From 256b1c9397d42c30b41acd68f7dd507633e7d9ef Mon Sep 17 00:00:00 2001 From: John Kenney Date: Wed, 22 Feb 2012 22:36:56 +0000 Subject: [PATCH] Update to latest ZTE Blade source code http://support.zte.com.cn/support//news/NewsDetail.aspx?newsId=1001722 Conflicts: arch/arm/configs/msm7627_blade_defconfig --- arch/arm/configs/msm7627_blade_defconfig | 65 +- arch/arm/mach-msm/Kconfig | 153 - arch/arm/mach-msm/Makefile | 15 +- arch/arm/mach-msm/board-msm7x27.c | 8 + arch/arm/mach-msm/board-zte-blade-keypad.c | 58 +- arch/arm/mach-msm/board-zte-blade.c | 780 ++-- arch/arm/mach-msm/include/mach/msm_battery.h | 1 + arch/arm/mach-msm/pm2.c | 10 +- arch/arm/mach-msm/qdsp5/adsp.c | 20 +- arch/arm/mach-msm/qdsp5/audio_aac.c | 7 + arch/arm/mach-msm/qdsp5/snd.c | 55 +- arch/arm/mach-msm/smd_pkt.c | 5 +- arch/arm/mach-msm/smd_rpcrouter.c | 16 + arch/arm/tools/mach-types | 18 +- drivers/bluetooth/bcm-power.c | 7 +- drivers/bluetooth/bcm_bluesleep.c | 16 +- drivers/i2c/algos/i2c-algo-bit.c | 19 +- drivers/i2c/chips/Kconfig | 21 + drivers/i2c/chips/Makefile | 2 + drivers/i2c/chips/ONA3301.c | 1453 +++++++ drivers/i2c/chips/accelerator.c | 20 +- drivers/i2c/chips/adxl34x.c | 26 +- drivers/i2c/chips/isl29026.c | 1276 ++++++ drivers/i2c/chips/lis302dl.c | 18 +- drivers/i2c/chips/pn544.c | 325 +- drivers/i2c/chips/taos.c | 1974 ++++----- drivers/input/touchscreen/Kconfig | 40 +- drivers/input/touchscreen/Makefile | 3 +- drivers/input/touchscreen/SynaUpgrade.c | 359 +- .../Ver11_20110802_036_9475_Only4P736T_app.i | 1783 ++++++++ .../Ver11_20110808_043_9485_skate_app.i | 1754 ++++++++ .../Ver17_20110721_028_P728T_app.i | 1742 ++++++++ drivers/input/touchscreen/atmel_config.c | 1359 ++++-- drivers/input/touchscreen/ft5x0x_ts.c | 137 +- drivers/input/touchscreen/ft5x0x_ts.h | 4 +- drivers/input/touchscreen/ft5x0x_ts_fwup.c | 748 ++++ drivers/input/touchscreen/ft5x0x_ts_new.c | 727 ++-- drivers/input/touchscreen/ft5x0x_ts_new.h | 4 +- drivers/input/touchscreen/mXT224_atmel.c | 988 ++++- drivers/input/touchscreen/mXT224_atmel_new.c | 2752 +++++++++++++ drivers/input/touchscreen/synaptics_3k.c | 505 ++- drivers/input/touchscreen/synaptics_i2c_rmi.c | 2 + drivers/media/video/msm/Kconfig | 19 +- drivers/media/video/msm/Makefile | 1 + drivers/media/video/msm/flash.c | 7 +- drivers/media/video/msm/hi704.h | 7 +- drivers/media/video/msm/hi704_kerr_fpc.c | 79 +- drivers/media/video/msm/hi704_reg_kerr_fpc.c | 7 +- drivers/media/video/msm/msm_axi_qos.c | 3 + drivers/media/video/msm/msm_camera.c | 204 +- drivers/media/video/msm/msm_sensorinfo.c | 17 +- drivers/media/video/msm/msm_vfe7x.c | 14 +- drivers/media/video/msm/mt9d113.h | 9 +- .../video/msm/mt9d113_qtech_sunny_socket.c | 105 +- .../msm/mt9d113_reg_qtech_sunny_socket.c | 550 ++- drivers/media/video/msm/mt9d115.h | 3 + .../media/video/msm/mt9d115_qtech_sunny_fpc.c | 122 +- .../video/msm/mt9d115_qtech_sunny_socket.c | 46 +- .../video/msm/mt9d115_reg_qtech_sunny_fpc.c | 572 ++- .../msm/mt9d115_reg_qtech_sunny_socket.c | 324 +- drivers/media/video/msm/mt9p111.h | 7 +- drivers/media/video/msm/mt9p111_mcnex.c | 2 +- drivers/media/video/msm/mt9p111_reg_mcnex.c | 1 + .../media/video/msm/mt9p111_reg_samsung_fpc.c | 99 +- .../video/msm/mt9p111_reg_samsung_socket.c | 42 +- drivers/media/video/msm/mt9p111_samsung_fpc.c | 190 +- .../mt9p111_samsung_fpc.c.merge-left.r9021 | 136 +- .../mt9p111_samsung_fpc.c.merge-right.r11080 | 171 +- .../video/msm/mt9p111_samsung_fpc.c.working | 174 +- .../media/video/msm/mt9p111_samsung_socket.c | 202 +- .../video/msm/mt9t111_reg_qtech_mcnex_fpc.c | 29 +- .../msm/mt9t111_reg_qtech_mcnex_socket.c | 26 +- .../video/msm/mt9t112_reg_qtech_mcnex_fpc.c | 339 +- .../msm/mt9t112_reg_qtech_mcnex_socket.c | 49 +- drivers/media/video/msm/mt9t11x.h | 6 +- .../media/video/msm/mt9t11x_qtech_mcnex_fpc.c | 197 +- .../video/msm/mt9t11x_qtech_mcnex_socket.c | 162 +- drivers/media/video/msm/mt9v113.c | 1270 +++++- drivers/media/video/msm/mt9v113.h | 16 +- drivers/media/video/msm/mt9v113_reg.c | 369 ++ drivers/media/video/msm/ov5640.h | 3 +- drivers/media/video/msm/ov5640_globaloptics.c | 343 +- .../media/video/msm/ov5640_reg_globaloptics.c | 27 +- drivers/media/video/msm/ov5642.h | 3 +- drivers/media/video/msm/ov5642_globaloptics.c | 122 +- .../ov5642_globaloptics.c.merge-left.r9021 | 85 +- .../ov5642_globaloptics.c.merge-right.r11080 | 111 +- .../video/msm/ov5642_globaloptics.c.working | 112 +- .../media/video/msm/ov5642_reg_globaloptics.c | 100 +- drivers/media/video/msm/ovm7690.h | 73 + drivers/media/video/msm/ovm7690_fpc.c | 2191 ++++++++++ drivers/media/video/msm/ovm7690_reg_fpc.c | 242 ++ .../video/msm/s5k5cagx_mcnex_qtech_fpc.c | 19 +- .../video/msm/s5k5cagx_reg_mcnex_qtech_fpc.c | 22 +- .../video/msm/s5k5cagx_reg_samsung_fpc.c | 11 +- .../media/video/msm/s5k5cagx_samsung_fpc.c | 29 +- drivers/mmc/core/core.c | 28 +- drivers/mmc/core/sdio.c | 38 +- drivers/mmc/host/Kconfig | 8 + drivers/mmc/host/msm_sdcc.c | 56 +- drivers/net/wireless/bcm4319/Makefile | 2 +- drivers/net/wireless/bcm4319/dhd.h | 21 + drivers/net/wireless/bcm4319/dhd_common.c | 111 +- drivers/net/wireless/bcm4319/dhd_linux.c | 307 +- .../net/wireless/bcm4319/include/wlioctl.h | 1 + drivers/net/wireless/bcm4319/wl_iw.c | 99 +- drivers/net/wireless/bcm4319/wl_iw.h | 4 +- drivers/power/Kconfig | 7 + drivers/power/msm_battery.c | 1588 ++++++- drivers/power/ti_gauge.c | 6 +- drivers/usb/gadget/f_mass_storage.c | 59 + drivers/usb/gadget/msm72k_udc.c | 123 +- drivers/usb/gadget/storage_common.c | 3 +- drivers/video/msm/lcdc.c | 20 +- drivers/video/msm/lcdc_panel_hvga_roamer.c | 230 +- drivers/video/msm/lcdc_panel_qvga725A.c | 6 +- drivers/video/msm/lcdc_panel_qvga_himax.c | 1 + drivers/video/msm/lcdc_panel_qvga_lead.c | 1 + drivers/video/msm/lcdc_panel_qvga_samsung.c | 1 + drivers/video/msm/lcdc_panel_wvga_oled.c | 6 +- drivers/video/msm/lcdc_panel_wvga_p736v.c | 1590 ++----- drivers/video/msm/lcdc_panel_wvga_skate.c | 514 ++- drivers/video/msm/mdp_dma_lcdc.c | 6 +- drivers/video/msm/msm_fb.c | 55 +- drivers/video/msm/msm_fb.h | 5 + firmware/Makefile | 8 + firmware/mXT140C27_v1.0.01.enc | 1 + firmware/mXT224C23_v1.1.09.enc | 1 + fs/yaffs2/yaffs_guts.c | 18 +- include/linux/atmel_qt602240.h | 28 +- include/linux/i2c/PS_ALS_common.h | 60 + include/linux/i2c/isl29026.h | 60 + include/linux/input/SynaUpgrade.h | 3637 +++++++++++++++++ include/linux/input/synaptics_i2c_rmi.h | 1 + include/linux/mmc/host.h | 2 +- include/linux/pn544.h | 36 + kernel/power/Makefile | 3 +- kernel/power/pm_monitor.c | 777 ++++ 138 files changed, 33016 insertions(+), 4856 deletions(-) create mode 100644 drivers/i2c/chips/ONA3301.c create mode 100644 drivers/i2c/chips/isl29026.c create mode 100644 drivers/input/touchscreen/Ver11_20110802_036_9475_Only4P736T_app.i create mode 100644 drivers/input/touchscreen/Ver11_20110808_043_9485_skate_app.i create mode 100644 drivers/input/touchscreen/Ver17_20110721_028_P728T_app.i create mode 100644 drivers/input/touchscreen/ft5x0x_ts_fwup.c create mode 100644 drivers/input/touchscreen/mXT224_atmel_new.c create mode 100644 drivers/media/video/msm/ovm7690.h create mode 100644 drivers/media/video/msm/ovm7690_fpc.c create mode 100644 drivers/media/video/msm/ovm7690_reg_fpc.c create mode 100644 firmware/mXT140C27_v1.0.01.enc create mode 100644 firmware/mXT224C23_v1.1.09.enc create mode 100644 include/linux/i2c/PS_ALS_common.h create mode 100644 include/linux/i2c/isl29026.h create mode 100644 include/linux/pn544.h create mode 100644 kernel/power/pm_monitor.c diff --git a/arch/arm/configs/msm7627_blade_defconfig b/arch/arm/configs/msm7627_blade_defconfig index b8f777e2..4faea79e 100644 --- a/arch/arm/configs/msm7627_blade_defconfig +++ b/arch/arm/configs/msm7627_blade_defconfig @@ -1,7 +1,6 @@ # # Automatically generated make config: don't edit # Linux kernel version: 2.6.35.7 -# Sat Sep 3 02:20:38 2011 # CONFIG_ARM=y CONFIG_SYS_SUPPORTS_APM_EMULATION=y @@ -39,13 +38,12 @@ CONFIG_CROSS_COMPILE="" CONFIG_LOCALVERSION="$(KERNEL_LOCAL_VERSION)-perf" # CONFIG_LOCALVERSION_AUTO is not set CONFIG_HAVE_KERNEL_GZIP=y -CONFIG_HAVE_KERNEL_BZIP2=y CONFIG_HAVE_KERNEL_LZMA=y -CONFIG_HAVE_KERNEL_XZ=y -# CONFIG_KERNEL_GZIP is not set +CONFIG_HAVE_KERNEL_LZO=y +CONFIG_KERNEL_GZIP=y # CONFIG_KERNEL_BZIP2 is not set # CONFIG_KERNEL_LZMA is not set -CONFIG_KERNEL_XZ=y +# CONFIG_KERNEL_LZO is not set # CONFIG_SWAP is not set CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y @@ -293,8 +291,6 @@ CONFIG_MACH_BLADE=y # CONFIG_MACH_ROAMER is not set # CONFIG_MACH_BLUETICK is not set CONFIG_ZTE_FTM_FLAG_SUPPORT=y -# CONFIG_ZTE_GEN1 is not set -CONFIG_ZTE_GEN2=y # CONFIG_MSM_STACKED_MEMORY is not set CONFIG_PHYS_OFFSET=0x02600000 CONFIG_MSM_AMSS_VERSION=6225 @@ -491,25 +487,16 @@ CONFIG_CPU_FREQ_TABLE=y CONFIG_CPU_FREQ_DEBUG=y CONFIG_CPU_FREQ_STAT=y CONFIG_CPU_FREQ_STAT_DETAILS=y -# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set +CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y # CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set -# CONFIG_CPU_FREQ_DEFAULT_GOV_LAGFREE is not set -CONFIG_CPU_FREQ_DEFAULT_GOV_SMARTASS2=y CONFIG_CPU_FREQ_GOV_PERFORMANCE=y -# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set -# CONFIG_CPU_FREQ_GOV_USERSPACE is not set -CONFIG_CPU_FREQ_GOV_INTERACTIVEX=y -CONFIG_CPU_FREQ_GOV_SMARTASS2=y -CONFIG_CPU_FREQ_GOV_SAVAGEDZEN=y -CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y -CONFIG_CPU_FREQ_GOV_LAGFREE=y +CONFIG_CPU_FREQ_GOV_POWERSAVE=y +CONFIG_CPU_FREQ_GOV_USERSPACE=y CONFIG_CPU_FREQ_GOV_ONDEMAND=y -CONFIG_CPU_FREQ_GOV_MINMAX=y -CONFIG_CPU_FREQ_MIN_TICKS=10 -CONFIG_CPU_FREQ_SAMPLING_LATENCY_MULTIPLIER=1000 +CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y # CONFIG_CPU_IDLE is not set CONFIG_CPU_FREQ_MSM=y @@ -1195,7 +1182,7 @@ CONFIG_INPUT=y # CONFIG_INPUT_MOUSEDEV is not set # CONFIG_INPUT_JOYDEV is not set CONFIG_INPUT_EVDEV=y -# CONFIG_INPUT_EVBUG is not set +CONFIG_INPUT_EVBUG=m # CONFIG_INPUT_KEYRESET is not set # @@ -1239,7 +1226,7 @@ CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI=y CONFIG_TOUCHSCREEN_CYPRESS_I2C_RMI=y # CONFIG_TOUCHSCREEN_MXT224 is not set # CONFIG_TOUCHSCREEN_CYTTSP_I2C is not set -# CONFIG_TOUCHSCREEN_FOCALTECH is not set +CONFIG_TOUCHSCREEN_FOCALTECH=y # CONFIG_TOUCHSCREEN_FOCALTECH_NEW is not set # CONFIG_TOUCHSCREEN_VIRTUAL_KEYS is not set # CONFIG_MINI_RACER is not set @@ -1363,6 +1350,8 @@ CONFIG_I2C_MSM=y # # CONFIG_MSENSORS_FROM_AUXI2C_TO_I2C is not set # CONFIG_GSENSORS_FROM_AUXI2C_TO_I2C is not set +CONFIG_SENSORS_ONA3301=y +CONFIG_SENSORS_ISL29026=y CONFIG_SENSORS_TSL2771=y # CONFIG_SENSORS_BH1721 is not set # CONFIG_SENSORS_AKM8962 is not set @@ -1441,12 +1430,12 @@ CONFIG_VIDEO_MEDIA=y # CONFIG_IR_CORE=y CONFIG_VIDEO_IR=y -# CONFIG_RC_MAP is not set -# CONFIG_IR_NEC_DECODER is not set -# CONFIG_IR_RC5_DECODER is not set -# CONFIG_IR_RC6_DECODER is not set -# CONFIG_IR_JVC_DECODER is not set -# CONFIG_IR_SONY_DECODER is not set +CONFIG_RC_MAP=y +CONFIG_IR_NEC_DECODER=y +CONFIG_IR_RC5_DECODER=y +CONFIG_IR_RC6_DECODER=y +CONFIG_IR_JVC_DECODER=y +CONFIG_IR_SONY_DECODER=y # CONFIG_IR_IMON is not set # CONFIG_MEDIA_ATTACH is not set CONFIG_MEDIA_TUNER=y @@ -1485,15 +1474,17 @@ CONFIG_MSM_CAMERA=y # CONFIG_MT9D112 is not set # CONFIG_MT9P012 is not set # CONFIG_MT9V113 is not set -CONFIG_MT9P111=y -# CONFIG_MT9P111_MCNEX is not set -CONFIG_MT9P111_SAMSUNG_FPC=y -# CONFIG_MT9P111_SAMSUNG_SOCKET is not set +# CONFIG_MT9P111 is not set CONFIG_MT9T11X=y CONFIG_MT9T11X_QTECH_MCNEX_FPC=y +# CONFIG_OV5642 is not set +CONFIG_OV5640=y +CONFIG_OV5640_GLOBALOPTICS=y + CONFIG_OV5642=y CONFIG_OV5642_GLOBALOPTICS=y -# CONFIG_OV5640 is not set +# CONFIG_OVM7690 is not set +# CONFIG_HI704 is not set # CONFIG_MT9D115 is not set # CONFIG_MT9D113 is not set CONFIG_S5K5CAGX=y @@ -1506,8 +1497,9 @@ CONFIG_S5K5CAGX_MCNEX_QTECH_FPC=y CONFIG_SENSOR_ADAPTER=y CONFIG_SENSOR_INFO=y # CONFIG_MSM_CAMERA_FLASH is not set -# CONFIG_MSM_GEMINI is not set +CONFIG_QUP_EXCLUSIVE_TO_CAMERA=y # CONFIG_CAMERA_N880 is not set +# CONFIG_V4L_MEM2MEM_DRIVERS is not set # CONFIG_RADIO_ADAPTERS is not set CONFIG_DAB=y @@ -2317,8 +2309,8 @@ CONFIG_CRYPTO_TWOFISH_COMMON=y # Compression # CONFIG_CRYPTO_DEFLATE=y -CONFIG_CRYPTO_ZLIB=y -CONFIG_CRYPTO_LZO=y +# CONFIG_CRYPTO_ZLIB is not set +# CONFIG_CRYPTO_LZO is not set # # Random Number Generation @@ -2351,4 +2343,3 @@ CONFIG_HAS_IOMEM=y CONFIG_HAS_IOPORT=y CONFIG_HAS_DMA=y CONFIG_NLATTR=y - diff --git a/arch/arm/mach-msm/Kconfig b/arch/arm/mach-msm/Kconfig index bfbe2f60..be71d43a 100644 --- a/arch/arm/mach-msm/Kconfig +++ b/arch/arm/mach-msm/Kconfig @@ -182,42 +182,6 @@ config MACH_BLADE help Support for the ZTE MSM7x27 Blade phone. -config MACH_BLADE2 - depends on ARCH_MSM7X27 - depends on !MSM_STACKED_MEMORY - default n - bool "ZTE BLADE2" - select ZTE_PLATFORM - help - Support for the ZTE MSM7x27 Blade2 phone. - -config MACH_NOVA - depends on ARCH_MSM7X27 - depends on !MSM_STACKED_MEMORY - default n - bool "ZTE NOVA" - select ZTE_PLATFORM - help - Support for the ZTE MSM7x27 Nova phone. - -config MACH_SAILBOAT - depends on ARCH_MSM7X27 - depends on !MSM_STACKED_MEMORY - default n - bool "ZTE SAILBOAT" - select ZTE_PLATFORM - help - Support for the ZTE MSM7x27 Sailboat phone. - -config MACH_TURIES - depends on ARCH_MSM7X27 - depends on !MSM_STACKED_MEMORY - default n - bool "ZTE TURIES" - select ZTE_PLATFORM - help - Support for the ZTE MSM7x27 Turies phone. - config MACH_BLADE_CAMERA5MP depends on MACH_BLADE default n @@ -225,123 +189,6 @@ config MACH_BLADE_CAMERA5MP help Support for the ZTE blade board,5MP camera. -config MACH_MOONCAKE - depends on ARCH_MSM7X27 - depends on !MSM_STACKED_MEMORY - default n - bool "ZTE MOONCAKE" - select ZTE_PLATFORM - help - Support for the ZTE MSM7x27 mooncake phone. - -config MACH_V9 - depends on ARCH_MSM7X27 - depends on !MSM_STACKED_MEMORY - default n - bool "ZTE V9" - select ZTE_PLATFORM - help - Support for the ZTE MSM7x27 v9 phone. - -config MACH_RAISE - depends on ARCH_MSM7X27 - depends on !MSM_STACKED_MEMORY - default n - bool "ZTE RAISE" - select ZTE_PLATFORM - help - Support for the ZTE MSM7x27 raise phone. - -config MACH_JOE - depends on ARCH_MSM7X27 - depends on !MSM_STACKED_MEMORY - default n - bool "ZTE JOE" - select ZTE_PLATFORM - help - Support for the ZTE MSM7x27 joe phone. - -config MACH_R750 - depends on ARCH_MSM7X27 - depends on !MSM_STACKED_MEMORY - default n - bool "ZTE R750" - select ZTE_PLATFORM - help - Support for the ZTE MSM7x27 r750 phone. - -config MACH_IBOX - depends on ARCH_MSM7X27 - depends on !MSM_STACKED_MEMORY - default n - bool "ZTE IBOX" - select ZTE_PLATFORM - help - Support for the ZTE MSM7x27 ibox phone. - -config MACH_AMIGO - depends on ARCH_MSM7X27 - depends on !MSM_STACKED_MEMORY - default n - bool "ZTE AMIGO" - select ZTE_PLATFORM - help - Support for the ZTE MSM7x27 amigo phone. - -config MACH_SMOOTH - depends on ARCH_MSM7X27 - depends on !MSM_STACKED_MEMORY - default n - bool "ZTE SMOOTH" - select ZTE_PLATFORM - help - Support for the ZTE MSM7x27 smooth phone. - -config MACH_JOECDMA - depends on ARCH_MSM7X27 - depends on !MSM_STACKED_MEMORY - default n - bool "ZTE JOECDMA" - select ZTE_PLATFORM - help - Support for the ZTE MSM7x27 joeCDMA phone. - -config MACH_RACER2 - depends on ARCH_MSM7X27 - depends on !MSM_STACKED_MEMORY - default n - bool "ZTE_RACER2" - select ZTE_PLATFORM - help - Support for the ZTE MSM7x27 racer2 phone. - -config MACH_SKATE - depends on ARCH_MSM7X27 - depends on !MSM_STACKED_MEMORY - default n - bool "ZTE SKATE" - select ZTE_PLATFORM - help - Support for the ZTE MSM7x27 skate phone. - -config MACH_ROAMER - depends on ARCH_MSM7X27 - depends on !MSM_STACKED_MEMORY - default n - bool "ZTE ROAMER" - select ZTE_PLATFORM - help - Support for the ZTE MSM7x27 roamer phone. - -config MACH_BLUETICK - depends on ARCH_MSM7X27 - depends on !MSM_STACKED_MEMORY - default n - bool "ZTE BLUETICK" - select ZTE_PLATFORM - help - Support for the ZTE MSM7x27 bluetick phone. - # ZTE_FTM_FLAG_SUPPORT config ZTE_FTM_FLAG_SUPPORT depends on ZTE_PLATFORM diff --git a/arch/arm/mach-msm/Makefile b/arch/arm/mach-msm/Makefile index c6ad07ac..baef9afb 100644 --- a/arch/arm/mach-msm/Makefile +++ b/arch/arm/mach-msm/Makefile @@ -174,17 +174,4 @@ obj-y += tlmm-msm7200a.o # Add ZTE board files and keypad config files obj-$(CONFIG_MACH_BLADE) += board-zte-blade-keypad.o board-zte-blade.o -obj-$(CONFIG_MACH_BLADE2) += board-zte-blade2-keypad.o board-zte-blade2.o -obj-$(CONFIG_MACH_NOVA) += board-zte-nova-keypad.o board-zte-nova.o -obj-$(CONFIG_MACH_TURIES) += board-zte-turies-keypad.o board-zte-turies.o -obj-$(CONFIG_MACH_RACER2) += board-zte-racer2-keypad.o board-zte-racer2.o -obj-$(CONFIG_MACH_SAILBOAT) += board-zte-sailboat-keypad.o board-zte-sailboat.o -obj-$(CONFIG_MACH_MOONCAKE) += board-zte-mooncake-keypad.o board-zte-mooncake.o -obj-$(CONFIG_MACH_V9) += board-zte-v9-keypad.o board-zte-v9.o -obj-$(CONFIG_MACH_AMIGO) += board-zte-amigo-keypad.o board-zte-amigo.o -obj-$(CONFIG_MACH_SMOOTH) += board-zte-smooth-keypad.o board-zte-smooth.o -obj-$(CONFIG_MACH_JOECDMA) += board-zte-joecdma-keypad.o board-zte-joecdma.o -obj-$(CONFIG_MACH_R750) += board-zte-r750.o board-zte-r750-keypad.o -obj-$(CONFIG_MACH_SKATE) += board-zte-skate-keypad.o board-zte-skate.o -obj-$(CONFIG_MACH_ROAMER) += board-zte-roamer-keypad.o board-zte-roamer.o -obj-$(CONFIG_MACH_BLUETICK) += board-zte-bluetick-keypad.o board-zte-bluetick.o + diff --git a/arch/arm/mach-msm/board-msm7x27.c b/arch/arm/mach-msm/board-msm7x27.c index c606418e..a50734f8 100644 --- a/arch/arm/mach-msm/board-msm7x27.c +++ b/arch/arm/mach-msm/board-msm7x27.c @@ -2455,6 +2455,14 @@ static struct i2c_board_info aux_i2c_devices[] = { .type = "taos", .addr = 0x39, }, + { + .type = "isl29026", + .addr = 0x45, + }, + { + .type = "ona3301", + .addr = 0x37, + }, //ZTE_ALSPRX_001 end }; /*ZTE_AUX_FYA_001,@2010-02-06,END*/ diff --git a/arch/arm/mach-msm/board-zte-blade-keypad.c b/arch/arm/mach-msm/board-zte-blade-keypad.c index 5aafb177..6d838216 100644 --- a/arch/arm/mach-msm/board-zte-blade-keypad.c +++ b/arch/arm/mach-msm/board-zte-blade-keypad.c @@ -15,9 +15,9 @@ /* ======================================================================================== when who what, where, why comment tag --------- ------- ------------------------------------------------------- -------------------------- -2010-05-20 weilanying blade_keypad ZTE_KEYPAD_WLY_0520 +2010-05-20 weilanying 修改blade_keypad名称 ZTE_KEYPAD_WLY_0520 2010-04-02 zhangtao modified the keypad map ZTE_KEYPAD_ZT_20100402_001 -2010-03-23 jiangfeng BLADE core +2010-03-23 jiangfeng 增加BLADE core支持 2009-12-11 wly support ftm mode ZTE_FTM_MODE_WLY_001 2009-10-30 qhhuang Copy from board-raise-keypad and modify "raise" to "mooncake" to support mooncake keypad =========================================================================================*/ @@ -29,13 +29,12 @@ when who what, where, why static unsigned int keypad_row_gpios[] = {33, 28}; - static unsigned int keypad_col_gpios[] = {37, 41, 40}; #define KEYMAP_INDEX(row, col) ((row)*ARRAY_SIZE(keypad_col_gpios) + (col)) -static const unsigned short keypad_keymap_mooncake[ARRAY_SIZE(keypad_col_gpios) * +static const unsigned short keypad_keymap_blade[ARRAY_SIZE(keypad_col_gpios) * ARRAY_SIZE(keypad_row_gpios)] = { /* row, col */ [KEYMAP_INDEX(0, 0)] = KEY_BACK, @@ -47,12 +46,13 @@ static const unsigned short keypad_keymap_mooncake[ARRAY_SIZE(keypad_col_gpios) }; -static const unsigned short mooncake_keypad_virtual_keys[] = { +static const unsigned short blade_keypad_virtual_keys[] = { KEY_END, KEY_POWER }; #ifdef CONFIG_MSM_GPIO_WAKE +//LHX_PM_20110506_01 get which GPIO for BACK HOME MENU------>> const unsigned short *p_keypad_keymap; void zte_get_gpio_for_key(int *keycode) { @@ -65,18 +65,26 @@ void zte_get_gpio_for_key(int *keycode) { keymap_index ++; } + + //pr_info("[IRQWAKE] keymap_index %d\n",keymap_index); + do{ gpio_wakeup_col = keymap_index - r * col_array_size; r++; }while(gpio_wakeup_col > col_array_size); + + //pr_info("[IRQWAKE] gpio_col %d\n",gpio_wakeup_col); *keycode = keypad_col_gpios[gpio_wakeup_col]; pr_info("[IRQWAKE] wakeup gpio_num %d\n",*keycode); + } + +//<<------LHX_PM_20110506_01 get which GPIO for BACK HOME MENU #endif -/* mooncake keypad platform device information */ -static struct gpio_event_matrix_info mooncake_keypad_matrix_info = { +/* blade keypad platform device information */ +static struct gpio_event_matrix_info blade_keypad_matrix_info = { .info.func = gpio_event_matrix_func, - .keymap = keypad_keymap_mooncake, + .keymap = keypad_keymap_blade, .output_gpios = keypad_row_gpios, .input_gpios = keypad_col_gpios, .noutputs = ARRAY_SIZE(keypad_row_gpios), @@ -91,42 +99,44 @@ static struct gpio_event_matrix_info mooncake_keypad_matrix_info = { #endif }; -static struct gpio_event_info *mooncake_keypad_info[] = { - &mooncake_keypad_matrix_info.info +static struct gpio_event_info *blade_keypad_info[] = { + &blade_keypad_matrix_info.info }; -static struct gpio_event_platform_data mooncake_keypad_data = { - .name = "blade_keypad", - .info = mooncake_keypad_info, - .info_count = ARRAY_SIZE(mooncake_keypad_info) +static struct gpio_event_platform_data blade_keypad_data = { + .name = "blade_keypad", + .info = blade_keypad_info, + .info_count = ARRAY_SIZE(blade_keypad_info) }; -struct platform_device keypad_device_mooncake = { +struct platform_device keypad_device_blade = { .name = GPIO_EVENT_DEV_NAME, .id = -1, .dev = { - .platform_data = &mooncake_keypad_data, + .platform_data = &blade_keypad_data, }, }; +/* ZTE_FTM_MODE_WLY_001, @2009-12-11, START*/ #ifdef CONFIG_ZTE_FTM_FLAG_SUPPORT extern int zte_get_ftm_flag(void); #endif - -static int __init mooncake_init_keypad(void) +/* ZTE_FTM_MODE_WLY_001, @2009-12-11, END*/ +static int __init blade_init_keypad(void) { - + /* ZTE_FTM_MODE_WLY_001, @2009-12-11, START*/ #ifdef CONFIG_ZTE_FTM_FLAG_SUPPORT int ftm_flag; ftm_flag = zte_get_ftm_flag(); if (1 ==ftm_flag)return 0; #endif - - mooncake_keypad_matrix_info.keymap = keypad_keymap_mooncake; + /* ZTE_FTM_MODE_WLY_001, @2009-12-11, START*/ + blade_keypad_matrix_info.keymap = keypad_keymap_blade; #ifdef CONFIG_MSM_GPIO_WAKE - p_keypad_keymap = mooncake_keypad_matrix_info.keymap; + p_keypad_keymap = blade_keypad_matrix_info.keymap; //LHX_PM_20110506_01 get which GPIO for BACK HOME MENU #endif - return platform_device_register(&keypad_device_mooncake); + return platform_device_register(&keypad_device_blade); } -device_initcall(mooncake_init_keypad); +device_initcall(blade_init_keypad); + diff --git a/arch/arm/mach-msm/board-zte-blade.c b/arch/arm/mach-msm/board-zte-blade.c index 0a3d69d5..44520b9d 100644 --- a/arch/arm/mach-msm/board-zte-blade.c +++ b/arch/arm/mach-msm/board-zte-blade.c @@ -17,6 +17,10 @@ /* ======================================================================================== when who what, where, why comment tag -------- ---- ----------------------------- ---------------------- +2011-06-08 lijing fix bug of high current ZTE_CAM_LJ_20110608 +2011-05-27 lijing add S5K5CAGX-mcnex and qtech module ZTE_CAM_LJ_20110527 +2011-04-22 guo.yl change camera power supply to identify ZTE_CAM_GUOYANLING2011422 + low cost board and normal board before 2011-03-01 wt add motor power supply for blade n880 ZTE_CAM_WT20110301 2011-01-19 wly change touch voltage sequence ZTE_WLY_CRDB00603771 2010-12-07 qxx compatible of qualcomm and broadcomm bluetooth chip ZTE_BT_QXX_20101207 @@ -75,12 +79,13 @@ when who what, where, why comment tag #include #include + #include #include #include - +/*ZTE_AUX_FYA_001,@2010-02-06,BEGIN*/ #include - +/*ZTE_AUX_FYA_001,@2010-02-06,END*/ #include #include #include @@ -100,22 +105,16 @@ when who what, where, why comment tag #ifdef CONFIG_ZTE_PLATFORM //#include "msm_usb_config.h" //USB-HML-001 #endif - +/*ZTE_GSENSOR_FYA_001,@2010-02-06,BEGIN*/ #include - - +/*ZTE_GSENSOR_FYA_001,@2010-02-06,END*/ +/*ZTE_TSSC_ZT_004,@2010-01-27,BEGIN*/ #if defined( CONFIG_TOUCHSCREEN_MSM_LEGACY) #include #elif defined( CONFIG_TOUCHSCREEN_MSM) #include #endif -#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_3K -#include -#endif -#ifdef CONFIG_TOUCHSCREEN_MXT224 -#include -extern struct atmel_i2c_platform_data atmel_data; -#endif +/*ZTE_TSSC_ZT_004,@2010-01-27,END*/ #ifdef CONFIG_ARCH_MSM7X25 #define MSM_PMEM_MDP_SIZE 0xb21000 @@ -127,7 +126,7 @@ extern struct atmel_i2c_platform_data atmel_data; #ifdef CONFIG_ARCH_MSM7X27 #define MSM_PMEM_MDP_SIZE 0x1B76000 -#define MSM_PMEM_ADSP_SIZE 0xAE4000 +#define MSM_PMEM_ADSP_SIZE 0xB71000 #define MSM_PMEM_AUDIO_SIZE 0x5B000 #define MSM_FB_SIZE 0x177000 #define MSM_GPU_PHYS_SIZE SZ_2M @@ -137,17 +136,17 @@ extern struct atmel_i2c_platform_data atmel_data; #endif #ifdef CONFIG_ANDROID_RAM_CONSOLE -#define MSM_RAM_CONSOLE_PHYS (PHYS_OFFSET - 0x100000) +#define MSM_RAM_CONSOLE_PHYS 0x02500000 //ZTE_BOOT_HUANGYANJUN_20100903_01 #define MSM_RAM_CONSOLE_SIZE SZ_1M #endif static smem_global *global; - +//ZTE_BOOT_JIANGFENG_20100223_01, start #ifdef CONFIG_ZTE_PLATFORM static int g_zte_ftm_flag_fixup; #endif - +//ZTE_BOOT_JIANGFENG_20100223_01, end /* Using upper 1/2MB of Apps Bootloader memory*/ #define MSM_PMEM_AUDIO_START_ADDR 0x80000ul @@ -184,6 +183,7 @@ static struct platform_device mass_storage_device = { }, }; #endif + #if 0 #ifdef CONFIG_USB_ANDROID //ruanmeisi 20100713 zte pid @@ -199,17 +199,11 @@ static struct platform_device mass_storage_device = { #define PRODUCT_ID_RNDIS_MS 0x1364 #define PRODUCT_ID_RNDIS_MS_ADB 0x1364 #define PRODUCT_ID_RNDIS 0x1365 - +/*ZTE_USB_WZY_101021 start*/ #define PRODUCT_ID_DIAG_MODEM_NEMA_MS_AT 0x1367 #define PRODUCT_ID_DIAG_MODEM_NEMA_MS_ADB_AT 0x1366 #define PRODUCT_ID_RNDIS_ADB 0x1373 /* dynamic composition */ -// ruanmeisi for dell -//end - -//for PIDs without ZTE vendor tag - - static struct usb_composition usb_func_composition[] = { #ifdef CONFIG_ZTE_PLATFORM { @@ -221,7 +215,7 @@ static struct usb_composition usb_func_composition[] = { }, { /* ADB*/ - .product_id = PRODUCT_ID_ADB, + .product_id = PRODUCT_ID_ADB, /*ZTE_USB_WZY_101021*/ .functions = 0x01, .adb_product_id = PRODUCT_ID_ADB, .adb_functions = 0x01 @@ -282,7 +276,7 @@ static struct usb_composition usb_func_composition[] = { .adb_product_id = PRODUCT_ID_RNDIS_ADB, .adb_functions = 0x1A }, - + /*ZTE_USB_WZY_101021 start*/ { /* diag+modm+nema+ms+at*/ .product_id = PRODUCT_ID_DIAG_MODEM_NEMA_MS_AT, @@ -296,22 +290,7 @@ static struct usb_composition usb_func_composition[] = { .functions = 0xB12764, .adb_product_id = PRODUCT_ID_DIAG_MODEM_NEMA_MS_ADB_AT, .adb_functions = 0xB12764 - }, - - //for dell ruanmeisi_20110110 - - /* modem + ms + adb */ - - /* MSC */ - - /* diag + modem + nmea + ms + adb*/ - //end ruanmeisi_20100110 - - //for PIDs without ZTE vendor tag - /* ms+adb*/ - /* diag+modm+nema+ms*/ - /* modm+ms+adb*/ - + },/*ZTE_USB_WZY_101021 end*/ #else { @@ -511,12 +490,14 @@ static struct msm_hsusb_platform_data msm_hsusb_pdata = { #endif #endif + static struct platform_device smc91x_device = { .name = "smc91x", .id = 0, .num_resources = ARRAY_SIZE(smc91x_resources), .resource = smc91x_resources, }; + #ifdef CONFIG_USB_ANDROID #if 0 static char *usb_functions_default[] = { @@ -526,6 +507,7 @@ static char *usb_functions_default[] = { "rmnet", "usb_mass_storage", }; + static char *usb_functions_default_adb[] = { "diag", "adb", @@ -534,16 +516,19 @@ static char *usb_functions_default_adb[] = { "rmnet", "usb_mass_storage", }; + static char *usb_functions_rndis_diag[] = { "rndis", "diag", }; + static char *usb_functions_rndis_adb_diag[] = { "rndis", "adb", "diag", }; #endif + static char *usb_functions_all[] = { #ifdef CONFIG_USB_ANDROID_RNDIS "rndis", @@ -567,6 +552,8 @@ static char *usb_functions_all[] = { "at" #endif }; + + #if 0 static struct android_usb_product usb_products[] = { { @@ -591,14 +578,18 @@ static struct android_usb_product usb_products[] = { }, }; #else + #include "zte_usb_config.c" + #endif + static struct usb_mass_storage_platform_data mass_storage_pdata = { .nluns = 1, .vendor = "ZTE Incorporated", .product = "Mass storage", .release = 0x0100, }; + static struct platform_device usb_mass_storage_device = { .name = "usb_mass_storage", .id = -1, @@ -606,8 +597,10 @@ static struct platform_device usb_mass_storage_device = { .platform_data = &mass_storage_pdata, }, }; + #if 0 static struct usb_ether_platform_data rndis_pdata = { + /* ethaddr is filled by board_serialno_setup */ .vendorID = 0x05C6, .vendorDescr = "Qualcomm Incorporated", }; @@ -619,6 +612,7 @@ static struct platform_device rndis_device = { .platform_data = &rndis_pdata, }, }; + #if 0 static struct android_usb_platform_data android_usb_pdata = { .vendor_id = 0x05C6, @@ -666,22 +660,31 @@ static int msm_hsusb_ldo_init(int init) return 0; } + static int msm_hsusb_ldo_enable(int enable) { static int ldo_status; + if (!vreg_3p3 || IS_ERR(vreg_3p3)) return -ENODEV; + if (ldo_status == enable) return 0; + ldo_status = enable; + pr_info("%s: %d", __func__, enable); + if (enable) return vreg_enable(vreg_3p3); + return vreg_disable(vreg_3p3); } + static int msm_hsusb_pmic_notif_init(void (*callback)(int online), int init) { int ret; + if (init) { ret = msm_pm_app_rpc_init(callback); } else { @@ -690,6 +693,8 @@ static int msm_hsusb_pmic_notif_init(void (*callback)(int online), int init) } return ret; } + +//ruanmeisi_20100713 reset phy from arm9 #ifdef CONFIG_ZTE_PLATFORM static int msm_hsusb_rpc_phy_reset(void __iomem *addr) { @@ -711,6 +716,7 @@ static struct msm_otg_platform_data msm_otg_pdata = { .ldo_init = msm_hsusb_ldo_init, .ldo_enable = msm_hsusb_ldo_enable, .pclk_required_during_lpm = 1 + }; #ifdef CONFIG_USB_GADGET @@ -718,7 +724,7 @@ static struct msm_otg_platform_data msm_otg_pdata = { #endif #endif - +/* ZTE_Audio_CJ_100304, chenjun, 2010-3-4, start */ #define SND(desc, num) { .name = #desc, .id = num } static struct snd_endpoint snd_endpoints_list[] = { SND(HANDSET, 0), @@ -735,7 +741,7 @@ static struct snd_endpoint snd_endpoints_list[] = { SND(CURRENT, 28), }; #undef SND - +/* ZTE_Audio_CJ_100304, chenjun, 2010-3-4, end */ static struct msm_snd_endpoints msm_device_snd_endpoints = { .endpoints = snd_endpoints_list, @@ -756,7 +762,6 @@ static struct platform_device msm_device_snd = { (1<> 1), }, +#else + //Do nothing +#endif #endif #ifdef CONFIG_MT9V113 @@ -1655,30 +1619,51 @@ static struct i2c_board_info i2c_devices[] = { #endif #endif -#ifdef CONFIG_OV5640 +#ifdef CONFIG_S5K5CAGX + /* + * add by ZTE_CAMERA_GUOYANLING_20110328 for S5K5CAGX-3.0Mp-AF-FPC + */ #if !defined(CONFIG_SENSOR_ADAPTER) { - I2C_BOARD_INFO("ov5640", 0x78 >> 1), + I2C_BOARD_INFO("s5k5cagx", 0x78 >> 1), }, #else //Do nothing #endif #endif -//ZTE_CAM_GUOYANLING2011422 -#ifdef CONFIG_S5K5CAGX +#ifdef CONFIG_S5K5CAGX_MCNEX_QTECH /* - * add by ZTE_CAMERA_GUOYANLING_20110328 for S5K5CAGX-3.0Mp-AF-FPC + * add by ZTE_CAMERA_GUOYANLING_20110511 for S5K5CAGX_MCNEX_QTECH-3.0Mp-AF-FPC */ #if !defined(CONFIG_SENSOR_ADAPTER) { - I2C_BOARD_INFO("s5k5cagx", 0x78 >> 1), + I2C_BOARD_INFO("s5k5cagx_mcnex_qtech", 0x5A >> 1), }, #else //Do nothing #endif #endif +#ifdef CONFIG_OV5640 + /* + * Commented by zhang.shengjie + * + * Refer to drivers/media/video/msm/ov5640.c + * For OV5640: 5.0Mp, 1/11-Inch System-On-A-Chip (SOC) CMOS Digital Image Sensor + * + * Attention: I2C device is initialized in sensor's driver if "CONFIG_SENSOR_ADAPTER" + * is defined + */ +#if !defined(CONFIG_SENSOR_ADAPTER) + { + I2C_BOARD_INFO("ov5640", 0x78 >> 1), + }, +#else + //Do nothing +#endif +#endif +//ZTE_TSSC_WLY_002,2010-05-10 #ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI { .type = "synaptics-rmi-ts", @@ -1687,16 +1672,6 @@ static struct i2c_board_info i2c_devices[] = { .irq = MSM_GPIO_TO_INT(29), }, #endif - #ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_3K - { - I2C_BOARD_INFO(SYNAPTICS_I2C_RMI4_NAME, TS_I2C_ADDR ), - /*.flags = ,*/ - .irq = MSM_GPIO_TO_INT(GPIO_TS_IRQ), - //.platform_data = touchscreen_power, - .platform_data = &synaptics_ts_data, - }, - #endif - #ifdef CONFIG_TOUCHSCREEN_CYPRESS_I2C_RMI { .type = "cypress_touch", @@ -1705,25 +1680,18 @@ static struct i2c_board_info i2c_devices[] = { .irq = MSM_GPIO_TO_INT(29), }, #endif - - #ifdef CONFIG_TOUCHSCREEN_FOCALTECH - { + //ZTE_TSSC_WLY_002,2010-05-10 +#ifdef CONFIG_TOUCHSCREEN_FOCALTECH + { .type = "ft5x0x_ts", - /*.flags = ,*/ - .addr = 0x3E, - .irq = MSM_GPIO_TO_INT(29), - }, - #endif -#ifdef CONFIG_TOUCHSCREEN_MXT224 - { - I2C_BOARD_INFO(ATMEL_QT602240_NAME, 0x4a ), - .platform_data = &atmel_data, - .irq = MSM_GPIO_TO_INT(29), + /*.flags = ,*/ + .addr = 0x3E, + .irq = MSM_GPIO_TO_INT(29), }, #endif }; - +/*ZTE_AUX_FYA_001,@2010-02-06,BEGIN*/ static struct i2c_gpio_platform_data aux_i2c_gpio_data = { .sda_pin = 93, .scl_pin = 92, @@ -1739,9 +1707,9 @@ static struct platform_device aux_i2c_gpio_device = { .platform_data = &aux_i2c_gpio_data }, }; +/*ZTE_AUX_FYA_001,@2010-02-06,END*/ - - +/*ZTE_AUX2_FYA_001,@2010-02-06,BEGIN*/ static struct i2c_gpio_platform_data aux2_i2c_gpio_data = { .sda_pin = 109, .scl_pin = 107, @@ -1757,7 +1725,7 @@ static struct platform_device aux2_i2c_gpio_device = { .platform_data = &aux2_i2c_gpio_data }, }; - +/*ZTE_AUX2_FYA_001,@2010-02-06,BEGIN*/ #ifdef CONFIG_MSM_CAMERA static uint32_t camera_off_gpio_table[] = { /* parallel CAMERA interfaces */ @@ -2147,13 +2115,149 @@ int32_t msm_camera_power_backend(enum msm_camera_pwr_mode_t pwr_mode) #define MSM_CAMERA_POWER_BACKEND_IOVDD_VAL (2600) +#if defined(CONFIG_S5K5CAGX_MCNEX_QTECH)|| defined(CONFIG_S5K5CAGX) +static int32_t camera_5ca_pwrup_sequence(struct vreg *vreg_cam_dvdd, struct vreg *vreg_cam_avdd, struct vreg *vreg_cam_iovdd) +{ + int32_t rc_cam_dvdd, rc_cam_avdd, rc_cam_iovdd; + + /* + * modified by ZTE_CAMERA_ZHANGTAO_20110329 for S5K5CAGX-3.0Mp-AF-FPC + */ + rc_cam_iovdd = vreg_set_level(vreg_cam_iovdd, 0); + if (rc_cam_iovdd) + { + CCRT("%s: vreg_set_level failed!\n", __func__); + return -EIO; + } + + rc_cam_iovdd = vreg_enable(vreg_cam_iovdd); + if (rc_cam_iovdd) + { + CCRT("%s: vreg_enable failed!\n", __func__); + return -EIO; + } + + mdelay(10); + + /* DVDD for both 5.0Mp and 3.0Mp camera on board-blade */ + rc_cam_dvdd = vreg_set_level(vreg_cam_dvdd, MSM_CAMERA_POWER_BACKEND_DVDD_VAL); + if (rc_cam_dvdd) + { + CCRT("%s: vreg_set_level failed!\n", __func__); + return -EIO; + } + + rc_cam_dvdd = vreg_enable(vreg_cam_dvdd); + if (rc_cam_dvdd) + { + CCRT("%s: vreg_enable failed!\n", __func__); + return -EIO; + } + + mdelay(1); + + rc_cam_avdd = vreg_set_level(vreg_cam_avdd, MSM_CAMERA_POWER_BACKEND_AVDD_VAL); + if (rc_cam_avdd) + { + CCRT("%s: vreg_set_level failed!\n", __func__); + return -EIO; + } + + rc_cam_avdd = vreg_enable(vreg_cam_avdd); + if (rc_cam_avdd) + { + CCRT("%s: vreg_enable failed!\n", __func__); + return -EIO; + } + + rc_cam_iovdd = vreg_set_level(vreg_cam_iovdd, MSM_CAMERA_POWER_BACKEND_IOVDD_VAL); + if (rc_cam_iovdd) + { + CCRT("%s: vreg_set_level failed!\n", __func__); + return -EIO; + } + + rc_cam_iovdd = vreg_enable(vreg_cam_iovdd); + if (rc_cam_iovdd) + { + CCRT("%s: vreg_enable failed!\n", __func__); + return -EIO; + } + + return 0; +} +#else +//begin ZTE_CAM_GUOYANLING2011422 +static int32_t blade_camera_pwrup_sequence(struct vreg *vreg_cam_dvdd, struct vreg *vreg_cam_avdd, struct vreg *vreg_cam_iovdd) +{ + int32_t rc_cam_dvdd, rc_cam_avdd, rc_cam_iovdd; + + /* DVDD for both 5.0Mp and 3.0Mp camera on board-blade */ + rc_cam_dvdd = vreg_set_level(vreg_cam_dvdd, MSM_CAMERA_POWER_BACKEND_DVDD_VAL); + if (rc_cam_dvdd) + { + CCRT("%s: vreg_set_level failed!\n", __func__); + return -EIO; + } + + rc_cam_dvdd = vreg_enable(vreg_cam_dvdd); + if (rc_cam_dvdd) + { + CCRT("%s: vreg_enable failed!\n", __func__); + return -EIO; + } + + mdelay(1); + + rc_cam_iovdd = vreg_set_level(vreg_cam_iovdd, MSM_CAMERA_POWER_BACKEND_IOVDD_VAL); + if (rc_cam_iovdd) + { + CCRT("%s: vreg_set_level failed!\n", __func__); + return -EIO; + } + + rc_cam_iovdd = vreg_enable(vreg_cam_iovdd); + if (rc_cam_iovdd) + { + CCRT("%s: vreg_enable failed!\n", __func__); + return -EIO; + } + + mdelay(2); + + /* + * AVDD for both 5.0Mp and 3.0Mp camera on board-blade + * AVDD and VCM are connected together on board-blade + */ + rc_cam_avdd = vreg_set_level(vreg_cam_avdd, MSM_CAMERA_POWER_BACKEND_AVDD_VAL); + if (rc_cam_avdd) + { + CCRT("%s: vreg_set_level failed!\n", __func__); + return -EIO; + } + + rc_cam_avdd = vreg_enable(vreg_cam_avdd); + if (rc_cam_avdd) + { + CCRT("%s: vreg_enable failed!\n", __func__); + return -EIO; + } + + mdelay(500); + + return 0; +} +#endif + +//end ZTE_CAM_GUOYANLING2011422 int32_t msm_camera_power_backend(enum msm_camera_pwr_mode_t pwr_mode) { struct vreg *vreg_cam_dvdd = NULL; struct vreg *vreg_cam_avdd = NULL; struct vreg *vreg_cam_iovdd = NULL; - int32_t rc_cam_dvdd, rc_cam_avdd, rc_cam_iovdd; + int32_t rc_cam_dvdd, rc_cam_avdd ;//rc_cam_iovdd; + int32_t ret = 0; CDBG("%s: entry\n", __func__); @@ -2165,7 +2269,7 @@ int32_t msm_camera_power_backend(enum msm_camera_pwr_mode_t pwr_mode) * VREG_CAM_AVDD2V6 = VREG_GP3 */ vreg_cam_dvdd = vreg_get(0, "gp2"); - vreg_cam_iovdd = vreg_get(0, "msmp"); + vreg_cam_iovdd = vreg_get(0, "msmp"); vreg_cam_avdd = vreg_get(0, "gp3"); if ((!vreg_cam_dvdd) || (!vreg_cam_iovdd) || (!vreg_cam_avdd)) @@ -2178,69 +2282,32 @@ int32_t msm_camera_power_backend(enum msm_camera_pwr_mode_t pwr_mode) { case MSM_CAMERA_PWRUP_MODE: { - /* DVDD for both 5.0Mp and 3.0Mp camera on board-blade */ - rc_cam_dvdd = vreg_set_level(vreg_cam_dvdd, MSM_CAMERA_POWER_BACKEND_DVDD_VAL); - if (rc_cam_dvdd) - { - CCRT("%s: vreg_set_level failed!\n", __func__); - return -EIO; - } - - rc_cam_dvdd = vreg_enable(vreg_cam_dvdd); - if (rc_cam_dvdd) - { - CCRT("%s: vreg_enable failed!\n", __func__); - return -EIO; - } - - mdelay(1); - - rc_cam_iovdd = vreg_set_level(vreg_cam_iovdd, MSM_CAMERA_POWER_BACKEND_IOVDD_VAL); - if (rc_cam_iovdd) - { - CCRT("%s: vreg_set_level failed!\n", __func__); - return -EIO; - } - - rc_cam_iovdd = vreg_enable(vreg_cam_iovdd); - if (rc_cam_iovdd) - { - CCRT("%s: vreg_enable failed!\n", __func__); - return -EIO; - } - - mdelay(2); - - /* - * AVDD for both 5.0Mp and 3.0Mp camera on board-blade - * AVDD and VCM are connected together on board-blade - */ - rc_cam_avdd = vreg_set_level(vreg_cam_avdd, MSM_CAMERA_POWER_BACKEND_AVDD_VAL); - if (rc_cam_avdd) - { - CCRT("%s: vreg_set_level failed!\n", __func__); - return -EIO; - } - - rc_cam_avdd = vreg_enable(vreg_cam_avdd); - if (rc_cam_avdd) - { - CCRT("%s: vreg_enable failed!\n", __func__); - return -EIO; - } +#if defined(CONFIG_S5K5CAGX_MCNEX_QTECH)|| defined(CONFIG_S5K5CAGX) + ret = camera_5ca_pwrup_sequence(vreg_cam_dvdd, vreg_cam_avdd, vreg_cam_iovdd); + if(ret != 0) + { + return -EIO; + } +#else + ret = blade_camera_pwrup_sequence(vreg_cam_dvdd, vreg_cam_avdd, vreg_cam_iovdd); + if(ret != 0) + return -EIO; +#endif - mdelay(500); break; } case MSM_CAMERA_STANDBY_MODE: { +#if 0 rc_cam_avdd = vreg_disable(vreg_cam_avdd); if (rc_cam_avdd) { CCRT("%s: vreg_disable failed!\n", __func__); return -EIO; } + +#endif break; } case MSM_CAMERA_NORMAL_MODE: @@ -2261,6 +2328,7 @@ int32_t msm_camera_power_backend(enum msm_camera_pwr_mode_t pwr_mode) CCRT("%s: vreg_enable failed!\n", __func__); return -EIO; } + mdelay(100); break; @@ -2509,30 +2577,6 @@ static struct platform_device msm_camera_sensor_s5k3e2fx = { }; #endif -#ifdef CONFIG_S5K5CAGX -static struct msm_camera_sensor_flash_data flash_s5k5cagx = { - .flash_type = MSM_CAMERA_FLASH_LED, - .flash_src = &msm_flash_src -}; - -static struct msm_camera_sensor_info msm_camera_sensor_s5k5cagx_data = { - .sensor_name = "s5k5cagx", - .sensor_reset = 2, - .sensor_pwd = 1, - .vcm_pwd = 0, - .vcm_enable = 0, - .pdata = &msm_camera_device_data, - .flash_data = &flash_s5k5cagx -}; - -static struct platform_device msm_camera_sensor_s5k5cagx = { - .name = "msm_camera_s5k5cagx", - .dev = { - .platform_data = &msm_camera_sensor_s5k5cagx_data, - }, -}; -#endif - #ifdef CONFIG_MT9P012 static struct msm_camera_sensor_flash_data flash_mt9p012 = { .flash_type = MSM_CAMERA_FLASH_LED, @@ -2802,7 +2846,74 @@ static struct platform_device msm_camera_sensor_ov5642 = { }; #endif +#ifdef CONFIG_S5K5CAGX +/* + * add by ZTE_CAM_GUOYANLING20110422 for S5K5CAGX-3.0Mp-AF-FPC + */ +static struct msm_camera_sensor_flash_data flash_s5k5cagx = { + .flash_type = MSM_CAMERA_FLASH_NONE, + .flash_src = &msm_flash_src +}; + +static struct msm_camera_sensor_info msm_camera_sensor_s5k5cagx_data = { + .sensor_name = "s5k5cagx", + .sensor_reset = 2, + .sensor_pwd = 1, + .vcm_pwd = 0, + .vcm_enable = 0, + .pdata = &msm_camera_device_data, + .flash_data = &flash_s5k5cagx +}; + +static struct platform_device msm_camera_sensor_s5k5cagx = { + .name = "msm_camera_s5k5cagx", + .dev = { + .platform_data = &msm_camera_sensor_s5k5cagx_data, + }, +}; +#endif + +#ifdef CONFIG_S5K5CAGX_MCNEX_QTECH +/* + * add by ZTE_CAM_GUOYANLING20110511 for S5K5CAGX_MCNEX_QTECH-3.0Mp-AF-FPC + */ +static struct msm_camera_sensor_flash_data flash_s5k5cagx_mcnex_qtech = { + .flash_type = MSM_CAMERA_FLASH_NONE, + .flash_src = &msm_flash_src +}; + +static struct msm_camera_sensor_info msm_camera_sensor_s5k5cagx_mcnex_qtech_data = { + .sensor_name = "s5k5cagx_mcnex_qtech", + .sensor_reset = 2, + .sensor_pwd = 1, + .vcm_pwd = 0, + .vcm_enable = 0, + .pdata = &msm_camera_device_data, + .flash_data = &flash_s5k5cagx_mcnex_qtech +}; + +static struct platform_device msm_camera_sensor_s5k5cagx_mcnex_qtech = { + .name = "msm_camera_s5k5cagx_mcnex_qtech", + .dev = { + .platform_data = &msm_camera_sensor_s5k5cagx_mcnex_qtech_data, + }, +}; +#endif + #ifdef CONFIG_OV5640 +/* + * Commented by zhang.shengjie + * + * Refer to drivers/media/video/msm/ov5640.c + * For OV5640: 5.0Mp, 1/4-Inch System-On-A-Chip (SOC) CMOS Digital Image Sensor + * + * ".vcm_pwd" are DISUSED + */ + +/* CHG_CAM_20100401 + * Commented by chg + * merge 5320 for camera flash. + */ static struct msm_camera_sensor_flash_data flash_ov5640 = { .flash_type = MSM_CAMERA_FLASH_LED, .flash_src = &msm_flash_src @@ -2828,6 +2939,8 @@ static struct platform_device msm_camera_sensor_ov5640 = { #endif +/*ZTE_TSSC_ZT_004,@2010-01-27,BEGIN*/ +/*ZTE_TSSC_WLY_001, @2010-04-13,BEGIN*/ /*add touchsreen size definition for mooncake. QVGA*/ #if defined( CONFIG_TOUCHSCREEN_MSM_LEGACY) struct msm_ts_platform_data msm_tssc_pdata ={ @@ -2846,8 +2959,8 @@ struct msm_ts_platform_data msm_tssc_pdata = { .inv_y = 955, }; #endif - - +/*ZTE_TSSC_WLY_001, @2010-04-13,END*/ +/*ZTE_TSSC_ZT_004,@2010-01-27,END*/ #if 0 @@ -2961,7 +3074,7 @@ static struct platform_device ram_console_device = { .resource = ram_console_resource, }; #endif - +//ZTE_WIFI_OYHQ_20100714 wifi froyo upgrade begin /* ATHENV */ static struct platform_device msm_wlan_ar6000_pm_device = { .name = "wlan_ar6000_pm_dev", @@ -2970,7 +3083,7 @@ static struct platform_device msm_wlan_ar6000_pm_device = { .resource = NULL, }; /* ATHENV */ - +//ZTE_WIFI_OYHQ_20100714 wifi froyo upgrade end static struct platform_device *early_devices[] __initdata = { #ifdef CONFIG_GPIOLIB &msm_gpio_devices[0], @@ -2983,7 +3096,7 @@ static struct platform_device *early_devices[] __initdata = { }; static struct platform_device *devices[] __initdata = { - +//ZTE_WIFI_OYHQ_20100714 wifi froyo upgrade begin /* ATHENV */ /* * It is necessary to put here in order to support WoW. @@ -2991,7 +3104,7 @@ static struct platform_device *devices[] __initdata = { */ &msm_wlan_ar6000_pm_device, /* ATHENV */ - +//ZTE_WIFI_OYHQ_20100714 wifi froyo upgrade end #if !defined(CONFIG_MSM_SERIAL_DEBUGGER) &msm_device_uart3, #endif @@ -3019,19 +3132,20 @@ static struct platform_device *devices[] __initdata = { #endif &android_usb_device, #endif - &msm_device_i2c, + &msm_device_i2c, +/*ZTE_AUX_FYA_001,@2010-02-06,BEGIN*/ &aux_i2c_gpio_device, - - +/*ZTE_AUX_FYA_001,@2010-02-06,END*/ +/*ZTE_AUX2_FYA_001,@2010-02-06,BEGIN*/ &aux2_i2c_gpio_device, - +/*ZTE_AUX2_FYA_001,@2010-02-06,END*/ &smc91x_device, - +/*ZTE_TSSC_WLY_001, @2010-04-13,BEGIN*/ #if defined( CONFIG_TOUCHSCREEN_MSM_LEGACY) || defined( CONFIG_TOUCHSCREEN_MSM) &msm_device_tssc, #endif - +/*ZTE_TSSC_WLY_001, @2010-04-13,BEGIN*/ &android_pmem_kernel_ebi1_device, &android_pmem_device, &android_pmem_adsp_device, @@ -3072,7 +3186,7 @@ static struct platform_device *devices[] __initdata = { &msm_bluesleep_device, &msm_bcmsleep_device, //compatible of qualcomm and broadcomm bluetooth chip ZTE_BT_QXX_20101207 #ifdef CONFIG_ARCH_MSM7X27 - &msm_device_kgsl, + &msm_device_kgsl, #endif #ifdef CONFIG_MT9P111 /* @@ -3122,18 +3236,28 @@ static struct platform_device *devices[] __initdata = { &msm_camera_sensor_ov5642, #endif -#ifdef CONFIG_OV5640 - &msm_camera_sensor_ov5640, +#ifdef CONFIG_S5K5CAGX + /* + * add by ZTE_CAM_GUOYANLING20110422 for S5K5CAGX-3.0Mp-AF-FPC + */ + &msm_camera_sensor_s5k5cagx, #endif -#ifdef CONFIG_S5K5CAGX +#ifdef CONFIG_S5K5CAGX_MCNEX_QTECH + /* + * add by ZTE_CAM_GUOYANLING20110511 for S5K5CAGX_MCNEX_QTECH-3.0Mp-AF-FPC + */ + &msm_camera_sensor_s5k5cagx_mcnex_qtech, +#endif + +#ifdef CONFIG_OV5640 /* * Commented by zh.shj * - * Refer to drivers/media/video/msm/s5k5cagx.c - * For S5K5CAGX: 3.1Mp, 1/5-Inch System-On-A-Chip (SOC) CMOS Digital Image Sensor + * Refer to drivers/media/video/msm/ov5640.c + * For OV5640: 5.0Mp, 1/4-Inch System-On-A-Chip (SOC) CMOS Digital Image Sensor */ - &msm_camera_sensor_s5k5cagx, + &msm_camera_sensor_ov5640, #endif &hs_device, @@ -3154,7 +3278,7 @@ static void __init msm_fb_add_devices(void) msm_fb_register_device("lcdc", &lcdc_pdata); } - +/*ZTE_AUX_FYA_001,@2010-02-06,BEGIN*/ static struct i2c_board_info aux_i2c_devices[] = { #if 0 { @@ -3168,16 +3292,24 @@ static struct i2c_board_info aux_i2c_devices[] = { { I2C_BOARD_INFO("si4708", 0x10), }, - + //ZTE_ALSPRX_001 start { .type = "taos", .addr = 0x39, }, - + { + .type = "isl29026", + .addr = 0x45, + }, + { + .type = "ona3301", + .addr = 0x37, + }, + //ZTE_ALSPRX_001 end }; +/*ZTE_AUX_FYA_001,@2010-02-06,END*/ - - +/*ZTE_AUX2_FYA_001,@2010-02-06,BEGIN+++++++++++*/ static struct i2c_board_info aux2_i2c_devices[] = { @@ -3188,12 +3320,12 @@ static struct i2c_board_info aux2_i2c_devices[] = { #endif #ifndef CONFIG_GSENSORS_FROM_AUXI2C_TO_I2C { - .type = "accelerator", + .type = "accelerator", //ZTE_FYA_20101122 .addr = 0x1d, }, #endif }; - +/*ZTE_AUX_FYA_001,@2010-02-06,END---------------*/ extern struct sys_timer msm_timer; static void __init msm7x2x_init_irq(void) @@ -3242,11 +3374,13 @@ static void __init msm7x2x_init_host(void) static unsigned long vreg_sts, gpio_sts; static struct vreg *vreg_mmc; static unsigned mpp_mmc = 2; + struct sdcc_gpio { struct msm_gpio *cfg_data; uint32_t size; struct msm_gpio *sleep_cfg_data; }; + static struct msm_gpio sdc1_cfg_data[] = { {GPIO_CFG(51, 1, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_8MA), "sdc1_dat_3"}, {GPIO_CFG(52, 1, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_8MA), "sdc1_dat_2"}, @@ -3290,25 +3424,23 @@ static struct msm_gpio sdc4_cfg_data[] = { {GPIO_CFG(108, 1, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_8MA), "sdc4_dat_0"}, {GPIO_CFG(109, 1, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_8MA), "sdc4_clk"}, }; + static struct sdcc_gpio sdcc_cfg_data[] = { { .cfg_data = sdc1_cfg_data, .size = ARRAY_SIZE(sdc1_cfg_data), .sleep_cfg_data = NULL, }, - /* SDC2 configs */ { .cfg_data = sdc2_cfg_data, .size = ARRAY_SIZE(sdc2_cfg_data), .sleep_cfg_data = sdc2_sleep_cfg_data, }, - /* SDC3 configs */ { .cfg_data = sdc3_cfg_data, .size = ARRAY_SIZE(sdc3_cfg_data), .sleep_cfg_data = NULL, }, - /* SDC4 configs */ { .cfg_data = sdc4_cfg_data, .size = ARRAY_SIZE(sdc4_cfg_data), @@ -3316,7 +3448,6 @@ static struct sdcc_gpio sdcc_cfg_data[] = { }, }; - static void msm_sdcc_setup_gpio(int dev_id, unsigned int enable) { int rc = 0; @@ -3351,10 +3482,6 @@ static uint32_t msm_sdcc_setup_power(struct device *dv, unsigned int vdd) pdev = container_of(dv, struct platform_device, dev); msm_sdcc_setup_gpio(pdev->id, !!vdd); - if(pdev->id==2) - { - return 0; - } if (vdd == 0) { if (!vreg_sts) return 0; @@ -3393,10 +3520,17 @@ static uint32_t msm_sdcc_setup_power(struct device *dv, unsigned int vdd) set_bit(pdev->id, &vreg_sts); return 0; } - +//ZTE_WIFI_OYHQ_20100714 wifi froyo upgrade begin /* ATHENV+++ */ static void (*wifi_status_notify_cb)(int card_present, void *dev_id); void *wifi_devid; +//static int msm_sdcc_register_status_notify(void (*callback)(int card_present, void *dev_id), void *dev_id) +//{ +// wifi_status_notify_cb = callback; +// wifi_devid = dev_id; +// printk("%s: callback %p devid %p\n", __func__, callback, dev_id); +// return 0; +//} void wifi_detect_change(int on) { @@ -3407,7 +3541,7 @@ void wifi_detect_change(int on) } EXPORT_SYMBOL(wifi_detect_change); /* ATHENV---*/ - +//ZTE_WIFI_OYHQ_20100714 wifi froyo upgrade end #ifdef CONFIG_MMC_MSM_SDC1_SUPPORT static struct mmc_platform_data msm7x2x_sdc1_data = { .ocr_mask = MMC_VDD_28_29, @@ -3422,21 +3556,25 @@ static struct mmc_platform_data msm7x2x_sdc1_data = { #ifdef CONFIG_MMC_MSM_SDC2_SUPPORT static struct mmc_platform_data msm7x2x_sdc2_data = { - .ocr_mask = MMC_VDD_20_21, + .ocr_mask = MMC_VDD_28_29, .translate_vdd = msm_sdcc_setup_power, .mmc_bus_width = MMC_CAP_4_BIT_DATA, #ifdef CONFIG_MMC_MSM_SDIO_SUPPORT -#ifndef CONFIG_ATH_WIFI +#ifdef CONFIG_ATH_WIFI +#ifdef CONFIG_WOW_BY_SDIO_DATA1 .sdiowakeup_irq = MSM_GPIO_TO_INT(66), +#else + .sdiowakeup_irq = MSM_GPIO_TO_INT(19), #endif +#endif /*CONFIG_ATH_WIFI*/ #endif .msmsdcc_fmin = 144000, .msmsdcc_fmid = 24576000, .msmsdcc_fmax = 49152000, .nonremovable = 0, - + //ZTE_WIFI_OYHQ_20100714 wifi froyo upgrade begin .dummy52_required = 1, - + //ZTE_WIFI_OYHQ_20100714 wifi froyo upgrade end }; #endif @@ -3481,7 +3619,7 @@ static void __init msm7x2x_init_mmc(void) msm_add_sdcc(1, &msm7x2x_sdc1_data); #endif - +//ZTE_WIFI_OYHQ_20100714 wifi froyo upgrade begin //if (machine_is_msm7x25_surf() || machine_is_msm7x27_surf() || //machine_is_msm7x27_ffa()) { #ifdef CONFIG_MMC_MSM_SDC2_SUPPORT @@ -3491,7 +3629,7 @@ static void __init msm7x2x_init_mmc(void) msm_add_sdcc(2, &msm7x2x_sdc2_data); #endif //} - +//ZTE_WIFI_OYHQ_20100714 wifi froyo upgrade end if (machine_is_msm7x25_surf() || machine_is_msm7x27_surf()) { #ifdef CONFIG_MMC_MSM_SDC3_SUPPORT msm_add_sdcc(3, &msm7x2x_sdc3_data); @@ -3617,7 +3755,7 @@ static void __init msm_device_i2c_init(void) msm_device_i2c.dev.platform_data = &msm_i2c_pdata; } - +//ZTE_BOOT_HUANGYJ_20100816_01 add mooncake boot config #ifdef CONFIG_ZTE_PLATFORM //USB-HML-001 : USB 3.3V control #define MSM_GPIO_USB3V3 21 @@ -3664,9 +3802,9 @@ static void usb_mpp_init(void) } } - +/*ZTE_VIB_SLF_001 2010-03-02,BEGIN*/ extern void __init msm_init_pmic_vibrator(void); - +/*ZTE_VIB_SLF_001 2010-03-02 END*/ static ssize_t debug_global_read(struct file *file, char __user *buf, size_t len, loff_t *offset) @@ -3693,20 +3831,29 @@ static struct file_operations debug_global_file_ops = { .read = debug_global_read, }; - -static void msm7x27_wlan_init(void) +//begin ZTE_CAM_GUOYANLING20110422 for S5K5CAGX-3.0Mp-AF-FPC +#if defined(CONFIG_S5K5CAGX_MCNEX_QTECH)|| defined(CONFIG_S5K5CAGX) +static void set_camera_reset_low(void) { - int rc = 0; - /* TBD: if (machine_is_msm7x27_ffa_with_wcn1312()) */ - if (machine_is_msm7x27_ffa()) { - rc = mpp_config_digital_out(3, MPP_CFG(MPP_DLOGIC_LVL_MSMP, - MPP_DLOGIC_OUT_CTRL_LOW)); - if (rc) - printk(KERN_ERR "%s: return val: %d \n", - __func__, rc); - } + int rc = 0; + + rc = gpio_request(2, NULL); + if (0 == rc) + { + /* ignore "rc" */ + rc = gpio_direction_output(2, 0); + + mdelay(10); + } + + gpio_free(2); + mdelay(10); } +#endif + +//end ZTE_CAM_GUOYANLING20110422 for S5K5CAGX-3.0Mp-AF-FPC +//ZTE_WLY_CRDB00603771,START #if defined (CONFIG_MACH_BLADE) static void touch_vdd(void) { @@ -3724,11 +3871,23 @@ static void touch_vdd(void) gpio_direction_input(29); } #endif +//ZTE_WLY_CRDB00603771,END +static void msm7x27_wlan_init(void) +{ + int rc = 0; + /* TBD: if (machine_is_msm7x27_ffa_with_wcn1312()) */ + if (machine_is_msm7x27_ffa()) { + rc = mpp_config_digital_out(3, MPP_CFG(MPP_DLOGIC_LVL_MSMP, + MPP_DLOGIC_OUT_CTRL_LOW)); + if (rc) + printk(KERN_ERR "%s: return val: %d \n", + __func__, rc); + } +} -//#ifdef CONFIG_ATH_WIFI -#if 0 -static int wlan_init_power() +#ifdef CONFIG_ATH_WIFI +static int wlan_init_power(void) { int ret = 0; struct vreg *vreg = NULL; @@ -3772,10 +3931,16 @@ static void __init msm7x2x_init(void) { struct proc_dir_entry *entry; - +//ZTE_BOOT_JIANGFENG_20100223_01, start #ifdef CONFIG_ZTE_FTM_FLAG_SUPPORT zte_ftm_set_value(g_zte_ftm_flag_fixup); #endif +//ZTE_BOOT_JIANGFENG_20100223_01, end + + ////ZTE_CAM_LJ_20110527 +#if defined(CONFIG_S5K5CAGX_MCNEX_QTECH)|| defined(CONFIG_S5K5CAGX) + set_camera_reset_low(); +#endif if (socinfo_init() < 0) @@ -3808,19 +3973,18 @@ static void __init msm7x2x_init(void) } if (cpu_is_msm7x27()) - msm7x2x_clock_data.max_axi_khz = 422400; + msm7x2x_clock_data.max_axi_khz = 200000; msm_acpu_clock_init(&msm7x2x_clock_data); #ifdef CONFIG_ZTE_PLATFORM init_usb3v3();//USB-HML-001 enable ldo. #endif #ifdef CONFIG_ARCH_MSM7X27 - /* Initialize the zero page for barriers and cache ops */ /* This value has been set to 160000 for power savings. */ /* OEMs may modify the value at their discretion for performance */ /* The appropriate maximum replacement for 160000 is: */ /* clk_get_max_axi_khz() */ - kgsl_pdata.high_axi_3d = clk_get_max_axi_khz(); + kgsl_pdata.high_axi_3d = 160000; /* 7x27 doesn't allow graphics clocks to be run asynchronously to */ /* the AXI bus */ @@ -3843,12 +4007,13 @@ static void __init msm7x2x_init(void) #endif #endif - +/*ZTE_TSSC_ZT_004,@2010-01-27,BEGIN*/ +/*ZTE_TSSC_WLY_001, @2010-04-13,BEGIN*/ #if defined( CONFIG_TOUCHSCREEN_MSM_LEGACY) || defined( CONFIG_TOUCHSCREEN_MSM) msm_device_tssc.dev.platform_data = &msm_tssc_pdata; #endif - - +/*ZTE_TSSC_WLY_001, @2010-04-13,BEGIN*/ +/*ZTE_TSSC_ZT_004,@2010-01-27,END*/ usb_mpp_init(); @@ -3884,30 +4049,27 @@ static void __init msm7x2x_init(void) // msm_device_gadget_peripheral.dev.platform_data = &msm_gadget_pdata; #endif #endif - +/*ZTE_VIB_SLF_001 2010-03-02,BEGIN*/ msm_init_pmic_vibrator(); - +/*ZTE_VIB_SLF_001 2010-03-02 END*/ platform_add_devices(devices, ARRAY_SIZE(devices)); #ifdef CONFIG_MSM_CAMERA // config_camera_off_gpios(); /* might not be necessary */ #endif - +//ZTE_WLY_CRDB00603771,START #if defined (CONFIG_MACH_BLADE) touch_vdd(); #endif - +//ZTE_WLY_CRDB00603771,END msm_device_i2c_init(); i2c_register_board_info(0, i2c_devices, ARRAY_SIZE(i2c_devices)); - +/*ZTE_AUX_FYA_001,@2010-02-06,BEGIN*/ i2c_register_board_info(1, aux_i2c_devices, ARRAY_SIZE(aux_i2c_devices)); - - +/*ZTE_AUX_FYA_001,@2010-02-06,END*/ +/*ZTE_AUX2_FYA_001,@2010-02-06,BEGIN*/ i2c_register_board_info(2, aux2_i2c_devices, ARRAY_SIZE(aux2_i2c_devices)); -#ifdef CONFIG_TOUCHSCREEN_VIRTUAL_KEYS - touch_sysfs_init(); -#endif - +/*ZTE_AUX2_FYA_001,@2010-02-06,END*/ #ifdef CONFIG_SURF_FFA_GPIO_KEYPAD if (machine_is_msm7x25_ffa() || machine_is_msm7x27_ffa()) platform_device_register(&keypad_device_7k_ffa); @@ -3925,8 +4087,7 @@ touch_vdd(); #endif msm7x2x_init_mmc(); bt_power_init(); -//#ifdef CONFIG_ATH_WIFI -#if 0 +#ifdef CONFIG_ATH_WIFI wlan_init_power(); #endif if (cpu_is_msm7x27()) @@ -3935,7 +4096,7 @@ touch_vdd(); else msm_pm_set_platform_data(msm7x25_pm_data, ARRAY_SIZE(msm7x25_pm_data)); - + msm7x27_wlan_init(); global = ioremap(SMEM_LOG_GLOBAL_BASE, sizeof(smem_global)); @@ -3986,12 +4147,12 @@ static void __init msm_msm7x2x_allocate_memory_regions(void) unsigned long size; #if defined(CONFIG_ZTE_PLATFORM) && defined(CONFIG_F3_LOG) - +/* ZTE_F3LOG_YYM_0804 begin */ unsigned int len; smem_global *global_tmp = (smem_global *)(MSM_RAM_LOG_BASE + PAGE_SIZE) ; len = global_tmp->f3log; - +/* ZTE_F3LOG_YYM_0804 end */ #endif size = pmem_mdp_size; @@ -4034,9 +4195,8 @@ static void __init msm_msm7x2x_allocate_memory_regions(void) " ebi1 pmem arena\n", size, addr, __pa(addr)); } - #if defined(CONFIG_ZTE_PLATFORM) && defined(CONFIG_F3_LOG) - +/* ZTE_F3LOG_YYM_0804 begin */ pr_info("length = %d ++ \n", len); if (len > 12) @@ -4052,7 +4212,7 @@ static void __init msm_msm7x2x_allocate_memory_regions(void) addr = phys_to_virt(0x08D00000); pr_info("allocating %lu M at %p (%lx physical) for F3\n",size, addr, __pa(addr)); - +/* ZTE_F3LOG_YYM_0804 end */ #endif } @@ -4062,7 +4222,7 @@ static void __init msm7x2x_map_io(void) msm_map_common_io(); msm_msm7x2x_allocate_memory_regions(); - +//ZTE_BOOT_HUANGYJ_20100816_01 begin #if 0 #ifdef CONFIG_CACHE_L2X0 if (machine_is_msm7x27_surf() || machine_is_msm7x27_ffa() || machine_is_blade()) { @@ -4078,7 +4238,7 @@ static void __init msm7x2x_map_io(void) #ifdef CONFIG_CACHE_L2X0 l2x0_init(MSM_L2CC_BASE, 0x00068012, 0xfe000000); #endif - +//ZTE_BOOT_HUANGYJ_20100816_01 end } //ruanmeisi @@ -4176,7 +4336,7 @@ MACHINE_START(BLADE, "blade") #endif .boot_params = PHYS_OFFSET + 0x100, #ifdef CONFIG_ZTE_PLATFORM - .fixup = zte_fixup, + .fixup = zte_fixup, #endif .map_io = msm7x2x_map_io, .init_irq = msm7x2x_init_irq, diff --git a/arch/arm/mach-msm/include/mach/msm_battery.h b/arch/arm/mach-msm/include/mach/msm_battery.h index 92daea09..41b1c016 100644 --- a/arch/arm/mach-msm/include/mach/msm_battery.h +++ b/arch/arm/mach-msm/include/mach/msm_battery.h @@ -33,6 +33,7 @@ #define AC_CHG 0x00000001 #define USB_CHG 0x00000002 +#define CARKIT_CHG 0x00000004 struct msm_psy_batt_pdata { u32 voltage_max_design; diff --git a/arch/arm/mach-msm/pm2.c b/arch/arm/mach-msm/pm2.c index cf2bee6d..eef66f79 100644 --- a/arch/arm/mach-msm/pm2.c +++ b/arch/arm/mach-msm/pm2.c @@ -216,6 +216,7 @@ static ssize_t msm_pm_mode_attr_show( break; } + if (ret > 0) { strcat(buf, "\n"); ret++; @@ -985,10 +986,7 @@ void zte_update_lateresume_2_earlysuspend_time(bool resume_or_earlysuspend) // L } } -unsigned pm_modem_sleep_time_get(void) -{ - return 0; - } +extern unsigned pm_modem_sleep_time_get(void); /*BEGIN LHX_PM_20110324_01 add code to record how long the APP sleeps or keeps awake*/ struct timespec time_updated_when_sleep_awake; void record_sleep_awake_time(bool record_sleep_awake) @@ -1839,8 +1837,12 @@ static uint32_t restart_reason = 0x776655AA; static void msm_pm_power_off(void) { + unsigned int subid=14; msm_rpcrouter_close(); + printk("msm_pm_power_off, set pwrdwn flag\n"); + msm_proc_comm(PCOM_CUSTOMER_CMD3,0, &subid); msm_proc_comm(PCOM_POWER_DOWN, 0, 0); + printk("msm_pm_power_off, waiting POWEROFF\n"); for (;;) ; } diff --git a/arch/arm/mach-msm/qdsp5/adsp.c b/arch/arm/mach-msm/qdsp5/adsp.c index 39a6622b..4579dd38 100644 --- a/arch/arm/mach-msm/qdsp5/adsp.c +++ b/arch/arm/mach-msm/qdsp5/adsp.c @@ -27,7 +27,9 @@ /*=========================================================================== when who what, where, why comment tag -------- ---- ------------------------------------- ---------------------------------- - +2010-3-27 chenjun fix CRDB00480356 ZTE_Audio_CJ_100327 +2010-1-16 chenjun add adsp wakelock debug log ZTE_CJ_adsp_wakelock_100116 +2010-2-2 chenjun fix CRDB00443050 ZTE_CJ_CRDB00443050 ===========================================================================*/ #include @@ -43,6 +45,7 @@ when who what, where, why #include static struct wake_lock adsp_wake_lock; +/* ZTE_CJ_CRDB00443050, chenjun, 2010-2-2, start */ static inline void prevent_suspend(void) { if (!wake_lock_active(&adsp_wake_lock)) @@ -68,6 +71,7 @@ void suspend_allow_suspend(void) allow_suspend(); MM_INFO("chenjun:patch:suspend_allow_suspend\n"); } +/* ZTE_CJ_CRDB00443050, chenjun, 2010-2-2, end */ #include #include @@ -492,8 +496,10 @@ int __msm_adsp_write(struct msm_adsp_module *module, unsigned dsp_queue_addr, while ((readl(info->write_ctrl) & ADSP_RTOS_WRITE_CTRL_WORD_MUTEX_M) == ADSP_RTOS_WRITE_CTRL_WORD_MUTEX_NAVAIL_V) { +/* ZTE_CJ_CRDB00483425, chenjun, 2010-4-15, start */ // if (cnt > 2500) { if (cnt > (2500 * 4)) { +/* ZTE_CJ_CRDB00483425, chenjun, 2010-4-15, end */ MM_ERR("timeout waiting for adsp ack\n"); MM_ERR("chenjun:ack:write_ctrl = %#x\n", readl(info->write_ctrl)); ret_status = -EIO; @@ -1024,7 +1030,9 @@ int msm_adsp_enable(struct msm_adsp_module *module) MM_INFO("enable '%s'state[%d] id[%d]\n", module->name, module->state, module->id); +/* ZTE_CJ_adsp_wakelock_100116, chenjun, 2010-1-16, start */ MM_INFO("chenjun:adsp_open_count=%d\n", adsp_open_count); +/* ZTE_CJ_adsp_wakelock_100116, chenjun, 2010-1-16, end */ mutex_lock(&module->lock); switch (module->state) { case ADSP_STATE_DISABLED: @@ -1034,6 +1042,7 @@ int msm_adsp_enable(struct msm_adsp_module *module) break; module->state = ADSP_STATE_ENABLING; mutex_unlock(&module->lock); +/* ZTE_Audio_CJ_100327, chenjun, 2010-3-27, start */ #if 0 /* 这里的超时会导致 @@ -1047,6 +1056,7 @@ W/AudioTrack( 1898): obtainBuffer timed out (is the CPU pegged?)... module->state != ADSP_STATE_ENABLING, 5 * HZ); #endif +/* ZTE_Audio_CJ_100327, chenjun, 2010-3-27, end */ mutex_lock(&module->lock); if (module->state == ADSP_STATE_ENABLED) { rc = 0; @@ -1098,17 +1108,23 @@ static int msm_adsp_disable_locked(struct msm_adsp_module *module) { int rc = 0; +/* ZTE_CJ_adsp_wakelock_100116, chenjun, 2010-1-16, start */ MM_INFO("chenjun:disable_locked:'%s'state[%d]:id[%d]:adsp_open_count=%d\n", module->name, module->state, module->id, adsp_open_count); +/* ZTE_CJ_adsp_wakelock_100116, chenjun, 2010-1-16, end */ switch (module->state) { case ADSP_STATE_DISABLED: MM_DBG("module '%s' already disabled\n", module->name); +/* ZTE_CJ_adsp_wakelock_100116, chenjun, 2010-1-16, start */ MM_INFO("chenjun:module '%s' already disabled\n", module->name); +/* ZTE_CJ_adsp_wakelock_100116, chenjun, 2010-1-16, end */ break; case ADSP_STATE_ENABLING: case ADSP_STATE_ENABLED: +/* ZTE_CJ_adsp_wakelock_100116, chenjun, 2010-1-16, start */ MM_INFO("chenjun:module'%s' to disabled\n", module->name); +/* ZTE_CJ_adsp_wakelock_100116, chenjun, 2010-1-16, end */ rc = rpc_adsp_rtos_app_to_modem(RPC_ADSP_RTOS_CMD_DISABLE, module->id, module); module->state = ADSP_STATE_DISABLED; @@ -1121,7 +1137,9 @@ static int msm_adsp_disable_locked(struct msm_adsp_module *module) MM_INFO("disable interrupt\n"); } mutex_unlock(&adsp_open_lock); +/* ZTE_CJ_adsp_wakelock_100116, chenjun, 2010-1-16, start */ MM_INFO("chenjun:adsp_open_count=%d\n", adsp_open_count); +/* ZTE_CJ_adsp_wakelock_100116, chenjun, 2010-1-16, end */ } return rc; } diff --git a/arch/arm/mach-msm/qdsp5/audio_aac.c b/arch/arm/mach-msm/qdsp5/audio_aac.c index 2545243a..803046c8 100644 --- a/arch/arm/mach-msm/qdsp5/audio_aac.c +++ b/arch/arm/mach-msm/qdsp5/audio_aac.c @@ -16,6 +16,11 @@ * GNU General Public License for more details. * */ +/*=========================================================================== +when who what, where, why comment tag +-------- ---- ------------------------------------- ---------------------------------- +2010-2-2 chenjun fix CRDB00443050 ZTE_CJ_CRDB00443050 +===========================================================================*/ #include #include @@ -1474,6 +1479,7 @@ static void audaac_post_event(struct audio *audio, int type, } #ifdef CONFIG_HAS_EARLYSUSPEND +/* ZTE_CJ_CRDB00443050, chenjun, 2010-2-2, start */ static void audaac_suspend(struct early_suspend *h) { struct audaac_suspend_ctl *ctl = @@ -1495,6 +1501,7 @@ static void audaac_resume(struct early_suspend *h) audaac_post_event(ctl->audio, AUDIO_EVENT_RESUME, payload); resume_prevent_suspend(); } +/* ZTE_CJ_CRDB00443050, chenjun, 2010-2-2, end */ #endif #ifdef CONFIG_DEBUG_FS diff --git a/arch/arm/mach-msm/qdsp5/snd.c b/arch/arm/mach-msm/qdsp5/snd.c index 2cb035bd..a287f11c 100755 --- a/arch/arm/mach-msm/qdsp5/snd.c +++ b/arch/arm/mach-msm/qdsp5/snd.c @@ -17,7 +17,15 @@ */ /*=========================================================================== - +when who what, where, why comment tag +-------- ---- ------------------------------------- ---------------------------------- +2011--3-2 chenjun fix CRDB00616634 ZTE_Audio_CJ_110302 +2010-08-31 yangxs modify for fm to save power ZTE_FM_YXS_20100831 +2010-5-17 chenjun fix CRDB00480912 ZTE_Audio_CJ_100511 +2010-1-25 chenjun add snd debug info ZTE_Audio_DEBUG_CJ_100125 +2009-12-17 chenjun modify for snd debug ZTE_Audio_DEBUG_CJ_091217 +2009-11-8 chenjun add audio loopback ZTE_Audio-LB_CJ_1 +2009-11-10 chenjun add snd debug info ZTE_Audio-DEBUG_CJ_1 ===========================================================================*/ #include @@ -33,7 +41,12 @@ #include #include #include +/* ZTE_Audio_CJ_100302, chenjun, 2010-3-2, start */ +// 2010-3-2:this file merged from 4735 +/* ZTE_Audio-DEBUG_CJ_1, chenjun, 2009-11-6, start */ #include +/* ZTE_Audio-DEBUG_CJ_1, chenjun, 2009-11-6, end */ +/* ZTE_Audio_CJ_100302, chenjun, 2010-3-2, end */ struct snd_ctxt { struct mutex lock; @@ -41,7 +54,9 @@ struct snd_ctxt { struct msm_rpc_endpoint *ept; struct msm_snd_endpoints *snd_epts; +/* ZTE_Audio-DEBUG_CJ_1, chenjun, 2009-11-6, start */ struct switch_dev snd_dev_info; +/* ZTE_Audio-DEBUG_CJ_1, chenjun, 2009-11-6, end */ }; struct snd_sys_ctxt { @@ -53,11 +68,13 @@ static struct snd_sys_ctxt the_snd_sys; static struct snd_ctxt the_snd; +/* ZTE_Audio-DEBUG_CJ_1, chenjun, 2009-11-6, start */ #define SND_DEV 0 #define EAR_MUTE 1 #define MIC_MUTE 2 #define SND_DEV_INFO_NUM 3 static int keep_snd_dev_info[SND_DEV_INFO_NUM] = {0, 0, 0}; +/* ZTE_Audio-DEBUG_CJ_1, chenjun, 2009-11-6, end */ #define RPC_SND_PROG 0x30000002 #define RPC_SND_CB_PROG 0x31000002 @@ -68,11 +85,17 @@ static int keep_snd_dev_info[SND_DEV_INFO_NUM] = {0, 0, 0}; #define SND_SET_VOLUME_PROC 3 #define SND_AVC_CTL_PROC 29 #define SND_AGC_CTL_PROC 30 +/* ZTE_Audio-LB_CJ_1 chenjun 2009-10-28 start */ #define SND_AUDIO_LOOPBACK_PROC 37 +/* ZTE_Audio-LB_CJ_1 chenjun 2009-10-28 end */ +/* ZTE_Audio_CJ_100511, chenjun, 2010-5-11, start */ #define SND_HPH_AMP_CTL_PROC 38 +/* ZTE_Audio_CJ_100511, chenjun, 2010-5-11, end */ +/* ZTE_FM_YXS_20100831 start */ #define SND_DEVICE_FM_STEREO_HEADSET_ZTE 32 #define SND_SET_FM_HEADSET_DEVICE_PROC 41 +/* ZTE_FM_YXS_20100831 end */ struct rpc_snd_set_device_args { uint32_t device; @@ -105,17 +128,21 @@ struct rpc_snd_agc_ctl_args { }; +/* ZTE_Audio-LB_CJ_1 chenjun 2009-10-28 start */ struct rpc_snd_lb_ctl_args { uint32_t lb_ctl; uint32_t cb_func; uint32_t client_data; }; +/* ZTE_Audio-LB_CJ_1 chenjun 2009-10-28 end */ +/* ZTE_Audio_CJ_100511, chenjun, 2010-5-11, start */ struct rpc_snd_hph_amp_ctl_args { uint32_t amp_ctl; uint32_t cb_func; uint32_t client_data; }; +/* ZTE_Audio_CJ_100511, chenjun, 2010-5-11, end */ struct snd_set_device_msg { struct rpc_request_hdr hdr; @@ -138,15 +165,19 @@ struct snd_agc_ctl_msg { }; +/* ZTE_Audio-LB_CJ_1 chenjun 2009-10-28 start */ struct snd_set_lb_msg { struct rpc_request_hdr hdr; struct rpc_snd_lb_ctl_args args; }; +/* ZTE_Audio-LB_CJ_1 chenjun 2009-10-28 end */ +/* ZTE_Audio_CJ_100511, chenjun, 2010-5-11, start */ struct snd_hph_amp_msg { struct rpc_request_hdr hdr; struct rpc_snd_hph_amp_ctl_args args; }; +/* ZTE_Audio_CJ_100511, chenjun, 2010-5-11, end */ struct snd_endpoint *get_snd_endpoints(int *size); @@ -191,7 +222,9 @@ static long snd_ioctl(struct file *file, unsigned int cmd, unsigned long arg) struct snd_set_volume_msg vmsg; struct snd_avc_ctl_msg avc_msg; struct snd_agc_ctl_msg agc_msg; +/* ZTE_Audio-LB_CJ_1 chenjun 2009-10-28 start */ struct snd_set_lb_msg lb_msg; +/* ZTE_Audio-LB_CJ_1 chenjun 2009-10-28 end */ struct msm_snd_device_config dev; struct msm_snd_volume_config vol; @@ -199,7 +232,9 @@ static long snd_ioctl(struct file *file, unsigned int cmd, unsigned long arg) int rc = 0; uint32_t avc, agc; +/* ZTE_Audio-LB_CJ_1 chenjun 2009-10-28 start */ uint32_t set_lb; +/* ZTE_Audio-LB_CJ_1 chenjun 2009-10-28 end */ mutex_lock(&snd->lock); switch (cmd) { @@ -225,6 +260,7 @@ static long snd_ioctl(struct file *file, unsigned int cmd, unsigned long arg) MM_INFO("snd_set_device %d %d %d\n", dev.device, dev.ear_mute, dev.mic_mute); + /* ZTE_FM_YXS_20100831 start */ #if 0 rc = msm_rpc_call(snd->ept, SND_SET_DEVICE_PROC, @@ -245,12 +281,17 @@ static long snd_ioctl(struct file *file, unsigned int cmd, unsigned long arg) &dmsg, sizeof(dmsg), 5 * HZ); } #endif + /* ZTE_FM_YXS_20100831 end */ +/* ZTE_Audio_DEBUG_CJ_091217, chenjun, 2009-12-17, start */ +/* ZTE_Audio-DEBUG_CJ_1, chenjun, 2009-11-6, start */ if (dev.device != 28) { keep_snd_dev_info[SND_DEV] = dev.device; } keep_snd_dev_info[EAR_MUTE] = dev.ear_mute; keep_snd_dev_info[MIC_MUTE] = dev.mic_mute; +/* ZTE_Audio-DEBUG_CJ_1, chenjun, 2009-11-6, end */ +/* ZTE_Audio_DEBUG_CJ_091217, chenjun, 2009-12-17, end */ break; case SND_SET_VOLUME: @@ -332,6 +373,7 @@ static long snd_ioctl(struct file *file, unsigned int cmd, unsigned long arg) break; +/* ZTE_Audio-LB_CJ_1 chenjun 2009-10-28 start */ case SND_SET_AUDIO_LOOPBACK: if (get_user(set_lb, (uint32_t __user *) arg)) { rc = -EFAULT; @@ -352,6 +394,7 @@ static long snd_ioctl(struct file *file, unsigned int cmd, unsigned long arg) SND_AUDIO_LOOPBACK_PROC, &lb_msg, sizeof(lb_msg), 5 * HZ); break; +/* ZTE_Audio-LB_CJ_1 chenjun 2009-10-28 end */ default: MM_ERR("unknown command\n"); @@ -360,7 +403,9 @@ static long snd_ioctl(struct file *file, unsigned int cmd, unsigned long arg) } mutex_unlock(&snd->lock); +/* ZTE_Audio_DEBUG_CJ_100125, chenjun, 2010-1-25, start */ MM_INFO("chenjun:rc = %d\n", rc); +/* ZTE_Audio_DEBUG_CJ_100125, chenjun, 2010-1-25, end */ return rc; } @@ -413,6 +458,7 @@ static int snd_open(struct inode *inode, struct file *file) snd->opened = 1; } else { MM_ERR("snd already opened\n"); +/* ZTE_Audio_CJ_110302, chenjun, 2011-03-02, start */ #if 0 rc = -EBUSY; #else @@ -430,6 +476,7 @@ static int snd_open(struct inode *inode, struct file *file) snd->opened = 1; MM_ERR("chenjun:reuse opened-snd\n"); #endif +/* ZTE_Audio_CJ_110302, chenjun, 2011-03-02, end */ } err: @@ -686,6 +733,7 @@ static ssize_t snd_vol_store(struct device *dev, return status ? : size; } +/* ZTE_Audio_CJ_100511, chenjun, 2010-5-11, start */ int snd_hph_amp_ctl(uint32_t on) { struct snd_ctxt *snd = &the_snd; @@ -708,6 +756,7 @@ int snd_hph_amp_ctl(uint32_t on) return rc; } +/* ZTE_Audio_CJ_100511, chenjun, 2010-5-11, end */ static DEVICE_ATTR(agc, S_IWUSR | S_IRUGO, NULL, snd_agc_store); @@ -721,6 +770,7 @@ static DEVICE_ATTR(device, S_IWUSR | S_IRUGO, static DEVICE_ATTR(volume, S_IWUSR | S_IRUGO, NULL, snd_vol_store); +/* ZTE_Audio-DEBUG_CJ_1, chenjun, 2009-11-6, start */ static ssize_t print_snd_dev_name(struct switch_dev *sdev, char *buf) { return sprintf(buf, "%s\n", "dev,ear_mute,mic_mute"); @@ -730,6 +780,7 @@ static ssize_t print_snd_dev_state(struct switch_dev *sdev, char *buf) { return sprintf(buf, "%d,%d,%d\n", keep_snd_dev_info[SND_DEV], keep_snd_dev_info[EAR_MUTE], keep_snd_dev_info[MIC_MUTE]); } +/* ZTE_Audio-DEBUG_CJ_1, chenjun, 2009-11-6, end */ static int snd_probe(struct platform_device *pdev) { @@ -780,12 +831,14 @@ static int snd_probe(struct platform_device *pdev) misc_deregister(&snd_misc); } +/* ZTE_Audio-DEBUG_CJ_1, chenjun, 2009-11-6, start */ snd->snd_dev_info.name = "snd_debug"; snd->snd_dev_info.print_name = print_snd_dev_name; snd->snd_dev_info.print_state = print_snd_dev_state; rc = switch_dev_register(&snd->snd_dev_info); if (rc < 0) switch_dev_unregister(&snd->snd_dev_info); +/* ZTE_Audio-DEBUG_CJ_1, chenjun, 2009-11-6, end */ return rc; } diff --git a/arch/arm/mach-msm/smd_pkt.c b/arch/arm/mach-msm/smd_pkt.c index cf7d3e93..290837d7 100644 --- a/arch/arm/mach-msm/smd_pkt.c +++ b/arch/arm/mach-msm/smd_pkt.c @@ -43,7 +43,7 @@ #include "modem_notifier.h" #include "smd_private.h" -#define NUM_SMD_PKT_PORTS 11 +#define NUM_SMD_PKT_PORTS 12 #define DEVICE_NAME "smdpkt" struct smd_pkt_dev { @@ -458,6 +458,7 @@ static char *smd_pkt_dev_name[] = { "smd22", "smd_sns_dsps", "smd_pkt_loopback", + "smdcsdata", }; static char *smd_ch_name[] = { @@ -472,6 +473,7 @@ static char *smd_ch_name[] = { "DATA22", "SENSOR", "LOOPBACK", + "DATA11" }; static uint32_t smd_ch_edge[] = { @@ -486,6 +488,7 @@ static uint32_t smd_ch_edge[] = { SMD_APPS_MODEM, SMD_APPS_DSPS, SMD_APPS_MODEM, + SMD_APPS_MODEM, }; static int smd_pkt_dummy_probe(struct platform_device *pdev) diff --git a/arch/arm/mach-msm/smd_rpcrouter.c b/arch/arm/mach-msm/smd_rpcrouter.c index d4562e7c..4d071a4d 100644 --- a/arch/arm/mach-msm/smd_rpcrouter.c +++ b/arch/arm/mach-msm/smd_rpcrouter.c @@ -1270,6 +1270,17 @@ static int msm_rpc_write_pkt( spin_unlock_irqrestore(&r_ept->quota_lock, flags); xprt_info = rpcrouter_get_xprt_info(hdr->dst_pid); + /* + * xprt_info is null when called smd_rpcrouter_close() + * Must have a check to fix this NULL pointer problem. + * ZHENGCHAO_PM_20110726 + * + * */ + if (!xprt_info){ + printk(KERN_ERR"xprt_info is NULL\n"); + return 0; + + } spin_lock_irqsave(&xprt_info->lock, flags); spin_lock(&ept->restart_lock); @@ -2079,6 +2090,11 @@ int msm_rpcrouter_close(void) rpcrouter_send_control_msg(xprt_info, &ctl); xprt_info->xprt->close(); list_del(&xprt_info->list); + /* + ZHENGCHAO_PM_20110726 + Must do this.Wakelock must be destroyed before kfree + */ + wake_lock_destroy(&xprt_info->wakelock); kfree(xprt_info); } mutex_unlock(&xprt_info_list_lock); diff --git a/arch/arm/tools/mach-types b/arch/arm/tools/mach-types index 983a97fd..0a824c8a 100644 --- a/arch/arm/tools/mach-types +++ b/arch/arm/tools/mach-types @@ -2556,24 +2556,8 @@ qsd8x50_ffa MACH_QSD8X50_FFA QSD8X50_FFA 1008002 qsd8x50a_surf MACH_QSD8X50A_SURF QSD8X50A_SURF 1008003 qsd8x50a_ffa MACH_QSD8X50A_FFA QSD8X50A_FFA 1008004 msm8x60_rumi3 MACH_MSM8X60_RUMI3 MSM8X60_RUMI3 1009000 -raise MACH_RAISE RAISE 1009001 -mooncake MACH_MOONCAKE MOONCAKE 1009002 -joe MACH_JOE JOE 1009003 + blade MACH_BLADE BLADE 1009004 -smooth MACH_SMOOTH SMOOTH 1009005 -r750 MACH_R750 R750 1009006 -v9 MACH_V9 V9 1009007 -ibox MACH_IBOX IBOX 1009008 -amigo MACH_AMIGO AMIGO 1009009 -joecdma MACH_JOECDMA JOECDMA 1009010 -roamer MACH_ROAMER ROAMER 1009011 -skate MACH_SKATE SKATE 1009012 -nova MACH_NOVA NOVA 1009013 -sailboat MACH_SAILBOAT SAILBOAT 1009014 -turies MACH_TURIES TURIES 1009015 -racer2 MACH_RACER2 RACER2 1009016 -bluetick MACH_BLUETICK BLUETICK 1009017 -blade2 MACH_BLADE2 BLADE2 1009018 msm8x55_svlte_ffa MACH_MSM8X55_SVLTE_FFA MSM8X55_SVLTE_FFA 2863 msm8x55_svlte_surf MACH_MSM8X55_SVLTE_SURF MSM8X55_SVLTE_SURF 2864 diff --git a/drivers/bluetooth/bcm-power.c b/drivers/bluetooth/bcm-power.c index ef9f5b70..996c9302 100644 --- a/drivers/bluetooth/bcm-power.c +++ b/drivers/bluetooth/bcm-power.c @@ -20,7 +20,12 @@ * with interface to power management device */ - + /*----------------------------------------------------------------------------------------- + when who what, where, why comment tag + ---------- ------------- ------------------------------------- ------------------- +2011-01-26 xumei modified according to bluetooth-power of kernel 2.6.35 ZTE_BT_QXX_20101207 +2010-12-07 qxx compatible of qualcomm and broadcomm bluetooth chip ZTE_BT_QXX_20101207 +------------------------------------------------------------------------------------------*/ #include #include diff --git a/drivers/bluetooth/bcm_bluesleep.c b/drivers/bluetooth/bcm_bluesleep.c index a6a64f0c..29efbff0 100644 --- a/drivers/bluetooth/bcm_bluesleep.c +++ b/drivers/bluetooth/bcm_bluesleep.c @@ -23,7 +23,9 @@ Sleep-Mode Protocol from the Host side 2006-Sep-08 Motorola Added workqueue for handling sleep work. 2007-Jan-24 Motorola Added mbm_handle_ioi() call to ISR. - + 2010-Oct-25 qxx modify sleep control for broadcom bluetooth chip ZTE_BT_QXX_20101025 + 2010-12-07 qxx compatible of qualcomm and broadcomm bluetooth chip ZTE_BT_QXX_20101207 + 2011-03-14 qxx modify sleep control for broadcom BTLA bluetooth chip ZTE_BT_QXX_20110314 */ #include /* kernel module definitions */ @@ -191,7 +193,7 @@ static void bcmsleep_sleep_work(struct work_struct *work) return; } } else { - + //modify sleep control for broadcom bluetooth chip ZTE_BT_QXX_20101025 begin if (test_bit(BT_ASLEEP, &flags)) { bcmsleep_sleep_wakeup(); @@ -200,7 +202,7 @@ static void bcmsleep_sleep_work(struct work_struct *work) { mod_timer(&tx_timer, jiffies + (TX_TIMER_INTERVAL * HZ)); } - + //modify sleep control for broadcom bluetooth chip ZTE_BT_QXX_20101025 end } } @@ -238,10 +240,10 @@ static void bcmsleep_outgoing_data(void) /* if the tx side is sleeping... */ if (gpio_get_value(bsi->ext_wake)) { - +//modify sleep control for broadcom bluetooth chip ZTE_BT_QXX_20101025 begin gpio_set_value(bsi->ext_wake, 0); bcmsleep_sleep_wakeup(); - +//modify sleep control for broadcom bluetooth chip ZTE_BT_QXX_20101025 end } spin_unlock_irqrestore(&rw_lock, irq_flags); @@ -254,7 +256,7 @@ static void bcmsleep_outgoing_data(void) * @param data The HCI device associated with the event. * @return NOTIFY_DONE. */ - +//modify sleep control for broadcom BTLA bluetooth chip ZTE_BT_QXX_20110314 begin #ifdef CONFIG_BT_BCM_BTLA_SLEEP void bcmsleep_set_bsi(struct uart_port *); void bt_outgoing_data(void); @@ -274,7 +276,7 @@ void bt_outgoing_data(void) BT_DBG("[qxx] outgoing data\n"); } #endif - +//modify sleep control for broadcom BTLA bluetooth chip ZTE_BT_QXX_20110314 end static int bcmsleep_hci_event(struct notifier_block *this, unsigned long event, void *data) diff --git a/drivers/i2c/algos/i2c-algo-bit.c b/drivers/i2c/algos/i2c-algo-bit.c index f0e516df..293ec8fe 100644 --- a/drivers/i2c/algos/i2c-algo-bit.c +++ b/drivers/i2c/algos/i2c-algo-bit.c @@ -51,8 +51,9 @@ do {} while (0) #endif /* DEBUG */ +#if defined(CONFIG_MACH_SAILBOAT) && (defined(CONFIG_OVM7690) ||defined(CONFIG_MT9V113)) #define GPIO_SDA_PIN 93 - +#endif /* ----- global variables --------------------------------------------- */ static int bit_test; /* see if the line-setting functions work */ @@ -178,7 +179,6 @@ static int i2c_outb(struct i2c_adapter *i2c_adap, unsigned char c) sb = (c >> i) & 1; setsda(adap, sb); udelay((adap->udelay + 1) / 2); - if (sclhi(adap) < 0) { /* timed out */ bit_dbg(1, &i2c_adap->dev, "i2c_outb: 0x%02x, " "timeout at bit #%d\n", (int)c, i); @@ -192,14 +192,12 @@ static int i2c_outb(struct i2c_adapter *i2c_adap, unsigned char c) */ scllo(adap); } - -#if defined(CONFIG_MACH_SAILBOAT) +#if defined(CONFIG_MACH_SAILBOAT) && (defined(CONFIG_OVM7690) ||defined(CONFIG_MT9V113)) gpio_tlmm_config(GPIO_CFG(GPIO_SDA_PIN, 0, GPIO_INPUT, GPIO_NO_PULL, GPIO_2MA), GPIO_ENABLE); #else sdahi(adap); #endif - if (sclhi(adap) < 0) { /* timeout */ bit_dbg(1, &i2c_adap->dev, "i2c_outb: 0x%02x, " "timeout at ack\n", (int)c); @@ -214,11 +212,10 @@ sdahi(adap); ack ? "A" : "NA"); scllo(adap); -#if defined(CONFIG_MACH_SAILBOAT) +#if defined(CONFIG_MACH_SAILBOAT) && (defined(CONFIG_OVM7690) ||defined(CONFIG_MT9V113)) gpio_tlmm_config(GPIO_CFG(GPIO_SDA_PIN, 0, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_2MA), GPIO_ENABLE); #endif - return ack; /* assert: scl is low (sda undef) */ } @@ -233,8 +230,7 @@ static int i2c_inb(struct i2c_adapter *i2c_adap) struct i2c_algo_bit_data *adap = i2c_adap->algo_data; /* assert: scl is low */ - -#if defined(CONFIG_MACH_SAILBOAT) +#if defined(CONFIG_MACH_SAILBOAT) && (defined(CONFIG_OVM7690) ||defined(CONFIG_MT9V113)) gpio_tlmm_config(GPIO_CFG(GPIO_SDA_PIN, 0, GPIO_INPUT, GPIO_NO_PULL, GPIO_2MA), GPIO_ENABLE); #else @@ -251,17 +247,14 @@ static int i2c_inb(struct i2c_adapter *i2c_adap) indata |= 0x01; setscl(adap, 0); udelay(i == 7 ? adap->udelay / 2 : adap->udelay); - } /* assert: scl is low */ - -#if defined(CONFIG_MACH_SAILBOAT) +#if defined(CONFIG_MACH_SAILBOAT) && (defined(CONFIG_OVM7690) ||defined(CONFIG_MT9V113)) sdahi(adap); gpio_tlmm_config(GPIO_CFG(GPIO_SDA_PIN, 0, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_2MA), GPIO_ENABLE); //for testing #endif - return indata; } diff --git a/drivers/i2c/chips/Kconfig b/drivers/i2c/chips/Kconfig index 584db115..658ec088 100644 --- a/drivers/i2c/chips/Kconfig +++ b/drivers/i2c/chips/Kconfig @@ -30,6 +30,27 @@ config GSENSORS_FROM_AUXI2C_TO_I2C help Here is one feature to match hardware ,used by fya. +config SENSORS_ONA3301 + tristate "ONA3301 ambient light sensor" + depends on EXPERIMENTAL + help + If you say yes here you get support for the ONA3301 + ambient light sensor. + + This driver can also be built as a module. If so, the module + will be called ONA3301. + +config SENSORS_ISL29026 + tristate "ISL29026 ambient light sensor" + depends on EXPERIMENTAL + help + If you say yes here you get support for the ISL29026 + ambient light sensor. + + This driver can also be built as a module. If so, the module + will be called ISL29026. + + config SENSORS_TSL2550 tristate "Taos TSL2550 ambient light sensor" depends on EXPERIMENTAL diff --git a/drivers/i2c/chips/Makefile b/drivers/i2c/chips/Makefile index ceba3893..78f48a7d 100644 --- a/drivers/i2c/chips/Makefile +++ b/drivers/i2c/chips/Makefile @@ -22,6 +22,8 @@ obj-$(CONFIG_VP_A1026) += a1026.o obj-$(CONFIG_SENSOR_ADXL34X) += adxl34x.o obj-$(CONFIG_SENSOR_ACCELERATOR) += accelerator.o obj-$(CONFIG_SENSORS_BH1721) += bh1721.o +obj-$(CONFIG_SENSORS_ONA3301) += ONA3301.o +obj-$(CONFIG_SENSORS_ISL29026) += isl29026.o obj-$(CONFIG_SENSORS_TSL2771) += taos.o obj-$(CONFIG_SENSOR_LIS302DL) += lis302dl.o obj-$(CONFIG_NFC_PN544) += pn544.o diff --git a/drivers/i2c/chips/ONA3301.c b/drivers/i2c/chips/ONA3301.c new file mode 100644 index 00000000..8db96bd2 --- /dev/null +++ b/drivers/i2c/chips/ONA3301.c @@ -0,0 +1,1453 @@ +/****************************************************************** +*File Name: ONA3301.c * +*Description: Linux device driver for ONA ambient light and * +* proximity sensors. * +******************************************************************* +Geschichte: +Wenn Wer Was Tag +2011-11-15 wanglg create + +******************************************************************/ +// includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include //copy to linux/i2c +#include +#include + + +#define ONA_INT_GPIO 42 +#define ONA_TAG "[ONA]" + +// device name/id/address/counts +#define ONA_DEVICE_NAME "ona3301" +#define ONA_DEVICE_ID "ONA" +#define ONA_ID_NAME_SIZE 10 + +#define ONA_MAX_NUM_DEVICES 3 + +/*************************************************/ +// Register Definitions +#define NAOCHIP_REG_NUM 24 +#define NOACHIP_VENDOR 0x0001 +/* PART_ID */ +#define NOACHIP_PART 0x90 /* needs to be set to the correct part id */ +#define NOACHIP_PART_MASK 0xf0 +#define NOACHIP_REV_MASK 0x0f +#define NOACHIP_REV_SHIFT 0 +#define NOACHIP_REV_0 0x00 + +/* Operating modes for both */ +#define NOACHIP_STANDBY 0x00 +#define NOACHIP_PS_ONESHOT 0x01 +#define NOACHIP_PS_REPEAT 0x02 + +#define NOACHIP_TRIG_MEAS 0x01 + + +/* Interrupt control */ +#define NOACHIP_INT_LEDS_INT_HI (1 << 1) +#define NOACHIP_INT_LEDS_INT_LO (1 << 0) +#define NOACHIP_INT_ALS_INT_HI (1 << 2) +#define NOACHIP_INT_ALS_INT_LO (1 << 3) +#define NOACHIP_INT_EXTERNAL (1 << 4) + +#define NOACHIP_DISABLE 0 +#define NOACHIP_ENABLE 3 + +enum noa_regs { + NOACHIP_PART_ID, + NOACHIP_RESET, + NOACHIP_INT_CONFIG, + NOACHIP_PS_LED_CURRENT, + NOACHIP_PS_FILTER_CONFIG, + NOACHIP_PS_CONFIG, + NOACHIP_PS_TH_UP_MSB, + NOACHIP_PS_TH_UP_LSB, + NOACHIP_PS_TH_LO_MSB, + NOACHIP_PS_TH_LO_LSB, + NOACHIP_PS_MEAS_INTERVAL, + NOACHIP_PS_CONTROL, + NOACHIP_ALS_TH_UP_MSB, + NOACHIP_ALS_TH_UP_LSB, + NOACHIP_ALS_TH_LO_MSB, + NOACHIP_ALS_TH_LO_LSB, + NOACHIP_ALS_CONFIG, + NOACHIP_ALS_MEAS_INTERVAL, + NOACHIP_ALS_CONTROL, + NOACHIP_INTERRUPT, + NOACHIP_PS_DATA_MSB, + NOACHIP_PS_DATA_LSB, + NOACHIP_ALS_DATA_MSB, + NOACHIP_ALS_DATA_LSB +}; + +static const char noa_regmap[]={ + [NOACHIP_PART_ID] = 0x00, /* Part number and revision ID */ + [NOACHIP_RESET] = 0x01, /* Reset */ + [NOACHIP_INT_CONFIG] = 0x02, /* Interrupt pin function control settings */ + [NOACHIP_PS_LED_CURRENT] = 0x0F, /* Set PS LED Current */ + [NOACHIP_PS_FILTER_CONFIG] = 0x14, /* Sets N and M setting for PS fileter */ + [NOACHIP_PS_CONFIG] = 0x15, /* PS Range and intergration time */ + [NOACHIP_PS_TH_UP_MSB] = 0x10, /* PS interrupt upper threshold, MSB */ + [NOACHIP_PS_TH_UP_LSB] = 0x11, /* PS interrupt upper threshold, LSB */ + [NOACHIP_PS_TH_LO_MSB] = 0x12, /* PS interrupt lower threshold, MSB */ + [NOACHIP_PS_TH_LO_LSB] = 0x13, /* PS interrupt lower threshold, LSB */ + [NOACHIP_PS_MEAS_INTERVAL] = 0x16, /* PS meas. interval at stand alone mode */ + [NOACHIP_PS_CONTROL] = 0x17, /* PS operation mode control 0x02 = PS_Repeat, 0x01=PS_OneShot */ + [NOACHIP_ALS_TH_UP_MSB] = 0x20, /* ALS upper threshold MSB */ + [NOACHIP_ALS_TH_UP_LSB] = 0x21, /* ALS upper threshold LSB */ + [NOACHIP_ALS_TH_LO_MSB] = 0x22, /* ALS lower threshold MSB */ + [NOACHIP_ALS_TH_LO_LSB] = 0x23, /* ALS lower threshold LSB */ + [NOACHIP_ALS_CONFIG] = 0x25, /* ALS intergration time */ + [NOACHIP_ALS_MEAS_INTERVAL] = 0x26, /* ALS meas. interval at stand alone mode */ + [NOACHIP_ALS_CONTROL] = 0x27, /* ALS operation mode control */ + [NOACHIP_INTERRUPT] = 0x40, /* Interrupt status */ + [NOACHIP_PS_DATA_MSB] = 0x41, /* PS DATA MSB */ + [NOACHIP_PS_DATA_LSB] = 0x42, /* PS DATA LSB */ + [NOACHIP_ALS_DATA_MSB] = 0x43, /* ALS DATA high byte */ + [NOACHIP_ALS_DATA_LSB] = 0x44 /* ALS DATA low byte */ +}; + +/* led_max_curr is a safetylimit for IR leds */ +#define NOA3402_LED_5mA 0 +#define NOA3402_LED_10mA 1 +#define NOA3402_LED_15mA 2 +#define NOA3402_LED_20mA 3 +#define NOA3402_LED_25mA 4 +#define NOA3402_LED_30mA 5 +#define NOA3402_LED_35mA 6 +#define NOA3402_LED_40mA 7 +#define NOA3402_LED_45mA 8 +#define NOA3402_LED_50mA 9 +#define NOA3402_LED_55mA 10 +#define NOA3402_LED_60mA 11 +#define NOA3402_LED_65mA 12 +#define NOA3402_LED_70mA 13 +#define NOA3402_LED_75mA 14 +#define NOA3402_LED_80mA 15 +#define NOA3402_LED_85mA 16 +#define NOA3402_LED_90mA 17 +#define NOA3402_LED_95mA 18 +#define NOA3402_LED_100mA 19 +#define NOA3402_LED_105mA 20 +#define NOA3402_LED_110mA 21 +#define NOA3402_LED_115mA 22 +#define NOA3402_LED_120mA 23 +#define NOA3402_LED_125mA 24 +#define NOA3402_LED_130mA 25 +#define NOA3402_LED_135mA 26 +#define NOA3402_LED_140mA 27 +#define NOA3402_LED_145mA 28 +#define NOA3402_LED_150mA 29 +#define NOA3402_LED_155mA 30 +#define NOA3402_LED_160mA 31 +//#define NOA3402_INT_CONFIG 0x01 // interrupt pin active till cleared, active high +#define NOA3402_INT_CONFIG 0x00 // interrupt pin active till cleared, active low +#define NOA3402_PWM_SENS 0x00 // Standard: 0x00=standard, 0x01=1/2, 0x10=1/4, 0x11=1/8 +#define NOA3402_PWM_RES 0x01 // 8bit: 0x00=7bit, 0x01=7bit, 0x10=9bit, 0x11=10bit +#define NOA3402_PWM_ENABLE 0x00 // not enabled. +#define NOA3402_PWM_POLARITY 0x01 // Positive: 0x00=neg, 0x01=pos +#define NOA3402_PWM_TYPE 0x01 // log: 0x00=lin,0x01=log +#define NOA3402_ALS_HYST_TRIGGER (1<<4) // Upper: 0x00=Lowwer, 0x01=Upper +#define NOA3402_ALS_HYST_ENABLE 0x00 // Disabled 0x00=Disabled, 0x01=Enabled +#define NOA3402_ALS_INTEGRATION_TIME 0X04 //100ms: 0x000=6.25ms, 0x001=12.5ms,0x010=25ms,0x011=50ms,0x100=200ms,0x110=400,0x111=800ms +#define NOA3402_ALS_THRES_LO 0 +#define NOA3402_ALS_THRES_UP 65535 +#define NOA3402_ALS_CONTROL 0x02 // Repeat Mode 0x01=One Shot +#define NOA3402_ALS_INTERVAL 500 // Valid values 0 - 3150 in steps of 50. + +#define NOA3402_PS_FILTER_M 1 // 1 - 15 +#define NOA3402_PS_FILTER_N (1<<4) // 1 - 15 +#define NOA3402_PS_INTEGRATION_TIME 0x20 // 300us: 0x00=75us, 0x01=150us, 0x10=300us, 0x11=600us +#define NOA3402_PS_HYST_TRIGGER (1<<4) // Upper: 0x00=Lowwer, 0x01=Upper +#define NOA3402_PS_HYST_ENABLE 0x00 // Disabled 0x00=Disabled, 0x01=Enabled +#define NOA3402_PS_THRES_LO 1200 +#define NOA3402_PS_THRES_UP 1500 +#define NOA3402_PS_INTERVAL 100 // 100ms: Valid values 0 - 3150 in steps of 50. +#define NOA3402_PS_LED_CURRENT 0x10 // 85ma NOA3402_PS_LED_CURRENT * 5 + 5 +#define NOA3402_PS_MODE NOACHIP_PS_REPEAT + +/*************************************************/ + +// lux constants +#define ONA_MAX_LUX 65535000 +//#define ONA_SCALE_MILLILUX 3 +#define ONA_FILTER_DEPTH 3 +#define THRES_LO_TO_HI_RATIO 4/5 + +// forward declarations +static int ONA_probe(struct i2c_client *clientp, const struct i2c_device_id *idp); +static int ONA_remove(struct i2c_client *client); +static int ONA_open(struct inode *inode, struct file *file); +static int ONA_release(struct inode *inode, struct file *file); +static int ONA_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg); +static int ONA_read(struct file *file, char *buf, size_t count, loff_t *ppos); +static int ONA_write(struct file *file, const char *buf, size_t count, loff_t *ppos); +static loff_t ONA_llseek(struct file *file, loff_t offset, int orig); +static int ONA_get_lux(void); +static int ONA_device_name(unsigned char *bufp, char **device_name); +static int ONA_prox_poll(struct PS_ALS_prox_info *prxp); + +static void do_ONA_work(struct work_struct *w); +static void ONA_report_value(int mask); +static int calc_distance(int value); +static int enable_light_and_proximity(int mask); +static int light_on=0; +static int prox_on = 0; + +enum ONA_chip_type { + ONA3301 = 0, + ONA3302, +}; + +struct alsprox_data { + struct input_dev *input_dev; +}; + +static struct alsprox_data *light; +static struct alsprox_data *proximity; +// first device number +static dev_t ONA_dev_number; + +// class structure for this device +struct class *ONA_class; + +// module device table +static struct i2c_device_id ONA_idtable[] = { + {ONA_DEVICE_ID, 0}, + {} +}; +MODULE_DEVICE_TABLE(i2c, ONA_idtable); + + +// client and device +struct i2c_client *ONA_my_clientp; +struct i2c_client *ONA_bad_clientp[ONA_MAX_NUM_DEVICES]; +//static int num_bad = 0; +//static int device_found = 0; + +// driver definition +static struct i2c_driver ONA_driver = { + .driver = { + .owner = THIS_MODULE, + .name = "ona3301", + }, + .id_table = ONA_idtable, + .probe = ONA_probe, + .remove = __devexit_p(ONA_remove), +}; + + +struct ONA_intr_data { + int int_gpio; + int irq; +}; + +// per-device data +struct ONA_data { + struct i2c_client *client; + struct cdev cdev; + unsigned int addr; + char ONA_id; + char ONA_name[ONA_ID_NAME_SIZE]; + struct semaphore update_lock; + char valid; + unsigned long last_updated; + struct ONA_intr_data *pdata; + struct work_struct ONA_work; + enum ONA_chip_type chip_type; + struct mutex proximity_calibrating; +} *ONA_datap; + +static struct ONA_intr_data ONA_irq= { + .int_gpio = ONA_INT_GPIO, + .irq = MSM_GPIO_TO_INT(ONA_INT_GPIO), +}; + + +// file operations +static struct file_operations ONA_fops = { + .owner = THIS_MODULE, + .open = ONA_open, + .release = ONA_release, + .read = ONA_read, + .write = ONA_write, + .llseek = ONA_llseek, + .ioctl = ONA_ioctl, +}; + +// device configuration +struct PS_ALS_cfg *ONA_cfgp; +static u32 calibrate_target_param = 300000; +static u16 als_time_param = 27; +static u16 scale_factor_param = 1; +static u8 filter_history_param = 3; +static u8 filter_count_param = 1; +static u8 gain_param = 1; + +#if defined(CONFIG_MACH_BLADE) +static u16 gain_trim_param = 25; +#elif defined(CONFIG_MACH_RACER2) +static u16 gain_trim_param = 50; +#elif defined(CONFIG_MACH_SKATE) +static u16 gain_trim_param = 240; +#elif defined(CONFIG_MACH_ROAMER) +static u16 gain_trim_param = 5; +#elif defined(CONFIG_MACH_BLADE2) +static u16 gain_trim_param = 100; +#else +static u16 gain_trim_param = 25; //this value is set according to specific device +#endif + +static u16 prox_threshold_hi_param = 1500; +static u16 prox_threshold_lo_param = 1200; +static u8 prox_int_time_param = 0xF6; +static u8 prox_adc_time_param = 0xFF; +static u8 prox_wait_time_param = 0xFF; +static u8 prox_intr_filter_param = 0x00; +static u8 prox_config_param = 0x00; + +static u8 prox_pulse_cnt_param = 0x10; +static u8 prox_gain_param = 0x20; + +// device reg init values +//u8 ONA_triton_reg_init[16] = {0x00,0xFF,0XFF,0XFF,0X00,0X00,0XFF,0XFF,0X00,0X00,0XFF,0XFF,0X00,0X00,0X00,0X00}; + +// +static u16 als_intr_threshold_hi_param = 0; +static u16 als_intr_threshold_lo_param = 0; +int ONA_g_nlux = 0; + + + +// prox info +struct PS_ALS_prox_info ONA_prox_cal_info[20]; +struct PS_ALS_prox_info ONA_prox_cur_info; +struct PS_ALS_prox_info *ONA_prox_cur_infop = &ONA_prox_cur_info; + + +static int device_released = 0; +static u16 sat_als = 0; +static u16 sat_prox = 0; + +// lux time scale +struct time_scale_factor { + u16 numerator; + u16 denominator; + u16 saturation; +}; +struct time_scale_factor ONA_TritonTime = {1, 0, 0}; +struct time_scale_factor *ONA_lux_timep = &ONA_TritonTime; + +// gain table +u8 ONA_triton_gain_table[] = {1, 8, 16, 120}; + +// lux data +struct lux_data { + u16 ratio; + u16 clear; + u16 ir; +}; +struct lux_data ONA_TritonFN_lux_data[] = { + { 9830, 8320, 15360 }, + { 12452, 10554, 22797 }, + { 14746, 6234, 11430 }, + { 17695, 3968, 6400 }, + { 0, 0, 0 } +}; +struct lux_data *ONA_lux_tablep = ONA_TritonFN_lux_data; +static int lux_history[ONA_FILTER_DEPTH] = {-ENODATA, -ENODATA, -ENODATA}; + +//prox data +struct ONA_prox_data { + u16 ratio; + u16 hi; + u16 lo; +}; +struct ONA_prox_data ONA_prox_data[] = { + { 1, 22, 20 }, + { 3, 20, 16 }, + { 6, 18, 14 }, + { 10, 16, 16 }, + { 0, 0, 0 } +}; +struct ONA_prox_data *ONA_prox_tablep = ONA_prox_data; + + +/* ----------------------* +* config gpio for intr utility * +*-----------------------*/ +int ONA_config_int_gpio(int int_gpio) +{ + int rc=0; + uint32_t gpio_config_data = GPIO_CFG(int_gpio, 0, GPIO_INPUT, GPIO_PULL_UP, GPIO_2MA); + + rc = gpio_request(int_gpio, "gpio_sensor"); + if (rc) { + printk(ONA_TAG "%s: gpio_request(%#x)=%d\n", + __func__, int_gpio, rc); + return rc; + } + + rc = gpio_tlmm_config(gpio_config_data, GPIO_ENABLE); + if (rc) { + printk(ONA_TAG "%s: gpio_tlmm_config(%#x)=%d\n", + __func__, gpio_config_data, rc); + return rc; + } + + mdelay(1); + + rc = gpio_direction_input(int_gpio); + if (rc) { + printk(ONA_TAG "%s: gpio_direction_input(%#x)=%d\n", + __func__, int_gpio, rc); + return rc; + } + + return 0; +} + +/* ----------------------* +* ONA interrupt function * +*-----------------------*/ +static irqreturn_t ONA_interrupt(int irq, void *data) +{ + //printk(ONA_TAG "ONA_interrupt\n"); + disable_irq_nosync(ONA_datap->pdata->irq); + schedule_work(&ONA_datap->ONA_work); + + return IRQ_HANDLED; +} + +static void do_ONA_work(struct work_struct *w) +{ + + int ret =0; + //int prx_hi, prx_lo; + u16 status = 0; + status = i2c_smbus_read_byte_data(ONA_datap->client,noa_regmap[NOACHIP_INTERRUPT]);//add error ctl + //printk(ONA_TAG "ONA_interrupt status = %x\n",status); + if(status<0) + goto read_reg_fail; + + //als interrupt + if(((status & (NOACHIP_INT_ALS_INT_HI|NOACHIP_INT_ALS_INT_LO)) != 0)/*&&((status & NOACHIP_INT_EXTERNAL) != 0)*/) + { + printk(ONA_TAG "ONA_interrupt als change status = %d\n",status); + ONA_g_nlux = ONA_get_lux(); + ONA_report_value(0); + } + + //prox interrupt + if((status & (NOACHIP_INT_LEDS_INT_HI|NOACHIP_INT_LEDS_INT_LO))!=0) + { + printk(ONA_TAG "ONA_interrupt prox change status = %d\n",status); + if((ret = ONA_prox_poll(ONA_prox_cur_infop))<0) + { + printk(KERN_CRIT "ONA: get prox poll failed in ONA interrupt()\n"); + goto read_reg_fail; + } + //printk(ONA_TAG "prox_data = %d prox_threshold_hi = %d prox_threshold_lo = %d \n",ONA_prox_cur_infop->prox_data,ONA_cfgp->prox_threshold_hi,ONA_cfgp->prox_threshold_lo); + if(ONA_prox_cur_infop->prox_data > ONA_cfgp->prox_threshold_hi) + { + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_PS_TH_UP_MSB], (ONA_prox_cur_infop->prox_data >> 8)&0xFF))) < 0) { + pr_crit(ONA_TAG "i2c_smbus_write_byte() to ONA_TRITON_PRX_MAXTHRESHLO\n"); + } + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_PS_TH_UP_LSB], (ONA_prox_cur_infop->prox_data)&0xFF))) < 0) { + pr_crit(ONA_TAG "i2c_smbus_write_byte() to ONA_TRITON_PRX_MAXTHRESHLO\n"); + } + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_PS_TH_LO_MSB], (ONA_cfgp->prox_threshold_lo >> 8)&0xFF))) < 0) { + pr_crit(ONA_TAG "i2c_smbus_write_byte() to ONA_TRITON_PRX_MAXTHRESHLO\n"); + } + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_PS_TH_LO_LSB], (ONA_cfgp->prox_threshold_lo)&0xFF))) < 0) { + pr_crit(ONA_TAG "i2c_smbus_write_byte() to ONA_TRITON_PRX_MAXTHRESHLO\n"); + } + + ONA_prox_cur_infop->prox_event = 1; + } + else if(ONA_prox_cur_infop->prox_data < ONA_cfgp->prox_threshold_lo) + { + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_PS_TH_UP_MSB], (ONA_cfgp->prox_threshold_hi >> 8)&0xFF))) < 0) { + pr_crit(ONA_TAG "i2c_smbus_write_byte() to ONA_TRITON_PRX_MAXTHRESHLO\n"); + } + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_PS_TH_UP_LSB], (ONA_cfgp->prox_threshold_hi)&0xFF))) < 0) { + pr_crit(ONA_TAG "i2c_smbus_write_byte() to ONA_TRITON_PRX_MAXTHRESHLO\n"); + } + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_PS_TH_LO_MSB], (ONA_prox_cur_infop->prox_data >> 8)&0xFF))) < 0) { + pr_crit(ONA_TAG "i2c_smbus_write_byte() to ONA_TRITON_PRX_MAXTHRESHLO\n"); + } + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_PS_TH_LO_LSB], (ONA_prox_cur_infop->prox_data)&0xFF))) < 0) { + pr_crit(ONA_TAG "i2c_smbus_write_byte() to ONA_TRITON_PRX_MAXTHRESHLO\n"); + } + ONA_prox_cur_infop->prox_event = 0; + //pr_crit(ONA_TAG "screen on:ONA_prox_cur_infop->prox_data=%d\n",ONA_prox_cur_infop->prox_data); + } + ONA_report_value(1); + } + +read_reg_fail: + enable_irq(ONA_datap->pdata->irq); + return; +} + +static int noa3402_ps_intervals_to_reg_value(int interval) +{ + int i; + int ret = 0; + int calc_interval; + + for (i = 0; i < 256; i++) { + calc_interval = 5 * i; + if (calc_interval == interval) { + ret = i; + break; + } + } + if (i == 256) + ret = -EINVAL; + return ret; +} + +static int noa3402_als_intervals_to_reg_value(int interval) +{ + int i; + int ret = 0; + int calc_interval; + + for (i = 0; i < 64; i++) { + calc_interval = 50 * i; + if (calc_interval == interval) { + ret = i; + break; + } + } + if (i == 64) + ret = -EINVAL; + return ret; +} + +/*calc_distance, using prox value*/ +static int calc_distance(int value) +{ + int temp=0; + if(ONA_prox_cur_infop->prox_event == 1) + temp=0; + else if(ONA_prox_cur_infop->prox_event == 0) + temp=5; + return temp; +} + +/*report als and prox data to input sub system, +for data poll utility in hardware\alsprox.c +*/ +static void ONA_report_value(int mask) +{ + struct PS_ALS_prox_info *val = ONA_prox_cur_infop; + int lux_val=ONA_g_nlux; + int dist; + lux_val=(lux_val<=1)? lux_val:lux_val*10; + + if (mask==0) { + input_report_abs(light->input_dev, ABS_MISC, lux_val); +//[sensor wlg 20110729]ALS thereshold modify add log + printk(KERN_CRIT "ONA: als_interrupt lux_val(%d)=ONA_g_nlux(%d) * 9 \n", lux_val, ONA_g_nlux); + input_sync(light->input_dev); + } + + if (mask==1) { + dist=calc_distance(val->prox_data); + //input_report_als(alsprox->input_dev, ALS_PROX, val->prox_clear); + input_report_abs(proximity->input_dev, ABS_DISTANCE, dist); + //input_report_als(alsprox->input_dev, ALS_PROX, val->prox_event); + printk(KERN_CRIT "ONA: prox_interrupt =%d, distance=%d\n", val->prox_data,dist); + input_sync(proximity->input_dev); + } + + //input_sync(alsprox->input_dev); + //enable_irq(ONA_datap->pdata->irq); +} + + + +/* ------------* +* driver init * +*------------*/ +static int __init ONA_init(void) { + int ret = 0; + //struct i2c_adapter *my_adap; + printk(KERN_ERR "ONA: comes into ONA_init\n"); + if ((ret = (alloc_chrdev_region(&ONA_dev_number, 0, ONA_MAX_NUM_DEVICES, ONA_DEVICE_NAME))) < 0) { + printk(KERN_ERR "ONA: alloc_chrdev_region() failed in ONA_init()\n"); + return (ret); + } + ONA_class = class_create(THIS_MODULE, ONA_DEVICE_NAME); + ONA_datap = kmalloc(sizeof(struct ONA_data), GFP_KERNEL); + if (!ONA_datap) { + printk(KERN_ERR "ONA: kmalloc for struct ONA_data failed in ONA_init()\n"); + return -ENOMEM; + } + memset(ONA_datap, 0, sizeof(struct ONA_data)); + cdev_init(&ONA_datap->cdev, &ONA_fops); + ONA_datap->cdev.owner = THIS_MODULE; + if ((ret = (cdev_add(&ONA_datap->cdev, ONA_dev_number, 1))) < 0) { + printk(KERN_ERR "ONA: cdev_add() failed in ONA_init()\n"); + return (ret); + } + //device_create(ONA_class, NULL, MKDEV(MAJOR(ONA_dev_number), 0), &ONA_driver ,"ONA"); + ret = i2c_add_driver(&ONA_driver); + if(ret){ + printk(KERN_ERR "ONA: i2c_add_driver() failed in ONA_init(),%d\n",ret); + return (ret); + } + //pr_crit(ONA_TAG "%s:%d\n",__func__,ret); + return (ret); +} + + + +// driver exit +static void __exit ONA_exit(void) { +/* if (ONA_my_clientp) + i2c_unregister_device(ONA_my_clientp); + */ + i2c_del_driver(&ONA_driver); + unregister_chrdev_region(ONA_dev_number, ONA_MAX_NUM_DEVICES); + device_destroy(ONA_class, MKDEV(MAJOR(ONA_dev_number), 0)); + cdev_del(&ONA_datap->cdev); + class_destroy(ONA_class); + mutex_destroy(&ONA_datap->proximity_calibrating); + kfree(ONA_datap); +} + + +//*************************************************** +/*static struct file_operations ONA_device_fops = { + .owner = THIS_MODULE, + .open = ONA_open, + .release = ONA_release, + .ioctl = ONA_ioctl, +}; + + +static struct miscdevice ONA_device = { + .minor = MISC_DYNAMIC_MINOR, + .name = "ONA", + .fops = &ONA_device_fops, +}; +*/ + +// client probe +static int ONA_probe(struct i2c_client *clientp, const struct i2c_device_id *idp) { + int ret = 0; + int i = 0; + unsigned char buf[NAOCHIP_REG_NUM]; + char *device_name; + +// if (device_found) +// return -ENODEV; + if (!i2c_check_functionality(clientp->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) { + printk(KERN_ERR "ONA: ONA_probe() - i2c smbus byte data functions unsupported\n"); + return -EOPNOTSUPP; + } + if (!i2c_check_functionality(clientp->adapter, I2C_FUNC_SMBUS_WORD_DATA)) { + printk(KERN_ERR "ONA: ONA_probe() - i2c smbus word data functions unsupported\n"); + } + if (!i2c_check_functionality(clientp->adapter, I2C_FUNC_SMBUS_BLOCK_DATA)) { + printk(KERN_ERR "ONA: ONA_probe() - i2c smbus block data functions unsupported\n"); + } + ONA_datap->client = clientp; + i2c_set_clientdata(clientp, ONA_datap); + + for(i = 0; i < NAOCHIP_REG_NUM; i++) { + buf[i] = i2c_smbus_read_byte_data(ONA_datap->client, noa_regmap[i]); + if(buf[i] < 0) + { + printk(KERN_ERR "ONA: i2c_smbus_read_byte_data(%d) failed in ONA_probe()\n",noa_regmap[i]); + } + else + { + printk(KERN_ERR "ONA: i2c_smbus_read_byte_data(%d) = %d in ONA_probe()\n", noa_regmap[i], buf[i]); + } + } + //check device ID "tritonFN" + if ((ret = ONA_device_name(buf, &device_name)) == 0) { + printk(KERN_ERR "ONA: chip id that was read found mismatched by ONA_device_name(), in ONA_probe()\n"); + return -ENODEV; + } + if (strcmp(device_name, ONA_DEVICE_ID)) { + printk(KERN_ERR "ONA: chip id that was read does not match expected id in ONA_probe()\n"); + return -ENODEV; + } + else{ + printk(KERN_ERR "ONA: chip id of %s that was read matches expected id in ONA_probe()\n", device_name); + //device_found = 1; + } + device_create(ONA_class, NULL, MKDEV(MAJOR(ONA_dev_number), 0), &ONA_driver ,"ONA"); + + printk(KERN_ERR "ONA: ONA_probe() init regs.\n"); +// noa3402_reset(chip, 0x01); + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_RESET], 0x01))) < 0) { + pr_crit(ONA_TAG "error: i2c_smbus_write_byte(%d) val %d\n",noa_regmap[NOACHIP_RESET],0x01); + return(ret); + } +//init PS +// noa3402_ps_mode(chip, NOACHIP_STANDBY); + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_PS_CONTROL], NOACHIP_STANDBY))) < 0) { + pr_crit(ONA_TAG "error: i2c_smbus_write_byte(%d) val %d\n",noa_regmap[NOACHIP_PS_CONTROL],NOACHIP_STANDBY); + return(ret); + } +// noa3402_set_filter_m(chip, NOA3402_PS_FILTER_M); +// noa3402_set_filter_n(chip, NOA3402_PS_FILTER_N); + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_PS_FILTER_CONFIG], NOA3402_PS_FILTER_M|NOA3402_PS_FILTER_N))) < 0) { + pr_crit(ONA_TAG "error: i2c_smbus_write_byte(%d) val %d\n",noa_regmap[NOACHIP_PS_FILTER_CONFIG],NOA3402_PS_FILTER_M|NOA3402_PS_FILTER_N); + return(ret); + } +// noa3402_set_integ_time(chip, NOA3402_PS_INTEGRATION_TIME); +// noa3402_set_hyst_trigger(chip, NOA3402_PS_HYST_TRIGGER); +// noa3402_set_hyst_enable(chip, NOA3402_PS_HYST_ENABLE); + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_PS_CONFIG], NOA3402_PS_HYST_ENABLE|NOA3402_PS_HYST_TRIGGER|NOA3402_PS_INTEGRATION_TIME))) < 0) { + pr_crit(ONA_TAG "error: i2c_smbus_write_byte(%d) val %d\n",noa_regmap[NOACHIP_PS_CONFIG],NOA3402_PS_HYST_ENABLE|NOA3402_PS_HYST_TRIGGER|NOA3402_PS_INTEGRATION_TIME); + return(ret); + } +// noa3402_ps_set_threshold(chip, +// NOA3402_PS_THRES_UP, +// NOA3402_PS_THRES_LO); + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_PS_TH_UP_MSB], (ONA_cfgp->prox_threshold_hi >> 8)&0xFF))) < 0) { + pr_crit(ONA_TAG "error: i2c_smbus_write_byte(%d) val %d\n",noa_regmap[NOACHIP_PS_TH_UP_MSB],(ONA_cfgp->prox_threshold_hi >> 8)&0xFF); + return(ret); + } + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_PS_TH_UP_LSB], (ONA_cfgp->prox_threshold_hi)&0xFF))) < 0) { + pr_crit(ONA_TAG "error: i2c_smbus_write_byte(%d) val %d\n",noa_regmap[NOACHIP_PS_TH_UP_LSB],(ONA_cfgp->prox_threshold_hi)&0xFF); + return(ret); + } + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_PS_TH_LO_MSB], (ONA_cfgp->prox_threshold_lo >> 8)&0xFF))) < 0) { + pr_crit(ONA_TAG "error: i2c_smbus_write_byte(%d) val %d\n",noa_regmap[NOACHIP_PS_TH_LO_MSB],(ONA_cfgp->prox_threshold_lo >> 8)&0xFF); + return(ret); + } + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_PS_TH_LO_LSB], (ONA_cfgp->prox_threshold_lo)&0xFF))) < 0) { + pr_crit(ONA_TAG "error: i2c_smbus_write_byte(%d) val %d\n",noa_regmap[NOACHIP_PS_TH_LO_LSB],(ONA_cfgp->prox_threshold_lo)&0xFF); + return(ret); + } +// noa3402_led_cfg(chip, NOA3402_PS_LED_CURRENT); + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_PS_LED_CURRENT], NOA3402_PS_LED_CURRENT))) < 0) { + pr_crit(ONA_TAG "error: i2c_smbus_write_byte(%d) val %d\n",noa_regmap[NOACHIP_PS_LED_CURRENT],NOA3402_PS_LED_CURRENT); + return(ret); + } +// noa3402_ps_interval(chip, NOA3402_PS_INTERVAL); + if ((ret = noa3402_ps_intervals_to_reg_value(NOA3402_PS_INTERVAL)) < 0) { + pr_crit(ONA_TAG "error: noa3402_ps_intervals_to_reg_value(%d)\n",NOA3402_PS_INTERVAL); + return(ret); + } + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_PS_MEAS_INTERVAL], ret))) < 0) { + pr_crit(ONA_TAG "error: i2c_smbus_write_byte(%d) val %d\n",noa_regmap[NOACHIP_PS_MEAS_INTERVAL],noa3402_ps_intervals_to_reg_value(NOA3402_PS_INTERVAL)); + return(ret); + } + +//init ALS +// noa3402_als_mode(chip, NOACHIP_STANDBY); + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_ALS_CONTROL], NOACHIP_STANDBY))) < 0) { + pr_crit(ONA_TAG "error: i2c_smbus_write_byte(%d) val %d\n",noa_regmap[NOACHIP_ALS_CONTROL],NOACHIP_STANDBY); + return(ret); + } +// noa3402_als_set_threshold(chip, +// NOA3402_ALS_THRES_UP, +// NOA3402_ALS_THRES_LO); + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_ALS_TH_UP_MSB], 0))) < 0) { + pr_crit(ONA_TAG "error: i2c_smbus_write_byte(%d) val %d\n",noa_regmap[NOACHIP_ALS_TH_UP_MSB],0); + return(ret); + } + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_ALS_TH_UP_LSB], 0))) < 0) { + pr_crit(ONA_TAG "error: i2c_smbus_write_byte(%d) val %d\n",noa_regmap[NOACHIP_ALS_TH_UP_LSB],0); + return(ret); + } + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_ALS_TH_LO_MSB], 0))) < 0) { + pr_crit(ONA_TAG "error: i2c_smbus_write_byte(%d) val %d\n",noa_regmap[NOACHIP_ALS_TH_LO_MSB],0); + return(ret); + } + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_ALS_TH_LO_LSB], 0))) < 0) { + pr_crit(ONA_TAG "error: i2c_smbus_write_byte(%d) val %d\n",noa_regmap[NOACHIP_ALS_TH_LO_LSB],0); + return(ret); + } +// noa3402_als_interval(chip, NOA3402_ALS_INTERVAL); + if ((ret = noa3402_als_intervals_to_reg_value(NOA3402_ALS_INTERVAL)) < 0) { + pr_crit(ONA_TAG "error: noa3402_als_intervals_to_reg_value(%d)\n",NOA3402_ALS_INTERVAL); + return(ret); + } + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_ALS_MEAS_INTERVAL], ret))) < 0) { + pr_crit(ONA_TAG "error: i2c_smbus_write_byte(%d) val %d\n",noa_regmap[NOACHIP_ALS_MEAS_INTERVAL],noa3402_als_intervals_to_reg_value(NOA3402_ALS_INTERVAL)); + return(ret); + } +// noa3402_set_als_hyst_trigger(chip, NOA3402_ALS_HYST_TRIGGER); +// noa3402_set_als_hyst_enable(chip, NOA3402_ALS_HYST_ENABLE); +// noa3402_set_als_integ_time(chip, NOA3402_ALS_INTEGRATION_TIME); + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_ALS_CONFIG], NOA3402_ALS_HYST_ENABLE|NOA3402_ALS_HYST_TRIGGER|NOA3402_ALS_INTEGRATION_TIME))) < 0) { + pr_crit(ONA_TAG "error: i2c_smbus_write_byte(%d) val %d\n",noa_regmap[NOACHIP_ALS_CONFIG],NOA3402_ALS_HYST_ENABLE|NOA3402_ALS_HYST_TRIGGER|NOA3402_ALS_INTEGRATION_TIME); + return(ret); + } + +// noa3402_interrupt_config(chip, NOA3402_INT_CONFIG); + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_INT_CONFIG], NOA3402_INT_CONFIG))) < 0) { + pr_crit(ONA_TAG "error: i2c_smbus_write_byte(%d) val %d\n",noa_regmap[NOACHIP_INT_CONFIG],NOA3402_INT_CONFIG); + return(ret); + } + INIT_WORK(&ONA_datap->ONA_work, do_ONA_work); + mutex_init(&ONA_datap->proximity_calibrating); + ONA_datap->pdata = &ONA_irq; + if(clientp->irq){ + ONA_datap->pdata->irq=ONA_datap->client->irq; + ONA_datap->pdata->int_gpio=INT_TO_MSM_GPIO(ONA_datap->pdata->irq); + } + printk(KERN_CRIT "ONA use gpio %d\n",ONA_datap->pdata->int_gpio); + ret=ONA_config_int_gpio(ONA_datap->pdata->int_gpio); + if (ret) { + printk(KERN_CRIT "ONA configure int_gpio%d failed\n", + ONA_datap->pdata->int_gpio); + return ret; + } + + ret = request_irq(ONA_datap->pdata->irq, ONA_interrupt, IRQF_TRIGGER_FALLING, + ONA_datap->ONA_name, ONA_prox_cur_infop); + if (ret) { + printk(KERN_CRIT "ONA request interrupt failed\n"); + return ret; + } + + strlcpy(clientp->name, ONA_DEVICE_ID, I2C_NAME_SIZE); + strlcpy(ONA_datap->ONA_name, ONA_DEVICE_ID, ONA_ID_NAME_SIZE); + ONA_datap->valid = 0; + + init_MUTEX(&ONA_datap->update_lock); + if (!(ONA_cfgp = kmalloc(sizeof(struct PS_ALS_cfg), GFP_KERNEL))) { + printk(KERN_ERR "ONA: kmalloc for struct PS_ALS_cfg failed in ONA_probe()\n"); + return -ENOMEM; + } + + //update settings + //this should behind ONA_device_name + ONA_cfgp->calibrate_target = calibrate_target_param; + ONA_cfgp->als_time = als_time_param; + ONA_cfgp->scale_factor = scale_factor_param; + ONA_cfgp->gain_trim = gain_trim_param; + ONA_cfgp->filter_history = filter_history_param; + ONA_cfgp->filter_count = filter_count_param; + ONA_cfgp->gain = gain_param; + ONA_cfgp->prox_threshold_hi = prox_threshold_hi_param; + ONA_cfgp->prox_threshold_lo = prox_threshold_lo_param; + ONA_cfgp->prox_int_time = prox_int_time_param; + ONA_cfgp->prox_adc_time = prox_adc_time_param; + ONA_cfgp->prox_wait_time = prox_wait_time_param; + ONA_cfgp->prox_intr_filter = prox_intr_filter_param; + ONA_cfgp->prox_config = prox_config_param; + ONA_cfgp->prox_pulse_cnt = prox_pulse_cnt_param; + ONA_cfgp->prox_gain = prox_gain_param; + sat_als = 0xFFF; + sat_prox = 0xFF; + + light = kzalloc(sizeof(struct alsprox_data), GFP_KERNEL); + if (!light) { + ret = -ENOMEM; + goto exit_alloc_data_failed; + } + proximity= kzalloc(sizeof(struct alsprox_data), GFP_KERNEL); + if (!proximity) { + ret = -ENOMEM; + goto exit_alloc_data_failed; + } + + light->input_dev = input_allocate_device(); + if (!light->input_dev) { + ret = -ENOMEM; + printk(KERN_ERR "ONA_probe: Failed to allocate light input device\n"); + goto exit_input_dev_alloc_failed; + } + proximity->input_dev = input_allocate_device(); + if (!proximity->input_dev) { + ret = -ENOMEM; + printk(KERN_ERR "ONA_probe: Failed to allocate prox input device\n"); + goto exit_input_dev_alloc_failed; + } + + /* lux */ + set_bit(EV_ABS, light->input_dev->evbit); + input_set_abs_params(light->input_dev, ABS_MISC, 0, 65535, 0, 0); + light->input_dev->name = "light"; + /* prox */ + set_bit(EV_ABS, proximity->input_dev->evbit); + input_set_abs_params(proximity->input_dev, ABS_DISTANCE, 0, 65535, 0, 0); + proximity->input_dev->name = "proximity"; + + ret = input_register_device(light->input_dev); + if (ret) { + printk("ONA_probe: Unable to register input device: %s\n", light->input_dev->name); + goto exit_input_register_device_failed; + } + ret = input_register_device(proximity->input_dev); + if (ret) { + printk("ONA_probe: Unable to register input device: %s\n", proximity->input_dev->name); + goto exit_input_register_device_failed; + } + + return (ret); +//exit_ONA_device_register_failed: +exit_input_register_device_failed: + if(light->input_dev) + input_free_device(light->input_dev); + if(proximity->input_dev) + input_free_device(proximity->input_dev); +exit_input_dev_alloc_failed: +exit_alloc_data_failed: + if(light) + kfree(light); + if(proximity) + kfree(proximity); + return (ret); +} + + +// client remove +static int __devexit ONA_remove(struct i2c_client *client) { + int ret = 0; + + return (ret); +} + +// open +static int ONA_open(struct inode *inode, struct file *file) { + struct ONA_data *ONA_datap; + int ret = 0; + device_released = 0; + ONA_datap = container_of(inode->i_cdev, struct ONA_data, cdev); + if (strcmp(ONA_datap->ONA_name, ONA_DEVICE_ID) != 0) { + printk(KERN_ERR "ONA: device name incorrect during ONA_open(), get %s\n", ONA_datap->ONA_name); + ret = -ENODEV; + } + return (ret); +} + +// release +static int ONA_release(struct inode *inode, struct file *file) { + struct ONA_data *ONA_datap; + int ret = 0; + + device_released = 1; + prox_on = 0; + //printk(KERN_CRIT "[ONA]:%s\n", __func__); + + //prox_history_hi = 0; + //prox_history_hi = 0; + ONA_datap = container_of(inode->i_cdev, struct ONA_data, cdev); + if (strcmp(ONA_datap->ONA_name, ONA_DEVICE_ID) != 0) { + printk(KERN_ERR "ONA: device name incorrect during ONA_release(), get %s\n", ONA_datap->ONA_name); + ret = -ENODEV; + } + return (ret); +} + +// read +static int ONA_read(struct file *file, char *buf, size_t count, loff_t *ppos) { + struct ONA_data *ONA_datap; + u8 i = 0, xfrd = 0, reg = 0; + u8 my_buf[NAOCHIP_REG_NUM]; + int ret = 0; + + //if (prox_on) + //del_timer(&prox_poll_timer); + if ((*ppos < 0) || (*ppos >= NAOCHIP_REG_NUM) || (count > NAOCHIP_REG_NUM)) { + printk(KERN_ERR "ONA: reg limit check failed in ONA_read()\n"); + return -EINVAL; + } + reg = (u8)*ppos; + ONA_datap = container_of(file->f_dentry->d_inode->i_cdev, struct ONA_data, cdev); + while (xfrd < count) { + my_buf[i++] = i2c_smbus_read_byte_data(ONA_datap->client,noa_regmap[reg]); + reg++; + xfrd++; + } + if ((ret = copy_to_user(buf, my_buf, xfrd))){ + printk(KERN_ERR "ONA: copy_to_user failed in ONA_read()\n"); + return -ENODATA; + } + //if (prox_on) + //ONA_prox_poll_timer_start(); + return ((int)xfrd); +} + +// write +static int ONA_write(struct file *file, const char *buf, size_t count, loff_t *ppos) { + struct ONA_data *ONA_datap; + u8 i = 0, xfrd = 0, reg = 0; + u8 my_buf[NAOCHIP_REG_NUM]; + int ret = 0; + + //if (prox_on) + //del_timer(&prox_poll_timer); + if ((*ppos < 0) || (*ppos >= NAOCHIP_REG_NUM) || ((*ppos + count) > NAOCHIP_REG_NUM)) { + printk(KERN_ERR "ONA: reg limit check failed in ONA_write()\n"); + return -EINVAL; + } + reg = (u8)*ppos; + if ((ret = copy_from_user(my_buf, buf, count))) { + printk(KERN_ERR "ONA: copy_to_user failed in ONA_write()\n"); + return -ENODATA; + } + ONA_datap = container_of(file->f_dentry->d_inode->i_cdev, struct ONA_data, cdev); + while (xfrd < count) { + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[reg], my_buf[i++]))) < 0) { + printk(KERN_ERR "ONA: i2c_smbus_write_byte_data failed in ONA_write()\n"); + return (ret); + } + reg++; + xfrd++; + } + //if (prox_on) + //ONA_prox_poll_timer_start(); + return ((int)xfrd); +} + +// llseek +static loff_t ONA_llseek(struct file *file, loff_t offset, int orig) { + int ret = 0; + loff_t new_pos = 0; + + //if (prox_on) + //del_timer(&prox_poll_timer); + if ((offset >= NAOCHIP_REG_NUM) || (orig < 0) || (orig > 1)) { + printk(KERN_ERR "ONA: offset param limit or origin limit check failed in ONA_llseek()\n"); + return -EINVAL; + } + switch (orig) { + case 0: + new_pos = offset; + break; + case 1: + new_pos = file->f_pos + offset; + break; + default: + return -EINVAL; + break; + } + if ((new_pos < 0) || (new_pos >= NAOCHIP_REG_NUM) || (ret < 0)) { + printk(KERN_ERR "ONA: new offset limit or origin limit check failed in ONA_llseek()\n"); + return -EINVAL; + } + file->f_pos = new_pos; + // if (prox_on) + // ONA_prox_poll_timer_start(); + return new_pos; +} + +/*enable_light_and_proximity, mask values' indication*/ +/*10 : light on*/ +/*01 : prox on*/ +/*20 : light off*/ +/*02 : prox off*/ +static int enable_light_and_proximity(int mask) +{ + u8 ret = 0;// reg_val = 0 //itime = 0; + + if(mask==0x10) /*10 : light on*/ + { + pr_crit(ONA_TAG "light on\n"); +// noa3402_als_set_threshold(chip, +// NOA3402_ALS_THRES_UP, +// NOA3402_ALS_THRES_LO); + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_ALS_TH_UP_MSB], 0))) < 0) { + pr_crit(ONA_TAG "error: i2c_smbus_write_byte(%d) val %d\n",noa_regmap[NOACHIP_ALS_TH_UP_MSB],0); + return(ret); + } + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_ALS_TH_UP_LSB], 0))) < 0) { + pr_crit(ONA_TAG "error: i2c_smbus_write_byte(%d) val %d\n",noa_regmap[NOACHIP_ALS_TH_UP_LSB],0); + return(ret); + } + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_ALS_TH_LO_MSB], 0))) < 0) { + pr_crit(ONA_TAG "error: i2c_smbus_write_byte(%d) val %d\n",noa_regmap[NOACHIP_ALS_TH_LO_MSB],0); + return(ret); + } + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_ALS_TH_LO_LSB], 0))) < 0) { + pr_crit(ONA_TAG "error: i2c_smbus_write_byte(%d) val %d\n",noa_regmap[NOACHIP_ALS_TH_LO_LSB],0); + return(ret); + } +// noa3402_als_mode(chip, NOACHIP_PS_REPEAT); + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_ALS_CONTROL], NOACHIP_PS_REPEAT))) < 0) { + pr_crit(ONA_TAG "error: i2c_smbus_write_byte(%d) val %d\n",noa_regmap[NOACHIP_ALS_CONTROL],NOACHIP_PS_REPEAT); + return(ret); + } + } + if(mask==0x01) /*01 : prox on*/ + { + pr_crit(ONA_TAG "prox on\n"); +// noa3402_ps_set_threshold(chip, +// NOA3402_PS_THRES_UP, +// NOA3402_PS_THRES_LO); + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_PS_TH_UP_MSB], (ONA_cfgp->prox_threshold_hi >> 8)&0xFF))) < 0) { + pr_crit(ONA_TAG "error: i2c_smbus_write_byte(%d) val %d\n",noa_regmap[NOACHIP_PS_TH_UP_MSB],(ONA_cfgp->prox_threshold_hi >> 8)&0xFF); + return(ret); + } + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_PS_TH_UP_LSB], (ONA_cfgp->prox_threshold_hi)&0xFF))) < 0) { + pr_crit(ONA_TAG "error: i2c_smbus_write_byte(%d) val %d\n",noa_regmap[NOACHIP_PS_TH_UP_LSB],(ONA_cfgp->prox_threshold_hi)&0xFF); + return(ret); + } + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_PS_TH_LO_MSB], (ONA_cfgp->prox_threshold_lo >> 8)&0xFF))) < 0) { + pr_crit(ONA_TAG "error: i2c_smbus_write_byte(%d) val %d\n",noa_regmap[NOACHIP_PS_TH_LO_MSB],(ONA_cfgp->prox_threshold_lo >> 8)&0xFF); + return(ret); + } + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_PS_TH_LO_LSB], (ONA_cfgp->prox_threshold_lo)&0xFF))) < 0) { + pr_crit(ONA_TAG "error: i2c_smbus_write_byte(%d) val %d\n",noa_regmap[NOACHIP_PS_TH_LO_LSB],(ONA_cfgp->prox_threshold_lo)&0xFF); + return(ret); + } +// noa3402_ps_mode(chip, NOACHIP_PS_REPEAT); + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_PS_CONTROL], NOACHIP_PS_REPEAT))) < 0) { + pr_crit(ONA_TAG "error: i2c_smbus_write_byte(%d) val %d\n",noa_regmap[NOACHIP_PS_CONTROL],NOACHIP_PS_REPEAT); + return(ret); + } + } + if(mask==0x20) /*20 : light off*/ + { + pr_crit(ONA_TAG "light off\n"); +// noa3402_als_mode(chip, NOACHIP_STANDBY); + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_ALS_CONTROL], NOACHIP_STANDBY))) < 0) { + pr_crit(ONA_TAG "error: i2c_smbus_write_byte(%d) val %d\n",noa_regmap[NOACHIP_ALS_CONTROL],NOACHIP_STANDBY); + return(ret); + } + } + if(mask==0x02) /*02 : prox off*/ + { + pr_crit(ONA_TAG "prox off\n"); +// noa3402_ps_mode(chip, NOACHIP_STANDBY); + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_PS_CONTROL], NOACHIP_STANDBY))) < 0) { + pr_crit(ONA_TAG "error: i2c_smbus_write_byte(%d) val %d\n",noa_regmap[NOACHIP_PS_CONTROL],NOACHIP_STANDBY); + return(ret); + } + } + return ret; +} + +// ioctls +static int ONA_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { + struct ONA_data *ONA_datap; + int prox_sum = 0, prox_mean = 0, prox_max = 0; + int lux_val = 0, ret = 0, i = 0; + u8 reg_val = 0; + u16 ratio; + struct ONA_prox_data *prox_pt; + + ONA_datap = container_of(inode->i_cdev, struct ONA_data, cdev); +//[sensor wlg 20110729]ALS thereshold modify add log +//printk(KERN_ERR "ONA_wlg: ONA_ioctl() cmd=%d\n", cmd); + switch (cmd) { + case PS_ALS_IOCTL_ALS_ON: + if(light_on) + { + pr_crit(ONA_TAG "PS_ALS_IOCTL_ALS_ON: light already on.\n"); + break; + } + ret=enable_light_and_proximity(0x10); + if(ret>=0) + { + light_on=1; + pr_crit(ONA_TAG "PS_ALS_IOCTL_ALS_ON,lux=%d\n", ONA_g_nlux); + } + return (ret); + break; + case PS_ALS_IOCTL_ALS_OFF: + if(light_on == 0) + { + pr_crit(ONA_TAG "PS_ALS_IOCTL_ALS_OFF: light already off.\n"); + break; + } + + for (i = 0; i < ONA_FILTER_DEPTH; i++) + lux_history[i] = -ENODATA; + ret=enable_light_and_proximity(0x20); + if(ret>=0) + { + light_on=0; + //ONA_g_nlux=0; + pr_crit(ONA_TAG"PS_ALS_IOCTL_ALS_OFF\n"); + } + return (ret); + break; + case PS_ALS_IOCTL_ALS_DATA: + if(light_on == 0) + { + pr_crit(ONA_TAG "PS_ALS_IOCTL_ALS_DATA: read als data when light off.\n"); + } + + ret = i2c_smbus_read_byte_data(ONA_datap->client,noa_regmap[NOACHIP_ALS_DATA_MSB]); + if(ret < 0) + { + return ret; + } + reg_val = ret; + ret = i2c_smbus_read_byte_data(ONA_datap->client,noa_regmap[NOACHIP_ALS_DATA_LSB]); + if(ret < 0) + { + return ret; + } + lux_val = (ret & 0xFF) | ((reg_val & 0xFF) << 8); + return lux_val; + break; + case PS_ALS_IOCTL_ALS_CALIBRATE: + + break; + + case PS_ALS_IOCTL_CONFIG_GET: + ret = copy_to_user((struct PS_ALS_cfg *)arg, ONA_cfgp, sizeof(struct PS_ALS_cfg)); + if (ret) { + printk(KERN_ERR "ONA: copy_to_user failed in ioctl config_get\n"); + return -ENODATA; + } + return (ret); + break; + case PS_ALS_IOCTL_CONFIG_SET: + ret = copy_from_user(ONA_cfgp, (struct PS_ALS_cfg *)arg, sizeof(struct PS_ALS_cfg)); + if (ret) { + printk(KERN_ERR "ONA: copy_from_user failed in ioctl config_set\n"); + return -ENODATA; + } + return (ret); + break; + case PS_ALS_IOCTL_PROX_ON: + if(prox_on) + { + pr_crit(ONA_TAG "PS_ALS_IOCTL_PROX_ON: prox already on.\n"); + break; + } + + ONA_prox_cur_infop->prox_event = 0; + ONA_prox_cur_infop->prox_clear = 0; + ONA_prox_cur_infop->prox_data = 0; + ret=enable_light_and_proximity(0x01); + if(ret>=0) + { + prox_on = 1; + pr_crit(ONA_TAG "PS_ALS_IOCTL_PROX_ON\n"); + } + return ret; + break; + case PS_ALS_IOCTL_PROX_OFF: + if(prox_on == 0) + { + pr_crit(ONA_TAG "PS_ALS_IOCTL_PROX_OFF: prox already off.\n"); + break; + } + + ret=enable_light_and_proximity(0x02); + if(ret>=0) + { + prox_on = 0; + pr_crit(ONA_TAG"PS_ALS_IOCTL_PROX_OFF\n"); + } + return ret; + break; + case PS_ALS_IOCTL_PROX_DATA: + ret = copy_to_user((struct PS_ALS_prox_info *)arg, ONA_prox_cur_infop, sizeof(struct PS_ALS_prox_info)); + if (ret) { + printk(KERN_ERR "ONA: copy_to_user failed in ioctl prox_data\n"); + return -ENODATA; + } + return (ret); + break; + case PS_ALS_IOCTL_PROX_EVENT: + return (ONA_prox_cur_infop->prox_event); + break; + case PS_ALS_IOCTL_PROX_CALIBRATE: + if (!prox_on) + { + printk(KERN_ERR "ONA: ioctl prox_calibrate was called before ioctl prox_on was called\n"); + return -EPERM; + } + mutex_lock(&ONA_datap->proximity_calibrating); + prox_sum = 0; + prox_max = 0; + for (i = 0; i < 20; i++) { + if ((ret = ONA_prox_poll(&ONA_prox_cal_info[i])) < 0) { + printk(KERN_ERR "ONA: call to prox_poll failed in ioctl prox_calibrate\n"); + mutex_unlock(&ONA_datap->proximity_calibrating); + return (ret); + } + pr_crit(ONA_TAG "prox calibrate poll prox[%d] = %d\n",i,ONA_prox_cal_info[i].prox_data); + prox_sum += ONA_prox_cal_info[i].prox_data; + if (ONA_prox_cal_info[i].prox_data > prox_max) + prox_max = ONA_prox_cal_info[i].prox_data; + mdelay(100); + } + prox_mean = prox_sum/20; + ratio = 10*prox_mean/sat_prox; + for (prox_pt = ONA_prox_tablep; prox_pt->ratio && prox_pt->ratio <= ratio; prox_pt++); + if(!prox_pt->ratio) + return -1; + + ONA_cfgp->prox_threshold_hi = (prox_mean*prox_pt->hi)/10; + ONA_cfgp->prox_threshold_lo = ONA_cfgp->prox_threshold_hi*THRES_LO_TO_HI_RATIO; + + if (ONA_cfgp->prox_threshold_lo < ((sat_prox*15)/100)) { + ONA_cfgp->prox_threshold_hi = ((sat_prox*20)/100); + ONA_cfgp->prox_threshold_lo = (ONA_cfgp->prox_threshold_hi *THRES_LO_TO_HI_RATIO); + } + + //write back threshold +// noa3402_ps_set_threshold(chip, +// NOA3402_PS_THRES_UP, +// NOA3402_PS_THRES_LO); + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_PS_TH_UP_MSB], (ONA_cfgp->prox_threshold_hi >> 8)&0xFF))) < 0) { + pr_crit(ONA_TAG "error: i2c_smbus_write_byte(%d) val %d\n",noa_regmap[NOACHIP_PS_TH_UP_MSB],(ONA_cfgp->prox_threshold_hi >> 8)&0xFF); + return(ret); + } + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_PS_TH_UP_LSB], (ONA_cfgp->prox_threshold_hi)&0xFF))) < 0) { + pr_crit(ONA_TAG "error: i2c_smbus_write_byte(%d) val %d\n",noa_regmap[NOACHIP_PS_TH_UP_LSB],(ONA_cfgp->prox_threshold_hi)&0xFF); + return(ret); + } + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_PS_TH_LO_MSB], (ONA_cfgp->prox_threshold_lo >> 8)&0xFF))) < 0) { + pr_crit(ONA_TAG "error: i2c_smbus_write_byte(%d) val %d\n",noa_regmap[NOACHIP_PS_TH_LO_MSB],(ONA_cfgp->prox_threshold_lo >> 8)&0xFF); + return(ret); + } + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_PS_TH_LO_LSB], (ONA_cfgp->prox_threshold_lo)&0xFF))) < 0) { + pr_crit(ONA_TAG "error: i2c_smbus_write_byte(%d) val %d\n",noa_regmap[NOACHIP_PS_TH_LO_LSB],(ONA_cfgp->prox_threshold_lo)&0xFF); + return(ret); + } + mutex_unlock(&ONA_datap->proximity_calibrating); + pr_crit(KERN_ERR "ONA prox_cal_threshold_hi=%d,prox_cal_threshold_lo=%d\n",ONA_cfgp->prox_threshold_hi,ONA_cfgp->prox_threshold_lo); + break; + + case PS_ALS_IOCTL_PROX_GET_ENABLED: + return put_user(prox_on, (unsigned long __user *)arg); + break; + case PS_ALS_IOCTL_ALS_GET_ENABLED: + return put_user(light_on, (unsigned long __user *)arg); + break; + + default: + return -EINVAL; + break; + } + return (ret); +} + +// read and calculate lux value +static int ONA_get_lux(void) +{ + u16 raw_clear = 0, reg_val=0; + u32 lux = 0; +// u32 ratio = 0; +// u8 dev_gain = 0; +// struct lux_data *p; + int ret = 0; + +// int i = 0; + pr_crit(ONA_TAG "ONA start to calc lux value\n"); + + ret = i2c_smbus_read_byte_data(ONA_datap->client,noa_regmap[NOACHIP_ALS_DATA_MSB]); + if(ret < 0) + { + return ret; + } + reg_val = ret; + ret = i2c_smbus_read_byte_data(ONA_datap->client,noa_regmap[NOACHIP_ALS_DATA_LSB]); + if(ret < 0) + { + return ret; + } + raw_clear = (ret & 0xFF) | ((reg_val & 0xFF) << 8); + + als_intr_threshold_hi_param = raw_clear + raw_clear/5; + als_intr_threshold_lo_param = raw_clear - raw_clear/5; + + //update threshold + printk(ONA_TAG "als_intr_threshold_hi_param=%x,als_intr_threshold_lo_param=%x\n",als_intr_threshold_hi_param,als_intr_threshold_lo_param); +// noa3402_als_set_threshold(chip, +// als_intr_threshold_hi_param, +// als_intr_threshold_lo_param); + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_ALS_TH_UP_MSB], (als_intr_threshold_hi_param>>8)&0xFF))) < 0) { + pr_crit(ONA_TAG "error: i2c_smbus_write_byte(%d) val %d\n",noa_regmap[NOACHIP_ALS_TH_UP_MSB],(als_intr_threshold_hi_param>>8)&0xFF); + return(ret); + } + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_ALS_TH_UP_LSB], (als_intr_threshold_hi_param)&0xFF))) < 0) { + pr_crit(ONA_TAG "error: i2c_smbus_write_byte(%d) val %d\n",noa_regmap[NOACHIP_ALS_TH_UP_LSB],(als_intr_threshold_hi_param)&0xFF); + return(ret); + } + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_ALS_TH_LO_MSB], (als_intr_threshold_lo_param>>8)&0xFF))) < 0) { + pr_crit(ONA_TAG "error: i2c_smbus_write_byte(%d) val %d\n",noa_regmap[NOACHIP_ALS_TH_LO_MSB],(als_intr_threshold_lo_param>>8)&0xFF); + return(ret); + } + if ((ret = (i2c_smbus_write_byte_data(ONA_datap->client, noa_regmap[NOACHIP_ALS_TH_LO_LSB], (als_intr_threshold_lo_param)&0xFF))) < 0) { + pr_crit(ONA_TAG "error: i2c_smbus_write_byte(%d) val %d\n",noa_regmap[NOACHIP_ALS_TH_LO_LSB],(als_intr_threshold_lo_param>>8)&0xFF); + return(ret); + } + lux = raw_clear; + return(lux); +} + + +// verify device +static int ONA_device_name(unsigned char *bufp, char **device_name) { + ONA_datap->chip_type=ONA3301; +/* if( (bufp[0x12]&0xf0)!=0x00) + return(0); + if(bufp[0x10]|bufp[0x1a]|bufp[0x1b]|bufp[0x1c]|bufp[0x1d]|bufp[0x1e]) + return(0); + if(bufp[0x13]&0x0c) + return(0); +*/ + if( (bufp[NOACHIP_PART_ID]&NOACHIP_PART_MASK)!=NOACHIP_PART) + return(0); + *device_name="ONA3301"; + return(1); +} + +// proximity poll +static int ONA_prox_poll(struct PS_ALS_prox_info *prxp) { + u8 prox_data; + int ret,reg_val; + + ret = i2c_smbus_read_byte_data(ONA_datap->client,noa_regmap[NOACHIP_PS_DATA_MSB]); + if(ret < 0) + { + return ret; + } + reg_val = ret; + ret = i2c_smbus_read_byte_data(ONA_datap->client,noa_regmap[NOACHIP_PS_DATA_LSB]); + if(ret < 0) + { + return ret; + } + prox_data = (ret & 0xFF) | ((reg_val & 0xFF) << 8); + prxp->prox_data = prox_data; + + return (prox_data); + } +// start prox poll timer +/* +static void ONA_prox_poll_timer_start(void) { + init_timer(&prox_poll_timer); + prox_poll_timer.expires = jiffies + (HZ/10); + prox_poll_timer.function = ONA_prox_poll_timer_func; + add_timer(&prox_poll_timer); + + return; +}*/ + + +MODULE_AUTHOR("ZTE Software"); +MODULE_DESCRIPTION("ONA ambient light and proximity sensor driver"); +MODULE_LICENSE("GPL"); + +module_init(ONA_init); +module_exit(ONA_exit); + diff --git a/drivers/i2c/chips/accelerator.c b/drivers/i2c/chips/accelerator.c index 8b8748c4..7ae0a2f8 100644 --- a/drivers/i2c/chips/accelerator.c +++ b/drivers/i2c/chips/accelerator.c @@ -1181,7 +1181,7 @@ static int lis302dl_ioctl(struct inode *inode, struct file *file, unsigned int c static void adxl34x_early_suspend(struct early_suspend *handler) { - int ret = adxl34x_set_mode(0); + int ret = adxl34x_set_mode(1); if(!ret) pr_info(ADXL34X_TAG "adxl34x suspend\n"); else @@ -1190,7 +1190,7 @@ static void adxl34x_early_suspend(struct early_suspend *handler) static void lis302dl_early_suspend(struct early_suspend *handler) { - int ret = lis302dl_set_mode(0); + int ret = lis302dl_set_mode(1); if(!ret) pr_info(LIS302_TAG "lis302dl suspend\n"); else @@ -1199,23 +1199,23 @@ static void lis302dl_early_suspend(struct early_suspend *handler) static void adxl34x_late_resume(struct early_suspend *handler) { - int ret = adxl34x_set_mode(1); + //int ret = adxl34x_set_mode(1); - if(!ret) + //if(!ret) pr_info(ADXL34X_TAG "adxl34x resume\n"); - else - pr_err(ADXL34X_TAG "adxl34x resume failed \n"); + //else + // pr_err(ADXL34X_TAG "adxl34x resume failed \n"); } static void lis302dl_late_resume(struct early_suspend *handler) { - int ret = lis302dl_set_mode(1); + //int ret = lis302dl_set_mode(1); - if(!ret) + //if(!ret) pr_info(LIS302_TAG "lis302dl resume\n"); - else - pr_err(LIS302_TAG "lis302dl resume failed \n"); + //else + // pr_err(LIS302_TAG "lis302dl resume failed \n"); } diff --git a/drivers/i2c/chips/adxl34x.c b/drivers/i2c/chips/adxl34x.c index 3b4a483d..04ea822e 100644 --- a/drivers/i2c/chips/adxl34x.c +++ b/drivers/i2c/chips/adxl34x.c @@ -414,6 +414,22 @@ static int adxl34x_get_triple(short *buffer) buffer[0] = (s16) le16_to_cpu(buf[0])*(-1)*4; buffer[1] = (s16) le16_to_cpu(buf[1])*4; buffer[2] = (s16) le16_to_cpu(buf[2])*4; +#elif defined(CONFIG_MACH_RACER2) + buffer[0] = (s16) le16_to_cpu(buf[1])*4; + buffer[1] = (s16) le16_to_cpu(buf[0])*(-1)*4; + buffer[2] = (s16) le16_to_cpu(buf[2])*(-1)*4; +#elif defined(CONFIG_MACH_TURIES) + buffer[0] = (s16) le16_to_cpu(buf[1])*4; + buffer[1] = (s16) le16_to_cpu(buf[0])*(-1)*4; + buffer[2] = (s16) le16_to_cpu(buf[2])*(-1)*4; +#elif defined(CONFIG_MACH_BLUETICK) + buffer[0] = (s16) le16_to_cpu(buf[1])*4; + buffer[1] = (s16) le16_to_cpu(buf[0])*4; + buffer[2] = (s16) le16_to_cpu(buf[2])*4; +#elif defined(CONFIG_MACH_SAILBOAT) + buffer[0] = (s16) le16_to_cpu(buf[1])*4; + buffer[1] = (s16) le16_to_cpu(buf[0])*(-1)*4; + buffer[2] = (s16) le16_to_cpu(buf[2])*(-1)*4; #else buffer[0] = (s16) le16_to_cpu(buf[0])*(-1)*4; buffer[1] = (s16) le16_to_cpu(buf[1])*(-1)*4; @@ -884,7 +900,7 @@ static int adxl34x_ioctl(struct inode *inode, struct file *file, unsigned int cm static void adxl34x_early_suspend(struct early_suspend *handler) { - int ret = adxl34x_set_mode(0); + int ret = adxl34x_set_mode(1); if(!ret) pr_info(ADXL34X_TAG "adxl34x suspend\n"); else @@ -892,12 +908,12 @@ static void adxl34x_early_suspend(struct early_suspend *handler) } static void adxl34x_late_resume(struct early_suspend *handler) { - int ret = adxl34x_set_mode(1); + //int ret = adxl34x_set_mode(1); - if(!ret) + //if(!ret) pr_info(ADXL34X_TAG "adxl34x resume\n"); - else - pr_err(ADXL34X_TAG "adxl34x resume failed \n"); + //else + // pr_err(ADXL34X_TAG "adxl34x resume failed \n"); } diff --git a/drivers/i2c/chips/isl29026.c b/drivers/i2c/chips/isl29026.c new file mode 100644 index 00000000..8d33e16b --- /dev/null +++ b/drivers/i2c/chips/isl29026.c @@ -0,0 +1,1276 @@ +/****************************************************************** +*File Name: ISL29026.c * +*Description: Linux device driver for ISL ambient light and * +* proximity sensors. * +******************************************************************* +Geschichte: +Wenn Wer Was Tag +2011-10-15 wanglg create + +******************************************************************/ +// includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#define ISL_INT_GPIO 42 +#define ISL_TAG "[ISL]" + +// device name/id/address/counts +#define ISL_DEVICE_NAME "ISL" +#define ISL_DEVICE_ID "isl29026" +#define ISL_ID_NAME_SIZE 10 + +#define ISL_MAX_NUM_DEVICES 3 +#define ISL_MAX_DEVICE_REGS 10 + + +//#define RD_CHIPID 0x0 +#define ISL_CFG_REG 0x1 +#define ISL_PROX_EN_Bit 0x80 //1 is enable +#define ISL_PROX_SLP_Bit 0x70 //011 means sleep 100ms +#define ISL_PROX_DR_Bit 0x08 // 0 is 110mA, 1 is 220mA +#define ISL_ALS_EN_Bit 0x04 //1 is enable +#define ISL_ALS_RANGE_Bit 0x02 //0 is low range, 1 is high range +#define ISL_ALSIR_MODE_Bit 0x01 //0 is ALS mode, 1 is IR spectrum mode +#define ISL_SENSOR_All_Off 0x00 +#define ISL_ALS_On (ISL_ALS_EN_Bit | ISL_ALS_RANGE_Bit) +#define ISL_ALS_mask (ISL_ALS_EN_Bit | ISL_ALS_RANGE_Bit | ISL_ALSIR_MODE_Bit) +//#define ISL_PROX_On (0xD0) //101 50ms 110 100ms +#define ISL_PROX_mask (ISL_PROX_EN_Bit | ISL_PROX_SLP_Bit | ISL_PROX_DR_Bit) +#if defined(CONFIG_MACH_BLADE) +#define ISL_PROX_On (0xD0) //101 50ms 110 100ms +#elif defined(CONFIG_MACH_RACER2) +#define ISL_PROX_On (0xD0) //101 50ms 110 100ms +#elif defined(CONFIG_MACH_SKATE) +#define ISL_PROX_On (0xD8) //101 50ms 8 220mA +#elif defined(CONFIG_MACH_ROAMER) +#define ISL_PROX_On (0xD0) //101 50ms 110 100ms +#elif defined(CONFIG_MACH_BLADE2) +#define ISL_PROX_On (0xD0) //101 50ms 110 100ms +#else +#define ISL_PROX_On (0xD0) //101 50ms 110 100ms +#endif + + + +#define ISL_INT_REG 0x2 +#define ISL_INT_PROX_Bit 0x80 //read value is 1 means interrupt event occurred, 0 means no interrupt or cleared +#define ISL_INT_PROX_PRST_Bit 0x60 //00 is 1 c, 01 is 4 c, 10 is 8 c, 11 is 16 c +#define ISL_INT_ALS_Bit 0x08 //read value is 1 means interrupt event occurred, 0 means no interrupt or cleared +#define ISL_INT_ALS_PRST_Bit 0x06 //00 is 1 c, 01 is 4 c, 10 is 8 c, 11 is 16 c +#define ISL_INT_CTRL_Bit 0x01 //0 is PROX or ALS, 1 is PROX and ALS +#define ISL_INT_All_Off 0x00 +#define ISL_ALS_INT_On (0x00) // 4times over/ 4 means 8times over +#define ISL_ALS_INT_mask (0x0E) +#define ISL_PROX_INT_On (0x20) // 4times over +#define ISL_PROX_INT_mask (0xE0) + +#define ISL_PROX_TH_L 0x3 +#define ISL_PROX_TH_H 0x4 + +#define ISL_ALSIR_TH_L 0x5 +#define ISL_ALSIR_TH_HL 0x6 +#define ISL_ALSIR_TH_H 0x7 + +#define ISL_PROX_DATA 0x8 + +#define ISL_ALSIR_DATA_L 0x9 +#define ISL_ALSIR_DATA_H 0xa + +// lux constants +#define ISL_MAX_LUX 65535000 +//#define ISL_SCALE_MILLILUX 3 +#define ISL_FILTER_DEPTH 3 +#define THRES_LO_TO_HI_RATIO 4/5 + +// forward declarations +static int ISL_probe(struct i2c_client *clientp, const struct i2c_device_id *idp); +static int ISL_remove(struct i2c_client *client); +static int ISL_open(struct inode *inode, struct file *file); +static int ISL_release(struct inode *inode, struct file *file); +static int ISL_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg); +static int ISL_read(struct file *file, char *buf, size_t count, loff_t *ppos); +static int ISL_write(struct file *file, const char *buf, size_t count, loff_t *ppos); +static loff_t ISL_llseek(struct file *file, loff_t offset, int orig); +static int ISL_get_lux(void); +static int ISL_device_name(unsigned char *bufp, char **device_name); +static int ISL_prox_poll(struct PS_ALS_prox_info *prxp); + +static void do_ISL_work(struct work_struct *w); +static void ISL_report_value(int mask); +static int calc_distance(int value); +static int enable_light_and_proximity(int mask); +static int light_on=0; +static int prox_on = 0; + +enum ISL_chip_type { + TSL2771 = 0, + TMD2771, +}; + +struct alsprox_data { + struct input_dev *input_dev; +}; + +static struct alsprox_data *light; +static struct alsprox_data *proximity; +// first device number +static dev_t ISL_dev_number; + +// class structure for this device +struct class *ISL_class; + +// module device table +static struct i2c_device_id ISL_idtable[] = { + {ISL_DEVICE_ID, 0}, + {} +}; +MODULE_DEVICE_TABLE(i2c, ISL_idtable); + + +// client and device +struct i2c_client *ISL_my_clientp; +struct i2c_client *ISL_bad_clientp[ISL_MAX_NUM_DEVICES]; +//static int num_bad = 0; +//static int device_found = 0; + +// driver definition +static struct i2c_driver ISL_driver = { + .driver = { + .owner = THIS_MODULE, + .name = "isl29026", + }, + .id_table = ISL_idtable, + .probe = ISL_probe, + .remove = __devexit_p(ISL_remove), +}; + + +struct ISL_intr_data { + int int_gpio; + int irq; +}; + +// per-device data +struct ISL_data { + struct i2c_client *client; + struct cdev cdev; + unsigned int addr; + char ISL_id; + char ISL_name[ISL_ID_NAME_SIZE]; + struct semaphore update_lock; + char valid; + unsigned long last_updated; + struct ISL_intr_data *pdata; + struct work_struct ISL_work; + enum ISL_chip_type chip_type; + struct mutex proximity_calibrating; +} *ISL_datap; + +static struct ISL_intr_data ISL_irq= { + .int_gpio = ISL_INT_GPIO, + .irq = MSM_GPIO_TO_INT(ISL_INT_GPIO), +}; + + +// file operations +static struct file_operations ISL_fops = { + .owner = THIS_MODULE, + .open = ISL_open, + .release = ISL_release, + .read = ISL_read, + .write = ISL_write, + .llseek = ISL_llseek, + .ioctl = ISL_ioctl, +}; + +// device configuration +struct PS_ALS_cfg *ISL_cfgp; +static u32 calibrate_target_param = 300000; +static u16 als_time_param = 27; +static u16 scale_factor_param = 1; +static u8 filter_history_param = 3; +static u8 filter_count_param = 1; +static u8 gain_param = 1; + +#if defined(CONFIG_MACH_BLADE) +static u16 gain_trim_param = 25; +#elif defined(CONFIG_MACH_RACER2) +static u16 gain_trim_param = 50; +#elif defined(CONFIG_MACH_SKATE) +static u16 gain_trim_param = 240; +#elif defined(CONFIG_MACH_ROAMER) +static u16 gain_trim_param = 5; +#elif defined(CONFIG_MACH_BLADE2) +static u16 gain_trim_param = 100; +#else +static u16 gain_trim_param = 25; //this value is set according to specific device +#endif + +static u16 prox_threshold_hi_param = 1023; +static u16 prox_threshold_lo_param = 818; +static u8 prox_int_time_param = 0xF6; +static u8 prox_adc_time_param = 0xFF; +static u8 prox_wait_time_param = 0xFF; +static u8 prox_intr_filter_param = 0x00; +static u8 prox_config_param = 0x00; + +static u8 prox_pulse_cnt_param = 0x10; +static u8 prox_gain_param = 0x20; + +// device reg init values +u8 ISL_triton_reg_init[16] = {0x00,0xFF,0XFF,0XFF,0X00,0X00,0XFF,0XFF,0X00,0X00,0XFF,0XFF,0X00,0X00,0X00,0X00}; + +// +static u16 als_intr_threshold_hi_param = 0; +static u16 als_intr_threshold_lo_param = 0; +int ISL_g_nlux = 0; + + + +// prox info +struct PS_ALS_prox_info ISL_prox_cal_info[20]; +struct PS_ALS_prox_info ISL_prox_cur_info; +struct PS_ALS_prox_info *ISL_prox_cur_infop = &ISL_prox_cur_info; + + +static int device_released = 0; +static u16 sat_als = 0; +static u16 sat_prox = 0; + +// lux time scale +struct time_scale_factor { + u16 numerator; + u16 denominator; + u16 saturation; +}; +struct time_scale_factor ISL_TritonTime = {1, 0, 0}; +struct time_scale_factor *ISL_lux_timep = &ISL_TritonTime; + +// gain table +u8 ISL_triton_gain_table[] = {1, 8, 16, 120}; + +// lux data +struct lux_data { + u16 ratio; + u16 clear; + u16 ir; +}; +struct lux_data ISL_TritonFN_lux_data[] = { + { 9830, 8320, 15360 }, + { 12452, 10554, 22797 }, + { 14746, 6234, 11430 }, + { 17695, 3968, 6400 }, + { 0, 0, 0 } +}; +struct lux_data *ISL_lux_tablep = ISL_TritonFN_lux_data; +static int lux_history[ISL_FILTER_DEPTH] = {-ENODATA, -ENODATA, -ENODATA}; + +//prox data +struct ISL_prox_data { + u16 ratio; + u16 hi; + u16 lo; +}; +struct ISL_prox_data ISL_prox_data[] = { + { 1, 50, 20 }, + { 3, 20, 16 }, + { 6, 18, 14 }, + { 10, 16, 16 }, + { 0, 0, 0 } +}; +struct ISL_prox_data *ISL_prox_tablep = ISL_prox_data; + + +/* ----------------------* +* config gpio for intr utility * +*-----------------------*/ +int ISL_config_int_gpio(int int_gpio) +{ + int rc=0; + uint32_t gpio_config_data = GPIO_CFG(int_gpio, 0, GPIO_INPUT, GPIO_PULL_UP, GPIO_2MA); + + rc = gpio_request(int_gpio, "gpio_sensor"); + if (rc) { + printk(ISL_TAG "%s: gpio_request(%#x)=%d\n", + __func__, int_gpio, rc); + return rc; + } + + rc = gpio_tlmm_config(gpio_config_data, GPIO_ENABLE); + if (rc) { + printk(ISL_TAG "%s: gpio_tlmm_config(%#x)=%d\n", + __func__, gpio_config_data, rc); + return rc; + } + + mdelay(1); + + rc = gpio_direction_input(int_gpio); + if (rc) { + printk(ISL_TAG "%s: gpio_direction_input(%#x)=%d\n", + __func__, int_gpio, rc); + return rc; + } + + return 0; +} + +/* ----------------------* +* ISL interrupt function * +*-----------------------*/ +static irqreturn_t ISL_interrupt(int irq, void *data) +{ + //printk(ISL_TAG "ISL_interrupt\n"); + disable_irq_nosync(ISL_datap->pdata->irq); + schedule_work(&ISL_datap->ISL_work); + + return IRQ_HANDLED; +} + +static void do_ISL_work(struct work_struct *w) +{ + + int ret =0; + //int prx_hi, prx_lo; + u16 status = 0; + status = i2c_smbus_read_byte_data(ISL_datap->client,ISL_INT_REG);//add error ctl + //printk(ISL_TAG "ISL_interrupt status = %x\n",status); + if(status<0) + goto read_reg_fail; + + //als interrupt + if(((status & ISL_INT_ALS_Bit) != 0)/*&&((status & ISL_INT_PROX_Bit)==0)*/) + { + status = status & (~ISL_INT_ALS_Bit); + //printk(ISL_TAG "ISL_interrupt als change status = %d\n",status); + ISL_g_nlux = ISL_get_lux(); + ISL_report_value(0); + } + + //prox interrupt + +// if(((status & ISL_INT_PROX_Bit)!=0)||ISL_prox_cur_infop->prox_event) + if((status & ISL_INT_PROX_Bit)!=0) + { + status = status & (~ISL_INT_PROX_Bit); + //printk(ISL_TAG "ISL_interrupt prox change status = %d\n",status); + if((ret = ISL_prox_poll(ISL_prox_cur_infop))<0) + { + printk(KERN_CRIT "ISL: get prox poll failed in ISL interrupt()\n"); + + } + //printk(ISL_TAG "prox_data = %d prox_threshold_hi = %d prox_threshold_lo = %d \n",ISL_prox_cur_infop->prox_data,ISL_cfgp->prox_threshold_hi,ISL_cfgp->prox_threshold_lo); + if(ISL_prox_cur_infop->prox_data > ISL_cfgp->prox_threshold_hi) + { + if ((ret = (i2c_smbus_write_byte_data(ISL_datap->client, ISL_PROX_TH_H, 0x01))) < 0) { + pr_crit(ISL_TAG "i2c_smbus_write_byte() to ISL_TRITON_PRX_MAXTHRESHLO\n"); + } +/* if ((ret = (i2c_smbus_write_byte_data(ISL_datap->client, ISL_PROX_TH_L, 0x00))) < 0) { + pr_crit(ISL_TAG "i2c_smbus_write_byte() to ISL_TRITON_PRX_MAXTHRESHLO\n"); + } +*/ + ISL_prox_cur_infop->prox_event = 1; + } + else if(ISL_prox_cur_infop->prox_data < ISL_cfgp->prox_threshold_lo) + { + if ((ret = (i2c_smbus_write_byte_data(ISL_datap->client, ISL_PROX_TH_H,ISL_cfgp->prox_threshold_hi))) < 0) { + pr_crit(ISL_TAG "i2c_smbus_write_byte() to ISL_TRITON_PRX_MAXTHRESHLO\n"); + } +/* if ((ret = (i2c_smbus_write_byte_data(ISL_datap->client, ISL_PROX_TH_L,0x00))) < 0) { + pr_crit(ISL_TAG "i2c_smbus_write_byte() to ISL_TRITON_PRX_MINTHRESHLO\n"); + } +*/ + ISL_prox_cur_infop->prox_event = 0; + //pr_crit(ISL_TAG "screen on:ISL_prox_cur_infop->prox_data=%d\n",ISL_prox_cur_infop->prox_data); + } + /* if ((ret = (i2c_smbus_write_byte_data(ISL_datap->client, ISL_INT_REG, status))) < 0) + { + printk(KERN_CRIT "ISL: i2c_smbus_write_byte failed in clear als interrupt\n"); + }*/ + ISL_report_value(1); + } + +read_reg_fail: + //clear intr for als intr case, as prox intr already be cleared in prox_poll + if ((ret = (i2c_smbus_write_byte_data(ISL_datap->client, ISL_INT_REG, status))) < 0) + { + printk(KERN_CRIT "ISL: i2c_smbus_write_byte failed in clear als interrupt\n"); + } + enable_irq(ISL_datap->pdata->irq); + return; +} + +/*calc_distance, using prox value*/ +static int calc_distance(int value) +{ + int temp=0; + if(ISL_prox_cur_infop->prox_event == 1) + temp=0; + else if(ISL_prox_cur_infop->prox_event == 0) + temp=5; + return temp; +} + +/*report als and prox data to input sub system, +for data poll utility in hardware\alsprox.c +*/ +static void ISL_report_value(int mask) +{ + struct PS_ALS_prox_info *val = ISL_prox_cur_infop; + int lux_val=ISL_g_nlux; + int dist; + lux_val=(lux_val<=1)? lux_val:lux_val*10; + + if (mask==0) { + input_report_abs(light->input_dev, ABS_MISC, lux_val); +//[sensor wlg 20110729]ALS thereshold modify add log + printk(KERN_CRIT "ISL: als_interrupt lux_val(%d)=ISL_g_nlux(%d) * 9 \n", lux_val, ISL_g_nlux); + input_sync(light->input_dev); + } + + if (mask==1) { + dist=calc_distance(val->prox_data); + //input_report_als(alsprox->input_dev, ALS_PROX, val->prox_clear); + input_report_abs(proximity->input_dev, ABS_DISTANCE, dist); + //input_report_als(alsprox->input_dev, ALS_PROX, val->prox_event); + printk(KERN_CRIT "ISL: prox_interrupt =%d, distance=%d\n", val->prox_data,dist); + input_sync(proximity->input_dev); + } + + //input_sync(alsprox->input_dev); + //enable_irq(ISL_datap->pdata->irq); +} + + + +/* ------------* +* driver init * +*------------*/ +static int __init ISL_init(void) { + int ret = 0; + //struct i2c_adapter *my_adap; + printk(KERN_ERR "ISL: comes into ISL_init\n"); + if ((ret = (alloc_chrdev_region(&ISL_dev_number, 0, ISL_MAX_NUM_DEVICES, ISL_DEVICE_NAME))) < 0) { + printk(KERN_ERR "ISL: alloc_chrdev_region() failed in ISL_init()\n"); + return (ret); + } + ISL_class = class_create(THIS_MODULE, ISL_DEVICE_NAME); + ISL_datap = kmalloc(sizeof(struct ISL_data), GFP_KERNEL); + if (!ISL_datap) { + printk(KERN_ERR "ISL: kmalloc for struct ISL_data failed in ISL_init()\n"); + return -ENOMEM; + } + memset(ISL_datap, 0, sizeof(struct ISL_data)); + cdev_init(&ISL_datap->cdev, &ISL_fops); + ISL_datap->cdev.owner = THIS_MODULE; + if ((ret = (cdev_add(&ISL_datap->cdev, ISL_dev_number, 1))) < 0) { + printk(KERN_ERR "ISL: cdev_add() failed in ISL_init()\n"); + return (ret); + } + //device_create(ISL_class, NULL, MKDEV(MAJOR(ISL_dev_number), 0), &ISL_driver ,"ISL"); + ret = i2c_add_driver(&ISL_driver); + if(ret){ + printk(KERN_ERR "ISL: i2c_add_driver() failed in ISL_init(),%d\n",ret); + return (ret); + } + //pr_crit(ISL_TAG "%s:%d\n",__func__,ret); + return (ret); +} + + + +// driver exit +static void __exit ISL_exit(void) { +/* if (ISL_my_clientp) + i2c_unregister_device(ISL_my_clientp); + */ + i2c_del_driver(&ISL_driver); + unregister_chrdev_region(ISL_dev_number, ISL_MAX_NUM_DEVICES); + device_destroy(ISL_class, MKDEV(MAJOR(ISL_dev_number), 0)); + cdev_del(&ISL_datap->cdev); + class_destroy(ISL_class); + mutex_destroy(&ISL_datap->proximity_calibrating); + kfree(ISL_datap); +} + + +//*************************************************** +/*static struct file_operations ISL_device_fops = { + .owner = THIS_MODULE, + .open = ISL_open, + .release = ISL_release, + .ioctl = ISL_ioctl, +}; + + +static struct miscdevice ISL_device = { + .minor = MISC_DYNAMIC_MINOR, + .name = "ISL", + .fops = &ISL_device_fops, +}; +*/ + +// client probe +static int ISL_probe(struct i2c_client *clientp, const struct i2c_device_id *idp) { + int ret = 0; + int i = 0; + unsigned char buf[ISL_MAX_DEVICE_REGS]; + char *device_name; + +// if (device_found) +// return -ENODEV; + if (!i2c_check_functionality(clientp->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) { + printk(KERN_ERR "ISL: ISL_probe() - i2c smbus byte data functions unsupported\n"); + return -EOPNOTSUPP; + } + if (!i2c_check_functionality(clientp->adapter, I2C_FUNC_SMBUS_WORD_DATA)) { + printk(KERN_ERR "ISL: ISL_probe() - i2c smbus word data functions unsupported\n"); + } + if (!i2c_check_functionality(clientp->adapter, I2C_FUNC_SMBUS_BLOCK_DATA)) { + printk(KERN_ERR "ISL: ISL_probe() - i2c smbus block data functions unsupported\n"); + } + ISL_datap->client = clientp; + i2c_set_clientdata(clientp, ISL_datap); + + for(i = 1; i < ISL_MAX_DEVICE_REGS; i++) { + //buf[i] = i2c_smbus_read_byte_data(clientp, i); + buf[i] = i2c_smbus_read_byte_data(ISL_datap->client, i); + if(buf[i] < 0) + { + printk(KERN_ERR "ISL: i2c_smbus_read_byte_data(%d) failed in ISL_probe()\n",i); + } + else + { + //printk(KERN_ERR "ISL: i2c_smbus_read_byte_data(%d) = %d in ISL_probe()\n", i, buf[i]); + } + } + //check device ID "tritonFN" + if ((ret = ISL_device_name(buf, &device_name)) == 0) { + printk(KERN_ERR "ISL: chip id that was read found mismatched by ISL_device_name(), in ISL_probe()\n"); + return -ENODEV; + } + if (strcmp(device_name, ISL_DEVICE_ID)) { + printk(KERN_ERR "ISL: chip id that was read does not match expected id in ISL_probe()\n"); + return -ENODEV; + } + else{ + printk(KERN_ERR "ISL: chip id of %s that was read matches expected id in ISL_probe()\n", device_name); + //device_found = 1; + } + device_create(ISL_class, NULL, MKDEV(MAJOR(ISL_dev_number), 0), &ISL_driver ,"ISL"); + + if ((ret = (i2c_smbus_write_byte_data(ISL_datap->client,ISL_ALSIR_TH_L,0) < 0))) { + printk(KERN_ERR "ISL: i2c_smbus_write_byte() to control reg failed in ISL_probe()\n"); + return(ret); + } + if ((ret = (i2c_smbus_write_byte_data(ISL_datap->client,ISL_ALSIR_TH_HL,0) < 0))) { + printk(KERN_ERR "ISL: i2c_smbus_write_byte() to control reg failed in ISL_probe()\n"); + return(ret); + } + if ((ret = (i2c_smbus_write_byte_data(ISL_datap->client,ISL_ALSIR_TH_H,0) < 0))) { + printk(KERN_ERR "ISL: i2c_smbus_write_byte() to control reg failed in ISL_probe()\n"); + return(ret); + } + + if ((ret = (i2c_smbus_write_byte_data(ISL_datap->client,ISL_CFG_REG,ISL_SENSOR_All_Off) < 0))) { + printk(KERN_ERR "ISL: i2c_smbus_write_byte() to control reg failed in ISL_probe()\n"); + return(ret); + } + + if ((ret = (i2c_smbus_write_byte_data(ISL_datap->client,ISL_INT_REG,ISL_INT_All_Off) < 0))) { + printk(KERN_ERR "ISL: i2c_smbus_write_byte() to control reg failed in ISL_probe()\n"); + return(ret); + } + + INIT_WORK(&ISL_datap->ISL_work, do_ISL_work); + mutex_init(&ISL_datap->proximity_calibrating); + ISL_datap->pdata = &ISL_irq; + if(clientp->irq){ + ISL_datap->pdata->irq=ISL_datap->client->irq; + ISL_datap->pdata->int_gpio=INT_TO_MSM_GPIO(ISL_datap->pdata->irq); + } + printk(KERN_CRIT "ISL use gpio %d\n",ISL_datap->pdata->int_gpio); + ret=ISL_config_int_gpio(ISL_datap->pdata->int_gpio); + if (ret) { + printk(KERN_CRIT "ISL configure int_gpio%d failed\n", + ISL_datap->pdata->int_gpio); + return ret; + } + + ret = request_irq(ISL_datap->pdata->irq, ISL_interrupt, IRQF_TRIGGER_FALLING, + ISL_datap->ISL_name, ISL_prox_cur_infop); + if (ret) { + printk(KERN_CRIT "ISL request interrupt failed\n"); + return ret; + } + + strlcpy(clientp->name, ISL_DEVICE_ID, I2C_NAME_SIZE); + strlcpy(ISL_datap->ISL_name, ISL_DEVICE_ID, ISL_ID_NAME_SIZE); + ISL_datap->valid = 0; + + init_MUTEX(&ISL_datap->update_lock); + if (!(ISL_cfgp = kmalloc(sizeof(struct PS_ALS_cfg), GFP_KERNEL))) { + printk(KERN_ERR "ISL: kmalloc for struct PS_ALS_cfg failed in ISL_probe()\n"); + return -ENOMEM; + } + + //update settings + //this should behind ISL_device_name + ISL_cfgp->calibrate_target = calibrate_target_param; + ISL_cfgp->als_time = als_time_param; + ISL_cfgp->scale_factor = scale_factor_param; + ISL_cfgp->gain_trim = gain_trim_param; + ISL_cfgp->filter_history = filter_history_param; + ISL_cfgp->filter_count = filter_count_param; + ISL_cfgp->gain = gain_param; + ISL_cfgp->prox_threshold_hi = prox_threshold_hi_param; + ISL_cfgp->prox_threshold_lo = prox_threshold_lo_param; + ISL_cfgp->prox_int_time = prox_int_time_param; + ISL_cfgp->prox_adc_time = prox_adc_time_param; + ISL_cfgp->prox_wait_time = prox_wait_time_param; + ISL_cfgp->prox_intr_filter = prox_intr_filter_param; + ISL_cfgp->prox_config = prox_config_param; + ISL_cfgp->prox_pulse_cnt = prox_pulse_cnt_param; + ISL_cfgp->prox_gain = prox_gain_param; + sat_als = 0xFFF; + sat_prox = 0xFF; + + light = kzalloc(sizeof(struct alsprox_data), GFP_KERNEL); + if (!light) { + ret = -ENOMEM; + goto exit_alloc_data_failed; + } + proximity= kzalloc(sizeof(struct alsprox_data), GFP_KERNEL); + if (!proximity) { + ret = -ENOMEM; + goto exit_alloc_data_failed; + } + + light->input_dev = input_allocate_device(); + if (!light->input_dev) { + ret = -ENOMEM; + printk(KERN_ERR "ISL_probe: Failed to allocate light input device\n"); + goto exit_input_dev_alloc_failed; + } + proximity->input_dev = input_allocate_device(); + if (!proximity->input_dev) { + ret = -ENOMEM; + printk(KERN_ERR "ISL_probe: Failed to allocate prox input device\n"); + goto exit_input_dev_alloc_failed; + } + + /* lux */ + set_bit(EV_ABS, light->input_dev->evbit); + input_set_abs_params(light->input_dev, ABS_MISC, 0, 65535, 0, 0); + light->input_dev->name = "light"; + /* prox */ + set_bit(EV_ABS, proximity->input_dev->evbit); + input_set_abs_params(proximity->input_dev, ABS_DISTANCE, 0, 65535, 0, 0); + proximity->input_dev->name = "proximity"; + + ret = input_register_device(light->input_dev); + if (ret) { + printk("ISL_probe: Unable to register input device: %s\n", light->input_dev->name); + goto exit_input_register_device_failed; + } + ret = input_register_device(proximity->input_dev); + if (ret) { + printk("ISL_probe: Unable to register input device: %s\n", proximity->input_dev->name); + goto exit_input_register_device_failed; + } + + return (ret); +//exit_ISL_device_register_failed: +exit_input_register_device_failed: + if(light->input_dev) + input_free_device(light->input_dev); + if(proximity->input_dev) + input_free_device(proximity->input_dev); +exit_input_dev_alloc_failed: +exit_alloc_data_failed: + if(light) + kfree(light); + if(proximity) + kfree(proximity); + return (ret); +} + + +// client remove +static int __devexit ISL_remove(struct i2c_client *client) { + int ret = 0; + + return (ret); +} + +// open +static int ISL_open(struct inode *inode, struct file *file) { + struct ISL_data *ISL_datap; + int ret = 0; + device_released = 0; + ISL_datap = container_of(inode->i_cdev, struct ISL_data, cdev); + if (strcmp(ISL_datap->ISL_name, ISL_DEVICE_ID) != 0) { + printk(KERN_ERR "ISL: device name incorrect during ISL_open(), get %s\n", ISL_datap->ISL_name); + ret = -ENODEV; + } + return (ret); +} + +// release +static int ISL_release(struct inode *inode, struct file *file) { + struct ISL_data *ISL_datap; + int ret = 0; + + device_released = 1; + prox_on = 0; + //printk(KERN_CRIT "[ISL]:%s\n", __func__); + + //prox_history_hi = 0; + //prox_history_hi = 0; + ISL_datap = container_of(inode->i_cdev, struct ISL_data, cdev); + if (strcmp(ISL_datap->ISL_name, ISL_DEVICE_ID) != 0) { + printk(KERN_ERR "ISL: device name incorrect during ISL_release(), get %s\n", ISL_datap->ISL_name); + ret = -ENODEV; + } + return (ret); +} + +// read +static int ISL_read(struct file *file, char *buf, size_t count, loff_t *ppos) { + struct ISL_data *ISL_datap; + u8 i = 0, xfrd = 0, reg = 0; + u8 my_buf[ISL_MAX_DEVICE_REGS]; + int ret = 0; + + //if (prox_on) + //del_timer(&prox_poll_timer); + if ((*ppos < 0) || (*ppos >= ISL_MAX_DEVICE_REGS) || (count > ISL_MAX_DEVICE_REGS)) { + printk(KERN_ERR "ISL: reg limit check failed in ISL_read()\n"); + return -EINVAL; + } + reg = (u8)*ppos; + ISL_datap = container_of(file->f_dentry->d_inode->i_cdev, struct ISL_data, cdev); + while (xfrd < count) { + my_buf[i++] = i2c_smbus_read_byte_data(ISL_datap->client,reg); + reg++; + xfrd++; + } + if ((ret = copy_to_user(buf, my_buf, xfrd))){ + printk(KERN_ERR "ISL: copy_to_user failed in ISL_read()\n"); + return -ENODATA; + } + //if (prox_on) + //ISL_prox_poll_timer_start(); + return ((int)xfrd); +} + +// write +static int ISL_write(struct file *file, const char *buf, size_t count, loff_t *ppos) { + struct ISL_data *ISL_datap; + u8 i = 0, xfrd = 0, reg = 0; + u8 my_buf[ISL_MAX_DEVICE_REGS]; + int ret = 0; + + //if (prox_on) + //del_timer(&prox_poll_timer); + if ((*ppos < 0) || (*ppos >= ISL_MAX_DEVICE_REGS) || ((*ppos + count) > ISL_MAX_DEVICE_REGS)) { + printk(KERN_ERR "ISL: reg limit check failed in ISL_write()\n"); + return -EINVAL; + } + reg = (u8)*ppos; + if ((ret = copy_from_user(my_buf, buf, count))) { + printk(KERN_ERR "ISL: copy_to_user failed in ISL_write()\n"); + return -ENODATA; + } + ISL_datap = container_of(file->f_dentry->d_inode->i_cdev, struct ISL_data, cdev); + while (xfrd < count) { + if ((ret = (i2c_smbus_write_byte_data(ISL_datap->client, reg, my_buf[i++]))) < 0) { + printk(KERN_ERR "ISL: i2c_smbus_write_byte_data failed in ISL_write()\n"); + return (ret); + } + reg++; + xfrd++; + } + //if (prox_on) + //ISL_prox_poll_timer_start(); + return ((int)xfrd); +} + +// llseek +static loff_t ISL_llseek(struct file *file, loff_t offset, int orig) { + int ret = 0; + loff_t new_pos = 0; + + //if (prox_on) + //del_timer(&prox_poll_timer); + if ((offset >= ISL_MAX_DEVICE_REGS) || (orig < 0) || (orig > 1)) { + printk(KERN_ERR "ISL: offset param limit or origin limit check failed in ISL_llseek()\n"); + return -EINVAL; + } + switch (orig) { + case 0: + new_pos = offset; + break; + case 1: + new_pos = file->f_pos + offset; + break; + default: + return -EINVAL; + break; + } + if ((new_pos < 0) || (new_pos >= ISL_MAX_DEVICE_REGS) || (ret < 0)) { + printk(KERN_ERR "ISL: new offset limit or origin limit check failed in ISL_llseek()\n"); + return -EINVAL; + } + file->f_pos = new_pos; + // if (prox_on) + // ISL_prox_poll_timer_start(); + return new_pos; +} + +/*enable_light_and_proximity, mask values' indication*/ +/*10 : light on*/ +/*01 : prox on*/ +/*20 : light off*/ +/*02 : prox off*/ +static int enable_light_and_proximity(int mask) +{ + u8 ret = 0, reg_val = 0; //itime = 0; + + if(mask==0x10) /*10 : light on*/ + { + pr_crit(ISL_TAG "light on\n"); + if ((reg_val = (i2c_smbus_read_byte_data(ISL_datap->client,ISL_INT_REG))) < 0) { + printk(KERN_ERR "ISL: i2c_smbus_read_byte_data failed in ioctl prox_on\n"); + return (reg_val); + } + reg_val = (reg_val & (~ISL_ALS_INT_mask)) | ISL_ALS_INT_On; + if ((ret = (i2c_smbus_write_byte_data(ISL_datap->client, ISL_INT_REG, reg_val))) < 0) { + printk(KERN_ERR "ISL: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + + reg_val = als_intr_threshold_lo_param & 0x00FF; + if ((ret = (i2c_smbus_write_byte_data(ISL_datap->client, ISL_ALSIR_TH_L, reg_val))) < 0) { + printk(KERN_ERR "ISL: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + reg_val = ((als_intr_threshold_lo_param >> 8) & 0x000F) | ((als_intr_threshold_hi_param << 4) & 0x00F0) ; + if ((ret = (i2c_smbus_write_byte_data(ISL_datap->client, ISL_ALSIR_TH_HL, reg_val))) < 0) { + printk(KERN_ERR "ISL: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + reg_val = (als_intr_threshold_hi_param >> 4) & 0x00FF; + if ((ret = (i2c_smbus_write_byte_data(ISL_datap->client, ISL_ALSIR_TH_H, reg_val))) < 0) { + printk(KERN_ERR "ISL: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + + if ((reg_val = (i2c_smbus_read_byte_data(ISL_datap->client,ISL_CFG_REG))) < 0) { + printk(KERN_ERR "ISL: i2c_smbus_read_byte_data failed in ioctl prox_on\n"); + return (reg_val); + } + reg_val = (reg_val & (~ISL_ALS_mask)) | ISL_ALS_On; + if ((ret = (i2c_smbus_write_byte_data(ISL_datap->client, ISL_CFG_REG, reg_val))) < 0) { + printk(KERN_ERR "ISL: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + } + if(mask==0x01) /*01 : prox on*/ + { + pr_crit(ISL_TAG "prox on\n"); + if ((reg_val = (i2c_smbus_read_byte_data(ISL_datap->client,ISL_INT_REG))) < 0) { + printk(KERN_ERR "ISL: i2c_smbus_read_byte_data failed in ioctl prox_on\n"); + return (reg_val); + } + reg_val = (reg_val & (~(ISL_PROX_INT_mask ))) | ISL_PROX_INT_On; + if ((ret = (i2c_smbus_write_byte_data(ISL_datap->client, ISL_INT_REG, reg_val))) < 0) { + printk(KERN_ERR "ISL: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + +// reg_val = ISL_cfgp->prox_threshold_lo & 0x00FF; + if ((ret = (i2c_smbus_write_byte_data(ISL_datap->client, ISL_PROX_TH_L, 0x00))) < 0) { + printk(KERN_ERR "ISL: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + reg_val = ISL_cfgp->prox_threshold_hi & 0x00FF; + if ((ret = (i2c_smbus_write_byte_data(ISL_datap->client, ISL_PROX_TH_H, reg_val))) < 0) { + printk(KERN_ERR "ISL: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + + if ((reg_val = (i2c_smbus_read_byte_data(ISL_datap->client,ISL_CFG_REG))) < 0) { + printk(KERN_ERR "ISL: i2c_smbus_read_byte_data failed in ioctl prox_on\n"); + return (reg_val); + } + reg_val = (reg_val & (~ISL_PROX_mask)) | ISL_PROX_On; + if ((ret = (i2c_smbus_write_byte_data(ISL_datap->client, ISL_CFG_REG, reg_val))) < 0) { + printk(KERN_ERR "ISL: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + } + if(mask==0x20) /*20 : light off*/ + { + pr_crit(ISL_TAG "light off\n"); + reg_val = 0x00; + if ((ret = (i2c_smbus_write_byte_data(ISL_datap->client, ISL_ALSIR_TH_L, reg_val))) < 0) { + printk(KERN_ERR "ISL: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + reg_val = 0xF0; + if ((ret = (i2c_smbus_write_byte_data(ISL_datap->client, ISL_ALSIR_TH_HL, reg_val))) < 0) { + printk(KERN_ERR "ISL: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + reg_val = 0xFF; + if ((ret = (i2c_smbus_write_byte_data(ISL_datap->client, ISL_ALSIR_TH_H, reg_val))) < 0) { + printk(KERN_ERR "ISL: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + + if ((reg_val = (i2c_smbus_read_byte_data(ISL_datap->client,ISL_INT_REG))) < 0) { + printk(KERN_ERR "ISL: i2c_smbus_read_byte_data failed in ioctl prox_on\n"); + return (reg_val); + } + reg_val = (reg_val & (~ISL_ALS_INT_mask)); + if ((ret = (i2c_smbus_write_byte_data(ISL_datap->client, ISL_INT_REG, reg_val))) < 0) { + printk(KERN_ERR "ISL: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + + if ((reg_val = (i2c_smbus_read_byte_data(ISL_datap->client,ISL_CFG_REG))) < 0) { + printk(KERN_ERR "ISL: i2c_smbus_read_byte_data failed in ioctl prox_on\n"); + return (reg_val); + } + reg_val = (reg_val & (~ISL_ALS_mask)) ; + if ((ret = (i2c_smbus_write_byte_data(ISL_datap->client, ISL_CFG_REG, reg_val))) < 0) { + printk(KERN_ERR "ISL: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + } + if(mask==0x02) /*02 : prox off*/ + { + pr_crit(ISL_TAG "prox off\n"); + if ((reg_val = (i2c_smbus_read_byte_data(ISL_datap->client,ISL_CFG_REG))) < 0) { + printk(KERN_ERR "ISL: i2c_smbus_read_byte_data failed in ioctl prox_on\n"); + return (reg_val); + } + reg_val = (reg_val & (~ISL_PROX_mask)); + if ((ret = (i2c_smbus_write_byte_data(ISL_datap->client, ISL_CFG_REG, reg_val))) < 0) { + printk(KERN_ERR "ISL: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + + if ((reg_val = (i2c_smbus_read_byte_data(ISL_datap->client,ISL_INT_REG))) < 0) { + printk(KERN_ERR "ISL: i2c_smbus_read_byte_data failed in ioctl prox_on\n"); + return (reg_val); + } + reg_val = (reg_val & (~ISL_PROX_INT_mask)); + if ((ret = (i2c_smbus_write_byte_data(ISL_datap->client, ISL_INT_REG, reg_val))) < 0) { + printk(KERN_ERR "ISL: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + } + return ret; +} + +// ioctls +static int ISL_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { + struct ISL_data *ISL_datap; + int prox_sum = 0, prox_mean = 0, prox_max = 0; + int lux_val = 0, ret = 0, i = 0; + u8 reg_val = 0; + u16 ratio; + struct ISL_prox_data *prox_pt; + + ISL_datap = container_of(inode->i_cdev, struct ISL_data, cdev); +//[sensor wlg 20110729]ALS thereshold modify add log +//printk(KERN_ERR "ISL_wlg: ISL_ioctl() cmd=%d\n", cmd); + switch (cmd) { + case PS_ALS_IOCTL_ALS_ON: + if(light_on) + { + pr_crit(ISL_TAG "PS_ALS_IOCTL_ALS_ON: light already on.\n"); + break; + } + ret=enable_light_and_proximity(0x10); + if(ret>=0) + { + light_on=1; + pr_crit(ISL_TAG "PS_ALS_IOCTL_ALS_ON,lux=%d\n", ISL_g_nlux); + } + return (ret); + break; + case PS_ALS_IOCTL_ALS_OFF: + if(light_on == 0) + { + pr_crit(ISL_TAG "PS_ALS_IOCTL_ALS_OFF: light already off.\n"); + break; + } + + for (i = 0; i < ISL_FILTER_DEPTH; i++) + lux_history[i] = -ENODATA; + ret=enable_light_and_proximity(0x20); + if(ret>=0) + { + light_on=0; + //ISL_g_nlux=0; + pr_crit(ISL_TAG"PS_ALS_IOCTL_ALS_OFF\n"); + } + return (ret); + break; + case PS_ALS_IOCTL_ALS_DATA: + if(light_on == 0) + { + pr_crit(ISL_TAG "PS_ALS_IOCTL_ALS_DATA: read als data when light off.\n"); + } + + reg_val = i2c_smbus_read_byte_data(ISL_datap->client,ISL_ALSIR_DATA_L); + if(reg_val < 0) + { + return ret; + } + ret = reg_val; + reg_val = i2c_smbus_read_byte_data(ISL_datap->client,ISL_ALSIR_DATA_H); + if(reg_val < 0) + { + return reg_val; + } + lux_val = (ret & 0xf0) + ((reg_val & 0xf) << 8); + return lux_val; + break; + case PS_ALS_IOCTL_ALS_CALIBRATE: + + break; + + case PS_ALS_IOCTL_CONFIG_GET: + ret = copy_to_user((struct PS_ALS_cfg *)arg, ISL_cfgp, sizeof(struct PS_ALS_cfg)); + if (ret) { + printk(KERN_ERR "ISL: copy_to_user failed in ioctl config_get\n"); + return -ENODATA; + } + return (ret); + break; + case PS_ALS_IOCTL_CONFIG_SET: + ret = copy_from_user(ISL_cfgp, (struct PS_ALS_cfg *)arg, sizeof(struct PS_ALS_cfg)); + if (ret) { + printk(KERN_ERR "ISL: copy_from_user failed in ioctl config_set\n"); + return -ENODATA; + } + return (ret); + break; + case PS_ALS_IOCTL_PROX_ON: + if(prox_on) + { + pr_crit(ISL_TAG "PS_ALS_IOCTL_PROX_ON: prox already on.\n"); + break; + } + + ISL_prox_cur_infop->prox_event = 0; + ISL_prox_cur_infop->prox_clear = 0; + ISL_prox_cur_infop->prox_data = 0; + ret=enable_light_and_proximity(0x01); + if(ret>=0) + { + prox_on = 1; + pr_crit(ISL_TAG "PS_ALS_IOCTL_PROX_ON\n"); + } + return ret; + break; + case PS_ALS_IOCTL_PROX_OFF: + if(prox_on == 0) + { + pr_crit(ISL_TAG "PS_ALS_IOCTL_PROX_OFF: prox already off.\n"); + break; + } + + ret=enable_light_and_proximity(0x02); + if(ret>=0) + { + prox_on = 0; + pr_crit(ISL_TAG"PS_ALS_IOCTL_PROX_OFF\n"); + } + return ret; + break; + case PS_ALS_IOCTL_PROX_DATA: + ret = copy_to_user((struct PS_ALS_prox_info *)arg, ISL_prox_cur_infop, sizeof(struct PS_ALS_prox_info)); + if (ret) { + printk(KERN_ERR "ISL: copy_to_user failed in ioctl prox_data\n"); + return -ENODATA; + } + return (ret); + break; + case PS_ALS_IOCTL_PROX_EVENT: + return (ISL_prox_cur_infop->prox_event); + break; + case PS_ALS_IOCTL_PROX_CALIBRATE: + if (!prox_on) + { + printk(KERN_ERR "ISL: ioctl prox_calibrate was called before ioctl prox_on was called\n"); + return -EPERM; + } + mutex_lock(&ISL_datap->proximity_calibrating); + prox_sum = 0; + prox_max = 0; + for (i = 0; i < 20; i++) { + if ((ret = ISL_prox_poll(&ISL_prox_cal_info[i])) < 0) { + printk(KERN_ERR "ISL: call to prox_poll failed in ioctl prox_calibrate\n"); + mutex_unlock(&ISL_datap->proximity_calibrating); + return (ret); + } + pr_crit(ISL_TAG "prox calibrate poll prox[%d] = %d\n",i,ISL_prox_cal_info[i].prox_data); + prox_sum += ISL_prox_cal_info[i].prox_data; + if (ISL_prox_cal_info[i].prox_data > prox_max) + prox_max = ISL_prox_cal_info[i].prox_data; + mdelay(100); + } + prox_mean = prox_sum/20; + ratio = 10*prox_mean/sat_prox; + for (prox_pt = ISL_prox_tablep; prox_pt->ratio && prox_pt->ratio <= ratio; prox_pt++); + if(!prox_pt->ratio) + return -1; + + ISL_cfgp->prox_threshold_hi = (prox_mean*prox_pt->hi)/10; + if (ISL_cfgp->prox_threshold_hi <= ((sat_prox*3)/100)) { + ISL_cfgp->prox_threshold_hi = ((sat_prox*8)/100); + } + ISL_cfgp->prox_threshold_lo = ISL_cfgp->prox_threshold_hi*THRES_LO_TO_HI_RATIO; + //write back threshold + reg_val = 0;//ISL_cfgp->prox_threshold_lo & 0x00FF; + if ((ret = (i2c_smbus_write_byte_data(ISL_datap->client, ISL_PROX_TH_L, reg_val))) < 0) { + printk(KERN_ERR "ISL: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + reg_val = ISL_cfgp->prox_threshold_hi & 0x00FF; + if ((ret = (i2c_smbus_write_byte_data(ISL_datap->client, ISL_PROX_TH_H, reg_val))) < 0) { + printk(KERN_ERR "ISL: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + mutex_unlock(&ISL_datap->proximity_calibrating); + pr_crit(KERN_ERR "ISL prox_cal_threshold_hi=%d,prox_cal_threshold_lo=%d\n",ISL_cfgp->prox_threshold_hi,ISL_cfgp->prox_threshold_lo); + break; + + case PS_ALS_IOCTL_PROX_GET_ENABLED: + return put_user(prox_on, (unsigned long __user *)arg); + break; + case PS_ALS_IOCTL_ALS_GET_ENABLED: + return put_user(light_on, (unsigned long __user *)arg); + break; + + default: + return -EINVAL; + break; + } + return (ret); +} + +// read and calculate lux value +static int ISL_get_lux(void) +{ + u16 raw_clear = 0, reg_val=0; + u32 lux = 0; +// u32 ratio = 0; +// u8 dev_gain = 0; +// struct lux_data *p; + int ret = 0; + u8 chdata[2]; + int i = 0; + pr_crit(ISL_TAG "ISL start to calc lux value\n"); + + for (i = 0; i < 2; i++) { + chdata[i] = i2c_smbus_read_byte_data(ISL_datap->client,ISL_ALSIR_DATA_L+i); + } + + raw_clear = ((chdata[1]&0xF)<< 8)|chdata[0]; + + als_intr_threshold_hi_param = raw_clear + raw_clear/5; + als_intr_threshold_lo_param = raw_clear - raw_clear/5; + + //update threshold + printk(ISL_TAG "als_intr_threshold_hi_param=%x,als_intr_threshold_lo_param=%x\n",als_intr_threshold_hi_param,als_intr_threshold_lo_param); + reg_val = als_intr_threshold_lo_param & 0x00FF; + //printk(ISL_TAG "ISL_ALSIR_TH_L = %x\n",reg_val); + if ((ret = (i2c_smbus_write_byte_data(ISL_datap->client, ISL_ALSIR_TH_L, reg_val))) < 0) { + printk(KERN_ERR "ISL: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + reg_val = ((als_intr_threshold_lo_param >> 8) & 0x000F) | ((als_intr_threshold_hi_param << 4) & 0x00F0) ; + //printk(ISL_TAG "ISL_ALSIR_TH_HL = %x\n",reg_val); + if ((ret = (i2c_smbus_write_byte_data(ISL_datap->client, ISL_ALSIR_TH_HL, reg_val))) < 0) { + printk(KERN_ERR "ISL: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + reg_val = (als_intr_threshold_hi_param >> 4) & 0x00FF; + //printk(ISL_TAG "ISL_ALSIR_TH_H = %x\n",reg_val); + if ((ret = (i2c_smbus_write_byte_data(ISL_datap->client, ISL_ALSIR_TH_H, reg_val))) < 0) { + printk(KERN_ERR "ISL: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + + lux = raw_clear; + return(lux); +} + + +// verify device +static int ISL_device_name(unsigned char *bufp, char **device_name) { + ISL_datap->chip_type=TMD2771; +/* if( (bufp[0x12]&0xf0)!=0x00) + return(0); + if(bufp[0x10]|bufp[0x1a]|bufp[0x1b]|bufp[0x1c]|bufp[0x1d]|bufp[0x1e]) + return(0); + if(bufp[0x13]&0x0c) + return(0); +*/ + *device_name="isl29026"; + return(1); +} + +// proximity poll +static int ISL_prox_poll(struct PS_ALS_prox_info *prxp) { + u8 prox_data; + + prox_data = i2c_smbus_read_byte_data(ISL_datap->client,ISL_PROX_DATA); + prxp->prox_data = prox_data; + + return (prox_data); + } +// start prox poll timer +/* +static void ISL_prox_poll_timer_start(void) { + init_timer(&prox_poll_timer); + prox_poll_timer.expires = jiffies + (HZ/10); + prox_poll_timer.function = ISL_prox_poll_timer_func; + add_timer(&prox_poll_timer); + + return; +}*/ + + +MODULE_AUTHOR("ZTE Software"); +MODULE_DESCRIPTION("ISL ambient light and proximity sensor driver"); +MODULE_LICENSE("GPL"); + +module_init(ISL_init); +module_exit(ISL_exit); + diff --git a/drivers/i2c/chips/lis302dl.c b/drivers/i2c/chips/lis302dl.c index 61fab70a..1f76a542 100644 --- a/drivers/i2c/chips/lis302dl.c +++ b/drivers/i2c/chips/lis302dl.c @@ -320,6 +320,14 @@ static int lis302dl_TransRBuff(short *buffer) buffer[0] = ((s8)buf[1])*18; buffer[1] = ((s8)buf[0])*18; buffer[2] = ((s8)buf[2])*18; +#elif defined(CONFIG_MACH_RACER2) + buffer[0] = ((s8)buf[0])*18; + buffer[1] = ((s8)buf[1])*18; + buffer[2] = ((s8)buf[2])*18*(-1); +#elif defined(CONFIG_MACH_BLUETICK) + buffer[0] = ((s8)buf[0])*18; + buffer[1] = ((s8)buf[1])*18*(-1); + buffer[2] = ((s8)buf[2])*18; #else buffer[0] = ((s8)buf[1])*18*(-1); buffer[1] = ((s8)buf[0])*18*(-1); @@ -423,7 +431,7 @@ static int lis302dl_ioctl(struct inode *inode, struct file *file, unsigned int c static void lis302dl_early_suspend(struct early_suspend *handler) { - int ret = lis302dl_set_mode(0); + int ret = lis302dl_set_mode(1); if(!ret) pr_info(LIS302_TAG "lis302dl suspend\n"); else @@ -433,12 +441,12 @@ static void lis302dl_early_suspend(struct early_suspend *handler) static void lis302dl_late_resume(struct early_suspend *handler) { - int ret = lis302dl_set_mode(1); + //int ret = lis302dl_set_mode(1); - if(!ret) + //if(!ret) pr_info(LIS302_TAG "lis302dl resume\n"); - else - pr_err(LIS302_TAG "lis302dl resume failed \n"); + //else + // pr_err(LIS302_TAG "lis302dl resume failed \n"); } diff --git a/drivers/i2c/chips/pn544.c b/drivers/i2c/chips/pn544.c index 56810b7a..190d8259 100644 --- a/drivers/i2c/chips/pn544.c +++ b/drivers/i2c/chips/pn544.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include @@ -36,9 +37,8 @@ #include #define ZTE_NFC_DEBUG -#define ZTE_IRQ_LOW -#define MAX_BUFFER_SIZE 256 +#define MAX_BUFFER_SIZE 512 #define PN544_MAJOR 0 /* Defaults to dynamic major number */ #define PN544_MINORS 1 /* Register for only one minor */ @@ -53,6 +53,12 @@ struct pn544_dev { struct device *dev; /* The char device structure */ int use_irq; /* Flag set to 1 if using IRQ, 0 if polling */ struct hrtimer timer; /* Timer used for polling */ + unsigned int ven_gpio; + unsigned int firm_gpio; + unsigned int irq_gpio; + unsigned int dcdc_gpio; + unsigned int clock_gpio; + unsigned int int_active_low; }; static struct pn544_dev *pn544_dev = NULL; @@ -175,39 +181,65 @@ static ssize_t pn544_dev_read (struct file *filp, char __user *buf, size_t count return -ERESTARTSYS; } /* Wait for IRQ if not already pending */ - #ifdef ZTE_IRQ_LOW - while (gpio_get_value(irq_gpio)) { - #else - while (!gpio_get_value(irq_gpio)) { - #endif - /* Not ready to read data, release semaphore */ - up(&pn544->sem); - /* Handle non-blocking calls */ - if (filp->f_flags & O_NONBLOCK) { - return -EAGAIN; - } - -#ifdef ZTE_NFC_DEBUG - printk("pn544-dev: wait for incoming data.\n"); -#else - pr_debug("pn544-dev: wait for incoming data.\n"); -#endif - - /* Sleep until the IRQ comes */ - /*这个函数睡眠之后不会被调度,需要在中断或定时器中wake_up_interruptible() - 之后才会被调度去判决gpio_get_value(irq_gpio)!=0 */ - #ifdef ZTE_IRQ_LOW - if (wait_event_interruptible(pn544->read_queue, (gpio_get_value(irq_gpio)==0))) { -#else - if (wait_event_interruptible(pn544->read_queue, (gpio_get_value(irq_gpio)!=0))) { -#endif - return -ERESTARTSYS; /* signal: tell the fs layer to handle it */ - } - /* Loop, but first reacquire the lock (to avoid multiple read concurrency) */ - if (down_interruptible(&pn544->sem)) { - return -ERESTARTSYS; - } + if(pn544_dev->int_active_low==1) + { + while (gpio_get_value(irq_gpio)) { + /* Not ready to read data, release semaphore */ + up(&pn544->sem); + /* Handle non-blocking calls */ + if (filp->f_flags & O_NONBLOCK) { + return -EAGAIN; + } + + #ifdef ZTE_NFC_DEBUG + printk("pn544-dev: wait for incoming data.\n"); + #else + pr_debug("pn544-dev: wait for incoming data.\n"); + #endif + + /* Sleep until the IRQ comes */ + /*这个函数睡眠之后不会被调度,需要在中断或定时器中wake_up_interruptible() + 之后才会被调度去判决gpio_get_value(irq_gpio)!=0 */ + if (wait_event_interruptible(pn544->read_queue, (gpio_get_value(irq_gpio)==0))) { + return -ERESTARTSYS; /* signal: tell the fs layer to handle it */ + } + + + /* Loop, but first reacquire the lock (to avoid multiple read concurrency) */ + if (down_interruptible(&pn544->sem)) { + return -ERESTARTSYS; + } + } } + else + { + while (!gpio_get_value(irq_gpio)) { + /* Not ready to read data, release semaphore */ + up(&pn544->sem); + /* Handle non-blocking calls */ + if (filp->f_flags & O_NONBLOCK) { + return -EAGAIN; + } + + #ifdef ZTE_NFC_DEBUG + printk("pn544-dev: wait for incoming data.\n"); + #else + pr_debug("pn544-dev: wait for incoming data.\n"); + #endif + + /* Sleep until the IRQ comes */ + /*这个函数睡眠之后不会被调度,需要在中断或定时器中wake_up_interruptible() + 之后才会被调度去判决gpio_get_value(irq_gpio)!=0 */ + if (wait_event_interruptible(pn544->read_queue, (gpio_get_value(irq_gpio)!=0))) { + return -ERESTARTSYS; /* signal: tell the fs layer to handle it */ + } + + /* Loop, but first reacquire the lock (to avoid multiple read concurrency) */ + if (down_interruptible(&pn544->sem)) { + return -ERESTARTSYS; + } + } + } /* Read data */ ret = i2c_master_recv(client, tmp, count); @@ -334,6 +366,180 @@ static int pn544_dev_release(struct inode *inode, struct file *file) return 0; } +#if 0 +static int pn544_dev_ioctl(struct inode *inode, struct file *filp,unsigned int cmd, unsigned long arg) +{ + + void __user *argp = (void __user *)arg; + char buf[8]; + int ret = -1; + + if (copy_from_user(&buf, argp, sizeof(buf))) + return -EFAULT; + + switch (cmd) { + case PN544_SET_PWR: + ret = pn544_set_power(); + if (ret < 0) + return ret; + break; + + default: + return -ENOTTY; + } + + return 0; +} + +#else +static int pn544_dev_ioctl(struct inode *inode, struct file *filp,unsigned int cmd, unsigned long arg) + +{ +// struct pn544_dev *pn544_dev = filp->private_data; + + switch (cmd) { + case PN544_SET_PWR: + if (arg == 2) { + /* power on with firmware download (requires hw reset) */ + #ifdef ZTE_NFC_DEBUG + printk("%s power on with firmware\n", __func__); + #endif + gpio_set_value(pn544_dev->ven_gpio, 0); + gpio_set_value(pn544_dev->firm_gpio, 1); + msleep(10); + gpio_set_value(pn544_dev->ven_gpio, 1); + msleep(50); + gpio_set_value(pn544_dev->ven_gpio, 0); + msleep(10); + } else if (arg == 1) { + /* power on */ + #ifdef ZTE_NFC_DEBUG + printk("%s power on with ioctl cmd\n", __func__); + #endif + gpio_set_value(pn544_dev->firm_gpio, 0); + gpio_set_value(pn544_dev->ven_gpio, 0); + msleep(10); + } else if (arg == 0) { + /* power off */ + #ifdef ZTE_NFC_DEBUG + printk("%s power off with ioctl cmd\n", __func__); + #endif + gpio_set_value(pn544_dev->firm_gpio, 0); + gpio_set_value(pn544_dev->ven_gpio, 1); + msleep(10); + } else { + // printk("%s bad arg %d\n", __func__, arg); + return -EINVAL; + } + break; + default: + printk("%s bad ioctl %d\n", __func__, cmd); + return -EINVAL; + } + + return 0; +} + +#endif + +static int nxp_pn544_reset(void) +{ + int rc; + + //1. set NXP_PN544_DOWNLOAD_GPIO to 0 + if(pn544_dev->firm_gpio !=0) + { + rc = gpio_tlmm_config(GPIO_CFG(pn544_dev->firm_gpio, 0, + GPIO_OUTPUT, GPIO_PULL_DOWN, + GPIO_2MA), GPIO_ENABLE); + if (rc) { + printk(KERN_ERR"%s: Could not configure nfc gpio %d\n", + __func__, pn544_dev->firm_gpio); + return -EIO; + } + + rc = gpio_request(pn544_dev->firm_gpio, "nxp_pn544_download"); + if (rc) { + printk(KERN_ERR"%s: unable to request nfc gpio %d (%d)\n", + __func__, pn544_dev->firm_gpio, rc); + return -EIO; + } + gpio_direction_output(pn544_dev->firm_gpio, 0); + } + + //2. set NXP_PN544_REQ_CLOCK_GPIO to 1??? + if(pn544_dev->clock_gpio !=0) + { + rc = gpio_tlmm_config(GPIO_CFG(pn544_dev->clock_gpio, 0, + GPIO_OUTPUT, GPIO_NO_PULL, + GPIO_2MA), GPIO_ENABLE); + if (rc) { + printk(KERN_ERR"%s: Could not configure nfc gpio %d\n", + __func__, pn544_dev->clock_gpio); + return -EIO; + } + + rc = gpio_request(pn544_dev->clock_gpio, "nxp_pn544_req_clock"); + if (rc) { + printk(KERN_ERR"%s: unable to request nfc gpio %d (%d)\n", + __func__, pn544_dev->clock_gpio, rc); + return -EIO; + } + gpio_direction_output(pn544_dev->clock_gpio, 1); + } + + //3. set NXP_PN544_DCDC_GPIO to 1 + if( pn544_dev->dcdc_gpio!=0) + { + rc = gpio_tlmm_config(GPIO_CFG(pn544_dev->dcdc_gpio, 0, + GPIO_OUTPUT, GPIO_NO_PULL, + GPIO_2MA), GPIO_ENABLE); + if (rc) { + printk(KERN_ERR"%s: Could not configure nfc gpio %d\n", + __func__, pn544_dev->dcdc_gpio); + return -EIO; + } + + rc = gpio_request(pn544_dev->dcdc_gpio, "nxp_pn544_dcdc"); + if (rc) { + printk(KERN_ERR"%s: unable to request nfc gpio %d (%d)\n", + __func__, pn544_dev->dcdc_gpio, rc); + return -EIO; + } + gpio_direction_output(pn544_dev->dcdc_gpio, 1); + } + + //4. set NXP_PN544_ENABLE_GPIO to 0_1_0 + if(pn544_dev->ven_gpio !=0) + { + rc = gpio_tlmm_config(GPIO_CFG(pn544_dev->ven_gpio, 0, + GPIO_OUTPUT, GPIO_NO_PULL, + GPIO_2MA), GPIO_ENABLE); + if (rc) { + printk(KERN_ERR"%s: Could not configure nfc gpio %d\n", + __func__, pn544_dev->ven_gpio); + return -EIO; + } + + rc = gpio_request(pn544_dev->ven_gpio, "nxp_pn544_en"); + if (rc) { + printk(KERN_ERR"%s: unable to request nfc gpio %d (%d)\n", + __func__,pn544_dev->ven_gpio, rc); + return -EIO; + } + + gpio_direction_output(pn544_dev->ven_gpio, 0); + mdelay(10); + gpio_direction_output(pn544_dev->ven_gpio, 1); + mdelay(50); + gpio_direction_output(pn544_dev->ven_gpio, 0); + mdelay(10); + } + + return 0; +} + + static const struct file_operations pn544_dev_fops = { .owner = THIS_MODULE, .llseek = no_llseek, @@ -341,6 +547,7 @@ static const struct file_operations pn544_dev_fops = { .write = pn544_dev_write, .open = pn544_dev_open, .release = pn544_dev_release, + .ioctl = pn544_dev_ioctl, /* .poll = pn544_dev_poll, */ }; @@ -352,7 +559,8 @@ static int pn544_probe( struct i2c_client *client, const struct i2c_device_id *id) { int ret; - + struct pn544_i2c_platform_data *pdata; + if (pn544_dev != NULL) { printk(KERN_ERR "pn544_probe: multiple devices NOT supported\n"); ret = -ENODEV; @@ -372,6 +580,22 @@ static int pn544_probe( goto err_alloc_data_failed; } pn544_dev->client = client; + pdata = client->dev.platform_data; + if (pdata) { + pn544_dev->irq_gpio=pdata->irq_gpio; + pn544_dev->firm_gpio=pdata->firm_gpio; + pn544_dev->ven_gpio=pdata->ven_gpio; + pn544_dev->clock_gpio=pdata->clock_gpio; + pn544_dev->dcdc_gpio=pdata->dcdc_gpio; + pn544_dev->int_active_low=pdata->int_active_low; + printk( "pn544_probe: gpio config data,irq=%d,download=%d,ven=%d,clock=%d,dcdc=%d,int_active_low=%d\n",pn544_dev->irq_gpio,pn544_dev->firm_gpio,pn544_dev->ven_gpio,pn544_dev->clock_gpio,pn544_dev->dcdc_gpio,pn544_dev->int_active_low); + } + else + { + printk(KERN_ERR "pn544_probe: no gpio config data\n"); + ret = -ENODEV; + goto err_alloc_data_failed; + } /* init semaphore and queues */ sema_init(&pn544_dev->sem, 1); @@ -393,14 +617,25 @@ static int pn544_probe( goto err_device_create_file_failed; } + ret =nxp_pn544_reset(); + if (ret < 0) { + printk(KERN_ERR "pn544: can't reset device\n"); + goto err_device_create_file_failed; + } + /* set irq/polling mode */ if (client->irq && !pn544_disable_irq) { -#ifdef ZTE_IRQ_LOW - ret = request_irq(client->irq, pn544_dev_irq_handler, IRQF_TRIGGER_FALLING, client->name, pn544_dev); -#else - ret = request_irq(client->irq, pn544_dev_irq_handler, IRQF_TRIGGER_RISING, client->name, pn544_dev); -#endif - if (ret == 0) { + + if(pn544_dev->int_active_low==1) + { + ret = request_irq(client->irq, pn544_dev_irq_handler, IRQF_TRIGGER_FALLING, client->name, pn544_dev); + } + else + { + ret = request_irq(client->irq, pn544_dev_irq_handler, IRQF_TRIGGER_RISING, client->name, pn544_dev); + } + + if (ret == 0) { pn544_dev->use_irq = 1; } else { @@ -415,6 +650,7 @@ static int pn544_probe( printk(KERN_INFO "pn544_probe: Start in %s mode,IRQ=%d,GPIO=%d\n", pn544_dev->use_irq ? "interrupt" : "polling",client->irq,INT_TO_MSM_GPIO(client->irq)); + return 0; err_device_create_file_failed: @@ -465,19 +701,12 @@ static struct i2c_driver pn544_driver = { /* * module load/unload record keeping */ -extern int nxp_pn544_reset(void); static int __init pn544_dev_init(void) { int ret; printk(KERN_INFO "pn544 /dev/pn544 entry driver\n"); - ret =nxp_pn544_reset(); - if (ret < 0) { - printk(KERN_ERR "pn544: can't reset device\n"); - return ret; - } - /*1. slf note 20110328--->申请一个设备号,并且将其注册到字符 设备驱动模型中.: proc/devices/pn544 。 函数 register_chrdev 的第一个参数如果为 0, 表示由内核来确 diff --git a/drivers/i2c/chips/taos.c b/drivers/i2c/chips/taos.c index aa00dc48..d9edd09d 100644 --- a/drivers/i2c/chips/taos.c +++ b/drivers/i2c/chips/taos.c @@ -25,10 +25,9 @@ Wenn Wer Was #include #include #include -#include +#include #include #include -#include #define TAOS_INT_GPIO 42 @@ -102,10 +101,12 @@ Wenn Wer Was #define TAOS_TRITON_STATUS_PRXINTR 0x20 // lux constants -#define TAOS_MAX_LUX 65535000 +//[sensor wlg 20110729]ALS thereshold modify +//#define TAOS_MAX_LUX 65535000 +#define TAOS_MAX_LUX 10240 #define TAOS_SCALE_MILLILUX 3 #define TAOS_FILTER_DEPTH 3 - +#define THRES_LO_TO_HI_RATIO 4/5 // forward declarations static int taos_probe(struct i2c_client *clientp, const struct i2c_device_id *idp); static int taos_remove(struct i2c_client *client); @@ -118,7 +119,7 @@ static loff_t taos_llseek(struct file *file, loff_t offset, int orig); static int taos_get_lux(void); static int taos_lux_filter(int raw_lux); static int taos_device_name(unsigned char *bufp, char **device_name); -static int taos_prox_poll(struct taos_prox_info *prxp); +static int taos_prox_poll(struct PS_ALS_prox_info *prxp); //static void taos_prox_poll_timer_func(unsigned long param); //static void taos_prox_poll_timer_start(void); //static void taos_als_work(struct work_struct *w); @@ -127,17 +128,16 @@ static void taos_report_value(int mask); static int calc_distance(int value); static int enable_light_and_proximity(int mask); static void taos_chip_diff_settings(void); -static struct wake_lock taos_wake_lock; static int light_on=0; static int prox_on = 0; enum taos_chip_type { - TSL2771 = 0, - TMD2771, + TSL2771 = 0, + TMD2771, }; struct alsprox_data { - struct input_dev *input_dev; + struct input_dev *input_dev; }; static struct alsprox_data *light; @@ -150,16 +150,16 @@ struct class *taos_class; // module device table static struct i2c_device_id taos_idtable[] = { - {TAOS_DEVICE_ID, 0}, - {} + {TAOS_DEVICE_ID, 0}, + {} }; MODULE_DEVICE_TABLE(i2c, taos_idtable); // board and address info struct i2c_board_info taos_board_info[] = { - {I2C_BOARD_INFO(TAOS_DEVICE_ID, TAOS_DEVICE_ADDR1),}, - {I2C_BOARD_INFO(TAOS_DEVICE_ID, TAOS_DEVICE_ADDR2),}, - {I2C_BOARD_INFO(TAOS_DEVICE_ID, TAOS_DEVICE_ADDR3),}, + {I2C_BOARD_INFO(TAOS_DEVICE_ID, TAOS_DEVICE_ADDR1),}, + {I2C_BOARD_INFO(TAOS_DEVICE_ID, TAOS_DEVICE_ADDR2),}, + {I2C_BOARD_INFO(TAOS_DEVICE_ID, TAOS_DEVICE_ADDR3),}, }; unsigned short const taos_addr_list[4] = {TAOS_DEVICE_ADDR1, TAOS_DEVICE_ADDR2, TAOS_DEVICE_ADDR3, I2C_CLIENT_END}; @@ -171,16 +171,15 @@ struct i2c_client *bad_clientp[TAOS_MAX_NUM_DEVICES]; // driver definition static struct i2c_driver taos_driver = { - .driver = { - .owner = THIS_MODULE, - .name = "taos", - }, - .id_table = taos_idtable, - .probe = taos_probe, - .remove = __devexit_p(taos_remove), + .driver = { + .owner = THIS_MODULE, + .name = "taos", + }, + .id_table = taos_idtable, + .probe = taos_probe, + .remove = __devexit_p(taos_remove), }; - struct taos_intr_data { int int_gpio; int irq; @@ -188,17 +187,18 @@ struct taos_intr_data { // per-device data struct taos_data { - struct i2c_client *client; - struct cdev cdev; - unsigned int addr; - char taos_id; - char taos_name[TAOS_ID_NAME_SIZE]; - struct semaphore update_lock; - char valid; - unsigned long last_updated; - struct taos_intr_data *pdata; - struct work_struct taos_work; - enum taos_chip_type chip_type; + struct i2c_client *client; + struct cdev cdev; + unsigned int addr; + char taos_id; + char taos_name[TAOS_ID_NAME_SIZE]; + struct semaphore update_lock; + char valid; + unsigned long last_updated; + struct taos_intr_data *pdata; + struct work_struct taos_work; + enum taos_chip_type chip_type; + struct mutex proximity_calibrating; } *taos_datap; static struct taos_intr_data taos_irq= { @@ -209,17 +209,17 @@ static struct taos_intr_data taos_irq= { // file operations static struct file_operations taos_fops = { - .owner = THIS_MODULE, - .open = taos_open, - .release = taos_release, - .read = taos_read, - .write = taos_write, - .llseek = taos_llseek, - .ioctl = taos_ioctl, + .owner = THIS_MODULE, + .open = taos_open, + .release = taos_release, + .read = taos_read, + .write = taos_write, + .llseek = taos_llseek, + .ioctl = taos_ioctl, }; // device configuration -struct taos_cfg *taos_cfgp; +struct PS_ALS_cfg *taos_cfgp; static u32 calibrate_target_param = 300000; static u16 als_time_param = 27; static u16 scale_factor_param = 1; @@ -229,8 +229,8 @@ static u8 gain_param = 1; #if defined(CONFIG_MACH_BLADE) static u16 gain_trim_param = 25; -#elif defined(CONFIG_MACH_JOE) -static u16 gain_trim_param = 25; +#elif defined(CONFIG_MACH_RACER2) +static u16 gain_trim_param = 50; #elif defined(CONFIG_MACH_SKATE) static u16 gain_trim_param = 240; #elif defined(CONFIG_MACH_ROAMER) @@ -241,13 +241,8 @@ static u16 gain_trim_param = 100; static u16 gain_trim_param = 25; //this value is set according to specific device #endif -#if defined(CONFIG_MACH_BLADE) -static u16 prox_threshold_hi_param = 380; -static u16 prox_threshold_lo_param = 300; -#else static u16 prox_threshold_hi_param = 1023; -static u16 prox_threshold_lo_param = 1023; -#endif +static u16 prox_threshold_lo_param = 818; static u8 prox_int_time_param = 0xF6; static u8 prox_adc_time_param = 0xFF; static u8 prox_wait_time_param = 0xFF; @@ -268,9 +263,9 @@ int g_nlux = 0; // prox info -struct taos_prox_info prox_cal_info[20]; -struct taos_prox_info prox_cur_info; -struct taos_prox_info *prox_cur_infop = &prox_cur_info; +struct PS_ALS_prox_info prox_cal_info[20]; +struct PS_ALS_prox_info prox_cur_info; +struct PS_ALS_prox_info *prox_cur_infop = &prox_cur_info; //static u8 prox_history_hi = 0; //static u8 prox_history_lo = 0; //static struct timer_list prox_poll_timer; @@ -281,9 +276,9 @@ static u16 sat_prox = 0; // lux time scale struct time_scale_factor { - u16 numerator; - u16 denominator; - u16 saturation; + u16 numerator; + u16 denominator; + u16 saturation; }; struct time_scale_factor TritonTime = {1, 0, 0}; struct time_scale_factor *lux_timep = &TritonTime; @@ -293,24 +288,38 @@ u8 taos_triton_gain_table[] = {1, 8, 16, 120}; // lux data struct lux_data { - u16 ratio; - u16 clear; - u16 ir; + u16 ratio; + u16 clear; + u16 ir; }; struct lux_data TritonFN_lux_data[] = { - { 9830, 8320, 15360 }, - { 12452, 10554, 22797 }, - { 14746, 6234, 11430 }, - { 17695, 3968, 6400 }, - { 0, 0, 0 } + { 9830, 8320, 15360 }, + { 12452, 10554, 22797 }, + { 14746, 6234, 11430 }, + { 17695, 3968, 6400 }, + { 0, 0, 0 } }; struct lux_data *lux_tablep = TritonFN_lux_data; static int lux_history[TAOS_FILTER_DEPTH] = {-ENODATA, -ENODATA, -ENODATA}; +//prox data +struct prox_data { + u16 ratio; + u16 hi; + u16 lo; +}; +struct prox_data TritonFN_prox_data[] = { + { 1, 22, 20 }, + { 3, 20, 16 }, + { 6, 18, 14 }, + { 10, 16, 16 }, + { 0, 0, 0 } +}; +struct prox_data *prox_tablep = TritonFN_prox_data; -/* -----------------------------* - * config gpio for intr utility * - *------------------------------*/ +/* ----------------------* +* config gpio for intr utility * +*-----------------------*/ int taos_config_int_gpio(int int_gpio) { int rc=0; @@ -319,14 +328,14 @@ int taos_config_int_gpio(int int_gpio) rc = gpio_request(int_gpio, "gpio_sensor"); if (rc) { printk(TAOS_TAG "%s: gpio_request(%#x)=%d\n", - __func__, int_gpio, rc); + __func__, int_gpio, rc); return rc; } rc = gpio_tlmm_config(gpio_config_data, GPIO_ENABLE); if (rc) { printk(TAOS_TAG "%s: gpio_tlmm_config(%#x)=%d\n", - __func__, gpio_config_data, rc); + __func__, gpio_config_data, rc); return rc; } @@ -335,7 +344,7 @@ int taos_config_int_gpio(int int_gpio) rc = gpio_direction_input(int_gpio); if (rc) { printk(TAOS_TAG "%s: gpio_direction_input(%#x)=%d\n", - __func__, int_gpio, rc); + __func__, int_gpio, rc); return rc; } @@ -343,8 +352,8 @@ int taos_config_int_gpio(int int_gpio) } /* ----------------------* - * taos interrupt function * - *-----------------------*/ +* taos interrupt function * +*-----------------------*/ static irqreturn_t taos_interrupt(int irq, void *data) { //printk(TAOS_TAG "taos_interrupt\n"); @@ -361,21 +370,23 @@ static void do_taos_work(struct work_struct *w) //int prx_hi, prx_lo; u16 status = 0; if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | 0x13)))) < 0) { - goto read_reg_fail; - } + goto read_reg_fail; + } status = i2c_smbus_read_byte(taos_datap->client); //als interrupt if(((status & 0x10) != 0)&&((status & 0x20)==0)) { - g_nlux = taos_get_lux(); + g_nlux = taos_get_lux(); //clear intr for als intr case if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG|TAOS_TRITON_CMD_SPL_FN|TAOS_TRITON_CMD_PROXALS_INTCLR)))) < 0) { - printk(KERN_CRIT "TAOS: i2c_smbus_write_byte failed in clear als interrupt\n"); - } + printk(KERN_CRIT "TAOS: i2c_smbus_write_byte failed in clear als interrupt\n"); + } if(g_nlux>=0) - taos_report_value(0); + taos_report_value(0); + //if(prox_on&&(prox_cur_infop->prox_event == 1)&&(g_nlux>1000*(taos_cfgp->gain_trim))) + //goto turn_screen_on; } //prox interrupt @@ -383,47 +394,47 @@ static void do_taos_work(struct work_struct *w) { //printk(TAOS_TAG "taos_interrupt\n"); if((ret = taos_prox_poll(prox_cur_infop))<0){ - printk(KERN_CRIT "TAOS: get prox poll failed in taos interrupt()\n"); - if(ret==-ENODATA) - goto turn_screen_on; - } + printk(KERN_CRIT "TAOS: get prox poll failed in taos interrupt()\n"); + if(ret==-ENODATA) + goto turn_screen_on; + } if(prox_cur_infop->prox_data > taos_cfgp->prox_threshold_hi) - { - if ((ret = (i2c_smbus_write_word_data(taos_datap->client, (0xA0 | TAOS_TRITON_PRX_MAXTHRESHLO),sat_prox))) < 0) { - pr_crit(TAOS_TAG "i2c_smbus_write_byte() to TAOS_TRITON_PRX_MAXTHRESHLO\n"); - - } - if ((ret = (i2c_smbus_write_word_data(taos_datap->client, (0xA0 | TAOS_TRITON_PRX_MINTHRESHLO),taos_cfgp->prox_threshold_lo))) < 0) { - pr_crit(TAOS_TAG "i2c_smbus_write_byte() to TAOS_TRITON_PRX_MINTHRESHLO\n"); - - } - prox_cur_infop->prox_event = 1; - //pr_crit(TAOS_TAG "screen off:prox_cur_infop->prox_data=%d\n",prox_cur_infop->prox_data); - } - - else if(prox_cur_infop->prox_data < taos_cfgp->prox_threshold_lo) - turn_screen_on: - { - if ((ret = (i2c_smbus_write_word_data(taos_datap->client, (0xA0 | TAOS_TRITON_PRX_MAXTHRESHLO),taos_cfgp->prox_threshold_hi))) < 0) { - pr_crit(TAOS_TAG "i2c_smbus_write_byte() to TAOS_TRITON_PRX_MAXTHRESHLO\n"); - - } - if ((ret = (i2c_smbus_write_word_data(taos_datap->client, (0xA0 | TAOS_TRITON_PRX_MINTHRESHLO),0))) < 0) { - pr_crit(TAOS_TAG "i2c_smbus_write_byte() to TAOS_TRITON_PRX_MINTHRESHLO\n"); + { + if ((ret = (i2c_smbus_write_word_data(taos_datap->client, (0xA0 | TAOS_TRITON_PRX_MAXTHRESHLO),sat_prox))) < 0) { + pr_crit(TAOS_TAG "i2c_smbus_write_byte() to TAOS_TRITON_PRX_MAXTHRESHLO\n"); - } - prox_cur_infop->prox_event = 0; - //pr_crit(TAOS_TAG "screen on:prox_cur_infop->prox_data=%d\n",prox_cur_infop->prox_data); - } + } + if ((ret = (i2c_smbus_write_word_data(taos_datap->client, (0xA0 | TAOS_TRITON_PRX_MINTHRESHLO),taos_cfgp->prox_threshold_lo))) < 0) { + pr_crit(TAOS_TAG "i2c_smbus_write_byte() to TAOS_TRITON_PRX_MINTHRESHLO\n"); + + } + prox_cur_infop->prox_event = 1; + //pr_crit(TAOS_TAG "screen off:prox_cur_infop->prox_data=%d\n",prox_cur_infop->prox_data); + } + + else if(prox_cur_infop->prox_data < taos_cfgp->prox_threshold_lo) +turn_screen_on: + { + if ((ret = (i2c_smbus_write_word_data(taos_datap->client, (0xA0 | TAOS_TRITON_PRX_MAXTHRESHLO),taos_cfgp->prox_threshold_hi))) < 0) { + pr_crit(TAOS_TAG "i2c_smbus_write_byte() to TAOS_TRITON_PRX_MAXTHRESHLO\n"); + + } + if ((ret = (i2c_smbus_write_word_data(taos_datap->client, (0xA0 | TAOS_TRITON_PRX_MINTHRESHLO),0))) < 0) { + pr_crit(TAOS_TAG "i2c_smbus_write_byte() to TAOS_TRITON_PRX_MINTHRESHLO\n"); + + } + prox_cur_infop->prox_event = 0; + //pr_crit(TAOS_TAG "screen on:prox_cur_infop->prox_data=%d\n",prox_cur_infop->prox_data); + } - if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG|TAOS_TRITON_CMD_SPL_FN|TAOS_TRITON_CMD_PROXALS_INTCLR)))) < 0) { - pr_crit(TAOS_TAG "i2c_smbus_write_byte failed in clear interrupt\n"); - } + if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG|TAOS_TRITON_CMD_SPL_FN|TAOS_TRITON_CMD_PROXALS_INTCLR)))) < 0) { + pr_crit(TAOS_TAG "i2c_smbus_write_byte failed in clear interrupt\n"); + } taos_report_value(1); } - + read_reg_fail: enable_irq(taos_datap->pdata->irq); return; @@ -432,13 +443,13 @@ static void do_taos_work(struct work_struct *w) /*calc_distance, using prox value*/ static int calc_distance(int value) { - int temp=0; - if(prox_cur_infop->prox_event == 1) - //temp=4-((value-(taos_cfgp->prox_threshold_lo))/3000); - temp=4-((value-(taos_cfgp->prox_threshold_lo))/((sat_prox-(taos_cfgp->prox_threshold_lo))/4)); - else if(prox_cur_infop->prox_event == 0) - temp=5; - return temp; + int temp=0; + if(prox_cur_infop->prox_event == 1) + //temp=4-((value-(taos_cfgp->prox_threshold_lo))/3000); + temp=4-((value-(taos_cfgp->prox_threshold_lo))/((sat_prox-(taos_cfgp->prox_threshold_lo))/4)); + else if(prox_cur_infop->prox_event == 0) + temp=5; + return temp; } /*report als and prox data to input sub system, @@ -446,28 +457,29 @@ for data poll utility in hardware\alsprox.c */ static void taos_report_value(int mask) { - struct taos_prox_info *val = prox_cur_infop; - int lux_val=g_nlux; - int dist; - lux_val/=taos_cfgp->gain_trim; - - if (mask==0) { - input_report_abs(light->input_dev, ABS_MISC, lux_val); - printk(KERN_CRIT "TAOS: als_interrupt =%d\n", lux_val); - input_sync(light->input_dev); - } + struct PS_ALS_prox_info *val = prox_cur_infop; + int lux_val=g_nlux; + int dist; + lux_val/=taos_cfgp->gain_trim; + + if (mask==0) { + input_report_abs(light->input_dev, ABS_MISC, lux_val); +//[sensor wlg 20110729]ALS thereshold modify add log +// printk(KERN_CRIT "TAOS: als_interrupt lux_val(%d)=g_nlux(%d)/taos_cfgp->gain_trim(%d)\n", lux_val, g_nlux, taos_cfgp->gain_trim); + input_sync(light->input_dev); + } - if (mask==1) { - dist=calc_distance(val->prox_data); - //input_report_als(alsprox->input_dev, ALS_PROX, val->prox_clear); - input_report_abs(proximity->input_dev, ABS_DISTANCE, dist); - //input_report_als(alsprox->input_dev, ALS_PROX, val->prox_event); - printk(KERN_CRIT "TAOS: prox_interrupt =%d, distance=%d\n", val->prox_data,dist); - input_sync(proximity->input_dev); - } + if (mask==1) { + dist=calc_distance(val->prox_data); + //input_report_als(alsprox->input_dev, ALS_PROX, val->prox_clear); + input_report_abs(proximity->input_dev, ABS_DISTANCE, dist); + //input_report_als(alsprox->input_dev, ALS_PROX, val->prox_event); + printk(KERN_CRIT "TAOS: prox_interrupt =%d, distance=%d\n", val->prox_data,dist); + input_sync(proximity->input_dev); + } - //input_sync(alsprox->input_dev); - //enable_irq(taos_datap->pdata->irq); + //input_sync(alsprox->input_dev); + //enable_irq(taos_datap->pdata->irq); } @@ -476,35 +488,34 @@ static void taos_report_value(int mask) * driver init * *------------*/ static int __init taos_init(void) { - int ret = 0; - //struct i2c_adapter *my_adap; - printk(KERN_ERR "TAOS: comes into taos_init\n"); - if ((ret = (alloc_chrdev_region(&taos_dev_number, 0, TAOS_MAX_NUM_DEVICES, TAOS_DEVICE_NAME))) < 0) { - printk(KERN_ERR "TAOS: alloc_chrdev_region() failed in taos_init()\n"); - return (ret); - } - taos_class = class_create(THIS_MODULE, TAOS_DEVICE_NAME); - taos_datap = kmalloc(sizeof(struct taos_data), GFP_KERNEL); - if (!taos_datap) { - printk(KERN_ERR "TAOS: kmalloc for struct taos_data failed in taos_init()\n"); - return -ENOMEM; - } - memset(taos_datap, 0, sizeof(struct taos_data)); - cdev_init(&taos_datap->cdev, &taos_fops); - taos_datap->cdev.owner = THIS_MODULE; - if ((ret = (cdev_add(&taos_datap->cdev, taos_dev_number, 1))) < 0) { - printk(KERN_ERR "TAOS: cdev_add() failed in taos_init()\n"); - return (ret); - } - //device_create(taos_class, NULL, MKDEV(MAJOR(taos_dev_number), 0), &taos_driver ,"taos"); - ret = i2c_add_driver(&taos_driver); - if(ret){ - printk(KERN_ERR "TAOS: i2c_add_driver() failed in taos_init(),%d\n",ret); + int ret = 0; + //struct i2c_adapter *my_adap; + printk(KERN_ERR "TAOS: comes into taos_init\n"); + if ((ret = (alloc_chrdev_region(&taos_dev_number, 0, TAOS_MAX_NUM_DEVICES, TAOS_DEVICE_NAME))) < 0) { + printk(KERN_ERR "TAOS: alloc_chrdev_region() failed in taos_init()\n"); + return (ret); + } + taos_class = class_create(THIS_MODULE, TAOS_DEVICE_NAME); + taos_datap = kmalloc(sizeof(struct taos_data), GFP_KERNEL); + if (!taos_datap) { + printk(KERN_ERR "TAOS: kmalloc for struct taos_data failed in taos_init()\n"); + return -ENOMEM; + } + memset(taos_datap, 0, sizeof(struct taos_data)); + cdev_init(&taos_datap->cdev, &taos_fops); + taos_datap->cdev.owner = THIS_MODULE; + if ((ret = (cdev_add(&taos_datap->cdev, taos_dev_number, 1))) < 0) { + printk(KERN_ERR "TAOS: cdev_add() failed in taos_init()\n"); + return (ret); + } + //device_create(taos_class, NULL, MKDEV(MAJOR(taos_dev_number), 0), &taos_driver ,"taos"); + ret = i2c_add_driver(&taos_driver); + if(ret){ + printk(KERN_ERR "TAOS: i2c_add_driver() failed in taos_init(),%d\n",ret); + return (ret); + } + //pr_crit(TAOS_TAG "%s:%d\n",__func__,ret); return (ret); - } - wake_lock_init(&taos_wake_lock, WAKE_LOCK_SUSPEND, "taos"); - //pr_crit(TAOS_TAG "%s:%d\n",__func__,ret); - return (ret); } @@ -512,14 +523,15 @@ static int __init taos_init(void) { // driver exit static void __exit taos_exit(void) { /* if (my_clientp) - i2c_unregister_device(my_clientp); -*/ - i2c_del_driver(&taos_driver); - unregister_chrdev_region(taos_dev_number, TAOS_MAX_NUM_DEVICES); - device_destroy(taos_class, MKDEV(MAJOR(taos_dev_number), 0)); - cdev_del(&taos_datap->cdev); - class_destroy(taos_class); - kfree(taos_datap); + i2c_unregister_device(my_clientp); + */ + i2c_del_driver(&taos_driver); + unregister_chrdev_region(taos_dev_number, TAOS_MAX_NUM_DEVICES); + device_destroy(taos_class, MKDEV(MAJOR(taos_dev_number), 0)); + cdev_del(&taos_datap->cdev); + class_destroy(taos_class); + mutex_destroy(&taos_datap->proximity_calibrating); + kfree(taos_datap); } @@ -541,302 +553,303 @@ static struct miscdevice taos_device = { // client probe static int taos_probe(struct i2c_client *clientp, const struct i2c_device_id *idp) { - int ret = 0; - int i = 0; - unsigned char buf[TAOS_MAX_DEVICE_REGS]; - char *device_name; + int ret = 0; + int i = 0; + unsigned char buf[TAOS_MAX_DEVICE_REGS]; + char *device_name; // if (device_found) // return -ENODEV; - if (!i2c_check_functionality(clientp->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) { - printk(KERN_ERR "TAOS: taos_probe() - i2c smbus byte data functions unsupported\n"); - return -EOPNOTSUPP; - } + if (!i2c_check_functionality(clientp->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) { + printk(KERN_ERR "TAOS: taos_probe() - i2c smbus byte data functions unsupported\n"); + return -EOPNOTSUPP; + } if (!i2c_check_functionality(clientp->adapter, I2C_FUNC_SMBUS_WORD_DATA)) { - printk(KERN_ERR "TAOS: taos_probe() - i2c smbus word data functions unsupported\n"); - } + printk(KERN_ERR "TAOS: taos_probe() - i2c smbus word data functions unsupported\n"); + } if (!i2c_check_functionality(clientp->adapter, I2C_FUNC_SMBUS_BLOCK_DATA)) { - printk(KERN_ERR "TAOS: taos_probe() - i2c smbus block data functions unsupported\n"); - } - taos_datap->client = clientp; - i2c_set_clientdata(clientp, taos_datap); - - //write bytes to address control registers + printk(KERN_ERR "TAOS: taos_probe() - i2c smbus block data functions unsupported\n"); + } + taos_datap->client = clientp; + i2c_set_clientdata(clientp, taos_datap); + + //write bytes to address control registers for(i = 0; i < TAOS_MAX_DEVICE_REGS; i++) { - if((ret = (i2c_smbus_write_byte(clientp, (TAOS_TRITON_CMD_REG | (TAOS_TRITON_CNTRL + i))))) < 0) { - printk(KERN_ERR "TAOS: i2c_smbus_write_byte() to address control regs failed in taos_probe()\n"); - return(ret); + if((ret = (i2c_smbus_write_byte(clientp, (TAOS_TRITON_CMD_REG | (TAOS_TRITON_CNTRL + i))))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte() to address control regs failed in taos_probe()\n"); + return(ret); } - buf[i] = i2c_smbus_read_byte(clientp); - } - //check device ID "tritonFN" - if ((ret = taos_device_name(buf, &device_name)) == 0) { - printk(KERN_ERR "TAOS: chip id that was read found mismatched by taos_device_name(), in taos_probe()\n"); - return -ENODEV; - } - if (strcmp(device_name, TAOS_DEVICE_ID)) { - printk(KERN_ERR "TAOS: chip id that was read does not match expected id in taos_probe()\n"); - return -ENODEV; - } - else{ - printk(KERN_ERR "TAOS: chip id of %s that was read matches expected id in taos_probe()\n", device_name); - //device_found = 1; - } - device_create(taos_class, NULL, MKDEV(MAJOR(taos_dev_number), 0), &taos_driver ,"taos"); - if ((ret = (i2c_smbus_write_byte(clientp, (TAOS_TRITON_CMD_REG | TAOS_TRITON_CNTRL)))) < 0) { - printk(KERN_ERR "TAOS: i2c_smbus_write_byte() to control reg failed in taos_probe()\n"); - return(ret); - } - if ((ret = (i2c_smbus_write_word_data(clientp, (0xA0 | TAOS_TRITON_ALS_MAXTHRESHLO),0))) < 0) { - printk(KERN_ERR "TAOS: i2c_smbus_write_byte() to chan0/1/lo/hi reg failed in taos_probe()\n"); - } - if ((ret = (i2c_smbus_write_word_data(clientp, (0xA0 | TAOS_TRITON_ALS_MINTHRESHLO),0))) < 0) { - printk(KERN_ERR "TAOS: i2c_smbus_write_byte() to chan0/1/lo/hi reg failed in taos_probe()\n"); - } - - INIT_WORK(&taos_datap->taos_work, do_taos_work); - - taos_datap->pdata = &taos_irq; - if(clientp->irq){ - taos_datap->pdata->irq=taos_datap->client->irq; - taos_datap->pdata->int_gpio=INT_TO_MSM_GPIO(taos_datap->pdata->irq); - } - printk(KERN_CRIT "taos use gpio %d\n",taos_datap->pdata->int_gpio); - ret=taos_config_int_gpio(taos_datap->pdata->int_gpio); - if (ret) { - printk(KERN_CRIT "taos configure int_gpio%d failed\n", - taos_datap->pdata->int_gpio); - return ret; - } - - ret = request_irq(taos_datap->pdata->irq, taos_interrupt, IRQF_TRIGGER_FALLING, - taos_datap->taos_name, prox_cur_infop); - if (ret) { - printk(KERN_CRIT "taos request interrupt failed\n"); - return ret; - } - - strlcpy(clientp->name, TAOS_DEVICE_ID, I2C_NAME_SIZE); - strlcpy(taos_datap->taos_name, TAOS_DEVICE_ID, TAOS_ID_NAME_SIZE); - taos_datap->valid = 0; - - init_MUTEX(&taos_datap->update_lock); - if (!(taos_cfgp = kmalloc(sizeof(struct taos_cfg), GFP_KERNEL))) { - printk(KERN_ERR "TAOS: kmalloc for struct taos_cfg failed in taos_probe()\n"); - return -ENOMEM; - } - - //update settings - //this should behind taos_device_name - taos_cfgp->calibrate_target = calibrate_target_param; - taos_cfgp->als_time = als_time_param; - taos_cfgp->scale_factor = scale_factor_param; - taos_cfgp->gain_trim = gain_trim_param; - taos_cfgp->filter_history = filter_history_param; - taos_cfgp->filter_count = filter_count_param; - taos_cfgp->gain = gain_param; - taos_cfgp->prox_threshold_hi = prox_threshold_hi_param; - taos_cfgp->prox_threshold_lo = prox_threshold_lo_param; - taos_cfgp->prox_int_time = prox_int_time_param; - taos_cfgp->prox_adc_time = prox_adc_time_param; - taos_cfgp->prox_wait_time = prox_wait_time_param; - taos_cfgp->prox_intr_filter = prox_intr_filter_param; - taos_cfgp->prox_config = prox_config_param; - taos_cfgp->prox_pulse_cnt = prox_pulse_cnt_param; - taos_cfgp->prox_gain = prox_gain_param; - sat_als = (256 - taos_cfgp->prox_int_time) << 10; //10240 - sat_prox = (256 - taos_cfgp->prox_adc_time) << 10; //1024 - - light = kzalloc(sizeof(struct alsprox_data), GFP_KERNEL); - if (!light) { - ret = -ENOMEM; - goto exit_alloc_data_failed; - } - proximity= kzalloc(sizeof(struct alsprox_data), GFP_KERNEL); - if (!proximity) { - ret = -ENOMEM; - goto exit_alloc_data_failed; - } + buf[i] = i2c_smbus_read_byte(clientp); + } + //check device ID "tritonFN" + if ((ret = taos_device_name(buf, &device_name)) == 0) { + printk(KERN_ERR "TAOS: chip id that was read found mismatched by taos_device_name(), in taos_probe()\n"); + return -ENODEV; + } + if (strcmp(device_name, TAOS_DEVICE_ID)) { + printk(KERN_ERR "TAOS: chip id that was read does not match expected id in taos_probe()\n"); + return -ENODEV; + } + else{ + printk(KERN_ERR "TAOS: chip id of %s that was read matches expected id in taos_probe()\n", device_name); + //device_found = 1; + } + device_create(taos_class, NULL, MKDEV(MAJOR(taos_dev_number), 0), &taos_driver ,"taos"); + if ((ret = (i2c_smbus_write_byte(clientp, (TAOS_TRITON_CMD_REG | TAOS_TRITON_CNTRL)))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte() to control reg failed in taos_probe()\n"); + return(ret); + } + if ((ret = (i2c_smbus_write_word_data(clientp, (0xA0 | TAOS_TRITON_ALS_MAXTHRESHLO),0))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte() to chan0/1/lo/hi reg failed in taos_probe()\n"); + } + if ((ret = (i2c_smbus_write_word_data(clientp, (0xA0 | TAOS_TRITON_ALS_MINTHRESHLO),0))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte() to chan0/1/lo/hi reg failed in taos_probe()\n"); + } + + + INIT_WORK(&taos_datap->taos_work, do_taos_work); + mutex_init(&taos_datap->proximity_calibrating); + taos_datap->pdata = &taos_irq; + if(clientp->irq){ + taos_datap->pdata->irq=taos_datap->client->irq; + taos_datap->pdata->int_gpio=INT_TO_MSM_GPIO(taos_datap->pdata->irq); + } + printk(KERN_CRIT "taos use gpio %d\n",taos_datap->pdata->int_gpio); + ret=taos_config_int_gpio(taos_datap->pdata->int_gpio); + if (ret) { + printk(KERN_CRIT "taos configure int_gpio%d failed\n", + taos_datap->pdata->int_gpio); + return ret; + } + + ret = request_irq(taos_datap->pdata->irq, taos_interrupt, IRQF_TRIGGER_FALLING, + taos_datap->taos_name, prox_cur_infop); + if (ret) { + printk(KERN_CRIT "taos request interrupt failed\n"); + return ret; + } + + strlcpy(clientp->name, TAOS_DEVICE_ID, I2C_NAME_SIZE); + strlcpy(taos_datap->taos_name, TAOS_DEVICE_ID, TAOS_ID_NAME_SIZE); + taos_datap->valid = 0; + + init_MUTEX(&taos_datap->update_lock); + if (!(taos_cfgp = kmalloc(sizeof(struct PS_ALS_cfg), GFP_KERNEL))) { + printk(KERN_ERR "TAOS: kmalloc for struct PS_ALS_cfg failed in taos_probe()\n"); + return -ENOMEM; + } + + //update settings + //this should behind taos_device_name + taos_cfgp->calibrate_target = calibrate_target_param; + taos_cfgp->als_time = als_time_param; + taos_cfgp->scale_factor = scale_factor_param; + taos_cfgp->gain_trim = gain_trim_param; + taos_cfgp->filter_history = filter_history_param; + taos_cfgp->filter_count = filter_count_param; + taos_cfgp->gain = gain_param; + taos_cfgp->prox_threshold_hi = prox_threshold_hi_param; + taos_cfgp->prox_threshold_lo = prox_threshold_lo_param; + taos_cfgp->prox_int_time = prox_int_time_param; + taos_cfgp->prox_adc_time = prox_adc_time_param; + taos_cfgp->prox_wait_time = prox_wait_time_param; + taos_cfgp->prox_intr_filter = prox_intr_filter_param; + taos_cfgp->prox_config = prox_config_param; + taos_cfgp->prox_pulse_cnt = prox_pulse_cnt_param; + taos_cfgp->prox_gain = prox_gain_param; + sat_als = (256 - taos_cfgp->prox_int_time) << 10; //10240 + sat_prox = (256 - taos_cfgp->prox_adc_time) << 10; //1024 + + light = kzalloc(sizeof(struct alsprox_data), GFP_KERNEL); + if (!light) { + ret = -ENOMEM; + goto exit_alloc_data_failed; + } + proximity= kzalloc(sizeof(struct alsprox_data), GFP_KERNEL); + if (!proximity) { + ret = -ENOMEM; + goto exit_alloc_data_failed; + } - light->input_dev = input_allocate_device(); - if (!light->input_dev) { - ret = -ENOMEM; - printk(KERN_ERR "taos_probe: Failed to allocate light input device\n"); - goto exit_input_dev_alloc_failed; - } - proximity->input_dev = input_allocate_device(); - if (!proximity->input_dev) { - ret = -ENOMEM; - printk(KERN_ERR "taos_probe: Failed to allocate prox input device\n"); - goto exit_input_dev_alloc_failed; - } + light->input_dev = input_allocate_device(); + if (!light->input_dev) { + ret = -ENOMEM; + printk(KERN_ERR "taos_probe: Failed to allocate light input device\n"); + goto exit_input_dev_alloc_failed; + } + proximity->input_dev = input_allocate_device(); + if (!proximity->input_dev) { + ret = -ENOMEM; + printk(KERN_ERR "taos_probe: Failed to allocate prox input device\n"); + goto exit_input_dev_alloc_failed; + } - /* lux */ - set_bit(EV_ABS, light->input_dev->evbit); - input_set_abs_params(light->input_dev, ABS_MISC, 0, 65535, 0, 0); - light->input_dev->name = "light"; - /* prox */ - set_bit(EV_ABS, proximity->input_dev->evbit); - input_set_abs_params(proximity->input_dev, ABS_DISTANCE, 0, 65535, 0, 0); - proximity->input_dev->name = "proximity"; - - ret = input_register_device(light->input_dev); - if (ret) { - printk("taos_probe: Unable to register input device: %s\n", light->input_dev->name); - goto exit_input_register_device_failed; - } - ret = input_register_device(proximity->input_dev); - if (ret) { - printk("taos_probe: Unable to register input device: %s\n", proximity->input_dev->name); - goto exit_input_register_device_failed; - } + /* lux */ + set_bit(EV_ABS, light->input_dev->evbit); + input_set_abs_params(light->input_dev, ABS_MISC, 0, 65535, 0, 0); + light->input_dev->name = "light"; + /* prox */ + set_bit(EV_ABS, proximity->input_dev->evbit); + input_set_abs_params(proximity->input_dev, ABS_DISTANCE, 0, 65535, 0, 0); + proximity->input_dev->name = "proximity"; + + ret = input_register_device(light->input_dev); + if (ret) { + printk("taos_probe: Unable to register input device: %s\n", light->input_dev->name); + goto exit_input_register_device_failed; + } + ret = input_register_device(proximity->input_dev); + if (ret) { + printk("taos_probe: Unable to register input device: %s\n", proximity->input_dev->name); + goto exit_input_register_device_failed; + } - return (ret); + return (ret); //exit_taos_device_register_failed: exit_input_register_device_failed: - if(light->input_dev) - input_free_device(light->input_dev); - if(proximity->input_dev) - input_free_device(proximity->input_dev); + if(light->input_dev) + input_free_device(light->input_dev); + if(proximity->input_dev) + input_free_device(proximity->input_dev); exit_input_dev_alloc_failed: exit_alloc_data_failed: - if(light) - kfree(light); - if(proximity) - kfree(proximity); - return (ret); + if(light) + kfree(light); + if(proximity) + kfree(proximity); + return (ret); } // client remove static int __devexit taos_remove(struct i2c_client *client) { - int ret = 0; + int ret = 0; - return (ret); + return (ret); } // open static int taos_open(struct inode *inode, struct file *file) { - struct taos_data *taos_datap; - int ret = 0; - device_released = 0; - taos_datap = container_of(inode->i_cdev, struct taos_data, cdev); - if (strcmp(taos_datap->taos_name, TAOS_DEVICE_ID) != 0) { - printk(KERN_ERR "TAOS: device name incorrect during taos_open(), get %s\n", taos_datap->taos_name); - ret = -ENODEV; - } - return (ret); + struct taos_data *taos_datap; + int ret = 0; + device_released = 0; + taos_datap = container_of(inode->i_cdev, struct taos_data, cdev); + if (strcmp(taos_datap->taos_name, TAOS_DEVICE_ID) != 0) { + printk(KERN_ERR "TAOS: device name incorrect during taos_open(), get %s\n", taos_datap->taos_name); + ret = -ENODEV; + } + return (ret); } // release static int taos_release(struct inode *inode, struct file *file) { - struct taos_data *taos_datap; - int ret = 0; - - device_released = 1; - taos_datap = container_of(inode->i_cdev, struct taos_data, cdev); - if (strcmp(taos_datap->taos_name, TAOS_DEVICE_ID) != 0) { - printk(KERN_ERR "TAOS: device name incorrect during taos_release(), get %s\n", taos_datap->taos_name); - ret = -ENODEV; - } - return (ret); + struct taos_data *taos_datap; + int ret = 0; + + device_released = 1; + taos_datap = container_of(inode->i_cdev, struct taos_data, cdev); + if (strcmp(taos_datap->taos_name, TAOS_DEVICE_ID) != 0) { + printk(KERN_ERR "TAOS: device name incorrect during taos_release(), get %s\n", taos_datap->taos_name); + ret = -ENODEV; + } + return (ret); } // read static int taos_read(struct file *file, char *buf, size_t count, loff_t *ppos) { - struct taos_data *taos_datap; - u8 i = 0, xfrd = 0, reg = 0; - u8 my_buf[TAOS_MAX_DEVICE_REGS]; - int ret = 0; - - //if (prox_on) - //del_timer(&prox_poll_timer); - if ((*ppos < 0) || (*ppos >= TAOS_MAX_DEVICE_REGS) || (count > TAOS_MAX_DEVICE_REGS)) { - printk(KERN_ERR "TAOS: reg limit check failed in taos_read()\n"); - return -EINVAL; - } - reg = (u8)*ppos; - taos_datap = container_of(file->f_dentry->d_inode->i_cdev, struct taos_data, cdev); - while (xfrd < count) { - if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | reg)))) < 0) { - printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed in taos_read()\n"); - return (ret); + struct taos_data *taos_datap; + u8 i = 0, xfrd = 0, reg = 0; + u8 my_buf[TAOS_MAX_DEVICE_REGS]; + int ret = 0; + + //if (prox_on) + //del_timer(&prox_poll_timer); + if ((*ppos < 0) || (*ppos >= TAOS_MAX_DEVICE_REGS) || (count > TAOS_MAX_DEVICE_REGS)) { + printk(KERN_ERR "TAOS: reg limit check failed in taos_read()\n"); + return -EINVAL; + } + reg = (u8)*ppos; + taos_datap = container_of(file->f_dentry->d_inode->i_cdev, struct taos_data, cdev); + while (xfrd < count) { + if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | reg)))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed in taos_read()\n"); + return (ret); + } + my_buf[i++] = i2c_smbus_read_byte(taos_datap->client); + reg++; + xfrd++; } - my_buf[i++] = i2c_smbus_read_byte(taos_datap->client); - reg++; - xfrd++; - } - if ((ret = copy_to_user(buf, my_buf, xfrd))){ - printk(KERN_ERR "TAOS: copy_to_user failed in taos_read()\n"); - return -ENODATA; - } - //if (prox_on) - //taos_prox_poll_timer_start(); - return ((int)xfrd); + if ((ret = copy_to_user(buf, my_buf, xfrd))){ + printk(KERN_ERR "TAOS: copy_to_user failed in taos_read()\n"); + return -ENODATA; + } + //if (prox_on) + //taos_prox_poll_timer_start(); + return ((int)xfrd); } // write static int taos_write(struct file *file, const char *buf, size_t count, loff_t *ppos) { - struct taos_data *taos_datap; - u8 i = 0, xfrd = 0, reg = 0; - u8 my_buf[TAOS_MAX_DEVICE_REGS]; - int ret = 0; - - //if (prox_on) - //del_timer(&prox_poll_timer); - if ((*ppos < 0) || (*ppos >= TAOS_MAX_DEVICE_REGS) || ((*ppos + count) > TAOS_MAX_DEVICE_REGS)) { - printk(KERN_ERR "TAOS: reg limit check failed in taos_write()\n"); - return -EINVAL; - } - reg = (u8)*ppos; - if ((ret = copy_from_user(my_buf, buf, count))) { - printk(KERN_ERR "TAOS: copy_to_user failed in taos_write()\n"); - return -ENODATA; - } - taos_datap = container_of(file->f_dentry->d_inode->i_cdev, struct taos_data, cdev); - while (xfrd < count) { - if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG | reg), my_buf[i++]))) < 0) { - printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in taos_write()\n"); - return (ret); + struct taos_data *taos_datap; + u8 i = 0, xfrd = 0, reg = 0; + u8 my_buf[TAOS_MAX_DEVICE_REGS]; + int ret = 0; + + //if (prox_on) + //del_timer(&prox_poll_timer); + if ((*ppos < 0) || (*ppos >= TAOS_MAX_DEVICE_REGS) || ((*ppos + count) > TAOS_MAX_DEVICE_REGS)) { + printk(KERN_ERR "TAOS: reg limit check failed in taos_write()\n"); + return -EINVAL; + } + reg = (u8)*ppos; + if ((ret = copy_from_user(my_buf, buf, count))) { + printk(KERN_ERR "TAOS: copy_to_user failed in taos_write()\n"); + return -ENODATA; + } + taos_datap = container_of(file->f_dentry->d_inode->i_cdev, struct taos_data, cdev); + while (xfrd < count) { + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG | reg), my_buf[i++]))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in taos_write()\n"); + return (ret); + } + reg++; + xfrd++; } - reg++; - xfrd++; - } - //if (prox_on) - //taos_prox_poll_timer_start(); - return ((int)xfrd); + //if (prox_on) + //taos_prox_poll_timer_start(); + return ((int)xfrd); } // llseek static loff_t taos_llseek(struct file *file, loff_t offset, int orig) { - int ret = 0; - loff_t new_pos = 0; - - //if (prox_on) - //del_timer(&prox_poll_timer); - if ((offset >= TAOS_MAX_DEVICE_REGS) || (orig < 0) || (orig > 1)) { - printk(KERN_ERR "TAOS: offset param limit or origin limit check failed in taos_llseek()\n"); - return -EINVAL; - } - switch (orig) { - case 0: - new_pos = offset; - break; - case 1: - new_pos = file->f_pos + offset; - break; - default: - return -EINVAL; - break; - } - if ((new_pos < 0) || (new_pos >= TAOS_MAX_DEVICE_REGS) || (ret < 0)) { - printk(KERN_ERR "TAOS: new offset limit or origin limit check failed in taos_llseek()\n"); - return -EINVAL; - } - file->f_pos = new_pos; - // if (prox_on) - // taos_prox_poll_timer_start(); - return new_pos; + int ret = 0; + loff_t new_pos = 0; + + //if (prox_on) + //del_timer(&prox_poll_timer); + if ((offset >= TAOS_MAX_DEVICE_REGS) || (orig < 0) || (orig > 1)) { + printk(KERN_ERR "TAOS: offset param limit or origin limit check failed in taos_llseek()\n"); + return -EINVAL; + } + switch (orig) { + case 0: + new_pos = offset; + break; + case 1: + new_pos = file->f_pos + offset; + break; + default: + return -EINVAL; + break; + } + if ((new_pos < 0) || (new_pos >= TAOS_MAX_DEVICE_REGS) || (ret < 0)) { + printk(KERN_ERR "TAOS: new offset limit or origin limit check failed in taos_llseek()\n"); + return -EINVAL; + } + file->f_pos = new_pos; + // if (prox_on) + // taos_prox_poll_timer_start(); + return new_pos; } /*enable_light_and_proximity, mask values' indication*/ @@ -846,536 +859,633 @@ static loff_t taos_llseek(struct file *file, loff_t offset, int orig) { /*02 : prox off*/ static int enable_light_and_proximity(int mask) { - u8 ret = 0, reg_val = 0; //itime = 0; - - if(mask==0x10) - { - if(!prox_on){ - pr_crit(TAOS_TAG "light on while prox off\n"); - if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|0x00), 0x00))) < 0) { - printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); - return (ret); - } - }else - pr_crit(TAOS_TAG "light on while prox on\n"); - if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG|TAOS_TRITON_CMD_SPL_FN|TAOS_TRITON_CMD_ALS_INTCLR)))) < 0) { - printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed in ioctl als_on\n"); - return (ret); - } + u8 ret = 0, reg_val = 0; //itime = 0; - if(!prox_on){ - /* + if(mask==0x10) + { + if(!prox_on){ + pr_crit(TAOS_TAG "light on while prox off\n"); + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|0x00), 0x00))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + }else + pr_crit(TAOS_TAG "light on while prox on\n"); + if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG|TAOS_TRITON_CMD_SPL_FN|TAOS_TRITON_CMD_ALS_INTCLR)))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed in ioctl als_on\n"); + return (ret); + } + + if(!prox_on){ + /* itime = (((taos_cfgp->als_time/50) * 18) - 1); itime = (~itime);*/ - if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_ALS_TIME), 0xEE))) < 0) { - printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl als_on\n"); - return (ret); - } - if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|0x03), 0xDC))) < 0) { - printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl als_on\n"); - return (ret); - } - } - if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_GAIN)))) < 0) { - printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed in ioctl als_on\n"); - return (ret); - } - reg_val = i2c_smbus_read_byte(taos_datap->client); - reg_val = reg_val & 0xFC; - reg_val = reg_val | (taos_cfgp->gain & 0x03); - if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_GAIN), reg_val))) < 0) { - printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl als gain\n"); - return (ret); - } - reg_val=prox_on? 0x3F:0x1B; - if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_CNTRL), reg_val)) )< 0) { - printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl als enable\n"); - return (ret); - } - reg_val=prox_on? 0x23:0x03; - if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_INTERRUPT), reg_val))) < 0) { - printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl als_on\n"); - return (ret); - } - return ret; - } - if(mask==0x01) { - if(!light_on){ - if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|0x00), 0x00))) < 0) { - printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); - return (ret); - } - } - if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|0x01), taos_cfgp->prox_int_time))) < 0) { - printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); - return (ret); - } - if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|0x02), taos_cfgp->prox_adc_time))) < 0) { - printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); - return (ret); - } - if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|0x03), taos_cfgp->prox_wait_time))) < 0) { - printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); - return (ret); - } - if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|0x0C), taos_cfgp->prox_intr_filter))) < 0) { - printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); - return (ret); - } - if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|0x0E), taos_cfgp->prox_pulse_cnt))) < 0) { - printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); - return (ret); - } - if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_GAIN)))) < 0) { - printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed in ioctl prox_on\n"); - return (ret); - } - reg_val = i2c_smbus_read_byte(taos_datap->client); - reg_val = reg_val & 0x03; - reg_val = reg_val | (taos_cfgp->prox_gain & 0xFC); - if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_GAIN), reg_val))) < 0) { - printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox gain\n"); - return (ret); - } - if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG|TAOS_TRITON_CMD_SPL_FN|TAOS_TRITON_CMD_PROX_INTCLR)))) < 0) { - printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed in ioctl als_on\n"); - return (ret); - } - if ((ret = (i2c_smbus_write_word_data(taos_datap->client, (0xA0 | TAOS_TRITON_PRX_MAXTHRESHLO),taos_cfgp->prox_threshold_hi))) < 0) { - pr_crit(TAOS_TAG "i2c_smbus_write_byte() to TAOS_TRITON_PRX_MAXTHRESHLO\n"); - } - if ((ret = (i2c_smbus_write_word_data(taos_datap->client, (0xA0 | TAOS_TRITON_PRX_MINTHRESHLO),taos_cfgp->prox_threshold_lo))) < 0) { - pr_crit(TAOS_TAG "i2c_smbus_write_byte() to TAOS_TRITON_PRX_MINTHRESHLO\n"); - } - prox_cur_infop->prox_event = 0; - prox_cur_infop->prox_clear = 0; - prox_cur_infop->prox_data = 0; - if(light_on) - pr_crit(TAOS_TAG "prox on while light on\n"); - reg_val=light_on? 0x3F:0x2F; - if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|0x00), reg_val))) < 0) { - printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); - return (ret); - } - reg_val=light_on? 0x23:0x20; - if((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|0x0C), reg_val))) < 0) - { - printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); - return (ret); - } - // Use wake lock to stop suspending during calls. - wake_lock(&taos_wake_lock); - pr_crit(TAOS_TAG "get wake lock"); - return ret; - } - if(mask==0x20) - { - if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_CNTRL)))) < 0) { - printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed in ioctl als_calibrate\n"); - return (ret); - } - reg_val = i2c_smbus_read_byte(taos_datap->client); - if(prox_on){ - pr_crit(TAOS_TAG "light off while prox still on\n"); - reg_val = reg_val & (~TAOS_TRITON_CNTL_ALS_INT_ENBL); - } - else - reg_val = reg_val & (~(TAOS_TRITON_CNTL_ADC_ENBL | TAOS_TRITON_CNTL_PWRON)); - if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_CNTRL), reg_val))) < 0) { - printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl als_off\n"); - return (ret); - } - return ret; - } - if(mask==0x02) - { - if(light_on){ - pr_crit(TAOS_TAG "prox off while light still on\n"); - if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|0x03), 0xDC))) < 0) { - printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl als_on\n"); - return (ret); - } - if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_CNTRL)))) < 0) { - printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed in ioctl als_calibrate\n"); - return (ret); - } - reg_val = i2c_smbus_read_byte(taos_datap->client); - reg_val = reg_val & (~(TAOS_TRITON_CNTL_PROX_INT_ENBL | TAOS_TRITON_CNTL_PROX_DET_ENBL)); - } else - reg_val = 0x00; - if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|0x00), reg_val))) < 0) { - printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox_off\n"); - return (ret); - } - wake_unlock(&taos_wake_lock); - pr_crit(TAOS_TAG "release wake lock"); - return ret; - } - return ret; + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_ALS_TIME), 0xEE))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl als_on\n"); + return (ret); + } + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|0x03), 0xDC))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl als_on\n"); + return (ret); + } + } + if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_GAIN)))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed in ioctl als_on\n"); + return (ret); + } + reg_val = i2c_smbus_read_byte(taos_datap->client); + reg_val = reg_val & 0xFC; + reg_val = reg_val | (taos_cfgp->gain & 0x03); + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_GAIN), reg_val))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl als gain\n"); + return (ret); + } + reg_val=prox_on? 0x3F:0x1B; + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_CNTRL), reg_val)) )< 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl als enable\n"); + return (ret); + } + reg_val=prox_on? 0x23:0x03; + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_INTERRUPT), reg_val))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl als_on\n"); + return (ret); + } + return ret; + } + if(mask==0x01) + { + if(!light_on){ + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|0x00), 0x00))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + } + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|0x01), taos_cfgp->prox_int_time))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|0x02), taos_cfgp->prox_adc_time))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|0x03), taos_cfgp->prox_wait_time))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|0x0C), taos_cfgp->prox_intr_filter))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|0x0E), taos_cfgp->prox_pulse_cnt))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_GAIN)))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed in ioctl prox_on\n"); + return (ret); + } + reg_val = i2c_smbus_read_byte(taos_datap->client); + reg_val = reg_val & 0x03; + reg_val = reg_val | (taos_cfgp->prox_gain & 0xFC); + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_GAIN), reg_val))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox gain\n"); + return (ret); + } + if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG|TAOS_TRITON_CMD_SPL_FN|TAOS_TRITON_CMD_PROX_INTCLR)))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed in ioctl als_on\n"); + return (ret); + } + if ((ret = (i2c_smbus_write_word_data(taos_datap->client, (0xA0 | TAOS_TRITON_PRX_MAXTHRESHLO),taos_cfgp->prox_threshold_hi))) < 0) { + pr_crit(TAOS_TAG "i2c_smbus_write_byte() to TAOS_TRITON_PRX_MAXTHRESHLO\n"); + } + if ((ret = (i2c_smbus_write_word_data(taos_datap->client, (0xA0 | TAOS_TRITON_PRX_MINTHRESHLO),taos_cfgp->prox_threshold_lo))) < 0) { + pr_crit(TAOS_TAG "i2c_smbus_write_byte() to TAOS_TRITON_PRX_MINTHRESHLO\n"); + } + prox_cur_infop->prox_event = 0; + prox_cur_infop->prox_clear = 0; + prox_cur_infop->prox_data = 0; + if(light_on) + pr_crit(TAOS_TAG "prox on while light on\n"); + reg_val=light_on? 0x3F:0x2F; + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|0x00), reg_val))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + reg_val=light_on? 0x23:0x20; + if((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|0x0C), reg_val))) < 0) + { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + return ret; + } + if(mask==0x20) + { + if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_CNTRL)))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed in ioctl als_calibrate\n"); + return (ret); + } + reg_val = i2c_smbus_read_byte(taos_datap->client); + if(prox_on){ + pr_crit(TAOS_TAG "light off while prox still on\n"); + reg_val = reg_val & (~TAOS_TRITON_CNTL_ALS_INT_ENBL); + } + else + reg_val = reg_val & (~(TAOS_TRITON_CNTL_ADC_ENBL | TAOS_TRITON_CNTL_PWRON)); + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_CNTRL), reg_val))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl als_off\n"); + return (ret); + } + return ret; + } + if(mask==0x02) + { + if(light_on){ + pr_crit(TAOS_TAG "prox off while light still on\n"); + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|0x03), 0xDC))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl als_on\n"); + return (ret); + } + if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_CNTRL)))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed in ioctl als_calibrate\n"); + return (ret); + } + reg_val = i2c_smbus_read_byte(taos_datap->client); + reg_val = reg_val & (~(TAOS_TRITON_CNTL_PROX_INT_ENBL | TAOS_TRITON_CNTL_PROX_DET_ENBL)); + }else + reg_val = 0x00; + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|0x00), reg_val))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox_off\n"); + return (ret); + } + return ret; + } + return ret; } // ioctls static int taos_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { - struct taos_data *taos_datap; - int prox_sum = 0, prox_mean = 0, prox_max = 0; - int lux_val = 0, ret = 0, i = 0, tmp = 0; - u16 gain_trim_val = 0; - u8 reg_val = 0; - - taos_datap = container_of(inode->i_cdev, struct taos_data, cdev); - switch (cmd) { - case TAOS_IOCTL_ALS_ON: - if(prox_on) - break; - ret=enable_light_and_proximity(0x10); - if(ret>=0) - { - light_on=1; - pr_crit(TAOS_TAG "TAOS_IOCTL_ALS_ON,lux=%d\n", g_nlux); - } - return (ret); - break; - case TAOS_IOCTL_ALS_OFF: - if(prox_on) - break; - for (i = 0; i < TAOS_FILTER_DEPTH; i++) - lux_history[i] = -ENODATA; - ret=enable_light_and_proximity(0x20); - if(ret>=0) - { - light_on=0; - //g_nlux=0; - pr_crit(TAOS_TAG"TAOS_IOCTL_ALS_OFF\n"); - } - return (ret); - break; - case TAOS_IOCTL_ALS_DATA: - if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_CNTRL)))) < 0) { - printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed in ioctl als_data\n"); - return (ret); - } - reg_val = i2c_smbus_read_byte(taos_datap->client); - if ((reg_val & (TAOS_TRITON_CNTL_ADC_ENBL | TAOS_TRITON_CNTL_PWRON)) != (TAOS_TRITON_CNTL_ADC_ENBL | TAOS_TRITON_CNTL_PWRON)) - return -ENODATA; - if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_STATUS)))) < 0) { - printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed in ioctl als_data\n"); - return (ret); - } - reg_val = i2c_smbus_read_byte(taos_datap->client); - if ((reg_val & TAOS_TRITON_STATUS_ADCVALID) != TAOS_TRITON_STATUS_ADCVALID) - return -ENODATA; - if ((lux_val = taos_get_lux()) < 0) - printk(KERN_ERR "TAOS: call to taos_get_lux() returned error %d in ioctl als_data\n", lux_val); - lux_val = taos_lux_filter(lux_val); - return (lux_val); - break; - case TAOS_IOCTL_ALS_CALIBRATE: - if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_CNTRL)))) < 0) { - printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed in ioctl als_calibrate\n"); - return (ret); - } - reg_val = i2c_smbus_read_byte(taos_datap->client); - if ((reg_val & 0x03) != 0x03) - return -ENODATA; - if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_STATUS)))) < 0) { - printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed in ioctl als_calibrate\n"); - return (ret); - } - reg_val = i2c_smbus_read_byte(taos_datap->client); - if ((reg_val & 0x01) != 0x01) - return -ENODATA; - if ((lux_val = taos_get_lux()) < 0) { - printk(KERN_ERR "TAOS: call to lux_val() returned error %d in ioctl als_data\n", lux_val); - return (lux_val); - } - gain_trim_val = (u16)(((taos_cfgp->calibrate_target) * 512)/lux_val); - taos_cfgp->gain_trim = (int)gain_trim_val; - return ((int)gain_trim_val); - break; - - case TAOS_IOCTL_CONFIG_GET: - ret = copy_to_user((struct taos_cfg *)arg, taos_cfgp, sizeof(struct taos_cfg)); - if (ret) { - printk(KERN_ERR "TAOS: copy_to_user failed in ioctl config_get\n"); - return -ENODATA; - } - return (ret); - break; - case TAOS_IOCTL_CONFIG_SET: - ret = copy_from_user(taos_cfgp, (struct taos_cfg *)arg, sizeof(struct taos_cfg)); - if (ret) { - printk(KERN_ERR "TAOS: copy_from_user failed in ioctl config_set\n"); - return -ENODATA; - } - if(taos_cfgp->als_time < 50) - taos_cfgp->als_time = 50; - if(taos_cfgp->als_time > 650) - taos_cfgp->als_time = 650; - tmp = (taos_cfgp->als_time + 25)/50; - taos_cfgp->als_time = tmp*50; - sat_als = (256 - taos_cfgp->prox_int_time) << 10; - sat_prox = (256 - taos_cfgp->prox_adc_time) << 10; - break; - case TAOS_IOCTL_PROX_ON: - ret=enable_light_and_proximity(0x01); - if(ret>=0) - { - prox_on = 1; - pr_crit(TAOS_TAG "TAOS_IOCTL_PROX_ON\n"); - } - return ret; - break; - case TAOS_IOCTL_PROX_OFF: - ret=enable_light_and_proximity(0x02); - if(ret>=0) - { - prox_on = 0; - pr_crit(TAOS_TAG"TAOS_IOCTL_PROX_OFF\n"); - } - return ret; - break; - case TAOS_IOCTL_PROX_DATA: - ret = copy_to_user((struct taos_prox_info *)arg, prox_cur_infop, sizeof(struct taos_prox_info)); - if (ret) { - printk(KERN_ERR "TAOS: copy_to_user failed in ioctl prox_data\n"); - return -ENODATA; - } - return (ret); - break; - case TAOS_IOCTL_PROX_EVENT: - return (prox_cur_infop->prox_event); - break; - case TAOS_IOCTL_PROX_CALIBRATE: - if (!prox_on) - { - printk(KERN_ERR "TAOS: ioctl prox_calibrate was called before ioctl prox_on was called\n"); - return -EPERM; - } - prox_sum = 0; - prox_max = 0; - for (i = 0; i < 20; i++) { - if ((ret = taos_prox_poll(&prox_cal_info[i])) < 0) { - printk(KERN_ERR "TAOS: call to prox_poll failed in ioctl prox_calibrate\n"); - return (ret); - } - - prox_sum += prox_cal_info[i].prox_data; - if (prox_cal_info[i].prox_data > prox_max) - prox_max = prox_cal_info[i].prox_data; - mdelay(100); - } - prox_mean = prox_sum/20; - - taos_cfgp->prox_threshold_hi = 15*prox_mean/10; - taos_cfgp->prox_threshold_lo = 12*prox_mean/10; - - if (taos_cfgp->prox_threshold_lo < ((sat_prox*12)/100)) { - taos_cfgp->prox_threshold_lo = ((sat_prox*12)/100); - taos_cfgp->prox_threshold_hi = ((sat_prox*15)/100); - } - - if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG|TAOS_TRITON_CMD_SPL_FN|TAOS_TRITON_CMD_PROX_INTCLR)))) < 0) { - printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed in ioctl als_on\n"); - return (ret); - } - if ((ret = (i2c_smbus_write_word_data(taos_datap->client, (0xA0 | TAOS_TRITON_PRX_MAXTHRESHLO),taos_cfgp->prox_threshold_hi))) < 0) { - pr_crit(TAOS_TAG "i2c_smbus_write_byte() to TAOS_TRITON_PRX_MAXTHRESHLO\n"); - } - if ((ret = (i2c_smbus_write_word_data(taos_datap->client, (0xA0 | TAOS_TRITON_PRX_MINTHRESHLO),taos_cfgp->prox_threshold_lo))) < 0) { - pr_crit(TAOS_TAG "i2c_smbus_write_byte() to TAOS_TRITON_PRX_MINTHRESHLO\n"); - } - - pr_crit(KERN_ERR "taos prox_cal_threshold_hi=%d,prox_cal_threshold_lo=%d\n",taos_cfgp->prox_threshold_hi,taos_cfgp->prox_threshold_lo); - break; - - case TAOS_IOCTL_PROX_GET_ENABLED: - return put_user(prox_on, (unsigned long __user *)arg); - break; - case TAOS_IOCTL_ALS_GET_ENABLED: - return put_user(light_on, (unsigned long __user *)arg); - break; - - default: - return -EINVAL; - break; - } - return (ret); + struct taos_data *taos_datap; + int prox_sum = 0, prox_mean = 0, prox_max = 0; + int lux_val = 0, ret = 0, i = 0, tmp = 0; + u16 gain_trim_val = 0; + u8 reg_val = 0, prox_pulse=0, prox_gain=0; + int count=0; + struct prox_data *prox_pt; + u16 ratio; + taos_datap = container_of(inode->i_cdev, struct taos_data, cdev); +//[sensor wlg 20110729]ALS thereshold modify add log +//printk(KERN_ERR "TAOS_wlg: taos_ioctl() cmd=%d\n", cmd); + switch (cmd) { + case PS_ALS_IOCTL_ALS_ON: + if(prox_on) + break; + ret=enable_light_and_proximity(0x10); + if(ret>=0) + { + light_on=1; + pr_crit(TAOS_TAG "TAOS_IOCTL_ALS_ON,lux=%d\n", g_nlux); + } + return (ret); + break; + case PS_ALS_IOCTL_ALS_OFF: + if(prox_on) + break; + for (i = 0; i < TAOS_FILTER_DEPTH; i++) + lux_history[i] = -ENODATA; + ret=enable_light_and_proximity(0x20); + if(ret>=0) + { + light_on=0; + //g_nlux=0; + pr_crit(TAOS_TAG"TAOS_IOCTL_ALS_OFF\n"); + } + return (ret); + break; + case PS_ALS_IOCTL_ALS_DATA: + if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_CNTRL)))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed in ioctl als_data\n"); + return (ret); + } + reg_val = i2c_smbus_read_byte(taos_datap->client); + if ((reg_val & (TAOS_TRITON_CNTL_ADC_ENBL | TAOS_TRITON_CNTL_PWRON)) != (TAOS_TRITON_CNTL_ADC_ENBL | TAOS_TRITON_CNTL_PWRON)) + return -ENODATA; + if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_STATUS)))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed in ioctl als_data\n"); + return (ret); + } + reg_val = i2c_smbus_read_byte(taos_datap->client); + if ((reg_val & TAOS_TRITON_STATUS_ADCVALID) != TAOS_TRITON_STATUS_ADCVALID) + return -ENODATA; + if ((lux_val = taos_get_lux()) < 0) + printk(KERN_ERR "TAOS: call to taos_get_lux() returned error %d in ioctl als_data\n", lux_val); + lux_val = taos_lux_filter(lux_val); + return (lux_val); + break; + case PS_ALS_IOCTL_ALS_CALIBRATE: + if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_CNTRL)))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed in ioctl als_calibrate\n"); + return (ret); + } + reg_val = i2c_smbus_read_byte(taos_datap->client); + if ((reg_val & 0x03) != 0x03) + return -ENODATA; + if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_STATUS)))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed in ioctl als_calibrate\n"); + return (ret); + } + reg_val = i2c_smbus_read_byte(taos_datap->client); + if ((reg_val & 0x01) != 0x01) + return -ENODATA; + if ((lux_val = taos_get_lux()) < 0) { + printk(KERN_ERR "TAOS: call to lux_val() returned error %d in ioctl als_data\n", lux_val); + return (lux_val); + } + gain_trim_val = (u16)(((taos_cfgp->calibrate_target) * 512)/lux_val); + taos_cfgp->gain_trim = (int)gain_trim_val; + return ((int)gain_trim_val); + break; + + case PS_ALS_IOCTL_CONFIG_GET: + ret = copy_to_user((struct PS_ALS_cfg *)arg, taos_cfgp, sizeof(struct PS_ALS_cfg)); + if (ret) { + printk(KERN_ERR "TAOS: copy_to_user failed in ioctl config_get\n"); + return -ENODATA; + } + return (ret); + break; + case PS_ALS_IOCTL_CONFIG_SET: + ret = copy_from_user(taos_cfgp, (struct PS_ALS_cfg *)arg, sizeof(struct PS_ALS_cfg)); + if (ret) { + printk(KERN_ERR "TAOS: copy_from_user failed in ioctl config_set\n"); + return -ENODATA; + } + if(taos_cfgp->als_time < 50) + taos_cfgp->als_time = 50; + if(taos_cfgp->als_time > 650) + taos_cfgp->als_time = 650; + tmp = (taos_cfgp->als_time + 25)/50; + taos_cfgp->als_time = tmp*50; + sat_als = (256 - taos_cfgp->prox_int_time) << 10; + sat_prox = (256 - taos_cfgp->prox_adc_time) << 10; + if(!taos_cfgp->prox_pulse_cnt) + taos_cfgp->prox_pulse_cnt=prox_pulse_cnt_param; + break; + case PS_ALS_IOCTL_PROX_ON: + ret=enable_light_and_proximity(0x01); + if(ret>=0) + { + prox_on = 1; + pr_crit(TAOS_TAG "TAOS_IOCTL_PROX_ON\n"); + } + return ret; + break; + case PS_ALS_IOCTL_PROX_OFF: + ret=enable_light_and_proximity(0x02); + if(ret>=0) + { + prox_on = 0; + pr_crit(TAOS_TAG"TAOS_IOCTL_PROX_OFF\n"); + } + return ret; + break; + case PS_ALS_IOCTL_PROX_DATA: + ret = copy_to_user((struct PS_ALS_prox_info *)arg, prox_cur_infop, sizeof(struct PS_ALS_prox_info)); + if (ret) { + printk(KERN_ERR "TAOS: copy_to_user failed in ioctl prox_data\n"); + return -ENODATA; + } + return (ret); + break; + case PS_ALS_IOCTL_PROX_EVENT: + return (prox_cur_infop->prox_event); + break; + case PS_ALS_IOCTL_PROX_CALIBRATE: + if (!prox_on) + { + printk(KERN_ERR "TAOS: ioctl prox_calibrate was called before ioctl prox_on was called\n"); + return -EPERM; + } + + mutex_lock(&taos_datap->proximity_calibrating); + count=0; + prox_pulse=prox_pulse_cnt_param; + prox_gain=prox_gain_param; + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|0x0E), prox_pulse))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed\n"); + + } + if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_GAIN)))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed in ioctl prox_on\n"); + + } + reg_val = i2c_smbus_read_byte(taos_datap->client); + reg_val = reg_val & 0x03; + reg_val = reg_val | (prox_gain & 0xFC); + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_GAIN), reg_val))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox gain\n"); + + } + msleep(50); + do{ + prox_sum = 0; + prox_max = 0; + prox_mean = 0; + count++; + for (i = 0; i < 20; i++) { + if ((ret = taos_prox_poll(&prox_cal_info[i])) < 0) { + printk(KERN_ERR "TAOS: call to prox_poll failed in ioctl prox_calibrate\n"); + mutex_unlock(&taos_datap->proximity_calibrating); + return (ret); + } + prox_sum += prox_cal_info[i].prox_data; + if (prox_cal_info[i].prox_data > prox_max) + prox_max = prox_cal_info[i].prox_data; + msleep(50); + } + prox_mean = prox_sum/20; + + if(taos_datap->chip_type==TMD2771){ + ratio = 10*prox_mean/sat_prox; + + for (prox_pt = prox_tablep; prox_pt->ratio && prox_pt->ratio <= ratio; prox_pt++); + if(!prox_pt->ratio) + return -1; + + taos_cfgp->prox_threshold_hi = (prox_mean*prox_pt->hi)/10; + taos_cfgp->prox_threshold_lo = taos_cfgp->prox_threshold_hi*THRES_LO_TO_HI_RATIO; + } + else{ + taos_cfgp->prox_threshold_hi = 15*prox_mean/10; + taos_cfgp->prox_threshold_lo = taos_cfgp->prox_threshold_hi*THRES_LO_TO_HI_RATIO; + } + if(taos_cfgp->prox_threshold_hi>=sat_prox){ + prox_pulse-=1; + if(prox_pulse<1){ + prox_pulse=1; + count=10; + if(prox_gain==0x20) + count--; + prox_gain=0x60; + if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_GAIN)))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed in ioctl prox_on\n"); + + } + reg_val = i2c_smbus_read_byte(taos_datap->client); + reg_val = reg_val & 0x03; + reg_val = reg_val | (prox_gain & 0xFC); + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_GAIN), reg_val))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox gain\n"); + + } + } + } + if(taos_cfgp->prox_threshold_hi<=(sat_prox*2/5)){ + prox_pulse+=1; + if(taos_datap->chip_type==TMD2771){ + count=10; + prox_pulse--; + } + if(prox_pulse>20){ + prox_pulse=20; + count=10; + } + } + printk(KERN_ERR "taos:prox_pulse_cnt_param=%d\n",prox_pulse); + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|0x0E), prox_pulse))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed\n"); + + } + msleep(50); + }while(((taos_cfgp->prox_threshold_hi>=sat_prox)||(taos_cfgp->prox_threshold_hi<(sat_prox*2/5)))&&(count<10)); + + taos_cfgp->prox_pulse_cnt = prox_pulse; + taos_cfgp->prox_gain = prox_gain; + if (taos_cfgp->prox_threshold_lo < ((sat_prox*15)/100)) { + taos_cfgp->prox_threshold_hi = ((sat_prox*20)/100); + taos_cfgp->prox_threshold_lo = (taos_cfgp->prox_threshold_hi *THRES_LO_TO_HI_RATIO); + } + + if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG|TAOS_TRITON_CMD_SPL_FN|TAOS_TRITON_CMD_PROXALS_INTCLR)))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed\n"); + + } + if ((ret = (i2c_smbus_write_word_data(taos_datap->client, (0xA0 | TAOS_TRITON_PRX_MAXTHRESHLO),taos_cfgp->prox_threshold_hi))) < 0) { + pr_crit(TAOS_TAG "i2c_smbus_write_byte() to TAOS_TRITON_PRX_MAXTHRESHLO\n"); + } + if ((ret = (i2c_smbus_write_word_data(taos_datap->client, (0xA0 | TAOS_TRITON_PRX_MINTHRESHLO),taos_cfgp->prox_threshold_lo))) < 0) { + pr_crit(TAOS_TAG "i2c_smbus_write_byte() to TAOS_TRITON_PRX_MINTHRESHLO\n"); + } + reg_val=light_on? 0x3F:0x2F; + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|0x00), reg_val))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed\n"); + + } + mutex_unlock(&taos_datap->proximity_calibrating); + pr_crit(KERN_ERR "taos prox_cal_threshold_hi=%d,prox_cal_threshold_lo=%d\n",taos_cfgp->prox_threshold_hi,taos_cfgp->prox_threshold_lo); + return (ret); + break; + + case PS_ALS_IOCTL_PROX_GET_ENABLED: + return put_user(prox_on, (unsigned long __user *)arg); + break; + case PS_ALS_IOCTL_ALS_GET_ENABLED: + return put_user(light_on, (unsigned long __user *)arg); + break; + + default: + return -EINVAL; + break; + } + return (ret); } // read and calculate lux value static int taos_get_lux(void) { - u16 raw_clear = 0, raw_ir = 0, raw_lux = 0; - u32 lux = 0; - u32 ratio = 0; - u8 dev_gain = 0; - struct lux_data *p; - int ret = 0; - u8 chdata[4]; - int tmp = 0, i = 0; - //pr_crit(TAOS_TAG "taos start to calc lux value\n"); - - for (i = 0; i < 4; i++) { - if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | (TAOS_TRITON_ALS_CHAN0LO + i))))) < 0) { - printk(KERN_ERR "TAOS: i2c_smbus_write_byte() to chan0/1/lo/hi reg failed in taos_get_lux()\n"); - return (ret); - } - chdata[i] = i2c_smbus_read_byte(taos_datap->client); - } - - tmp = (taos_cfgp->als_time + 25)/50; - TritonTime.numerator = 1; - TritonTime.denominator = tmp; - - tmp = 300 * taos_cfgp->als_time; - if(tmp > 65535) - tmp = 65535; - TritonTime.saturation = tmp; - raw_clear = chdata[1]; - raw_clear <<= 8; - raw_clear |= chdata[0]; - raw_ir = chdata[3]; - raw_ir <<= 8; - raw_ir |= chdata[2]; - - als_intr_threshold_hi_param = raw_clear + raw_clear/5; - als_intr_threshold_lo_param = raw_clear - raw_clear/5; - - //update threshold - //printk(TAOS_TAG "als_intr_threshold_hi_param=%x,als_intr_threshold_lo_param=%x\n",als_intr_threshold_hi_param,als_intr_threshold_lo_param); - if ((ret = (i2c_smbus_write_word_data(taos_datap->client, (0xA0 | TAOS_TRITON_ALS_MAXTHRESHLO),als_intr_threshold_hi_param))) < 0) { - printk(KERN_ERR "TAOS: i2c_smbus_write_byte() to chan0/1/lo/hi reg failed in taos_get_lux()\n"); - } - if ((ret = (i2c_smbus_write_word_data(taos_datap->client, (0xA0 | TAOS_TRITON_ALS_MINTHRESHLO),als_intr_threshold_lo_param))) < 0) { - printk(KERN_ERR "TAOS: i2c_smbus_write_byte() to chan0/1/lo/hi reg failed in taos_get_lux()\n"); - } - - if(raw_ir > raw_clear) { - raw_lux = raw_ir; - raw_ir = raw_clear; - raw_clear = raw_lux; - } - raw_clear *= taos_cfgp->scale_factor; - raw_ir *= taos_cfgp->scale_factor; - dev_gain = taos_triton_gain_table[taos_cfgp->gain & 0x3]; - if(raw_clear >= lux_timep->saturation) - return(TAOS_MAX_LUX); - if(raw_ir >= lux_timep->saturation) - return(TAOS_MAX_LUX); - if(raw_clear == 0) - return(0); - if(dev_gain == 0 || dev_gain > 127) { - printk(KERN_ERR "TAOS: dev_gain = 0 or > 127 in taos_get_lux()\n"); - return -1; + u16 raw_clear = 0, raw_ir = 0, raw_lux = 0; + u32 lux = 0; + u32 ratio = 0; + u8 dev_gain = 0; + struct lux_data *p; + int ret = 0; + u8 chdata[4]; + int tmp = 0, i = 0; + //pr_crit(TAOS_TAG "taos start to calc lux value\n"); + + for (i = 0; i < 4; i++) { + if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | (TAOS_TRITON_ALS_CHAN0LO + i))))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte() to chan0/1/lo/hi reg failed in taos_get_lux()\n"); + return (ret); + } + chdata[i] = i2c_smbus_read_byte(taos_datap->client); +//[sensor wlg 20110729]ALS thereshold modify +// printk(KERN_ERR "TAOS_wlg: i2c_smbus_read_byte() i=%d ret=%d \n", i, chdata[i]); + } + + tmp = (taos_cfgp->als_time + 25)/50; + TritonTime.numerator = 1; + TritonTime.denominator = tmp; + + tmp = 300 * taos_cfgp->als_time; + if(tmp > 65535) + tmp = 65535; + TritonTime.saturation = tmp; + raw_clear = chdata[1]; + raw_clear <<= 8; + raw_clear |= chdata[0]; + raw_ir = chdata[3]; + raw_ir <<= 8; + raw_ir |= chdata[2]; +//[sensor wlg 20110729]ALS thereshold modify + if( raw_clear < ((TAOS_MAX_LUX*5)>>2)) + { + als_intr_threshold_hi_param = raw_clear + (raw_clear>>2); + als_intr_threshold_lo_param = raw_clear - (raw_clear>>2); } - if(lux_timep->denominator == 0) { - printk(KERN_ERR "TAOS: lux_timep->denominator = 0 in taos_get_lux()\n"); - return -1; + else + { + als_intr_threshold_hi_param = raw_clear + (TAOS_MAX_LUX>>2); + als_intr_threshold_lo_param = TAOS_MAX_LUX; } - ratio = (raw_ir<<15)/raw_clear; - for (p = lux_tablep; p->ratio && p->ratio < ratio; p++); - if(!p->ratio) - return -1; - lux = ((raw_clear*(p->clear)) - (raw_ir*(p->ir))); - lux = ((lux + (lux_timep->denominator >>1))/lux_timep->denominator) * lux_timep->numerator; - lux = (lux + (dev_gain >> 1))/dev_gain; - lux >>= TAOS_SCALE_MILLILUX; - if(lux > TAOS_MAX_LUX) - lux = TAOS_MAX_LUX; - return(lux); +printk(KERN_ERR "TAOS: lux_timep->saturation=%d hi=%d lo=%d\n", lux_timep->saturation, als_intr_threshold_hi_param, als_intr_threshold_lo_param); + + //update threshold + //printk(TAOS_TAG "als_intr_threshold_hi_param=%x,als_intr_threshold_lo_param=%x\n",als_intr_threshold_hi_param,als_intr_threshold_lo_param); + if ((ret = (i2c_smbus_write_word_data(taos_datap->client, (0xA0 | TAOS_TRITON_ALS_MAXTHRESHLO),als_intr_threshold_hi_param))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte() to chan0/1/lo/hi reg failed in taos_get_lux()\n"); + } + if ((ret = (i2c_smbus_write_word_data(taos_datap->client, (0xA0 | TAOS_TRITON_ALS_MINTHRESHLO),als_intr_threshold_lo_param))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte() to chan0/1/lo/hi reg failed in taos_get_lux()\n"); + } + + if(raw_ir > raw_clear) { + raw_lux = raw_ir; + raw_ir = raw_clear; + raw_clear = raw_lux; + } + raw_clear *= taos_cfgp->scale_factor; + raw_ir *= taos_cfgp->scale_factor; + dev_gain = taos_triton_gain_table[taos_cfgp->gain & 0x3]; + if(raw_clear >= lux_timep->saturation) + return((TAOS_MAX_LUX)*(taos_cfgp->gain_trim));//[sensor wlg 20110729]ALS thereshold modify + if(raw_ir >= lux_timep->saturation) + return((TAOS_MAX_LUX)*(taos_cfgp->gain_trim));//[sensor wlg 20110729]ALS thereshold modify + if(raw_clear == 0) + return(0); + if(dev_gain == 0 || dev_gain > 127) { + printk(KERN_ERR "TAOS: dev_gain = 0 or > 127 in taos_get_lux()\n"); + return -1; + } + if(lux_timep->denominator == 0) { + printk(KERN_ERR "TAOS: lux_timep->denominator = 0 in taos_get_lux()\n"); + return -1; + } + ratio = (raw_ir<<15)/raw_clear; + for (p = lux_tablep; p->ratio && p->ratio < ratio; p++); + if(!p->ratio) + return -1; + lux = ((raw_clear*(p->clear)) - (raw_ir*(p->ir))); + lux = ((lux + (lux_timep->denominator >>1))/lux_timep->denominator) * lux_timep->numerator; + lux = (lux + (dev_gain >> 1))/dev_gain; + lux >>= TAOS_SCALE_MILLILUX; +//[sensor wlg 20110729]ALS thereshold modify + if(lux > (TAOS_MAX_LUX)*(taos_cfgp->gain_trim)) + lux = (TAOS_MAX_LUX)*(taos_cfgp->gain_trim); + return(lux); } static int taos_lux_filter(int lux) { - static u8 middle[] = {1,0,2,0,0,2,0,1}; - int index; - - lux_history[2] = lux_history[1]; - lux_history[1] = lux_history[0]; - lux_history[0] = lux; - if((lux_history[2] < 0) || (lux_history[1] < 0) || (lux_history[0] < 0)) - return -ENODATA; - index = 0; - if( lux_history[0] > lux_history[1] ) index += 4; - if( lux_history[1] > lux_history[2] ) index += 2; - if( lux_history[0] > lux_history[2] ) index++; - return(lux_history[middle[index]]); + static u8 middle[] = {1,0,2,0,0,2,0,1}; + int index; + + lux_history[2] = lux_history[1]; + lux_history[1] = lux_history[0]; + lux_history[0] = lux; + if((lux_history[2] < 0) || (lux_history[1] < 0) || (lux_history[0] < 0)) + return -ENODATA; + index = 0; + if( lux_history[0] > lux_history[1] ) index += 4; + if( lux_history[1] > lux_history[2] ) index += 2; + if( lux_history[0] > lux_history[2] ) index++; + return(lux_history[middle[index]]); } // verify device static int taos_device_name(unsigned char *bufp, char **device_name) { - if( ((bufp[0x12]&0xf0)!=0x00)&&((bufp[0x12]&0xf0)!=0x20)) - return(0); - //distinguish TSL2771 and TMD2771 - if((bufp[0x12]&0xf0)==0x20) - taos_datap->chip_type=TMD2771; - else - taos_datap->chip_type=TSL2771; - printk(KERN_ERR "TAOS: taos_device_name is %d\n",taos_datap->chip_type); - taos_chip_diff_settings(); - if(bufp[0x10]|bufp[0x1a]|bufp[0x1b]|bufp[0x1c]|bufp[0x1d]|bufp[0x1e]) - return(0); - if(bufp[0x13]&0x0c) - return(0); - //*device_name="tritonFN"; - *device_name="taos"; - return(1); + if( ((bufp[0x12]&0xf0)!=0x00)&&((bufp[0x12]&0xf0)!=0x20)) + return(0); + //distinguish TSL2771 and TMD2771 + if((bufp[0x12]&0xf0)==0x20) + taos_datap->chip_type=TMD2771; + else + taos_datap->chip_type=TSL2771; + printk(KERN_ERR "TAOS: taos_device_name is %d\n",taos_datap->chip_type); + taos_chip_diff_settings(); + if(bufp[0x10]|bufp[0x1a]|bufp[0x1b]|bufp[0x1c]|bufp[0x1d]|bufp[0x1e]) + return(0); + if(bufp[0x13]&0x0c) + return(0); + //*device_name="tritonFN"; + *device_name="taos"; + return(1); } static void taos_chip_diff_settings() { - if(taos_datap->chip_type==TMD2771){ - prox_pulse_cnt_param = 0x04; - } - if(taos_datap->chip_type==TSL2771) - prox_pulse_cnt_param = 0x10; + if(taos_datap->chip_type==TMD2771){ + prox_pulse_cnt_param = 0x04; + } + if(taos_datap->chip_type==TSL2771) + prox_pulse_cnt_param = 0x10; } // proximity poll -static int taos_prox_poll(struct taos_prox_info *prxp) { - //static int event = 0; - //u16 status = 0; - int i = 0, ret = 0;//wait_count = 0 - u8 chdata[6]; +static int taos_prox_poll(struct PS_ALS_prox_info *prxp) { + //static int event = 0; + //u16 status = 0; + int i = 0, ret = 0;//wait_count = 0 + u8 chdata[6]; /* - if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | 0x13)))) < 0) { - printk(KERN_ERR "TAOS: i2c_write_byte address 0x13 failed in taos_prox_poll()\n"); - return (ret); - } - status = i2c_smbus_read_byte(taos_datap->client); - //pr_crit(TAOS_TAG "status=%d\n",status); - while ((status & 0x30) != 0x30) { - status = i2c_smbus_read_byte(taos_datap->client); - wait_count++; - if (wait_count > 10) { - printk(KERN_ERR "TAOS: Prox status invalid for 100 ms in taos_prox_poll()\n"); - return -ENODATA; - } - mdelay(10); - } - pr_crit(TAOS_TAG "success after read:wait_count=%d,status=%d\n",wait_count,status); - if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG|TAOS_TRITON_CMD_SPL_FN|0x05)))) < 0) { - printk(KERN_ERR "TAOS: i2c_write_byte prox intr clear failed in taos_prox_poll()\n"); - return (ret); - } - if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG|TAOS_TRITON_CMD_SPL_FN|0x06)))) < 0) { - printk(KERN_ERR "TAOS: i2c_write_byte als intr clear failed in taos_prox_poll()\n"); - return (ret); - }*/ - for (i = 0; i < 6; i++) { - if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | (TAOS_TRITON_ALS_CHAN0LO + i))))) < 0) { - printk(KERN_ERR "TAOS: i2c_smbus_write_byte() to als/prox data reg failed in taos_prox_poll()\n"); - return (ret); + if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | 0x13)))) < 0) { + printk(KERN_ERR "TAOS: i2c_write_byte address 0x13 failed in taos_prox_poll()\n"); + return (ret); } - chdata[i] = i2c_smbus_read_byte(taos_datap->client); - } - prxp->prox_clear = chdata[1]; - prxp->prox_clear <<= 8; - prxp->prox_clear |= chdata[0]; - if (prxp->prox_clear > ((sat_als*80)/100)) - return -ENODATA; - prxp->prox_data = chdata[5]; - prxp->prox_data <<= 8; - prxp->prox_data |= chdata[4]; + status = i2c_smbus_read_byte(taos_datap->client); + //pr_crit(TAOS_TAG "status=%d\n",status); + while ((status & 0x30) != 0x30) { + status = i2c_smbus_read_byte(taos_datap->client); + wait_count++; + if (wait_count > 10) { + printk(KERN_ERR "TAOS: Prox status invalid for 100 ms in taos_prox_poll()\n"); + return -ENODATA; + } + mdelay(10); + } + pr_crit(TAOS_TAG "success after read:wait_count=%d,status=%d\n",wait_count,status); + if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG|TAOS_TRITON_CMD_SPL_FN|0x05)))) < 0) { + printk(KERN_ERR "TAOS: i2c_write_byte prox intr clear failed in taos_prox_poll()\n"); + return (ret); + } + if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG|TAOS_TRITON_CMD_SPL_FN|0x06)))) < 0) { + printk(KERN_ERR "TAOS: i2c_write_byte als intr clear failed in taos_prox_poll()\n"); + return (ret); + }*/ + for (i = 0; i < 6; i++) { + if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | (TAOS_TRITON_ALS_CHAN0LO + i))))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte() to als/prox data reg failed in taos_prox_poll()\n"); + return (ret); + } + chdata[i] = i2c_smbus_read_byte(taos_datap->client); + } + prxp->prox_clear = chdata[1]; + prxp->prox_clear <<= 8; + prxp->prox_clear |= chdata[0]; + if (prxp->prox_clear > ((sat_als*80)/100)) + return -ENODATA; + prxp->prox_data = chdata[5]; + prxp->prox_data <<= 8; + prxp->prox_data |= chdata[4]; /* prox_history_hi <<= 1; prox_history_hi |= ((prxp->prox_data > taos_cfgp->prox_threshold_hi)? 1:0); @@ -1386,14 +1496,14 @@ static int taos_prox_poll(struct taos_prox_info *prxp) { prox_history_lo &= 0x07; if (prox_history_hi == 0x07) - event = 1; + event = 1; else { - if (prox_history_lo == 0) - event = 0; + if (prox_history_lo == 0) + event = 0; } prxp->prox_event = event;*/ - return (ret); + return (ret); } /* prox poll timer function diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig index 0b587d24..304661b1 100644 --- a/drivers/input/touchscreen/Kconfig +++ b/drivers/input/touchscreen/Kconfig @@ -722,6 +722,36 @@ config TOUCHSCREEN_CYPRESS_I2C_RMI tristate "MXT224 based touchscreens" depends on I2C default n + config TOUCHSCREEN_MXT224_NEW + tristate "MXT224 NEW based touchscreens" + depends on I2C + default n + config ATMEL_FW_UPDATE + tristate "MXT224 based touchscreens for fimeware update" + depends on I2C + default n + config ATMEL_FW_UPDATE_224 + tristate "MXT224 224 based touchscreens for fimeware update" + depends on I2C + default n + + config ATMEL_FW_UPDATE_140 + tristate "MXT224 140 based touchscreens for fimeware update" + depends on I2C + default n + + config TOUCHSCREEN_MXT224_P736V + tristate "MXT224 based touchscreens for p736v" + depends on I2C + default n +config TOUCHSCREEN_MXT224_N760 + tristate "MXT224 based touchscreens for N760" + depends on I2C + default n +config TOUCHSCREEN_MXT224_P743F + tristate "MXT224 based touchscreens for P743" + depends on I2C + default n config TOUCHSCREEN_CYTTSP_I2C tristate "Cypress TTSP based touchscreens" depends on I2C @@ -744,7 +774,7 @@ config TOUCHSCREEN_CYTTSP_I2C #ZTE_TS_XYM_20110711 begin config TOUCHSCREEN_FOCALTECH_NEW - tristate "FocalTech touchscreen" + tristate "FocalTech touchscreen new" depends on I2C default n #ZTE_TS_XYM_20110711 end @@ -755,4 +785,12 @@ config TOUCHSCREEN_VIRTUAL_KEYS config MINI_RACER tristate "mini racer" default n + +config FTS_USB_NOTIFY + tristate "notify touchscrenn about usb plugin/plugout event" + default n + +config SUPPORT_FTS_CTP_UPG + tristate "FOCALTECH firmware update" + default n endif diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile index 03f7a5e2..2556f1f8 100644 --- a/drivers/input/touchscreen/Makefile +++ b/drivers/input/touchscreen/Makefile @@ -76,12 +76,13 @@ issp-firmware-objs := issp_driver_routines.o issp_routines.o download_main.o obj-$(CONFIG_TOUCHSCREEN_CYPRESS_I2C_RMI) += cypress_i2c_rmi.o #ZTE_TOUCH_WLY_001,@2010-03-29,end obj-$(CONFIG_TOUCHSCREEN_MXT224) += mXT224_atmel.o atmel_config.o +obj-$(CONFIG_TOUCHSCREEN_MXT224_NEW) += mXT224_atmel_new.o atmel_config.o obj-$(CONFIG_TOUCHSCREEN_CYTTSP_I2C) += cyttsp-i2c.o #ZTE_TS_ZFJ_20110124, begin obj-$(CONFIG_TOUCHSCREEN_FOCALTECH) += ft5x0x_ts.o #ZTE_TS_ZFJ_20110124, end #ZTE_TS_XYM_20110711 begin -obj-$(CONFIG_TOUCHSCREEN_FOCALTECH_NEW) += ft5x0x_ts_new.o +obj-$(CONFIG_TOUCHSCREEN_FOCALTECH_NEW) += ft5x0x_ts_new.o ft5x0x_ts_fwup.o #ZTE_TS_XYM_20110711 end #ZTE_TS_XYM_20110715 begin obj-$(CONFIG_TOUCHSCREEN_CY8CTST241) += cy8ctst241.o diff --git a/drivers/input/touchscreen/SynaUpgrade.c b/drivers/input/touchscreen/SynaUpgrade.c index ae55d89c..2a652819 100644 --- a/drivers/input/touchscreen/SynaUpgrade.c +++ b/drivers/input/touchscreen/SynaUpgrade.c @@ -5,7 +5,13 @@ #include #include +#include +#include +#include + + +static struct i2c_client *syna_i2c_client; unsigned char Firmware_Image[16000]; // make smaller and dynamic unsigned char Config_Image[16000]; // make smaller and dynamic @@ -15,7 +21,6 @@ unsigned char status; unsigned long firmware_imgsize; unsigned char firmware_imgver; unsigned long config_imgsize; -unsigned long filesize; unsigned int synaptics_bootload_id; unsigned char *firmware_imgdata; @@ -68,7 +73,7 @@ bool unconfigured; struct rmi4_function_descriptor f34_func_des; struct rmi4_function_descriptor f01_func_des; -bool synaptics_read_flash_property(struct i2c_client *client) +static bool synaptics_read_flash_property(struct i2c_client *client) { int ret = 0; ret = i2c_smbus_read_i2c_block_data(client, f34_reflash_query_flashpropertyquery, 1, &page_data[0]); @@ -82,7 +87,7 @@ bool synaptics_read_flash_property(struct i2c_client *client) } //Func34 has 2 models, we should make sure which model the TP used -void synaptics_set_flash_addr(struct i2c_client *client) +static void synaptics_set_flash_addr(struct i2c_client *client) { if (synaptics_read_flash_property(client)){ pr_info("Flash Property 1\n"); @@ -96,7 +101,7 @@ void synaptics_set_flash_addr(struct i2c_client *client) } } -int synaptics_get_pgt_f34(struct i2c_client *client) +static int synaptics_get_pgt_f34(struct i2c_client *client) { #if 0 int ret = 0; @@ -179,7 +184,7 @@ for(uAddress = 0xe9; uAddress > 10; uAddress -= sizeof(struct rmi4_function_desc return 0; } -int synaptics_read_bootload_id(struct i2c_client *client) +static int synaptics_read_bootload_id(struct i2c_client *client) { int ret = 0; char data[2]; @@ -196,7 +201,7 @@ int synaptics_read_bootload_id(struct i2c_client *client) return 0; } -int synaptics_write_bootload_id(struct i2c_client *client) +static int synaptics_write_bootload_id(struct i2c_client *client) { int ret = 0; unsigned char data[2]; @@ -217,7 +222,7 @@ int synaptics_write_bootload_id(struct i2c_client *client) //Check wether the TP support F34 and try to enter bootload mode -void synaptics_write_page(struct i2c_client *client) +static void synaptics_write_page(struct i2c_client *client) { int ret = 0; unsigned char upage = 0x00; @@ -287,12 +292,12 @@ void synaptics_write_page(struct i2c_client *client) pr_info("%s: StatusCode: 0x%x \n", __func__, f01_rmi_data[0] & 0x0f ); } -int synaptics_enable_flash_command(struct i2c_client *client) +static int synaptics_enable_flash_command(struct i2c_client *client) { return i2c_smbus_write_i2c_block_data(client, f34_reflash_flashcontrol, 1, (unsigned char *)&f34_reflash_cmd_enable); } -void synaptics_enable_flash(struct i2c_client *client) +static void synaptics_enable_flash(struct i2c_client *client) { unsigned char data[2]={0,0}; int ret = 0; @@ -375,7 +380,7 @@ void synaptics_enable_flash(struct i2c_client *client) } -unsigned long synaptics_extract_long_from_header(const unsigned char* SynaImage) // Endian agnostic +static unsigned long synaptics_extract_long_from_header(const unsigned char* SynaImage) // Endian agnostic { return((unsigned long)SynaImage[0] + (unsigned long)SynaImage[1]*0x100 + @@ -383,7 +388,7 @@ unsigned long synaptics_extract_long_from_header(const unsigned char* SynaImage) (unsigned long)SynaImage[3]*0x1000000); } -void synaptics_read_config_info(struct i2c_client *client) +static void synaptics_read_config_info(struct i2c_client *client) { unsigned char data[2]; int ret; @@ -409,7 +414,7 @@ void synaptics_read_config_info(struct i2c_client *client) config_imgsize = config_blocksize*config_blockcount; } -void synaptics_read_firmware_info(struct i2c_client *client) +static void synaptics_read_firmware_info(struct i2c_client *client) { unsigned char data[2]; int ret; @@ -435,7 +440,7 @@ void synaptics_read_firmware_info(struct i2c_client *client) } -void synaptics_cal_checksum(unsigned short * data, unsigned short len, unsigned long * dataBlock) +static void synaptics_cal_checksum(unsigned short * data, unsigned short len, unsigned long * dataBlock) { unsigned long temp = *data++; unsigned long sum1; @@ -457,24 +462,27 @@ void synaptics_cal_checksum(unsigned short * data, unsigned short len, unsigned *dataBlock = sum2 << 16 | sum1; } -unsigned short synaptics_get_frimware_size(void) +static unsigned short synaptics_get_frimware_size(void) { return firmware_blocksize * firmware_blockcount; } -unsigned short synaptics_get_config_size(void) +static unsigned short synaptics_get_config_size(void) { return config_blocksize * config_blockcount; } +#if 0 //Go to a endless circule if config or firmware sizes dismatch here. -void synaptics_read_firmware_header(struct i2c_client *client) +static void synaptics_read_firmware_header(struct i2c_client *client + byte *pfwfile, unsigned long filesize) { unsigned long check_sum; //unsigned char data; int ret; + //unsigned long filesize; - filesize = sizeof(SynaFirmware) -1; + //filesize = sizeof(SynaFirmware) -1; pr_info("\n%s:Scanning SynaFirmware[], header file - len = %ld \n\n", __func__, filesize); @@ -526,8 +534,74 @@ void synaptics_read_firmware_header(struct i2c_client *client) } return; } +#else +static void synaptics_read_firmware_header( struct i2c_client *client,u8 *pfwfile, u32 filesize) +{ + unsigned long check_sum; + //unsigned char data; + int ret; + //unsigned long filesize; + + if ( pfwfile == NULL ){ + printk("xiayc, invalid param!\n"); + return; + } + filesize = sizeof(SynaFirmware) -1; + + pr_info("\n%s:Scanning SynaFirmware[], header file - len = %d \n\n", __func__, filesize); + + check_sum = synaptics_extract_long_from_header(&(pfwfile[0])); + synaptics_bootload_imgid = (unsigned int)pfwfile[4] + (unsigned int)pfwfile[5]*0x100; + firmware_imgver = pfwfile[7]; + firmware_imgsize = synaptics_extract_long_from_header(&(pfwfile[8])); + config_imgsize = synaptics_extract_long_from_header(&(pfwfile[12])); + + pr_info("%s: Target = %s, ", __func__, &pfwfile[16]); + pr_info("Cksum = 0x%ld, Id = 0x%d, Ver = %d, FwSize = 0x%ld, ConfigSize = 0x%ld \n", + check_sum, synaptics_bootload_imgid, firmware_imgver, firmware_imgsize, config_imgsize); + + // Determine firmware organization - read firmware block size and firmware size + synaptics_read_firmware_info(client); + + synaptics_cal_checksum((unsigned short*)&(pfwfile[4]), (unsigned short)(filesize-4)>>1, + &firmware_imgchecksum); + + if (filesize != (0x100+firmware_imgsize+config_imgsize)) + { + pr_err("%s: Error--SynaFirmware[] size = %d, expected %ld\n", __func__, filesize, (0x100+firmware_imgsize+config_imgsize)); + while(1); + } + + if (firmware_imgsize != synaptics_get_frimware_size()) + { + pr_err("%s: Firmware image size verfication failed!\n", __func__); + pr_err("\tsize in image %ld did not match device size %d\n", firmware_imgsize, synaptics_get_frimware_size()); + while(1); + } + + if (config_imgsize != synaptics_get_config_size()) + { + pr_err("%s: Configuration size verfication failed!\n", __func__); + pr_err("\tsize in image %ld did not match device size %d\n", config_imgsize, synaptics_get_config_size()); + while(1); + } + + firmware_imgdata=(unsigned char *)((&pfwfile[0])+0x100); + + // memcpy(m_firmwareImgData, (&SynaFirmware[0])+0x100, firmware_imgsize); + memcpy(config_imgdata, (&pfwfile[0])+0x100+firmware_imgsize, config_imgsize); + + ret = i2c_smbus_read_i2c_block_data(client, f34_reflash_flashcontrol, 1, &page_data[0]); + if(0 > ret){ + pr_err("%s: Read Func34 flash control err!\n", __func__); + return ; + } + return; +} + +#endif -bool synaptics_validate_bootload_id(unsigned short bootloadID, struct i2c_client *client) +static bool synaptics_validate_bootload_id(unsigned short bootloadID, struct i2c_client *client) { int ret = 0; pr_info("%s: called!\n", __func__); @@ -543,7 +617,7 @@ bool synaptics_validate_bootload_id(unsigned short bootloadID, struct i2c_client return firmware_imgver != 0 || bootloadID == synaptics_bootload_id; } -int synaptics_issue_erase_cmd(unsigned char *command, struct i2c_client *client) +static int synaptics_issue_erase_cmd(unsigned char *command, struct i2c_client *client) { int ret; // command = 3 - erase all; command = 7 - erase config @@ -552,7 +626,7 @@ int synaptics_issue_erase_cmd(unsigned char *command, struct i2c_client *client) return ret; } -int synaptics_flash_firmware_write(struct i2c_client *client) +static int synaptics_flash_firmware_write(struct i2c_client *client) { unsigned char *buf_firmware_data = firmware_imgdata; unsigned char data[2]; @@ -606,7 +680,7 @@ int synaptics_flash_firmware_write(struct i2c_client *client) return 0; } -void synaptics_prog_firmware(struct i2c_client *client) +static void synaptics_prog_firmware(struct i2c_client *client) { int ret; unsigned char data[1]; @@ -647,7 +721,7 @@ void synaptics_prog_firmware(struct i2c_client *client) } } -int synaptics_issue_flash_ctl_cmd(struct i2c_client *client, unsigned char *command) +static int synaptics_issue_flash_ctl_cmd(struct i2c_client *client, unsigned char *command) { int ret; ret = i2c_smbus_write_byte_data(client, f34_reflash_flashcontrol, *command); @@ -655,7 +729,7 @@ int synaptics_issue_flash_ctl_cmd(struct i2c_client *client, unsigned char *comm return ret; } -void synaptics_prog_configuration(struct i2c_client *client) +static void synaptics_prog_configuration(struct i2c_client *client) { int ret = 0; unsigned char data[2]; @@ -706,7 +780,7 @@ void synaptics_prog_configuration(struct i2c_client *client) } } -void synaptics_reset_device(struct i2c_client *client) +static void synaptics_reset_device(struct i2c_client *client) { int ret = 0; unsigned char data[1]; @@ -719,7 +793,7 @@ void synaptics_reset_device(struct i2c_client *client) } } -int synaptics_disenable_flash(struct i2c_client *client) +static int synaptics_disenable_flash(struct i2c_client *client) { int ret = 0; unsigned char data[2]; @@ -780,7 +854,7 @@ int synaptics_disenable_flash(struct i2c_client *client) } //函数功能为触摸屏通断电 -void syna_power_on_off(struct i2c_client *client,int on_off) +static void syna_power_on_off(struct i2c_client *client,int on_off) { // //int(* power)(int on); @@ -789,7 +863,7 @@ void syna_power_on_off(struct i2c_client *client,int on_off) gpio_direction_output(31, on_off); } unsigned short i2c_address; -void syna_i2c_init(struct i2c_client *client) +static void syna_i2c_init(struct i2c_client *client) { //i2c_address=client->addr;//temp syna_power_on_off(client,0); @@ -799,7 +873,9 @@ void syna_i2c_init(struct i2c_client *client) //RMI4WritePage(); synaptics_write_page(client); } -void syna_rmi4_init(struct i2c_client *client) + + +static void syna_rmi4_init(struct i2c_client *client) { /* // Set up blockSize and blockCount for UI and config @@ -815,6 +891,103 @@ void syna_rmi4_init(struct i2c_client *client) firmware_imgdata=&Firmware_Image[0]; config_imgdata = &Config_Image[0]; } + + +static int syna_getfwsize(char * firmware_name) +{ + struct file* pfile = NULL; + struct inode *inode; + unsigned long magic; + off_t fsize = 0; + char filepath[128]; + + memset(filepath, 0, sizeof(filepath)); + sprintf(filepath, "/sdcard/%s", firmware_name); + pr_info("filepath=%s\n", filepath); + if(NULL == pfile){ + pfile = filp_open(filepath, O_RDONLY, 0); + } + if(IS_ERR(pfile)){ + pr_err("error occured while opening file %s.\n", filepath); + return -1; + } + + inode=pfile->f_dentry->d_inode; + magic=inode->i_sb->s_magic; + fsize=inode->i_size; + + filp_close(pfile, NULL); + + return fsize; +} + +static int syna_getfwinfo(char * firmware_name, unsigned char * firmware_buf) +{ + struct file* pfile = NULL; + struct inode *inode; + unsigned long magic; + off_t fsize; + char filepath[128]; + loff_t pos; + mm_segment_t old_fs; + + memset(filepath, 0, sizeof(filepath)); + sprintf(filepath, "/sdcard/%s", firmware_name); + pr_info("filepath=%s\n", filepath); + if(NULL == pfile){ + pfile = filp_open(filepath, O_RDONLY, 0); + } + if(IS_ERR(pfile)){ + pr_err("error occured while opening file %s.\n", filepath); + return -1; + } + inode=pfile->f_dentry->d_inode; + magic=inode->i_sb->s_magic; + fsize=inode->i_size; + //char * buf; + old_fs = get_fs(); + set_fs(KERNEL_DS); + pos = 0; + + vfs_read(pfile, firmware_buf, fsize, &pos); + + filp_close(pfile, NULL); + set_fs(old_fs); + return 0; +} + +static void syna_fw_update(struct i2c_client *client, + u8 *pfwfile, u32 fwsize) +{ + //原函数中的初始化,暂时看来没有什么用处 + //RMI4FuncsConstructor(); + + //初始化i2c等 + //RMI4RMIInit(protocolType, (unsigned char)i2c_address, attn, byte_delay, bit_rate, time_out); + //RMI4Init(); + syna_i2c_init(client); + syna_rmi4_init(client); + + synaptics_set_flash_addr(client); + //前面准备工作完毕,开始programming流程 + synaptics_enable_flash(client); + + //这个函数功能暂时不要所需的数组已经用其他方法取得 + //SynaConvertFirmwareImageToCHeaderFile(ImgFile); // this is just a utility to generate a header file. + + synaptics_read_firmware_header(client, pfwfile, fwsize); + synaptics_prog_firmware(client); + synaptics_prog_configuration(client); + + synaptics_disenable_flash(client); + + //这里建议重启触摸屏 + //EndControlBridge(); + syna_power_on_off(client,0); + msleep(500); + syna_power_on_off(client,1); +} + #if 0 void Synaptics_Convert_FirmwareImage_To_CHeaderFile(void) { @@ -846,36 +1019,122 @@ void Synaptics_Convert_FirmwareImage_To_CHeaderFile(void) } #endif +static ssize_t syna_fwupdate_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + /* place holder for future use */ + return -EPERM; +} -void ioctol(struct i2c_client *client) +//upgrade from app.bin +static ssize_t syna_fwupdate_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) { - //原函数中的初始化,暂时看来没有什么用处 - //RMI4FuncsConstructor(); + u8* pbt_buf = 0; +// int i_ret; //u8 fwver; + int fwsize; + char fwname[128]; + struct i2c_client *client = syna_i2c_client; + + + memset(fwname, 0, sizeof(fwname)); + sprintf(fwname, "%s", buf); + fwname[count-1] = '\0'; + + + fwsize = syna_getfwsize(fwname); + if(fwsize <= 0) + { + pr_err("%s ERROR:Get firmware size failed\n", __FUNCTION__); + return -1; + } - //初始化i2c等 - //RMI4RMIInit(protocolType, (unsigned char)i2c_address, attn, byte_delay, bit_rate, time_out); - //RMI4Init(); - syna_i2c_init(client); - syna_rmi4_init(client); + // FW upgrade begin + pbt_buf = (unsigned char *) kmalloc(fwsize+1,GFP_ATOMIC); + if(syna_getfwinfo(fwname, pbt_buf)) + { + pr_err("%s() - ERROR: request_firmware failed\n", __FUNCTION__); + kfree(pbt_buf); + return -1; + } - synaptics_set_flash_addr(client); - //前面准备工作完毕,开始programming流程 - synaptics_enable_flash(client); - //这个函数功能暂时不要所需的数组已经用其他方法取得 - //SynaConvertFirmwareImageToCHeaderFile(ImgFile); // this is just a utility to generate a header file. + syna_fw_update( client, pbt_buf, fwsize); + return count; +} - synaptics_read_firmware_header(client); - synaptics_prog_firmware(client); - synaptics_prog_configuration(client); +static DEVICE_ATTR(synafwupdate, S_IRUGO|S_IWUSR, syna_fwupdate_show, syna_fwupdate_store); - synaptics_disenable_flash(client); +//void ioctol(struct i2c_client *client) +extern struct kobject *firmware_kobj; + +void syna_fwupdate(void) +{ + struct i2c_client *client = syna_i2c_client; + +/* + byte *pfw; + uint fwsize; + + pfw = (byte *)SynaFirmware; + fwsize = sizeof(SynaFirmware) -1; + syna_fw_update(client, pfw, fwsize); +*/ + + syna_fw_update( client, (u8 *)SynaFirmware,sizeof(SynaFirmware)); + +} + + +int syna_fwupdate_init(struct i2c_client *client) +{ + int ret; + struct kobject * fts_fw_kobj=NULL; + + fts_fw_kobj = kobject_get(firmware_kobj); + if (fts_fw_kobj == NULL) { + fts_fw_kobj = kobject_create_and_add("firmware", NULL); + if (fts_fw_kobj == NULL) { + pr_err("%s: subsystem_register failed\n", __func__); + ret = -ENOMEM; + return ret; + } + } + + ret=sysfs_create_file(fts_fw_kobj, &dev_attr_synafwupdate.attr); + if (ret) { + pr_err("%s: sysfs_create_file failed\n", __func__); + return ret; + } + syna_i2c_client = client; + printk("%s, xiayc: client=%p syna_i2c_client=%p\n",__func__,client,syna_i2c_client); + + pr_info("%s:fts firmware update init succeed!\n", __func__); + return 0; + + + if (!client) + syna_i2c_client = client; +} + + +int syna_fwupdate_deinit(struct i2c_client *client) +{ + struct kobject * fts_fw_kobj=NULL; + + fts_fw_kobj = kobject_get(firmware_kobj); + if ( !firmware_kobj ){ + printk("%s: error get kobject\n", __func__); + return -1; + } - //这里建议重启触摸屏 - //EndControlBridge(); - syna_power_on_off(client,0); - msleep(500); - syna_power_on_off(client,1); + sysfs_remove_file(firmware_kobj, &dev_attr_synafwupdate.attr); + // kobject_del(virtual_key_kobj); + + return 0; } + + diff --git a/drivers/input/touchscreen/Ver11_20110802_036_9475_Only4P736T_app.i b/drivers/input/touchscreen/Ver11_20110802_036_9475_Only4P736T_app.i new file mode 100644 index 00000000..53016066 --- /dev/null +++ b/drivers/input/touchscreen/Ver11_20110802_036_9475_Only4P736T_app.i @@ -0,0 +1,1783 @@ +0x2, 0x5, 0xa9,0x2, 0x69,0x95,0xee,0x30,0xe7,0x7, 0xc3,0xe4,0x9f,0xff,0xe4,0x9e, +0xfe,0x22,0x29,0xf9,0xe5,0xf0,0x3a,0xfa,0x22,0x22,0xff,0x2, 0x68,0x16,0x21,0x65, +0x21,0x65,0xff,0x2, 0x4c,0xa1,0xbd,0x77,0xb, 0xef,0xc3,0x94,0x13,0x40,0x19,0x74, +0xf3,0x2f,0xff,0x22,0xbd,0x78,0xb, 0xef,0xc3,0x94,0x13,0x40,0xb, 0x74,0xf8,0x2f, +0xff,0x22,0xbd,0x79,0x1, 0x22,0x7f,0xff,0x22,0xff,0xff,0x2, 0x67,0xe1,0x2, 0x45, +0xf1,0xff,0xff,0x2, 0x6a,0x24,0xe7,0x9, 0xf6,0x8, 0xdf,0xfa,0x80,0x46,0xe7,0x9, +0xf2,0x8, 0xdf,0xfa,0x80,0x3e,0x88,0x82,0x8c,0x83,0xe7,0x9, 0xf0,0xa3,0xdf,0xfa, +0x80,0x32,0xe3,0x9, 0xf6,0x8, 0xdf,0xfa,0x80,0x78,0xe3,0x9, 0xf2,0x8, 0xdf,0xfa, +0x80,0x70,0x88,0x82,0x8c,0x83,0xe3,0x9, 0xf0,0xa3,0xdf,0xfa,0x80,0x64,0x89,0x82, +0x8a,0x83,0xe0,0xa3,0xf6,0x8, 0xdf,0xfa,0x80,0x58,0x89,0x82,0x8a,0x83,0xe0,0xa3, +0xf2,0x8, 0xdf,0xfa,0x80,0x4c,0x80,0xd2,0x80,0xfa,0x80,0xc6,0x80,0xd4,0x80,0x69, +0x80,0xf2,0x80,0x33,0x80,0x10,0x80,0xa6,0x80,0xea,0x80,0x9a,0x80,0xa8,0x80,0xda, +0x80,0xe2,0x80,0xca,0x80,0x33,0x89,0x82,0x8a,0x83,0xec,0xfa,0xe4,0x93,0xa3,0xc8, +0xc5,0x82,0xc8,0xcc,0xc5,0x83,0xcc,0xf0,0xa3,0xc8,0xc5,0x82,0xc8,0xcc,0xc5,0x83, +0xcc,0xdf,0xe9,0xde,0xe7,0x80,0xd, 0x89,0x82,0x8a,0x83,0xe4,0x93,0xa3,0xf6,0x8, +0xdf,0xf9,0xec,0xfa,0xa9,0xf0,0xed,0xfb,0x22,0x89,0x82,0x8a,0x83,0xec,0xfa,0xe0, +0xa3,0xc8,0xc5,0x82,0xc8,0xcc,0xc5,0x83,0xcc,0xf0,0xa3,0xc8,0xc5,0x82,0xc8,0xcc, +0xc5,0x83,0xcc,0xdf,0xea,0xde,0xe8,0x80,0xdb,0x89,0x82,0x8a,0x83,0xe4,0x93,0xa3, +0xf2,0x8, 0xdf,0xf9,0x80,0xcc,0x88,0xf0,0xef,0x60,0x1, 0xe, 0x4e,0x60,0xc3,0x88, +0xf0,0xed,0x24,0x2, 0xb4,0x4, 0x0, 0x50,0xb9,0xf5,0x82,0xeb,0x24,0x2, 0xb4,0x4, +0x0, 0x50,0xaf,0x23,0x23,0x45,0x82,0x23,0x90,0x0, 0xa6,0x73,0xbb,0x1, 0x6, 0x89, +0x82,0x8a,0x83,0xe0,0x22,0x50,0x2, 0xe7,0x22,0xbb,0xfe,0x2, 0xe3,0x22,0x89,0x82, +0x8a,0x83,0xe4,0x93,0x22,0xbb,0x1, 0xc, 0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a, +0xf5,0x83,0xe0,0x22,0x50,0x6, 0xe9,0x25,0x82,0xf8,0xe6,0x22,0xbb,0xfe,0x6, 0xe9, +0x25,0x82,0xf8,0xe2,0x22,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe4, +0x93,0x22,0xbb,0x1, 0xf, 0xf8,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83, +0xe0,0x28,0xf0,0x22,0x50,0x9, 0xc5,0x82,0x29,0xf8,0xe5,0x82,0x26,0xf6,0x22,0xbb, +0xfe,0x9, 0xc5,0x82,0x29,0xf8,0xe2,0x25,0x82,0xf2,0x22,0xf8,0xea,0x25,0x83,0xf5, +0x83,0xe9,0x93,0x28,0x22,0xbb,0x1, 0x6, 0x89,0x82,0x8a,0x83,0xf0,0x22,0x50,0x2, +0xf7,0x22,0xbb,0xfe,0x1, 0xf3,0x22,0xf8,0xbb,0x1, 0xd, 0xe5,0x82,0x29,0xf5,0x82, +0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0x22,0x50,0x6, 0xe9,0x25,0x82,0xc8,0xf6,0x22, +0xbb,0xfe,0x5, 0xe9,0x25,0x82,0xc8,0xf2,0x22,0xef,0x8d,0xf0,0xa4,0xa8,0xf0,0xcf, +0x8c,0xf0,0xa4,0x28,0xce,0x8d,0xf0,0xa4,0x2e,0xfe,0x22,0xbc,0x0, 0xb, 0xbe,0x0, +0x29,0xef,0x8d,0xf0,0x84,0xff,0xad,0xf0,0x22,0xe4,0xcc,0xf8,0x75,0xf0,0x8, 0xef, +0x2f,0xff,0xee,0x33,0xfe,0xec,0x33,0xfc,0xee,0x9d,0xec,0x98,0x40,0x5, 0xfc,0xee, +0x9d,0xfe,0xf, 0xd5,0xf0,0xe9,0xe4,0xce,0xfd,0x22,0xed,0xf8,0xf5,0xf0,0xee,0x84, +0x20,0xd2,0x1c,0xfe,0xad,0xf0,0x75,0xf0,0x8, 0xef,0x2f,0xff,0xed,0x33,0xfd,0x40, +0x7, 0x98,0x50,0x6, 0xd5,0xf0,0xf2,0x22,0xc3,0x98,0xfd,0xf, 0xd5,0xf0,0xea,0x22, +0xc5,0xf0,0xf8,0xa3,0xe0,0x28,0xf0,0xc5,0xf0,0xf8,0xe5,0x82,0x15,0x82,0x70,0x2, +0x15,0x83,0xe0,0x38,0xf0,0x22,0xbb,0x1, 0xa, 0x89,0x82,0x8a,0x83,0xe0,0xf5,0xf0, +0xa3,0xe0,0x22,0x50,0x6, 0x87,0xf0,0x9, 0xe7,0x19,0x22,0xbb,0xfe,0x7, 0xe3,0xf5, +0xf0,0x9, 0xe3,0x19,0x22,0x89,0x82,0x8a,0x83,0xe4,0x93,0xf5,0xf0,0x74,0x1, 0x93, +0x22,0xbb,0x1, 0x10,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe0,0xf5, +0xf0,0xa3,0xe0,0x22,0x50,0x9, 0xe9,0x25,0x82,0xf8,0x86,0xf0,0x8, 0xe6,0x22,0xbb, +0xfe,0xa, 0xe9,0x25,0x82,0xf8,0xe2,0xf5,0xf0,0x8, 0xe2,0x22,0xe5,0x83,0x2a,0xf5, +0x83,0xe9,0x93,0xf5,0xf0,0xa3,0xe9,0x93,0x22,0xbb,0x1, 0xd, 0xc5,0x82,0x29,0xc5, +0x82,0xc5,0x83,0x3a,0xc5,0x83,0x2, 0x2, 0x60,0x50,0x11,0xc5,0x82,0x29,0xf8,0x8, +0xe5,0xf0,0x26,0xf6,0x18,0xf5,0xf0,0xe5,0x82,0x36,0xf6,0x22,0xbb,0xfe,0x11,0xc5, +0x82,0x29,0xf8,0x8, 0xe2,0x25,0xf0,0xf5,0xf0,0xf2,0x18,0xe2,0x35,0x82,0xf2,0x22, +0xf8,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x2a,0xf5,0x83,0x74,0x1, 0x93,0x25,0xf0, +0xf5,0xf0,0xe4,0x93,0x38,0x22,0xbb,0x1, 0xa, 0x89,0x82,0x8a,0x83,0xf0,0xe5,0xf0, +0xa3,0xf0,0x22,0x50,0x6, 0xf7,0x9, 0xa7,0xf0,0x19,0x22,0xbb,0xfe,0x6, 0xf3,0xe5, +0xf0,0x9, 0xf3,0x19,0x22,0xf8,0xbb,0x1, 0x11,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83, +0x3a,0xf5,0x83,0xe8,0xf0,0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x9, 0xe9,0x25,0x82,0xc8, +0xf6,0x8, 0xa6,0xf0,0x22,0xbb,0xfe,0x9, 0xe9,0x25,0x82,0xc8,0xf2,0xe5,0xf0,0x8, +0xf2,0x22,0xe8,0x8f,0xf0,0xa4,0xcc,0x8b,0xf0,0xa4,0x2c,0xfc,0xe9,0x8e,0xf0,0xa4, +0x2c,0xfc,0x8a,0xf0,0xed,0xa4,0x2c,0xfc,0xea,0x8e,0xf0,0xa4,0xcd,0xa8,0xf0,0x8b, +0xf0,0xa4,0x2d,0xcc,0x38,0x25,0xf0,0xfd,0xe9,0x8f,0xf0,0xa4,0x2c,0xcd,0x35,0xf0, +0xfc,0xeb,0x8e,0xf0,0xa4,0xfe,0xa9,0xf0,0xeb,0x8f,0xf0,0xa4,0xcf,0xc5,0xf0,0x2e, +0xcd,0x39,0xfe,0xe4,0x3c,0xfc,0xea,0xa4,0x2d,0xce,0x35,0xf0,0xfd,0xe4,0x3c,0xfc, +0x22,0x75,0xf0,0x8, 0x75,0x82,0x0, 0xef,0x2f,0xff,0xee,0x33,0xfe,0xcd,0x33,0xcd, +0xcc,0x33,0xcc,0xc5,0x82,0x33,0xc5,0x82,0x9b,0xed,0x9a,0xec,0x99,0xe5,0x82,0x98, +0x40,0xc, 0xf5,0x82,0xee,0x9b,0xfe,0xed,0x9a,0xfd,0xec,0x99,0xfc,0xf, 0xd5,0xf0, +0xd6,0xe4,0xce,0xfb,0xe4,0xcd,0xfa,0xe4,0xcc,0xf9,0xa8,0x82,0x22,0xb8,0x0, 0xc1, +0xb9,0x0, 0x59,0xba,0x0, 0x2d,0xec,0x8b,0xf0,0x84,0xcf,0xce,0xcd,0xfc,0xe5,0xf0, +0xcb,0xf9,0x78,0x18,0xef,0x2f,0xff,0xee,0x33,0xfe,0xed,0x33,0xfd,0xec,0x33,0xfc, +0xeb,0x33,0xfb,0x10,0xd7,0x3, 0x99,0x40,0x4, 0xeb,0x99,0xfb,0xf, 0xd8,0xe5,0xe4, +0xf9,0xfa,0x22,0x78,0x18,0xef,0x2f,0xff,0xee,0x33,0xfe,0xed,0x33,0xfd,0xec,0x33, +0xfc,0xc9,0x33,0xc9,0x10,0xd7,0x5, 0x9b,0xe9,0x9a,0x40,0x7, 0xec,0x9b,0xfc,0xe9, +0x9a,0xf9,0xf, 0xd8,0xe0,0xe4,0xc9,0xfa,0xe4,0xcc,0xfb,0x22,0x75,0xf0,0x10,0xef, +0x2f,0xff,0xee,0x33,0xfe,0xed,0x33,0xfd,0xcc,0x33,0xcc,0xc8,0x33,0xc8,0x10,0xd7, +0x7, 0x9b,0xec,0x9a,0xe8,0x99,0x40,0xa, 0xed,0x9b,0xfd,0xec,0x9a,0xfc,0xe8,0x99, +0xf8,0xf, 0xd5,0xf0,0xda,0xe4,0xcd,0xfb,0xe4,0xcc,0xfa,0xe4,0xc8,0xf9,0x22,0xeb, +0x9f,0xf5,0xf0,0xea,0x9e,0x42,0xf0,0xe9,0x9d,0x42,0xf0,0xec,0x64,0x80,0xc8,0x64, +0x80,0x98,0x45,0xf0,0x22,0xeb,0x9f,0xf5,0xf0,0xea,0x9e,0x42,0xf0,0xe9,0x9d,0x42, +0xf0,0xe8,0x9c,0x45,0xf0,0x22,0xe8,0x60,0xf, 0xec,0xc3,0x13,0xfc,0xed,0x13,0xfd, +0xee,0x13,0xfe,0xef,0x13,0xff,0xd8,0xf1,0x22,0xe8,0x60,0xf, 0xef,0xc3,0x33,0xff, +0xee,0x33,0xfe,0xed,0x33,0xfd,0xec,0x33,0xfc,0xd8,0xf1,0x22,0xec,0xf0,0xa3,0xed, +0xf0,0xa3,0xee,0xf0,0xa3,0xef,0xf0,0x22,0xa8,0x82,0x85,0x83,0xf0,0xd0,0x83,0xd0, +0x82,0x12,0x4, 0xff,0x12,0x4, 0xff,0x12,0x4, 0xff,0x12,0x4, 0xff,0xe4,0x73,0xe4, +0x93,0xa3,0xc5,0x83,0xc5,0xf0,0xc5,0x83,0xc8,0xc5,0x82,0xc8,0xf0,0xa3,0xc5,0x83, +0xc5,0xf0,0xc5,0x83,0xc8,0xc5,0x82,0xc8,0x22,0xa4,0x25,0x82,0xf5,0x82,0xe5,0xf0, +0x35,0x83,0xf5,0x83,0x22,0xbb,0x1, 0xd, 0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a, +0xf5,0x83,0x2, 0x5, 0x8b,0x50,0x7, 0xe9,0x25,0x82,0xf8,0x2, 0x5, 0x82,0xbb,0xfe, +0x7, 0xe9,0x25,0x82,0xf8,0x2, 0x5, 0x94,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a, +0xf5,0x83,0x2, 0x5, 0x9d,0xec,0x8e,0xf0,0xa4,0xcc,0xc5,0xf0,0xcc,0xcd,0xf8,0xef, +0xa4,0xce,0xc5,0xf0,0x2d,0xfd,0xe4,0x3c,0xfc,0xe8,0xa4,0x2e,0xc8,0xc5,0xf0,0x3d, +0xfd,0xe4,0x3c,0xfc,0xef,0xa4,0xff,0xe5,0xf0,0x28,0xfe,0xe4,0x3d,0xfd,0xe4,0x3c, +0xfc,0x22,0xe6,0xfb,0x8, 0xe6,0xfa,0x8, 0xe6,0xf9,0x22,0xe0,0xfb,0xa3,0xe0,0xfa, +0xa3,0xe0,0xf9,0x22,0xe2,0xfb,0x8, 0xe2,0xfa,0x8, 0xe2,0xf9,0x22,0xe4,0x93,0xfb, +0x74,0x1, 0x93,0xfa,0x74,0x2, 0x93,0xf9,0x22,0x78,0xff,0xe4,0xf6,0xd8,0xfd,0x75, +0x81,0x94,0x2, 0x5, 0xf0,0x2, 0x46,0x2e,0xe4,0x93,0xa3,0xf8,0xe4,0x93,0xa3,0x40, +0x3, 0xf6,0x80,0x1, 0xf2,0x8, 0xdf,0xf4,0x80,0x29,0xe4,0x93,0xa3,0xf8,0x54,0x7, +0x24,0xc, 0xc8,0xc3,0x33,0xc4,0x54,0xf, 0x44,0x20,0xc8,0x83,0x40,0x4, 0xf4,0x56, +0x80,0x1, 0x46,0xf6,0xdf,0xe4,0x80,0xb, 0x1, 0x2, 0x4, 0x8, 0x10,0x20,0x40,0x80, +0x90,0x6, 0x35,0xe4,0x7e,0x1, 0x93,0x60,0xbc,0xa3,0xff,0x54,0x3f,0x30,0xe5,0x9, +0x54,0x1f,0xfe,0xe4,0x93,0xa3,0x60,0x1, 0xe, 0xcf,0x54,0xc0,0x25,0xe0,0x60,0xa8, +0x40,0xb8,0xe4,0x93,0xa3,0xfa,0xe4,0x93,0xa3,0xf8,0xe4,0x93,0xa3,0xc8,0xc5,0x82, +0xc8,0xca,0xc5,0x83,0xca,0xf0,0xa3,0xc8,0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,0xdf, +0xe9,0xde,0xe7,0x80,0xbe,0x1, 0x13,0x0, 0x1, 0x8, 0x0, 0x42,0xc, 0x74,0x0, 0x0, +0x41,0xc, 0x76,0x1, 0x42,0xc, 0x85,0x0, 0x96,0x42,0xc, 0x77,0x1, 0x36,0x41,0xc, +0x79,0x1, 0x41,0xd, 0xeb,0x0, 0x41,0xd, 0xe4,0x0, 0x41,0xd, 0xe6,0x0, 0x41,0xe, +0x0, 0x0, 0x41,0xd, 0xe7,0x0, 0x0, 0xab,0x40,0xaa,0x41,0xa9,0x42,0x85,0x45,0x82, +0x75,0x83,0x0, 0x22,0xab,0x42,0xaa,0x43,0xa9,0x44,0x85,0x47,0x82,0x75,0x83,0x0, +0x22,0xe5,0x44,0xab,0x40,0xaa,0x41,0xa9,0x42,0x22,0xe5,0x46,0xab,0x42,0xaa,0x43, +0xa9,0x44,0x22,0xbd,0x77,0xb, 0xef,0xc3,0x94,0x6, 0x40,0x19,0x74,0xd, 0x2f,0xff, +0x22,0xbd,0x78,0xb, 0xef,0xc3,0x94,0xb, 0x40,0xb, 0x74,0x8, 0x2f,0xff,0x22,0xbd, +0x79,0x1, 0x22,0x7f,0xff,0x22,0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, +0x4, 0x3, 0x2, 0x1, 0x0, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, 0x19, +0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19, +0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x32,0x32,0x32,0x32,0x32, +0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x77,0x77,0x77,0x77,0x77,0x77,0x77, +0x77,0xe, 0xd, 0xc, 0xb, 0xa, 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, +0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, 0x3, 0x8, 0x3, 0x8, 0x14,0x8, +0x3, 0x8, 0x3, 0x1, 0x18,0x3, 0x0, 0xc8,0x2, 0x0, 0x0, 0x1, 0x0, 0x1, 0x2, 0x3, +0x1, 0x2, 0x0, 0x0, 0xb4,0xa0,0x64,0x64,0x0, 0x0, 0x0, 0x0, 0x0, 0x10,0x10,0x10, +0x1c,0x19,0x14,0x10,0xe, 0xc, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x31,0xc5,0xab,0x32, +0xe5,0x34,0x24,0x10,0xf9,0xe4,0x35,0x33,0xfa,0xe5,0x36,0x90,0x6, 0xc5,0x93,0x24, +0x4, 0xff,0xe4,0x33,0xa2,0xe7,0x13,0xfe,0xef,0x13,0x29,0xf9,0xea,0x3e,0xfa,0x21, +0x4c,0x2, 0x45,0xc3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x8b,0x3d,0x8a,0x3e,0x89,0x3f,0xe4,0xf5,0x45,0xe5,0x45,0xc3,0x95,0x43,0x40,0x3, +0x2, 0xa, 0x56,0xab,0x3d,0xaa,0x3e,0xa9,0x3f,0x12,0x6, 0x6d,0x12,0x1, 0x65,0xb4, +0x1c,0x0, 0x40,0x3, 0x2, 0xa, 0x51,0x90,0x8, 0x2e,0xf8,0x28,0x28,0x73,0x2, 0x8, +0x82,0x2, 0x8, 0x89,0x2, 0x8, 0x91,0x2, 0x8, 0x99,0x2, 0x8, 0xa1,0x2, 0x8, 0xa9, +0x2, 0x8, 0xb1,0x2, 0x8, 0xc7,0x2, 0x8, 0xdd,0x2, 0x8, 0xf3,0x2, 0x9, 0x9, 0x2, +0x9, 0x1f,0x2, 0x9, 0x42,0x2, 0x9, 0x65,0x2, 0x9, 0x88,0x2, 0x9, 0xab,0x2, 0x9, +0xc1,0x2, 0x9, 0xd7,0x2, 0x9, 0xed,0x2, 0xa, 0x3, 0x2, 0xa, 0x18,0x2, 0xa, 0x1f, +0x2, 0xa, 0x26,0x2, 0xa, 0x2d,0x2, 0xa, 0x34,0x2, 0xa, 0x3b,0x2, 0xa, 0x42,0x2, +0xa, 0x49,0x12,0x6, 0x67,0xe4,0x2, 0xa, 0x4e,0x12,0x6, 0x67,0x74,0x1, 0x2, 0xa, +0x4e,0x12,0x6, 0x67,0x74,0x2, 0x2, 0xa, 0x4e,0x12,0x6, 0x67,0x74,0x3, 0x2, 0xa, +0x4e,0x12,0x6, 0x67,0x74,0x4, 0x2, 0xa, 0x4e,0x12,0x6, 0x67,0x74,0x5, 0x2, 0xa, +0x4e,0x12,0x6, 0x81,0xb4,0x77,0x8, 0x12,0x6, 0x6d,0x74,0x13,0x2, 0xa, 0x4e,0x12, +0x6, 0x6d,0x74,0x6, 0x2, 0xa, 0x4e,0x12,0x6, 0x81,0xb4,0x77,0x8, 0x12,0x6, 0x6d, +0x74,0x14,0x2, 0xa, 0x4e,0x12,0x6, 0x6d,0x74,0x7, 0x2, 0xa, 0x4e,0x12,0x6, 0x81, +0xb4,0x77,0x8, 0x12,0x6, 0x6d,0x74,0x15,0x2, 0xa, 0x4e,0x12,0x6, 0x6d,0x74,0x8, +0x2, 0xa, 0x4e,0x12,0x6, 0x81,0xb4,0x77,0x8, 0x12,0x6, 0x6d,0x74,0x16,0x2, 0xa, +0x4e,0x12,0x6, 0x6d,0x74,0x9, 0x2, 0xa, 0x4e,0x12,0x6, 0x81,0xb4,0x77,0x8, 0x12, +0x6, 0x6d,0x74,0x17,0x2, 0xa, 0x4e,0x12,0x6, 0x6d,0x74,0xa, 0x2, 0xa, 0x4e,0xe5, +0x44,0xb4,0x77,0x8, 0x12,0x6, 0x67,0x74,0x18,0x2, 0xa, 0x4e,0x12,0x6, 0x81,0xb4, +0x78,0x8, 0x12,0x6, 0x6d,0x74,0x13,0x2, 0xa, 0x4e,0x12,0x6, 0x6d,0x74,0xb, 0x2, +0xa, 0x4e,0xe5,0x44,0xb4,0x77,0x8, 0x12,0x6, 0x67,0x74,0x19,0x2, 0xa, 0x4e,0x12, +0x6, 0x81,0xb4,0x78,0x8, 0x12,0x6, 0x6d,0x74,0x14,0x2, 0xa, 0x4e,0x12,0x6, 0x6d, +0x74,0xc, 0x2, 0xa, 0x4e,0xe5,0x44,0xb4,0x77,0x8, 0x12,0x6, 0x67,0x74,0x1a,0x2, +0xa, 0x4e,0x12,0x6, 0x81,0xb4,0x78,0x8, 0x12,0x6, 0x6d,0x74,0x15,0x2, 0xa, 0x4e, +0x12,0x6, 0x6d,0x74,0xd, 0x2, 0xa, 0x4e,0xe5,0x44,0xb4,0x77,0x8, 0x12,0x6, 0x67, +0x74,0x1b,0x2, 0xa, 0x4e,0x12,0x6, 0x81,0xb4,0x78,0x8, 0x12,0x6, 0x6d,0x74,0x16, +0x2, 0xa, 0x4e,0x12,0x6, 0x6d,0x74,0xe, 0x2, 0xa, 0x4e,0x12,0x6, 0x81,0xb4,0x78, +0x8, 0x12,0x6, 0x6d,0x74,0x17,0x2, 0xa, 0x4e,0x12,0x6, 0x6d,0x74,0xf, 0x2, 0xa, +0x4e,0x12,0x6, 0x81,0xb4,0x78,0x8, 0x12,0x6, 0x6d,0x74,0x18,0x2, 0xa, 0x4e,0x12, +0x6, 0x6d,0x74,0x10,0x2, 0xa, 0x4e,0x12,0x6, 0x81,0xb4,0x78,0x8, 0x12,0x6, 0x6d, +0x74,0x19,0x2, 0xa, 0x4e,0x12,0x6, 0x6d,0x74,0x11,0x2, 0xa, 0x4e,0x12,0x6, 0x81, +0xb4,0x78,0x8, 0x12,0x6, 0x6d,0x74,0x1a,0x2, 0xa, 0x4e,0x12,0x6, 0x6d,0x74,0x12, +0x2, 0xa, 0x4e,0x12,0x6, 0x81,0xb4,0x78,0x8, 0x12,0x6, 0x6d,0x74,0x1b,0x2, 0xa, +0x4e,0x12,0x6, 0x6d,0x74,0x13,0x80,0x36,0x12,0x6, 0x67,0x74,0x14,0x80,0x2f,0x12, +0x6, 0x67,0x74,0x15,0x80,0x28,0x12,0x6, 0x67,0x74,0x16,0x80,0x21,0x12,0x6, 0x67, +0x74,0x17,0x80,0x1a,0x12,0x6, 0x67,0x74,0x18,0x80,0x13,0x12,0x6, 0x67,0x74,0x19, +0x80,0xc, 0x12,0x6, 0x67,0x74,0x1a,0x80,0x5, 0x12,0x6, 0x67,0x74,0x1b,0x12,0x1, +0xd7,0x5, 0x45,0x2, 0x8, 0x9, 0x22,0x8b,0x3f,0x8a,0x40,0x89,0x41,0xe4,0xf5,0x47, +0xe5,0x47,0xc3,0x95,0x45,0x40,0x3, 0x2, 0xc, 0x53,0xab,0x3f,0xaa,0x40,0xa9,0x41, +0x12,0x6, 0x7a,0x12,0x1, 0x65,0xb4,0x10,0x0, 0x40,0x3, 0x2, 0xc, 0x4e,0x90,0xa, +0x85,0xf8,0x28,0x28,0x73,0x2, 0xa, 0xb5,0x2, 0xa, 0xcf,0x2, 0xa, 0xf2,0x2, 0xb, +0x15,0x2, 0xb, 0x38,0x2, 0xb, 0x5b,0x2, 0xb, 0x7e,0x2, 0xb, 0xa1,0x2, 0xb, 0xc4, +0x2, 0xb, 0xe7,0x2, 0xc, 0x9, 0x2, 0xc, 0x1d,0x2, 0xc, 0x31,0x2, 0xc, 0x38,0x2, +0xc, 0x3f,0x2, 0xc, 0x46,0xe5,0x46,0xb4,0x77,0x5, 0x12,0x6, 0x8c,0x80,0x23,0x12, +0x6, 0x8a,0xb4,0x78,0x3, 0x2, 0xb, 0x30,0x12,0x6, 0x7a,0xe4,0x2, 0xc, 0x4b,0xe5, +0x46,0xb4,0x77,0x8, 0x12,0x6, 0x74,0x74,0x5, 0x2, 0xc, 0x4b,0x12,0x6, 0x8a,0xb4, +0x78,0x8, 0x12,0x6, 0x7a,0x74,0x4, 0x2, 0xc, 0x4b,0x12,0x6, 0x7a,0x74,0x1, 0x2, +0xc, 0x4b,0xe5,0x46,0xb4,0x77,0x8, 0x12,0x6, 0x74,0x74,0x6, 0x2, 0xc, 0x4b,0x12, +0x6, 0x8a,0xb4,0x78,0x8, 0x12,0x6, 0x7a,0x74,0x5, 0x2, 0xc, 0x4b,0x12,0x6, 0x7a, +0x74,0x2, 0x2, 0xc, 0x4b,0xe5,0x46,0xb4,0x77,0x8, 0x12,0x6, 0x74,0x74,0x7, 0x2, +0xc, 0x4b,0x12,0x6, 0x8a,0xb4,0x78,0x8, 0x12,0x6, 0x7a,0x74,0x6, 0x2, 0xc, 0x4b, +0x12,0x6, 0x7a,0x74,0x3, 0x2, 0xc, 0x4b,0xe5,0x46,0xb4,0x77,0x8, 0x12,0x6, 0x74, +0x74,0x8, 0x2, 0xc, 0x4b,0x12,0x6, 0x8a,0xb4,0x78,0x8, 0x12,0x6, 0x7a,0x74,0x7, +0x2, 0xc, 0x4b,0x12,0x6, 0x7a,0x74,0x4, 0x2, 0xc, 0x4b,0xe5,0x46,0xb4,0x77,0x8, +0x12,0x6, 0x74,0x74,0x9, 0x2, 0xc, 0x4b,0x12,0x6, 0x8a,0xb4,0x78,0x8, 0x12,0x6, +0x7a,0x74,0x8, 0x2, 0xc, 0x4b,0x12,0x6, 0x7a,0x74,0x5, 0x2, 0xc, 0x4b,0xe5,0x46, +0xb4,0x77,0x8, 0x12,0x6, 0x74,0x74,0xa, 0x2, 0xc, 0x4b,0x12,0x6, 0x8a,0xb4,0x78, +0x8, 0x12,0x6, 0x7a,0x74,0x9, 0x2, 0xc, 0x4b,0x12,0x6, 0x7a,0x74,0x6, 0x2, 0xc, +0x4b,0xe5,0x46,0xb4,0x77,0x8, 0x12,0x6, 0x74,0x74,0xb, 0x2, 0xc, 0x4b,0x12,0x6, +0x8a,0xb4,0x78,0x8, 0x12,0x6, 0x7a,0x74,0xa, 0x2, 0xc, 0x4b,0x12,0x6, 0x7a,0x74, +0x7, 0x2, 0xc, 0x4b,0xe5,0x46,0xb4,0x77,0x8, 0x12,0x6, 0x74,0x74,0xc, 0x2, 0xc, +0x4b,0x12,0x6, 0x8a,0xb4,0x78,0x8, 0x12,0x6, 0x7a,0x74,0xb, 0x2, 0xc, 0x4b,0x12, +0x6, 0x7a,0x74,0x8, 0x2, 0xc, 0x4b,0xe5,0x46,0xb4,0x77,0x8, 0x12,0x6, 0x74,0x74, +0xd, 0x2, 0xc, 0x4b,0x12,0x6, 0x8a,0xb4,0x78,0x8, 0x12,0x6, 0x7a,0x74,0xc, 0x2, +0xc, 0x4b,0x12,0x6, 0x7a,0x74,0x9, 0x80,0x42,0x12,0x6, 0x8a,0xb4,0x78,0x7, 0x12, +0x6, 0x7a,0x74,0xd, 0x80,0x35,0x12,0x6, 0x7a,0x74,0xa, 0x80,0x2e,0x12,0x6, 0x8a, +0xb4,0x78,0x7, 0x12,0x6, 0x7a,0x74,0xe, 0x80,0x21,0x12,0x6, 0x7a,0x74,0xb, 0x80, +0x1a,0x12,0x6, 0x74,0x74,0xc, 0x80,0x13,0x12,0x6, 0x74,0x74,0xd, 0x80,0xc, 0x12, +0x6, 0x74,0x74,0xe, 0x80,0x5, 0x12,0x6, 0x74,0x74,0xf, 0x12,0x1, 0xd7,0x5, 0x47, +0x2, 0xa, 0x60,0x22,0xc0,0x0, 0xc0,0x3f,0xdf,0xbf,0xdf,0xbf,0xc0,0x1, 0xc0,0x82, +0xc1,0x2, 0xc1,0x1, 0xc0,0x3f,0xdf,0x3d,0xde,0x3c,0xde,0xbe,0xc0,0x2, 0xc1,0x85, +0xc2,0x85,0xc2,0x2, 0xc0,0x3e,0xde,0x3a,0xdd,0x3a,0xdd,0xbd,0xc0,0x3, 0xc2,0x87, +0xc4,0x7, 0xc3,0x3, 0xc0,0x3d,0xdd,0x38,0xdb,0xb7,0xdc,0xbc,0xc0,0x4, 0xc3,0x8a, +0xc5,0x8a,0xc4,0x4, 0xc0,0x3c,0xdc,0x35,0xda,0x35,0xdb,0xbb,0xc0,0x5, 0xc4,0x8c, +0xc6,0x8d,0xc5,0x5, 0xc0,0x3b,0xdb,0x32,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8d,0xc5,0x5, 0xc0,0x3b,0xdb,0x34,0xd9,0xb4,0xdb,0xbb,0xc0,0x5, 0xc4,0x8b, +0xc6,0xb, 0xc4,0x4, 0xc0,0x3c,0xdc,0x36,0xdb,0x36,0xdc,0xbc,0xc0,0x4, 0xc3,0x89, +0xc4,0x88,0xc3,0x3, 0xc0,0x3d,0xdd,0x39,0xdc,0x39,0xdd,0xbd,0xc0,0x3, 0xc2,0x86, +0xc3,0x6, 0xc2,0x2, 0xc0,0x3e,0xde,0x3b,0xdd,0xbc,0xde,0xbe,0xc0,0x2, 0xc1,0x83, +0xc1,0x83,0xc1,0x1, 0xc0,0x3f,0xdf,0x3e,0xdf,0x3e,0xdf,0xbf,0xc0,0x0, 0xc0,0x81, +0xc0,0x80,0xc0,0x0, 0x8b,0x32,0x8a,0x33,0x89,0x34,0xe5,0x36,0xd3,0x94,0xa, 0x50, +0x3b,0xed,0x94,0xf, 0x50,0x36,0xe5,0x36,0xc3,0x94,0xa, 0x50,0x2f,0xe5,0x36,0x90, +0x6, 0xc5,0x93,0xff,0x24,0x4, 0xab,0x32,0x20,0xe0,0x10,0x12,0x6e,0x92,0xfa,0xef, +0x12,0x7, 0x6f,0x54,0xf0,0x12,0x7, 0x5c,0x4d,0x80,0xe, 0x12,0x7, 0x60,0x54,0xf, +0x12,0x7, 0x5c,0xff,0xed,0xc4,0x54,0xf0,0x4f,0x12,0x1, 0xc5,0x22,0x7a,0xc, 0x79, +0x91,0x12,0x10,0x96,0x90,0x0, 0x52,0x12,0x1, 0x65,0xf5,0x2f,0x90,0x0, 0x53,0x12, +0x1, 0x65,0xf5,0x30,0x12,0x6f,0x10,0x12,0x6f,0x17,0xe4,0xf5,0x2d,0x12,0x6e,0x2e, +0x7e,0x0, 0xe9,0x25,0x2d,0x12,0x62,0x49,0x54,0xf, 0xfd,0xe5,0x2d,0x25,0xe0,0xff, +0xee,0x33,0xfe,0x12,0x6e,0x5b,0xed,0xf0,0x12,0x1, 0x4c,0x54,0xf0,0xc4,0x54,0xf, +0xfd,0x12,0x6d,0xd, 0xed,0xf0,0x5, 0x2d,0xe5,0x2d,0xb4,0x8, 0xd0,0x75,0x2e,0x5, +0xaf,0x2e,0x15,0x2e,0xef,0x70,0x3, 0x2, 0x10,0x5f,0x12,0x0, 0x4e,0x12,0x40,0x18, +0x53,0xdb,0xf0,0x12,0x2d,0xa5,0x12,0x38,0x3, 0x12,0x43,0xe3,0x85,0x27,0x49,0x85, +0x28,0x4a,0x85,0x29,0x4b,0x12,0x10,0x9c,0x12,0x59,0xfa,0xef,0x64,0xaa,0x60,0xec, +0xe4,0xf5,0x2d,0x12,0x10,0x9c,0x12,0x1, 0x4c,0xff,0xe5,0x2d,0xc3,0x9f,0x50,0x5b, +0xe4,0xfd,0x12,0x14,0x32,0xff,0xed,0xc3,0x9f,0x50,0x4c,0xe5,0x2d,0x70,0xd, 0x12, +0x6d,0xae,0xe4,0xf0,0xed,0x12,0x2d,0xb3,0xe4,0xf0,0xa3,0xf0,0x12,0x1c,0xc2,0x90, +0x3, 0x80,0x75,0xf0,0x20,0xe5,0x2d,0x12,0x3d,0x88,0xed,0x12,0x17,0xea,0xff,0xae, +0xf0,0xd3,0x94,0xa8,0xee,0x64,0x80,0x94,0xaf,0x50,0x19,0xef,0x78,0x5, 0x12,0x2f, +0x33,0xd8,0xfb,0xff,0xed,0x12,0x2d,0xb3,0xee,0x8f,0xf0,0x12,0x2, 0x60,0x12,0x6d, +0xae,0xe0,0x4, 0xf0,0xd, 0x80,0xab,0x5, 0x2d,0x80,0x98,0xe4,0xf5,0x31,0xf5,0x2d, +0x12,0x14,0x32,0xff,0xe5,0x2d,0xc3,0x9f,0x40,0x3, 0x2, 0x10,0x56,0x74,0x21,0x25, +0x2d,0x12,0x6d,0xb1,0xe0,0xfd,0x70,0xe, 0xe5,0x2d,0x12,0x2d,0xb3,0x74,0x2f,0xf0, +0xa3,0x74,0xa8,0xf0,0x80,0x3c,0xe5,0x2d,0x12,0x2d,0xb3,0xc0,0x83,0xc0,0x82,0xe0, +0xfe,0xa3,0xe0,0xff,0x7c,0x0, 0x12,0x2, 0xb, 0xd0,0x82,0xd0,0x83,0xee,0xf0,0xa3, +0xef,0xf0,0xe5,0x2d,0x12,0x2d,0xb3,0xc0,0x83,0xc0,0x82,0xe0,0xfe,0xa3,0xe0,0x78, +0x5, 0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xd0,0x82,0xd0,0x83,0xee,0xf0,0xa3, +0xef,0xf0,0x12,0x17,0x9e,0x90,0x0, 0x72,0x12,0x1c,0xa2,0x90,0x0, 0xe, 0x12,0x6e, +0x45,0xe5,0x2d,0x12,0x2d,0xb3,0x12,0x6e,0x78,0x50,0x7, 0x12,0x6c,0x5, 0xe0,0x4, +0x80,0x2c,0xf1,0x9e,0x90,0x0, 0x72,0x12,0x1c,0xa2,0x90,0x0, 0xe, 0x12,0x2, 0xa1, +0x2f,0xff,0xe5,0xf0,0x3e,0xfe,0xe5,0x2d,0x12,0x2d,0xb3,0x12,0x6e,0x81,0x40,0x1f, +0x12,0x6c,0x5, 0xe0,0xd3,0x94,0x0, 0x40,0x18,0x12,0x6c,0x5, 0xe0,0x14,0xf0,0x12, +0x2d,0xa5,0x12,0x6c,0x5, 0xe0,0xfd,0x85,0x2d,0x36,0x12,0xe, 0x54,0x80,0x2, 0x5, +0x31,0x5, 0x2d,0x2, 0xf, 0x90,0x91,0x32,0x65,0x31,0x60,0x3, 0x2, 0xe, 0xf0,0xe4, +0xf5,0x2d,0x12,0x6d,0xd, 0xe0,0xc4,0x54,0xf0,0xfd,0x12,0x6e,0x5b,0xe0,0x54,0xf, +0x4d,0xff,0x12,0x6e,0x2e,0xe5,0x2d,0x12,0x47,0x77,0x5, 0x2d,0xe5,0x2d,0xb4,0x8, +0xe1,0x11,0x9c,0x90,0x0, 0x52,0xe5,0x2f,0x12,0x1, 0xd7,0x90,0x0, 0x53,0xe5,0x30, +0x12,0x1, 0xd7,0x7f,0x1, 0x22,0x8b,0x21,0x8a,0x22,0x89,0x23,0xab,0x24,0xaa,0x25, +0xa9,0x26,0x22,0x12,0x4f,0xd1,0xe4,0xf5,0x2e,0x75,0x31,0xff,0xf5,0x32,0xf5,0x33, +0x7e,0x1, 0x11,0x9c,0x12,0x1, 0x4c,0xc3,0x13,0xf5,0x2a,0x91,0x38,0xc3,0x13,0xf5, +0x2c,0x12,0x4f,0xc5,0xc3,0x13,0xf5,0x2b,0x12,0x4f,0xcb,0xc3,0x13,0xf5,0x2d,0xf1, +0x22,0xc3,0x94,0x2, 0x40,0x41,0xad,0x2b,0x12,0x5c,0x49,0x94,0x3, 0x50,0x38,0x12, +0x6d,0x7b,0x94,0x3, 0x50,0x31,0xf1,0x9e,0x12,0x6e,0x6f,0x12,0x3d,0x88,0xe5,0x2c, +0xf1,0xea,0x12,0x6e,0xf8,0x94,0x81,0x40,0x1e,0x12,0x6e,0xad,0x12,0x3d,0x88,0xe5, +0x2d,0xf1,0xea,0x12,0x6e,0xf8,0x94,0x81,0x40,0xd, 0x8b,0x37,0x8a,0x38,0x89,0x39, +0x11,0x9c,0x12,0x4d,0x20,0xae,0x7, 0xee,0x70,0x6, 0x90,0xc, 0x79,0x74,0x2, 0xf0, +0x90,0xc, 0x79,0xe0,0xff,0xb4,0x1, 0x12,0x12,0x1c,0xb8,0x12,0x6c,0xb2,0xc3,0x94, +0x2, 0x40,0x4a,0xe4,0x90,0xc, 0x79,0xf0,0x80,0x43,0xef,0x70,0x17,0x90,0xc, 0x85, +0x4, 0xf0,0xa3,0x74,0x90,0x12,0x1c,0xc1,0x12,0x6c,0xb2,0x70,0x30,0x90,0xc, 0x79, +0x4, 0xf0,0x80,0x29,0x90,0xc, 0x79,0xe0,0x64,0x2, 0x70,0x21,0x12,0x1c,0xb8,0x12, +0x6c,0xb2,0x60,0x13,0xbe,0x1, 0x16,0xad,0x2b,0x12,0x5c,0x49,0x94,0x2, 0x50,0xd, +0x12,0x6d,0x7b,0x94,0x2, 0x50,0x6, 0x90,0xc, 0x79,0x74,0x1, 0xf0,0x11,0x9c,0xf1, +0x22,0xd3,0x94,0x2, 0x50,0x2, 0x61,0x43,0xe4,0xf5,0x2f,0xf1,0x8b,0xfa,0xc0,0x3, +0xc0,0x2, 0xc0,0x1, 0x11,0x9c,0x75,0xf0,0x2, 0xe5,0x2f,0x91,0x2b,0x12,0x66,0x60, +0xd0,0x1, 0xd0,0x2, 0xd0,0x3, 0x12,0x0, 0x12,0xc0,0x3, 0xc0,0x2, 0xc0,0x1, 0xf1, +0x61,0x91,0x38,0xc3,0x13,0x91,0x28,0xd0,0x1, 0xd0,0x2, 0xd0,0x3, 0x12,0x2, 0xa1, +0xc3,0x94,0xfa,0x12,0x5f,0x5b,0x50,0x2, 0x61,0x43,0xe4,0xf5,0x30,0xe5,0x2f,0x65, +0x30,0x60,0x40,0xf1,0x61,0x91,0x38,0xfc,0xe5,0x30,0x75,0xf0,0x2, 0xa4,0xf1,0x69, +0x91,0x38,0xfd,0xaf,0x4, 0xf1,0x35,0xae,0x7, 0x11,0x9c,0x75,0xf0,0x2, 0xe5,0x2f, +0x91,0x2b,0x12,0x1, 0x65,0xff,0x75,0xf0,0x2, 0xe5,0x30,0x91,0x2b,0x12,0x1, 0x65, +0xfd,0xf1,0x35,0xef,0x2e,0xff,0xc3,0x95,0x31,0x50,0x8, 0x8f,0x31,0x85,0x2f,0x32, +0x85,0x30,0x33,0x5, 0x30,0xe5,0x30,0xc3,0x94,0x3, 0x40,0xb1,0x5, 0x2f,0xe5,0x2f, +0xc3,0x94,0x3, 0x50,0x2, 0x21,0x8b,0x11,0x9c,0x75,0xf0,0x2, 0xe5,0x32,0x91,0x2b, +0x12,0x1, 0x65,0xff,0x75,0xf0,0x2, 0xe5,0x33,0x91,0x2b,0x12,0x1, 0x65,0x12,0x6c, +0xdc,0x40,0x2, 0x61,0x43,0xe5,0x32,0xf1,0x63,0x91,0x38,0xfc,0xe5,0x33,0x75,0xf0, +0x2, 0xa4,0xf1,0x69,0x91,0x38,0xfd,0xaf,0x4, 0x12,0x6c,0xdd,0x40,0x2, 0x61,0x43, +0xe4,0xf5,0x2f,0xe5,0x2f,0x65,0x32,0x60,0x5, 0xe5,0x2f,0xb5,0x33,0x7, 0x5, 0x2f, +0xe5,0x2f,0xb4,0x3, 0xee,0xe5,0x2f,0xc3,0x94,0x3, 0x50,0x1a,0x11,0x9c,0x75,0xf0, +0x2, 0xe5,0x2f,0x91,0x2b,0x12,0x1, 0x65,0xf5,0x30,0xe5,0x2f,0x75,0xf0,0x2, 0x12, +0x2e,0x78,0x91,0x38,0xf5,0x2f,0x11,0x9c,0x75,0xf0,0x2, 0xe5,0x33,0x91,0x2b,0x12, +0x1, 0x65,0xff,0x75,0xf0,0x2, 0xe5,0x32,0x91,0x2b,0x12,0x1, 0x65,0x2f,0x12,0x6f, +0x46,0x12,0x2f,0x33,0xd8,0xfb,0x12,0x1, 0xc5,0xe5,0x33,0xf1,0x63,0x91,0x38,0xfd, +0xe5,0x32,0x75,0xf0,0x2, 0xa4,0xf1,0x69,0x91,0x38,0x2d,0x12,0x6f,0x46,0x12,0x2f, +0x33,0xd8,0xfb,0x11,0x9c,0xf1,0x85,0xfa,0xc0,0x3, 0xc0,0x2, 0xc0,0x1, 0x11,0x9c, +0x12,0x1, 0x4c,0xff,0x75,0xf0,0x20,0xa4,0xd0,0x1, 0xd0,0x2, 0xd0,0x3, 0x12,0x0, +0x12,0xc0,0x3, 0xc0,0x2, 0xc0,0x1, 0x11,0x9c,0x90,0x0, 0x1, 0x91,0x25,0xd0,0x1, +0xd0,0x2, 0xd0,0x3, 0x12,0x5c,0x51,0x11,0x9c,0xef,0x25,0xe0,0x12,0x1, 0xc5,0xab, +0x24,0xe5,0x26,0x24,0x1, 0xf9,0xe4,0x35,0x25,0xfa,0x12,0x1, 0x4c,0x25,0xe0,0x12, +0x1, 0xc5,0x11,0x9c,0x90,0x0, 0x2, 0xe5,0x30,0x12,0x1, 0xd7,0x90,0x0, 0x3, 0xe5, +0x2f,0x12,0x1, 0xd7,0x90,0x0, 0x2d,0x74,0xff,0x12,0x1, 0x92,0x90,0xc, 0x79,0x74, +0x2, 0xf0,0x22,0x11,0x9c,0xf1,0x22,0xc3,0x94,0x2, 0x50,0x1, 0x22,0x90,0xc, 0x79, +0xe0,0x60,0x41,0x75,0x2e,0x1, 0xad,0x2b,0x12,0x5c,0x49,0x94,0x3, 0x50,0x21,0x12, +0x6d,0x7b,0x94,0x3, 0x50,0x1a,0x90,0xc, 0x79,0xe0,0xb4,0x1, 0x16,0x85,0x21,0x37, +0x85,0x22,0x38,0x85,0x23,0x39,0x11,0x9c,0x12,0x4d,0x20,0xbf,0x1, 0x5, 0x80,0x0, +0xe4,0xf5,0x2e,0x12,0x6f,0x3e,0x74,0x36,0xf0,0xa3,0xe0,0xb4,0x2, 0x6, 0x12,0x6f, +0x3e,0x74,0xc2,0xf0,0xe5,0x2e,0x64,0x1, 0x70,0x75,0xf1,0x9e,0x12,0x6e,0x6f,0x12, +0x3d,0x88,0xe5,0x2c,0xf1,0xea,0xff,0x90,0xc, 0x77,0xe0,0xfc,0xa3,0xe0,0xfd,0xd3, +0x9f,0xec,0x95,0xf0,0x40,0x59,0x12,0x6e,0xad,0x12,0x3d,0x88,0xe5,0x2d,0xf1,0xea, +0xff,0xd3,0xed,0x9f,0xec,0x95,0xf0,0x40,0x46,0x11,0x9c,0x90,0x0, 0x2d,0x74,0x1, +0x12,0x1, 0xd7,0xe5,0x2a,0x25,0x2b,0x12,0x1, 0xc5,0xe5,0x2c,0x25,0x2d,0x11,0x9c, +0xf1,0x85,0xfa,0xc0,0x3, 0xc0,0x2, 0xc0,0x1, 0x11,0x9c,0x12,0x1, 0x4c,0x12,0x66, +0x63,0xd0,0x1, 0xd0,0x2, 0xd0,0x3, 0x12,0x0, 0x12,0xc0,0x3, 0xc0,0x2, 0xc0,0x1, +0x91,0x32,0xc3,0x13,0x91,0x28,0xd0,0x1, 0xd0,0x2, 0xd0,0x3, 0x12,0x5c,0x51,0x22, +0xe5,0x2a,0x75,0xf0,0x7, 0xa4,0xff,0xae,0xf0,0xab,0x21,0x25,0x23,0xf9,0xe5,0x22, +0x3e,0xfa,0x90,0x0, 0x4, 0x12,0x1, 0x65,0x75,0xf0,0x2, 0xa4,0xf5,0x82,0x85,0xf0, +0x83,0x22,0xab,0x24,0xaa,0x25,0xa9,0x26,0x90,0x0, 0x1, 0x2, 0x1, 0x65,0x12,0x4f, +0xd1,0x75,0x2b,0xa, 0xe4,0xf5,0x2e,0x78,0x2f,0x7c,0x0, 0xfd,0x7b,0xff,0x7a,0x7, +0x79,0x48,0xfe,0x7f,0x5, 0x12,0x1, 0x26,0x11,0x9c,0x12,0x4e,0xc3,0xff,0xf1,0x22, +0xfe,0x2f,0xd3,0x94,0x4, 0x40,0x3, 0x75,0x2b,0xc, 0xee,0xd3,0x94,0x1, 0x40,0x3, +0x75,0x2e,0x1, 0xee,0xb4,0x1, 0x9, 0xef,0xd3,0x94,0x0, 0x40,0x3, 0x75,0x2e,0x1, +0xe4,0xf5,0x2c,0x11,0x9c,0xf1,0x22,0xf1,0x50,0x50,0x54,0xaf,0x2c,0xf1,0x2a,0x33, +0xfe,0xf1,0x49,0xf5,0x28,0xf1,0x7e,0x91,0x38,0xf5,0x27,0xe4,0xf5,0x2d,0x11,0x9c, +0xf1,0x22,0xff,0xad,0x2d,0xf1,0x53,0x50,0x24,0xe5,0x2c,0x65,0x2d,0x60,0x1a,0xf1, +0x43,0xaf,0x28,0x12,0x6e,0xbf,0x50,0x11,0xaf,0x2d,0xf1,0x2a,0x12,0x59,0x10,0xfa, +0x91,0x38,0xaf,0x27,0x12,0x6e,0xbf,0x40,0x4, 0x5, 0x2d,0x80,0xd1,0x11,0x9c,0xf1, +0x22,0xb5,0x2d,0x7, 0x74,0x2f,0x25,0x2c,0xf8,0x76,0x1, 0x5, 0x2c,0x80,0xa4,0xe5, +0x2e,0x64,0x1, 0x60,0x2, 0xe1,0x19,0xf5,0x2d,0x11,0x9c,0xf1,0x22,0xff,0xad,0x2d, +0xf1,0x53,0x50,0x22,0x74,0x2f,0x25,0x2d,0xf8,0xe6,0x70,0x16,0xaf,0x2d,0xf1,0x2a, +0x33,0xfe,0xf1,0x49,0xf5,0x28,0xf5,0x2a,0xf1,0x7e,0x91,0x38,0xf5,0x27,0xf5,0x29, +0x80,0x4, 0x5, 0x2d,0x80,0xd3,0xe4,0xf5,0x2c,0x11,0x9c,0xf1,0x22,0xf1,0x50,0x50, +0x50,0xe5,0x2c,0x65,0x2d,0x60,0x46,0x12,0x6d,0xc2,0x60,0x41,0xf1,0x43,0xff,0xe5, +0x28,0xd3,0x9f,0x40,0x2, 0x8f,0x28,0xaf,0x2c,0xf1,0x2a,0x12,0x59,0x10,0xfa,0x91, +0x38,0xff,0xe5,0x27,0xd3,0x9f,0x40,0x2, 0x8f,0x27,0xaf,0x2c,0xf1,0x2a,0x33,0x11, +0x9c,0xf1,0x49,0xff,0xe5,0x2a,0xc3,0x9f,0x50,0x2, 0x8f,0x2a,0xaf,0x2c,0xf1,0x2a, +0xf1,0x7c,0x91,0x38,0xff,0xe5,0x29,0xc3,0x9f,0x50,0x2, 0x8f,0x29,0x5, 0x2c,0x80, +0xa8,0xc3,0xe5,0x2a,0x95,0x28,0xc3,0x95,0x2b,0x40,0x2, 0xe1,0x19,0xc3,0xe5,0x29, +0x95,0x27,0xc3,0x95,0x2b,0x40,0x2, 0xe1,0x19,0xe4,0xf5,0x2c,0x11,0x9c,0xf1,0x22, +0xf1,0x50,0x50,0x49,0x12,0x6d,0xc2,0x60,0x40,0xf1,0x8b,0xfa,0xc0,0x3, 0xc0,0x2, +0xc0,0x1, 0xaf,0x2c,0xf1,0x2a,0x33,0xfe,0x11,0x9c,0xf1,0x49,0x12,0x66,0x63,0xd0, +0x1, 0xd0,0x2, 0xd0,0x3, 0x12,0x0, 0x12,0xc0,0x3, 0xc0,0x2, 0xc0,0x1, 0x12,0x59, +0x12,0xfa,0x91,0x38,0xc3,0x13,0x91,0x28,0xd0,0x1, 0xd0,0x2, 0xd0,0x3, 0x12,0x2, +0xa1,0xd3,0x94,0xdc,0x12,0x5f,0x5b,0x50,0x4, 0x5, 0x2c,0x80,0xaf,0x11,0x9c,0xf1, +0x22,0xf1,0x50,0x50,0x2, 0xe1,0x19,0xe5,0x2a,0x25,0x28,0x12,0x6e,0xb6,0xf5,0x2a, +0xe5,0x29,0x25,0x27,0x12,0x6e,0xb6,0xf5,0x29,0xf1,0x9e,0x90,0x3, 0x80,0xe5,0x2a, +0x12,0x5c,0x59,0xe5,0x29,0xc3,0x13,0x75,0xf0,0x2, 0xf1,0xea,0xc3,0x94,0xa0,0x12, +0x5f,0x5b,0x40,0x2, 0xe1,0x19,0xe4,0xf5,0x2d,0xf5,0x2c,0x11,0x9c,0xf1,0x22,0xf1, +0x50,0x50,0x2f,0x12,0x6d,0xc2,0x70,0x26,0xf1,0x43,0xfd,0xaf,0x2d,0xf1,0x2a,0x33, +0x8f,0x82,0xf5,0x83,0xed,0x12,0x1, 0xd7,0xaf,0x2c,0xf1,0x2a,0xf1,0x7c,0x91,0x38, +0xfd,0xaf,0x2d,0xf1,0x2a,0x12,0x59,0x10,0xfa,0x12,0x57,0xaa,0x5, 0x2d,0x5, 0x2c, +0x80,0xc9,0xe5,0x2d,0x4, 0x11,0x9c,0x90,0x0, 0x2d,0x12,0x1, 0xd7,0xaf,0x2d,0xf1, +0x2a,0x33,0xfe,0x8f,0x82,0xf5,0x83,0xe5,0x2a,0x12,0x1, 0xd7,0xf1,0x7e,0x90,0x0, +0x1, 0xe5,0x29,0x12,0x1, 0xd7,0xf1,0x9e,0x90,0x3, 0x80,0xe5,0x2a,0xc3,0x13,0xff, +0x12,0x5c,0x5b,0xe5,0x29,0x12,0x59,0xf2,0x12,0x5c,0x51,0xef,0x24,0xfe,0xf5,0x2c, +0xe5,0x2a,0xc3,0x13,0x12,0x59,0x9, 0xad,0x2c,0x12,0x2f,0xb0,0x50,0x78,0xe5,0x29, +0xc3,0x13,0x24,0xfe,0xf5,0x2d,0xe5,0x29,0xc3,0x13,0x24,0x2, 0x12,0x2f,0xaa,0x50, +0x61,0xc3,0xe5,0x2c,0x64,0x80,0x94,0x80,0x40,0x54,0xe5,0x2c,0x64,0x80,0x94,0x8e, +0x50,0x4c,0x12,0x6f,0x8, 0x40,0x47,0xe5,0x2d,0x64,0x80,0x94,0x89,0x50,0x3f,0xf1, +0x8b,0xfa,0xaf,0x2c,0x12,0x57,0x1a,0x78,0x5, 0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9, +0xf1,0x72,0x12,0x4e,0xac,0x12,0x4d,0x6, 0xac,0x6, 0xad,0x7, 0xf1,0x8b,0xfa,0xaf, +0x2c,0x12,0x57,0x1a,0x78,0x5, 0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0x29,0xf9,0xea, +0x3e,0xfa,0xaf,0x2d,0xf1,0x2a,0xf1,0x7c,0xec,0x8d,0xf0,0x12,0x3, 0x26,0x5, 0x2d, +0x80,0x94,0x5, 0x2c,0xc1,0x90,0x7f,0x1, 0x22,0x7f,0x0, 0x22,0xab,0x21,0xaa,0x22, +0xa9,0x23,0x90,0x0, 0x2d,0x2, 0x1, 0x65,0xaf,0x3b,0xef,0x33,0x95,0xe0,0xfe,0xef, +0x25,0xe0,0xff,0xee,0x22,0xef,0xc3,0x9d,0x40,0x4, 0xef,0x9d,0xff,0x22,0xc3,0xed, +0x9f,0xff,0x22,0xed,0x25,0xe0,0xff,0xec,0x33,0x8f,0x82,0xf5,0x83,0x2, 0x1, 0x65, +0xff,0xad,0x2c,0xed,0x33,0x95,0xe0,0xfc,0xc3,0xed,0x9f,0x74,0x80,0xf8,0x6c,0x98, +0x22,0xe5,0x2f,0x75,0xf0,0x2, 0xa4,0xab,0x24,0x25,0x26,0xf9,0xe5,0x25,0x35,0xf0, +0xfa,0x22,0x29,0xf9,0xea,0x3e,0xfa,0xed,0x25,0xe0,0xff,0xec,0x33,0xfe,0xe9,0x2f, +0xf9,0xea,0x3e,0xfa,0x22,0x90,0x0, 0x1, 0x12,0x1, 0xd7,0xab,0x21,0xe5,0x23,0x24, +0x80,0xf9,0xe5,0x22,0x34,0x3, 0x22,0x7e,0x0, 0x7f,0x23,0x12,0x1, 0x26,0xab,0x21, +0xaa,0x22,0xa9,0x23,0x22,0x11,0x96,0xf1,0x22,0xf1,0x9e,0x90,0x0, 0x41,0x12,0x1, +0xd7,0xab,0x24,0x12,0x6e,0xc8,0xfa,0xa8,0x23,0xac,0x22,0xad,0x21,0xf1,0x97,0x12, +0x1c,0xe9,0x12,0x6e,0xc8,0xa8,0x1, 0xfc,0xad,0x24,0xf1,0x9e,0xf1,0x97,0x90,0x0, +0x41,0x12,0x1, 0x65,0x90,0x0, 0x42,0x2, 0x1, 0xd7,0x90,0x3, 0x80,0x75,0xf0,0x20, +0xe5,0x28,0x12,0x5, 0x19,0x75,0xf0,0x2, 0xe5,0x27,0x12,0x5, 0x19,0x2, 0x2, 0xa1, +0x12,0x6f,0x5e,0x40,0x5, 0x12,0x6e,0xd1,0x80,0x3, 0xe4,0xfe,0xff,0x7d,0x84,0x12, +0x6b,0xe2,0xe4,0x7f,0x40,0x12,0x6c,0xfd,0x40,0x6, 0xe4,0x75,0x57,0x3f,0x11,0x15, +0xae,0x56,0xaf,0x57,0x22,0x75,0x56,0x1, 0xf5,0x55,0xf5,0x54,0x22,0x12,0x6f,0x5e, +0x40,0x5, 0x12,0x6e,0xd1,0x80,0x3, 0xe4,0xfe,0xff,0x7d,0x83,0x12,0x6b,0xe2,0xe4, +0x7f,0xe0,0x12,0x6c,0xfd,0x40,0x6, 0xe4,0x75,0x57,0xdf,0x11,0x15,0xae,0x56,0xaf, +0x57,0x22,0x12,0x4f,0xd1,0x91,0xc2,0x12,0x63,0xb0,0xf5,0x2f,0x12,0x6c,0xb2,0xf5, +0x30,0xe4,0xf5,0x2c,0x91,0xe2,0x24,0x35,0xf8,0x76,0xff,0x91,0xe2,0x24,0x31,0xf8, +0x76,0x7f,0x8, 0x76,0xff,0x91,0xe2,0x24,0x33,0xf8,0x76,0x7f,0x8, 0x76,0xff,0x5, +0x2c,0xe5,0x2c,0xb4,0x5, 0xde,0xe5,0x2f,0x70,0x31,0xe5,0x30,0xd3,0x94,0x0, 0x50, +0x2, 0x81,0xa, 0xe4,0xf5,0x2d,0xe5,0x2d,0x91,0x75,0x90,0x0, 0x27,0x74,0xff,0x12, +0x1, 0xd7,0x5, 0x2d,0xe5,0x2d,0xb4,0x5, 0xed,0x12,0x6c,0x2b,0x44,0x4, 0x12,0x1, +0xc5,0x54,0xf7,0x12,0x1, 0xc5,0x54,0xdf,0x2, 0x1, 0xc5,0xe4,0xf5,0x2d,0xe5,0x2d, +0xc3,0x95,0x2f,0x50,0x27,0xe5,0x2d,0x75,0xf0,0x7, 0xa4,0xfd,0xac,0xf0,0xf1,0xf1, +0x3c,0xfa,0xe9,0x24,0xa, 0x12,0x6c,0x39,0xab,0x21,0xe5,0x23,0x2d,0xf9,0xe5,0x22, +0x3c,0xfa,0xe9,0x24,0xc, 0x12,0x6c,0x39,0x5, 0x2d,0x80,0xd2,0xe5,0x30,0x70,0x8, +0x12,0x6c,0x2b,0x44,0x10,0x12,0x1, 0xc5,0xe4,0xf5,0x2c,0xf5,0x2d,0xe4,0xf5,0x2e, +0xe5,0x2e,0xc3,0x95,0x2f,0x50,0x1d,0x91,0x59,0x12,0x6d,0x67,0x91,0x75,0x12,0x6e, +0xa4,0x70,0xd, 0xef,0xf4,0x60,0x9, 0x91,0xb, 0x91,0xc9,0x12,0x6f,0x0, 0x80,0x4, +0x5, 0x2e,0x80,0xdc,0x5, 0x2d,0xe5,0x2d,0x64,0x5, 0x70,0xd1,0xe4,0xf5,0x2d,0x85, +0x2f,0x2e,0xe5,0x2e,0xc3,0x94,0x5, 0x50,0x1d,0x91,0x59,0x12,0x6d,0x67,0x91,0x75, +0x12,0x6e,0xa4,0x70,0xd, 0xef,0xf4,0x60,0x9, 0x91,0xb, 0x91,0xc9,0x12,0x6f,0x0, +0x80,0x4, 0x5, 0x2e,0x80,0xdc,0x5, 0x2d,0xe5,0x2d,0x64,0x5, 0x70,0xd1,0xe4,0xf5, +0x2e,0xe4,0xf5,0x2d,0xe5,0x2d,0xc3,0x95,0x2c,0x50,0x1a,0x91,0x59,0x90,0x0, 0xe, +0x12,0x1, 0x65,0xff,0xe5,0x2d,0x75,0xf0,0x7, 0xa4,0x24,0x35,0xf8,0xe6,0x6f,0x60, +0x4, 0x5, 0x2d,0x80,0xdf,0xe5,0x2d,0x65,0x2c,0x70,0x1e,0x12,0x6e,0x22,0xe5,0x2e, +0x12,0x2e,0x75,0xc0,0x1, 0x91,0xe2,0x24,0x31,0xf9,0xe4,0xa8,0x1, 0xfc,0xfd,0xd0, +0x1, 0xfe,0x7f,0x7, 0x12,0x1, 0x26,0x5, 0x2c,0x5, 0x2e,0xe5,0x2e,0x64,0x5, 0x70, +0xb0,0xf1,0xe8,0xa8,0x1, 0xfc,0xad,0x27,0x7b,0x0, 0x7a,0x0, 0x79,0x31,0x12,0x6e, +0xe1,0xe5,0x30,0x70,0x17,0x12,0x6e,0x22,0xc0,0x2, 0xc0,0x1, 0xf1,0xe8,0xa8,0x1, +0xfc,0xad,0x27,0xd0,0x1, 0xd0,0x2, 0x12,0x6e,0xe1,0x61,0x3f,0x91,0xc2,0x12,0x6d, +0xee,0x13,0x13,0x13,0x54,0x1f,0x30,0xe0,0x2, 0x61,0x3f,0xe4,0xf5,0x2e,0xe5,0x2e, +0xc3,0x95,0x2f,0x40,0x2, 0x61,0x3f,0xe4,0xf5,0x2d,0x91,0x59,0x12,0x6d,0x67,0x91, +0x75,0x90,0x0, 0x27,0x12,0x1, 0x65,0x6d,0x60,0x7, 0x5, 0x2d,0xe5,0x2d,0xb4,0x5, +0xe9,0x91,0x59,0x90,0x0, 0xc, 0x91,0xa2,0xc0,0x6, 0xc0,0x7, 0xe5,0x2d,0x91,0x75, +0x91,0x84,0xd0,0x7, 0xd0,0x6, 0x12,0x61,0x37,0xc0,0x6, 0xc0,0x7, 0x91,0x59,0x90, +0x0, 0xa, 0x91,0xa2,0xc0,0x6, 0xc0,0x7, 0xe5,0x2d,0x91,0x75,0x90,0x0, 0x23,0x91, +0x87,0xd0,0x7, 0xd0,0x6, 0x12,0x61,0x37,0xd0,0xe0,0x2f,0xf5,0x2b,0xd0,0xe0,0x3e, +0xf5,0x2a,0x12,0x10,0x9c,0x90,0x0, 0x1, 0x91,0x87,0xae,0x4, 0x78,0x3, 0xce,0xc3, +0x13,0xce,0x13,0xd8,0xf9,0x12,0x6d,0xcb,0x50,0x5, 0x75,0x2c,0x4, 0x80,0x3c,0xed, +0xae,0x4, 0x78,0x2, 0xce,0xc3,0x13,0xce,0x13,0xd8,0xf9,0x12,0x6d,0xcb,0x50,0x5, +0x75,0x2c,0x3, 0x80,0x26,0x90,0x0, 0x1, 0x91,0x87,0xec,0xc3,0x13,0xfe,0xed,0x13, +0x12,0x6d,0xcb,0x50,0x5, 0x75,0x2c,0x2, 0x80,0x11,0xc3,0xe5,0x2b,0x9d,0xe5,0x2a, +0x9c,0x50,0x5, 0x75,0x2c,0x1, 0x80,0x3, 0xe4,0xf5,0x2c,0x91,0x59,0x90,0x0, 0xa, +0x91,0xa2,0xc0,0x6, 0xc0,0x7, 0xe5,0x2d,0x91,0x75,0x90,0x0, 0x23,0x91,0x87,0xd0, +0x7, 0xd0,0x6, 0x12,0x62,0x2e,0x80,0x5, 0xce,0xc3,0x13,0xce,0x13,0xd8,0xf9,0xf5, +0x2b,0x8e,0x2a,0xe5,0x2d,0x91,0x75,0x90,0x0, 0x23,0x91,0x87,0x91,0x59,0x90,0x0, +0xa, 0x12,0x6e,0x3a,0x75,0xf0,0x7, 0x40,0xa, 0x91,0x78,0x90,0x0, 0x23,0x12,0x6e, +0x8a,0x80,0xb, 0x91,0x78,0xe9,0x24,0x23,0x12,0x6d,0x20,0x12,0x3, 0x26,0x91,0x59, +0x90,0x0, 0xc, 0x91,0xa2,0xc0,0x6, 0xc0,0x7, 0xe5,0x2d,0x91,0x75,0x91,0x84,0xd0, +0x7, 0xd0,0x6, 0x12,0x62,0x2e,0x80,0x5, 0xce,0xc3,0x13,0xce,0x13,0xd8,0xf9,0xf5, +0x2b,0x8e,0x2a,0xe5,0x2d,0x91,0x75,0x91,0x84,0x91,0x59,0x90,0x0, 0xc, 0x12,0x6e, +0x3a,0x75,0xf0,0x7, 0x40,0xa, 0x91,0x78,0x90,0x0, 0x25,0x12,0x6e,0x8a,0x80,0xb, +0x91,0x78,0xe9,0x24,0x25,0x12,0x6d,0x20,0x12,0x3, 0x26,0x5, 0x2e,0x21,0xde,0xe4, +0xf5,0x2e,0xe5,0x2e,0x91,0x75,0x90,0x0, 0x23,0x12,0x6b,0xc5,0xf1,0xf1,0x3e,0xfa, +0x90,0x0, 0xa, 0x91,0x8e,0x90,0x0, 0x25,0x12,0x6b,0xc5,0xf1,0xf1,0x3e,0xfa,0x90, +0x0, 0xc, 0x91,0x8e,0x90,0x0, 0x27,0x91,0xa9,0x90,0x0, 0xe, 0xed,0x12,0x1, 0xd7, +0x91,0x94,0x90,0x0, 0x28,0x91,0xa9,0x12,0x6e,0xda,0x91,0x94,0x90,0x0, 0x29,0x91, +0xa9,0x90,0x0, 0x10,0x12,0x6e,0x66,0x64,0x5, 0x70,0xb7,0x12,0x6c,0x2b,0x44,0x1, +0x12,0x1, 0xc5,0xe5,0x2f,0xd3,0x94,0x0, 0x40,0x70,0xe4,0xf5,0x2e,0x91,0x59,0x90, +0x0, 0xa, 0x91,0xa2,0x12,0x17,0xf0,0x91,0xc2,0x75,0xf0,0x7, 0xe5,0x2e,0x12,0x14, +0x2b,0x12,0x5f,0x65,0x91,0x59,0x90,0x0, 0xc, 0x91,0xa2,0x11,0x1d,0xac,0x6, 0xad, +0x7, 0x12,0x6b,0xd8,0xab,0x27,0x25,0x29,0xf9,0xe5,0x28,0x3e,0xfa,0x90,0x0, 0x2, +0x12,0x6d,0x4e,0x91,0xad,0x90,0x0, 0xe, 0x12,0x0, 0x1e,0xfd,0x91,0x94,0x90,0x0, +0x4, 0xed,0x12,0x1, 0xd7,0x91,0xad,0x90,0x0, 0xf, 0x12,0x1, 0x65,0xfd,0x91,0x94, +0x90,0x0, 0x5, 0xed,0x12,0x1, 0xd7,0x91,0xad,0x12,0x2e,0x38,0xfd,0x91,0x94,0x90, +0x0, 0x6, 0x12,0x6e,0x66,0xc3,0x94,0x5, 0x40,0x93,0x22,0xe5,0x2d,0x75,0xf0,0x7, +0xa4,0x25,0x29,0xf9,0xe5,0x28,0x35,0xf0,0xfa,0x90,0x0, 0x27,0x12,0x1, 0x65,0xff, +0xe5,0x2c,0x75,0xf0,0x7, 0xa4,0x24,0x35,0xf8,0xa6,0x7, 0x90,0x0, 0x23,0x12,0x2, +0xa1,0xff,0xae,0xf0,0xe5,0x2c,0x75,0xf0,0x7, 0xa4,0x24,0x31,0xf8,0xa6,0x6, 0x8, +0xa6,0x7, 0x90,0x0, 0x25,0x12,0x2, 0xa1,0xff,0xae,0xf0,0xe5,0x2c,0x75,0xf0,0x7, +0xa4,0x24,0x33,0xf8,0xa6,0x6, 0x8, 0xa6,0x7, 0xe5,0x2e,0x75,0xf0,0x7, 0xa4,0xab, +0x21,0x25,0x23,0xf9,0xe5,0x22,0x35,0xf0,0xfa,0x22,0x12,0x5, 0x19,0xee,0x8f,0xf0, +0x12,0x3, 0x45,0xe5,0x2a,0x75,0xf0,0x7, 0xa4,0xab,0x27,0x25,0x29,0xf9,0xe5,0x28, +0x35,0xf0,0xfa,0x22,0x90,0x0, 0x25,0x12,0x2, 0xa1,0xfd,0xac,0xf0,0x22,0xec,0x8d, +0xf0,0x12,0x3, 0x45,0xab,0x27,0xe5,0x29,0x2f,0xf9,0xe5,0x28,0x3e,0xfa,0x22,0x90, +0x0, 0x2, 0x12,0x2, 0xa1,0xff,0xae,0xf0,0x22,0x12,0x1, 0x65,0xfd,0xab,0x21,0xe5, +0x23,0x2f,0xf9,0xe5,0x22,0x3e,0xfa,0x22,0x90,0xc, 0x85,0x74,0x2, 0xf0,0xa3,0x74, +0xee,0xf0,0xab,0x27,0xaa,0x28,0xa9,0x29,0x22,0x90,0x0, 0xf, 0x12,0x1, 0x65,0xff, +0xe5,0x2c,0x75,0xf0,0x7, 0xa4,0x24,0x36,0xf8,0xa6,0x7, 0x90,0x0, 0x10,0x12,0x1, +0x65,0xff,0xe5,0x2c,0x75,0xf0,0x7, 0xa4,0x22,0x8b,0x27,0x8a,0x28,0x89,0x29,0xe4, +0x90,0xb, 0xe1,0xf0,0xf5,0x2a,0x91,0x73,0x12,0x6b,0xfd,0xf1,0xcc,0x74,0xff,0xf0, +0xe5,0x2a,0x12,0x2d,0xb3,0x74,0xff,0xf0,0xa3,0xf0,0x74,0xdc,0x25,0x2a,0xf1,0xd8, +0xe4,0xf0,0x5, 0x2a,0xe5,0x2a,0xb4,0x5, 0xdd,0x91,0xc2,0x90,0x0, 0x41,0x12,0x1, +0x65,0x70,0x1c,0x90,0x0, 0x42,0x12,0x1, 0x65,0x70,0x2, 0xe1,0x15,0xe4,0xf5,0x2a, +0x12,0x5c,0x61,0x12,0x36,0xd4,0x5, 0x2a,0xe5,0x2a,0xb4,0x5, 0xf3,0xe1,0x15,0x91, +0xc2,0x90,0x0, 0x42,0x12,0x1, 0x65,0x70,0x40,0xf5,0x2a,0x91,0xc2,0xf1,0xe0,0xe5, +0x2a,0xc3,0x9f,0x40,0x2, 0xe1,0x15,0x75,0xf0,0x7, 0xe5,0x2a,0x12,0x14,0x2b,0x91, +0xa2,0x90,0x0, 0x2d,0x75,0xf0,0x2, 0xe5,0x2a,0x91,0x6a,0x91,0x9f,0x12,0x6d,0x32, +0xe5,0x2a,0x91,0x6a,0x90,0x0, 0x4, 0xe5,0x2a,0x12,0x1, 0xd7,0x74,0xdc,0x25,0x2a, +0xf1,0xd8,0x74,0x1, 0xf0,0x5, 0x2a,0x80,0xc2,0xe4,0xf5,0x2a,0x91,0xc2,0xf1,0xe0, +0xe5,0x2a,0xc3,0x9f,0x50,0x70,0xe4,0xf5,0x2b,0x91,0xc2,0x12,0x6d,0x36,0xe5,0x2b, +0x12,0x17,0xea,0xfd,0xac,0xf0,0xe5,0x2a,0x12,0x2e,0x75,0x90,0x0, 0x2, 0x12,0x2, +0xa1,0xc3,0x9d,0xff,0xe5,0xf0,0x9c,0xfe,0x12,0x0, 0x6, 0xc0,0x6, 0xc0,0x7, 0x91, +0xc2,0x12,0x6d,0xb9,0x12,0x17,0xea,0xff,0xae,0xf0,0x75,0xf0,0x7, 0xe5,0x2a,0x12, +0x14,0x2b,0x12,0x6e,0x45,0x12,0x0, 0x6, 0xd0,0xe0,0x2f,0xff,0xd0,0xe0,0x3e,0xfe, +0xe5,0x2a,0x12,0x2d,0xb3,0x12,0x6e,0x81,0x40,0xf, 0xf1,0xcc,0xe5,0x2b,0xf0,0xe5, +0x2a,0x12,0x2d,0xb3,0xee,0xf0,0xa3,0xef,0xf0,0x5, 0x2b,0xe5,0x2b,0xc3,0x94,0x5, +0x40,0x97,0x5, 0x2a,0x80,0x86,0xe4,0xf5,0x2a,0x91,0xc2,0xf1,0xe0,0xe5,0x2a,0xc3, +0x9f,0x40,0x2, 0xc1,0xa6,0x90,0xb, 0xe1,0x74,0x1, 0xf0,0xe4,0xf5,0x2b,0x91,0xc2, +0xf1,0xe0,0xe5,0x2b,0xc3,0x9f,0x50,0x33,0xe5,0x2a,0x65,0x2b,0x60,0x29,0x74,0xd7, +0x25,0x2b,0xf1,0xd0,0xe0,0xff,0xf1,0xcc,0xe0,0xb5,0x7, 0x1b,0xe5,0x2b,0x12,0x2d, +0xb3,0xe0,0xfe,0xa3,0xe0,0xff,0xe5,0x2a,0x12,0x2d,0xb3,0x12,0x6e,0x78,0x40,0x7, +0xe4,0x90,0xb, 0xe1,0xf0,0x80,0x4, 0x5, 0x2b,0x80,0xc3,0x90,0xb, 0xe1,0xe0,0x64, +0x1, 0x70,0x3f,0xf1,0xcc,0xe0,0x24,0xdc,0xf1,0xd8,0x74,0x1, 0xf0,0xf1,0xcc,0xe0, +0xfd,0x91,0x73,0x90,0x0, 0x4, 0xed,0x12,0x1, 0xd7,0x91,0xc2,0x75,0xf0,0x7, 0xe5, +0x2a,0x12,0x14,0x2b,0x91,0xa2,0xe9,0x24,0x2d,0xf9,0xe4,0x3a,0xf1,0xcb,0xe0,0x12, +0x14,0x28,0x91,0x6d,0x91,0x9f,0x12,0x6c,0xa9,0xf1,0xcb,0xe0,0x12,0x14,0x28,0x12, +0x5f,0x65,0x5, 0x2a,0xc1,0x9, 0xe4,0xf5,0x2a,0x91,0xc2,0xf1,0xe0,0xe5,0x2a,0xc3, +0x9f,0x50,0x49,0xe5,0x2a,0x12,0x2e,0x75,0x12,0x30,0xc7,0xf4,0x70,0x3a,0xf5,0x2b, +0x74,0xdc,0x25,0x2b,0xf1,0xd8,0xe0,0x70,0x27,0x74,0xdc,0x25,0x2b,0xf1,0xd8,0x74, +0x1, 0x91,0xc1,0x75,0xf0,0x7, 0xe5,0x2a,0x12,0x14,0x2b,0x91,0xa2,0x12,0x6d,0xb9, +0x91,0x6a,0x91,0x9f,0x12,0x6d,0x32,0xe5,0x2b,0x91,0x6a,0x12,0x6c,0x6b,0x80,0x8, +0x5, 0x2b,0xe5,0x2b,0x64,0x5, 0x70,0xc8,0x5, 0x2a,0x80,0xad,0xe4,0xf5,0x2a,0x74, +0xdc,0x25,0x2a,0xf1,0xd8,0xe0,0x70,0x6, 0x12,0x5c,0x61,0x12,0x36,0xd4,0x5, 0x2a, +0xe5,0x2a,0xb4,0x5, 0xea,0x91,0xc2,0x90,0x0, 0x41,0x12,0x1, 0x65,0xf5,0x2b,0xe4, +0xf5,0x2a,0x74,0xdc,0x25,0x2a,0xf1,0xd8,0xe0,0x64,0x1, 0x70,0x3a,0xab,0x27,0xe5, +0x29,0x24,0x28,0x12,0x6b,0xba,0x12,0x62,0x49,0xb4,0x1, 0x5, 0x74,0x3, 0x12,0x1, +0xc5,0x12,0x1, 0x4c,0xff,0xb4,0x3, 0x11,0xab,0x27,0xf1,0xe8,0xfa,0xe5,0x2a,0x7c, +0x0, 0x29,0xf9,0xec,0x3a,0xfa,0xe4,0x80,0x48,0xef,0x70,0x48,0x12,0x6b,0xb4,0xf9, +0xee,0x3a,0xfa,0x74,0x2, 0x80,0x3a,0xab,0x27,0xe5,0x29,0x24,0x28,0x12,0x6b,0xba, +0x12,0x62,0x49,0xff,0x64,0x2, 0x60,0x3, 0xef,0x70,0x1d,0x12,0x6b,0xb4,0xf9,0xee, +0x3a,0xfa,0x74,0x1, 0x12,0x1, 0xc5,0xaf,0x2b,0x5, 0x2b,0xef,0x91,0x75,0x90,0x0, +0x4, 0xe5,0x2a,0x12,0x1, 0xd7,0x80,0xc, 0x12,0x6b,0xb4,0xf9,0xee,0x3a,0xfa,0x74, +0x3, 0x12,0x1, 0xc5,0xab,0x27,0xf1,0xe8,0xfa,0xaf,0x2a,0x7e,0x0, 0x12,0x62,0x47, +0xfd,0xe5,0x29,0x24,0x28,0xf9,0xe4,0x35,0x28,0x12,0x62,0x26,0xed,0x12,0x1, 0xc5, +0x5, 0x2a,0xe5,0x2a,0x64,0x5, 0x60,0x2, 0xe1,0x22,0x22,0xfa,0x74,0xd7,0x25,0x2a, +0xf5,0x82,0xe4,0x34,0xb, 0xf5,0x83,0x22,0xf5,0x82,0xe4,0x34,0xb, 0xf5,0x83,0x22, +0x90,0x0, 0x41,0x12,0x1, 0x65,0xff,0x22,0xe5,0x29,0x24,0x23,0xf9,0xe4,0x35,0x28, +0x22,0xab,0x21,0x25,0x23,0xf9,0xe5,0x22,0x22,0x8f,0x82,0x8e,0x83,0xd3,0xe5,0x82, +0x94,0x3f,0xe5,0x83,0x94,0x0, 0x50,0x21,0xe5,0x82,0x25,0xe0,0xff,0xe5,0x83,0x33, +0xfe,0xef,0x24,0xc1,0xfb,0xee,0x34,0xff,0xfa,0xc3,0xeb,0x94,0x2, 0xea,0x64,0x80, +0x94,0x80,0x50,0x2d,0xe4,0xfa,0xfb,0x80,0x28,0x11,0x5a,0xe5,0x83,0x9e,0x40,0x25, +0x11,0x5a,0xff,0xe5,0x83,0x9e,0xcf,0x25,0x82,0xfb,0xef,0x35,0x83,0xfa,0xed,0x24, +0xfe,0xff,0xec,0x34,0xff,0xfe,0xd3,0xeb,0x9f,0xea,0x9e,0x40,0x4, 0xaa,0x4, 0xab, +0x5, 0x8a,0x83,0x8b,0x82,0xae,0x83,0xaf,0x82,0x22,0xed,0x24,0xc1,0xff,0xec,0x34, +0xff,0xfe,0xc3,0xe5,0x82,0x9f,0x22,0x8c,0x25,0x8d,0x26,0x8b,0x27,0x8a,0x28,0x89, +0x29,0x7d,0x7f,0x7c,0x2, 0x12,0x1f,0xf9,0x12,0x1c,0xc2,0xee,0x8f,0xf0,0x12,0x3, +0x26,0x7d,0xbf,0xc, 0xaf,0x26,0xae,0x25,0x12,0x1f,0xf9,0xab,0x27,0x74,0x2, 0x25, +0x29,0xf9,0xf5,0x29,0xe4,0x35,0x28,0xfa,0xf5,0x28,0xee,0x8f,0xf0,0x2, 0x3, 0x26, +0x12,0x4f,0xd1,0xe4,0xf5,0x24,0x12,0x17,0x1c,0xff,0xe5,0x24,0xc3,0x9f,0x50,0x1e, +0xe5,0x24,0x12,0x2e,0x75,0x90,0x0, 0xa, 0x12,0x1c,0xa2,0x90,0x0, 0xc, 0x12,0x1c, +0x87,0xe9,0x24,0xa, 0xf9,0xe4,0x3a,0xfa,0x11,0x67,0x5, 0x24,0x80,0xd8,0x22,0xe4, +0x90,0xb, 0xc5,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0xb, 0xcb,0x74, +0x40,0xf0,0xe4,0xa3,0xf0,0x90,0x9, 0xa4,0x4, 0x12,0x6c,0x86,0x12,0x6d,0xd4,0x12, +0x35,0x19,0x12,0x41,0xf, 0x75,0x36,0x1, 0x75,0x37,0xa, 0x75,0x38,0x4c,0xb1,0x86, +0x12,0x2e,0x80,0x7b,0x1, 0x7a,0xb, 0x79,0x61,0x12,0x3d,0xf0,0x7b,0x1, 0x7a,0xb, +0x79,0xad,0x12,0x64,0x4c,0xe4,0xf5,0x14,0x7e,0xa, 0x7f,0xbd,0x12,0x36,0xfc,0x90, +0xd, 0x9b,0x74,0x19,0xf0,0x90,0xd, 0x9b,0xe0,0x70,0xfa,0x90,0x0, 0x55,0x74,0x21, +0xf0,0x7b,0x1, 0x7a,0xa, 0x79,0xe0,0xd1,0xb2,0x7b,0x1, 0x7a,0xa, 0x79,0xe0,0x12, +0x43,0xe0,0x7e,0x0, 0x7f,0x83,0x12,0x5f,0x9a,0x12,0x6e,0x50,0x12,0x6c,0xb8,0x75, +0x2b,0xa, 0x75,0x2c,0xbd,0x7b,0x1, 0x12,0xe, 0x9d,0x12,0x6c,0x73,0x79,0x0, 0xf1, +0x9b,0xe4,0x90,0x0, 0x52,0xf0,0xa3,0x4, 0xf0,0xa3,0x74,0x7, 0xf0,0x90,0xe, 0x28, +0x74,0x1, 0xf0,0x90,0xb, 0xaa,0xe0,0xff,0x12,0x5f,0x6b,0x90,0xe, 0x28,0xe0,0x64, +0x1, 0x60,0x2, 0xa1,0x3e,0x12,0x46,0x8d,0x90,0xc, 0x7a,0xf0,0xa3,0x74,0x64,0xf0, +0x12,0x6d,0xd4,0x12,0x66,0x6a,0xe4,0xf5,0xd, 0xf5,0xc, 0x90,0xe, 0x26,0xe0,0x70, +0x5, 0x90,0x9, 0xb2,0x80,0x3, 0x90,0x9, 0xb4,0xe0,0xf5,0xe, 0x90,0xe, 0x21,0xe0, +0xf4,0x60,0x1b,0x7e,0x0, 0x7f,0x0, 0x7c,0xa, 0x7d,0xbd,0x7a,0x0, 0x7b,0x83,0x75, +0x27,0xa, 0x75,0x28,0xe0,0x12,0x43,0x92,0x90,0xe, 0x21,0x74,0xff,0xf0,0x12,0x5c, +0x99,0x64,0xaa,0x60,0xf9,0x90,0xb, 0xc9,0xe0,0x70,0x5, 0xd1,0xa1,0x12,0x5c,0xac, +0x90,0x9, 0xb9,0xe0,0xb4,0x1, 0x5, 0xe4,0xff,0x12,0x34,0xf8,0xd1,0x86,0x12,0x50, +0xee,0x12,0x6c,0xb8,0x75,0x2b,0xa, 0x75,0x2c,0x9b,0xb1,0x86,0x12,0x4e,0xc9,0x90, +0x9, 0xa7,0xe0,0x64,0x6, 0x60,0x2, 0x41,0x8a,0x12,0x69,0x9, 0x40,0x17,0x75,0x33, +0x1, 0x75,0x34,0x0, 0x75,0x35,0x83,0x75,0x36,0x1, 0x75,0x37,0xa, 0x75,0x38,0x9b, +0xb1,0x86,0x12,0x3b,0x26,0x90,0x9, 0xe9,0xe0,0x30,0xe0,0x38,0xe4,0x90,0x9, 0xa7, +0xf0,0xc3,0x90,0xa, 0x97,0xe0,0x94,0x3c,0x90,0xa, 0x96,0xe0,0x94,0x0, 0x50,0xe, +0xa3,0xe0,0x4, 0xf0,0x70,0x6, 0x90,0xa, 0x96,0xe0,0x4, 0xf0,0x80,0x3c,0x12,0x6c, +0x73,0x79,0x0, 0xf1,0x9b,0x12,0x6f,0x36,0x90,0xc, 0x8f,0x74,0xb, 0xf0,0xa3,0x74, +0xb8,0xf0,0x80,0x26,0x12,0x6f,0x36,0x90,0x9, 0xe7,0xe0,0xff,0x70,0x8, 0x90,0xc, +0x8f,0xf0,0xa3,0xf0,0xc2,0x0, 0x30,0x0, 0x11,0xc2,0x0, 0xef,0xd3,0x94,0x0, 0x40, +0x9, 0x12,0x6c,0x73,0x79,0x0, 0xf1,0x9b,0x21,0x7b,0xe4,0x90,0xb, 0xc8,0x12,0x6c, +0x9c,0x75,0x27,0x1, 0x75,0x28,0x9, 0x75,0x29,0xba,0x75,0x2a,0x1, 0x75,0x2b,0xa, +0x75,0x2c,0x9b,0x7b,0x1, 0x7a,0xb, 0x79,0xad,0x12,0x64,0x69,0x90,0xa, 0x9b,0xe0, +0x70,0x4, 0xa3,0xe0,0x64,0xb4,0x60,0x8, 0x90,0xb, 0xc8,0x74,0x1, 0xf0,0x80,0x2c, +0x90,0xa, 0x95,0xe0,0x64,0x1, 0x70,0x24,0x90,0x9, 0xba,0xe0,0x90,0xb, 0xca,0x12, +0x6c,0xda,0x50,0x18,0x90,0x9, 0xbb,0xe0,0x90,0xb, 0xcb,0x12,0x6c,0xda,0x50,0xc, +0x90,0x9, 0xe7,0xe0,0x60,0x6, 0x90,0xb, 0xc8,0x74,0x2, 0xf0,0x90,0x9, 0xba,0xe0, +0x90,0xb, 0xca,0xf0,0x90,0x9, 0xbb,0xe0,0x90,0xb, 0xcb,0xf0,0xe4,0x90,0xb, 0xc5, +0xf0,0x90,0xb, 0xc9,0xe0,0x70,0xc, 0xd1,0xa8,0xd1,0xa1,0x12,0x14,0x3e,0x90,0xb, +0xc5,0xef,0xf0,0x90,0xb, 0xc5,0xe0,0x60,0xa, 0x90,0xb, 0xc8,0x74,0x1, 0xf0,0x90, +0xb, 0xcc,0xf0,0x90,0xb, 0xc8,0xe0,0xff,0xb4,0x1, 0xd, 0x90,0xa, 0x9a,0x74,0x14, +0xf0,0xe4,0x90,0xb, 0xc7,0xf0,0x80,0x26,0xef,0xb4,0x2, 0xe, 0x90,0xa, 0x9a,0x74, +0xc, 0xf0,0x90,0xb, 0xc7,0x74,0x39,0xf0,0x80,0x14,0x90,0xb, 0xc7,0xe0,0xc3,0x94, +0x3c,0x50,0x5, 0xe0,0x4, 0xf0,0x80,0x6, 0x90,0xa, 0x9a,0x74,0x1, 0xf0,0x90,0xb, +0xcc,0xe0,0x90,0xb, 0xcb,0xb4,0x1, 0x5, 0x74,0xa0,0xf0,0x80,0x3, 0x74,0x30,0xf0, +0x90,0xa, 0x95,0xe0,0x64,0x2, 0x60,0x2, 0x61,0xf9,0x90,0xa, 0x4e,0xe0,0xfe,0xa3, +0xe0,0xff,0x90,0xa, 0x55,0xe0,0xfc,0xa3,0xe0,0xfd,0x12,0x61,0x37,0xc0,0x6, 0xc0, +0x7, 0x90,0xa, 0x4c,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0xa, 0x53,0xe0,0xfc,0xa3,0xe0, +0xfd,0x12,0x61,0x37,0xd0,0xe0,0x2f,0xff,0xd0,0xe0,0x3e,0xfe,0x90,0xb, 0xcb,0xe0, +0xfd,0xd3,0xef,0x9d,0xee,0x94,0x0, 0x40,0x40,0x90,0x9, 0xba,0x12,0x6d,0x3d,0xc0, +0x83,0xc0,0x82,0x90,0x9, 0xbb,0xe0,0xff,0xc3,0x13,0xd0,0x82,0xd0,0x83,0x12,0x59, +0xf4,0x12,0x6d,0xe1,0x40,0x23,0x90,0x9, 0xbc,0x12,0x6d,0x3d,0xc0,0x83,0xc0,0x82, +0x90,0x9, 0xbd,0xe0,0xff,0xc3,0x13,0xd0,0x82,0xd0,0x83,0x12,0x59,0xf4,0x12,0x6d, +0xe1,0x40,0x6, 0x90,0xb, 0xc9,0x74,0x1, 0xf0,0x90,0xa, 0x95,0xe0,0x70,0x8, 0x90, +0xb, 0xc9,0xf0,0x90,0xb, 0xcc,0xf0,0x90,0xb, 0xc9,0xe0,0xb4,0x1, 0x8, 0x12,0x6c, +0x9d,0xb1,0x86,0x12,0x59,0x28,0x90,0x9, 0xe7,0xe0,0x70,0xb, 0x90,0xa, 0x40,0xe0, +0x70,0x5, 0x90,0xa, 0x9a,0x4, 0xf0,0xd1,0xa8,0x12,0x6d,0x54,0xd1,0xa1,0x12,0x10, +0xa3,0xd1,0xa8,0xd1,0xa1,0x12,0x5e,0xb9,0xbf,0x1, 0x8, 0x90,0xa, 0x99,0x74,0x50, +0xf0,0x80,0x5, 0xe4,0x90,0xa, 0x99,0xf0,0x90,0x9, 0xe7,0xe0,0xa3,0xf0,0xd1,0x86, +0x12,0x28,0x8b,0x90,0x9, 0xa7,0xe0,0xb4,0x6, 0xe, 0x90,0x9, 0xe7,0xe0,0xd3,0x94, +0x0, 0x40,0x5, 0xe4,0x90,0x9, 0xa7,0xf0,0xb1,0x86,0x11,0xa0,0x90,0x9, 0xe7,0xe0, +0x90,0xa, 0x94,0x12,0x6c,0x9c,0x75,0x27,0x1, 0x75,0x28,0xa, 0x75,0x29,0x9b,0x7b, +0x1, 0x7a,0x0, 0x79,0x0, 0x12,0x6a,0x59,0xd1,0xa8,0x12,0x6d,0x54,0xd1,0xa1,0x12, +0x57,0xe4,0xf1,0x94,0xb1,0x44,0x90,0xa, 0x94,0xe0,0x90,0x9, 0xe7,0xf0,0xe5,0x13, +0xd3,0x94,0x0, 0x40,0x13,0x90,0xa, 0x9a,0xe0,0x64,0x1, 0x60,0xb, 0x90,0xa, 0x9e, +0xe4,0xf0,0xa3,0x74,0x1e,0xf0,0x80,0x9, 0x90,0xa, 0x9e,0xe4,0xf0,0xa3,0x74,0x3c, +0xf0,0xb1,0x86,0x12,0x61,0x96,0xd1,0xa8,0x7b,0x1, 0x7a,0xb, 0x79,0x61,0x12,0x17, +0xa5,0x12,0x6d,0x71,0x7b,0x1, 0x7a,0xb, 0x79,0x61,0x12,0x5f,0xca,0x90,0xb, 0xa2, +0xe0,0x90,0xa, 0x94,0xf0,0x90,0x9, 0xe7,0xf0,0x12,0x6d,0x71,0x12,0x6d,0x54,0xb1, +0x86,0x12,0x18,0x42,0x75,0x24,0x1, 0x75,0x25,0xb, 0x75,0x26,0x61,0xf1,0x94,0x12, +0x2f,0xf9,0x12,0x6d,0x71,0x75,0x27,0x1, 0x75,0x28,0xb, 0x75,0x29,0x61,0xf1,0x94, +0x12,0x30,0xcd,0x75,0x24,0x1, 0x75,0x25,0x9, 0x75,0x26,0xaf,0x75,0x27,0x1, 0x75, +0x28,0x0, 0x75,0x29,0x0, 0x75,0x2a,0x1, 0x75,0x2b,0x0, 0x75,0x2c,0x83,0x75,0x2d, +0x1, 0x75,0x2e,0x9, 0x75,0x2f,0xba,0xf1,0x94,0x12,0x62,0x5c,0x21,0x7b,0x12,0x40, +0x18,0x2, 0x0, 0x19,0x12,0x4f,0xd1,0x12,0x63,0xb0,0x70,0x2f,0x12,0x6c,0xb2,0xd3, +0x94,0x0, 0x40,0x27,0x90,0x0, 0x4e,0x12,0x1, 0x65,0xff,0xe5,0x13,0xc3,0x9f,0x50, +0x16,0x90,0x0, 0x48,0x74,0x1, 0x12,0x1, 0xd7,0xe9,0x24,0x4c,0x12,0x57,0xcc,0x44, +0x8, 0x12,0x1, 0xc5,0x5, 0x13,0x22,0xe4,0xf5,0x13,0x22,0xe4,0xf5,0x13,0x12,0x63, +0xd2,0x54,0xf7,0x2, 0x1, 0xc5,0x7b,0x1, 0x7a,0x9, 0x79,0xba,0x22,0x12,0x6f,0x26, +0xf5,0x2c,0xd1,0x7f,0x85,0x2c,0x82,0x12,0x39,0xa7,0xfd,0xaf,0x2c,0xd1,0x78,0xe5, +0x2c,0x24,0x1c,0x12,0x6f,0x1e,0xd1,0x66,0xe5,0x2c,0x24,0x38,0xff,0xab,0x29,0xe5, +0x2b,0x24,0x38,0xd1,0x66,0xe5,0x2c,0x24,0x54,0xff,0xab,0x29,0xe5,0x2b,0x24,0x54, +0xd1,0x66,0x5, 0x2c,0xe5,0x2c,0xc3,0x94,0x1c,0x40,0xc7,0xd1,0x7f,0x90,0x0, 0x70, +0x12,0x1, 0x65,0xfd,0x7f,0x7e,0xd1,0x7d,0x90,0x0, 0x71,0x12,0x1, 0x65,0xfd,0x7f, +0x7f,0xd1,0x7d,0x90,0x0, 0x73,0x12,0x1, 0x65,0xfd,0x7f,0x81,0xd1,0x7d,0x90,0x0, +0x74,0x12,0x1, 0x65,0xfd,0x7f,0x82,0xd1,0x78,0xe4,0xf5,0x2c,0xe5,0x2c,0x24,0x83, +0xff,0xab,0x29,0xe5,0x2b,0x24,0x75,0xd1,0x66,0x5, 0x2c,0xe5,0x2c,0xc3,0x94,0x4, +0x40,0xea,0xe4,0xf5,0x2c,0xe5,0x2c,0x24,0x87,0xff,0xab,0x29,0xe5,0x2b,0x24,0x79, +0xd1,0x66,0x5, 0x2c,0xe5,0x2c,0xc3,0x94,0x2, 0x40,0xea,0xd1,0x7f,0x90,0x0, 0x7b, +0x12,0x1, 0x65,0xfd,0x7f,0x89,0xd1,0x7d,0x90,0x0, 0x7c,0x12,0x1, 0x65,0xfd,0x7f, +0x8c,0xd1,0x78,0xe4,0xf5,0x2c,0xe5,0x2c,0x24,0x8d,0xff,0xab,0x29,0xe5,0x2b,0x24, +0x7d,0xd1,0x66,0x5, 0x2c,0xe5,0x2c,0xc3,0x94,0x3, 0x40,0xea,0xd1,0x7f,0x12,0x3d, +0x6d,0xfd,0x7f,0x90,0x80,0x12,0xf9,0xe4,0x35,0x2a,0xfa,0xe5,0x2c,0x7c,0x0, 0x29, +0xf9,0xec,0x3a,0xfa,0x12,0x1, 0x4c,0xfd,0x8f,0xd9,0x8d,0xda,0x22,0xd1,0x78,0xab, +0x29,0xaa,0x2a,0xa9,0x2b,0x22,0x75,0x24,0x1, 0x75,0x25,0x0, 0x75,0x26,0x0, 0x75, +0x27,0x1, 0x75,0x28,0xa, 0x75,0x29,0x9b,0x75,0x2a,0x1, 0x75,0x2b,0x9, 0x75,0x2c, +0xba,0x7b,0x1, 0x7a,0x0, 0x79,0x83,0x22,0x75,0x24,0x1, 0x75,0x25,0x9, 0x75,0x26, +0xba,0x22,0x12,0x6f,0x26,0xf5,0x2c,0x12,0x46,0x11,0xe0,0xff,0xc3,0x94,0x1c,0x50, +0x3c,0x74,0xbd,0x25,0x2c,0x12,0x6f,0x4e,0xe0,0xd1,0x7f,0x8f,0x82,0x75,0x83,0x0, +0x12,0x1, 0xd7,0xe5,0x2c,0x20,0xe0,0xe, 0x12,0x6d,0xf4,0x54,0xf, 0xff,0xe9,0x24, +0x1c,0xf9,0xe4,0x3a,0x80,0xf, 0xe5,0x2c,0x12,0x6d,0xf4,0xc4,0x54,0xf, 0x12,0x6f, +0x1e,0xf9,0xe4,0x35,0x2a,0xfa,0x12,0x46,0x11,0xe0,0x12,0x47,0x77,0xab,0x29,0xe5, +0x2b,0x24,0x38,0xf9,0xe4,0x35,0x2a,0xfa,0xaf,0x2c,0x7e,0x0, 0x12,0x62,0x27,0x74, +0xc, 0x12,0x1, 0xc5,0xab,0x29,0xe5,0x2b,0x24,0x54,0xf9,0xe4,0x35,0x2a,0x12,0x62, +0x26,0xe4,0x12,0x1, 0xc5,0x5, 0x2c,0xe5,0x2c,0x64,0x1c,0x70,0x8a,0xd1,0x7f,0x90, +0x0, 0x70,0xe4,0x12,0x1, 0xd7,0x90,0x0, 0x71,0x74,0x7, 0x12,0x1, 0xd7,0x90,0x0, +0x72,0x74,0x17,0x12,0x1, 0xd7,0x90,0x0, 0x73,0x74,0x2, 0x12,0x1, 0xd7,0x90,0x0, +0x74,0x74,0x7f,0x12,0x1, 0xd7,0xe4,0xfd,0x12,0x46,0xab,0xd1,0x7f,0x7d,0x1, 0x12, +0x46,0xab,0xd1,0x7f,0x90,0x0, 0x7b,0x74,0xf, 0x12,0x1, 0xd7,0x90,0x0, 0x7c,0x74, +0x21,0x12,0x1, 0xd7,0x90,0x0, 0x7d,0x74,0x7, 0x12,0x1, 0xd7,0x90,0x0, 0x7e,0x74, +0x7, 0x12,0x1, 0xd7,0x90,0x0, 0x7f,0x74,0x7, 0x12,0x1, 0xd7,0x90,0x0, 0x80,0x74, +0x5d,0x2, 0x1, 0xd7,0x7b,0x1, 0x7a,0xa, 0x79,0x4c,0x22,0x8b,0x29,0x8a,0x2a,0x89, +0x2b,0xab,0x2c,0xaa,0x2d,0xa9,0x2e,0x12,0x63,0xe0,0xe4,0x12,0x46,0x1d,0x85,0x2c, +0x36,0x85,0x2d,0x37,0x85,0x2e,0x38,0xd1,0x7f,0x8b,0x33,0x8a,0x34,0x89,0x35,0x90, +0x0, 0x53,0x12,0x1, 0x65,0x90,0xb, 0xcd,0xf0,0x90,0x0, 0x52,0x12,0x1, 0x65,0x90, +0xb, 0xce,0xf0,0x12,0x6f,0x17,0x12,0x6f,0x10,0xe5,0x38,0x24,0x80,0xf9,0xe5,0x37, +0x34,0x3, 0x12,0x3d,0x73,0x85,0x37,0x3d,0x85,0x38,0x3e,0x75,0x39,0x1, 0x85,0x36, +0x49,0x85,0x37,0x4a,0x85,0x38,0x4b,0xab,0x33,0xaa,0x34,0xa9,0x35,0x12,0x59,0xfa, +0xef,0x64,0xaa,0x60,0xe9,0xe4,0xf5,0x3b,0xf5,0x3c,0xf5,0x3a,0xe4,0xf9,0x11,0x76, +0xfe,0xa3,0xe0,0x78,0x2, 0xf1,0x33,0xd8,0xfc,0xfd,0xac,0x6, 0xe5,0x3c,0x25,0xe0, +0xff,0xe5,0x3b,0x33,0xfe,0xe5,0x3e,0x2f,0xf5,0x82,0xe5,0x3d,0x3e,0xf5,0x83,0xec, +0x8d,0xf0,0x12,0x2, 0x60,0x5, 0x3c,0xe5,0x3c,0x70,0x2, 0x5, 0x3b,0x9, 0xb9,0x10, +0xcd,0x5, 0x3a,0xe5,0x3a,0xb4,0x1c,0xc4,0x5, 0x39,0xe5,0x39,0xd3,0x94,0x4, 0x40, +0x9d,0x90,0xb, 0xcd,0xe0,0xab,0x33,0xaa,0x34,0xa9,0x35,0x90,0x0, 0x53,0x12,0x1, +0xd7,0x90,0xb, 0xce,0xe0,0x90,0x0, 0x52,0x2, 0x1, 0xd7,0xe0,0xf8,0xa3,0xe0,0xf9, +0xa3,0xe0,0xfa,0xa3,0xe0,0xfb,0xe5,0x3c,0x25,0xe0,0xff,0xe5,0x3b,0x33,0xfe,0xe5, +0x40,0x2f,0xf5,0x82,0xe5,0x3f,0x3e,0xf5,0x83,0xe0,0x22,0x12,0x4f,0xd1,0xe4,0xf5, +0x2d,0xf5,0x2e,0x12,0x57,0xd3,0xf5,0x38,0xf5,0x3d,0xf5,0x3e,0x12,0x1c,0xc2,0x90, +0x0, 0x13,0x12,0x57,0xb9,0x75,0x46,0x0, 0x75,0x47,0x1, 0x75,0x48,0x0, 0x75,0x49, +0x1, 0xe4,0xf5,0x4a,0xf5,0x4b,0xf5,0x4c,0xf5,0x4d,0xf5,0x4e,0xf5,0x4f,0xf5,0x50, +0xf5,0x51,0xf5,0x52,0xf5,0x53,0xf5,0x54,0xf5,0x55,0x12,0x17,0x8d,0x12,0x3d,0x73, +0xe5,0x23,0x24,0x60,0xf9,0xe5,0x22,0x34,0x7, 0xaf,0x1, 0xf5,0x41,0x8f,0x42,0xe4, +0xf5,0x2f,0xe5,0x2f,0xb1,0x7e,0x90,0x0, 0xf, 0xe4,0x12,0x1, 0xd7,0x90,0x0, 0x10, +0xe4,0x12,0x1, 0xd7,0x5, 0x2f,0xe5,0x2f,0xb4,0x5, 0xe7,0xb1,0xa5,0x12,0x17,0x22, +0x70,0x2, 0xa1,0x7b,0xe4,0xf5,0x2f,0xb1,0xa5,0x12,0x17,0x22,0xff,0xe5,0x2f,0xc3, +0x9f,0x40,0x2, 0x81,0x5e,0xb1,0xaf,0x12,0x4, 0xe8,0x0, 0x0, 0x0, 0x0, 0xb1,0xea, +0x12,0x4, 0xe8,0x0, 0x0, 0x0, 0x0, 0xb1,0xce,0x12,0x4, 0xe8,0x0, 0x0, 0x0, 0x0, +0xd1,0x2a,0xf5,0x83,0x12,0x4, 0xe8,0x0, 0x0, 0x0, 0x0, 0x90,0xc, 0x1d,0x74,0x2, +0xf0,0xf5,0xf0,0xe5,0x2f,0x12,0x14,0x2b,0x12,0x1, 0x65,0xf1,0x71,0x40,0xa, 0x12, +0x10,0x9c,0x12,0x1, 0x4c,0xf1,0x94,0x50,0xb, 0x12,0x1c,0xc2,0xd1,0x38,0xc3,0x13, +0x90,0xc, 0x1d,0xf0,0xe5,0x2f,0x75,0xf0,0x2, 0xb1,0x81,0x12,0x14,0x38,0xf1,0x71, +0x40,0x7, 0x12,0x14,0x32,0xf1,0x94,0x50,0xb, 0x12,0x1c,0xc2,0xd1,0x38,0xc3,0x13, +0x90,0xc, 0x1d,0xf0,0xe5,0x2f,0x75,0xf0,0x2, 0xb1,0x81,0x12,0x14,0x38,0xf1,0x49, +0xa9,0x2c,0x75,0xf0,0x2, 0xe5,0x2f,0x12,0x14,0x2b,0x12,0x1, 0x65,0xf1,0xf2,0x2d, +0xff,0xec,0x35,0xf0,0xfe,0xe4,0xf5,0x43,0xef,0x25,0xe0,0xff,0xee,0x11,0x7d,0xfe, +0xa3,0xe0,0xff,0x12,0x1c,0xc2,0xf1,0x59,0x40,0x3, 0x75,0x43,0x1, 0xb1,0xa5,0x75, +0xf0,0x2, 0xe5,0x2f,0x12,0x14,0x2b,0xd1,0x47,0xe0,0xfe,0xc3,0xef,0x9e,0xf5,0x2d, +0xb1,0xa5,0x75,0xf0,0x2, 0xe5,0x2f,0x12,0x14,0x2b,0xd1,0x47,0xe0,0x2f,0xf1,0xaa, +0x40,0x2, 0x81,0x5a,0xe5,0x2f,0x75,0xf0,0x2, 0xd1,0x78,0x12,0x14,0x38,0xd1,0x4a, +0xe0,0xfe,0xc3,0xef,0x9e,0xf5,0x2e,0xe5,0x2f,0x75,0xf0,0x2, 0xb1,0x81,0x12,0x14, +0x38,0xd1,0x4a,0xe0,0x2f,0xff,0xe4,0x33,0xfe,0xad,0x2e,0xf1,0xb0,0x40,0x2, 0x81, +0x56,0x12,0x6f,0x8, 0x50,0x2, 0x81,0x52,0x12,0x10,0x9c,0x12,0x1, 0x4c,0xff,0xad, +0x2d,0x12,0x17,0x53,0x40,0x2, 0x81,0x52,0xc3,0xe5,0x2e,0x64,0x80,0x94,0x80,0x50, +0x2, 0x81,0x52,0x12,0x14,0x38,0xff,0xad,0x2e,0x12,0x17,0x53,0x40,0x2, 0x81,0x52, +0xaf,0x2d,0x12,0x57,0x96,0xef,0x2d,0xf5,0x3c,0xee,0x3c,0xf5,0x3b,0x11,0x76,0xfe, +0xa3,0xe0,0xff,0xd3,0x94,0x0, 0xee,0x64,0x80,0x94,0x80,0x50,0x2, 0x81,0x52,0xef, +0x95,0x45,0xee,0x95,0x44,0x40,0xc, 0xe5,0x2f,0xb1,0x7e,0x90,0x0, 0x10,0x74,0x1, +0x12,0x1, 0x92,0xe5,0x2d,0x25,0xe0,0xf5,0x3d,0xe5,0x2e,0x25,0xe0,0xf5,0x3e,0xb1, +0xa5,0x75,0xf0,0x2, 0xe5,0x2f,0x12,0x14,0x2b,0x12,0x1, 0x65,0xd1,0x3e,0x60,0x7b, +0xe5,0x2f,0x75,0xf0,0x2, 0xb1,0x81,0x12,0x14,0x38,0xd1,0x51,0x60,0x6d,0xb1,0xaf, +0xc0,0x83,0xc0,0x82,0xb1,0xbf,0xc0,0x0, 0xc0,0x1, 0xc0,0x2, 0xc0,0x3, 0x11,0x76, +0xd1,0xf, 0xd0,0x3, 0xd0,0x2, 0xd0,0x1, 0xd0,0x0, 0xb1,0x97,0xd0,0x82,0xd0,0x83, +0xd1,0x27,0xf5,0x83,0xc0,0x83,0xc0,0x82,0x11,0x6b,0xb1,0x8d,0xd0,0x82,0xd0,0x83, +0x12,0x4, 0xdc,0xb1,0xea,0xc0,0x83,0xc0,0x82,0xb1,0xbf,0xc0,0x0, 0xc0,0x1, 0xc0, +0x2, 0xc0,0x3, 0x11,0x76,0xf1,0x64,0xaf,0x2d,0xd1,0x1d,0xd0,0x3, 0xd0,0x2, 0xd0, +0x1, 0xd0,0x0, 0xb1,0x97,0xd0,0x82,0xd0,0x83,0x12,0x4, 0xdc,0xe5,0x2f,0x25,0xe0, +0x25,0xe0,0x24,0xf5,0xf5,0x82,0xe4,0x34,0xb, 0x81,0x3e,0xe4,0xf5,0x39,0xf5,0x3a, +0xb1,0xa5,0x12,0x17,0x22,0xff,0xc3,0xe5,0x3a,0x9f,0x74,0x80,0xf8,0x65,0x39,0x98, +0x50,0x4c,0xe5,0x2f,0x65,0x3a,0x70,0x2, 0xe5,0x39,0x60,0x38,0xf1,0x41,0x12,0x17, +0x48,0xd1,0x3e,0x60,0xd, 0xf1,0x80,0x12,0x14,0x38,0xd1,0x51,0x60,0x4, 0x74,0xff, +0x80,0x1c,0xf1,0x41,0x33,0xb1,0xa5,0x12,0x17,0x49,0xfd,0x7b,0x4, 0xd1,0x41,0x60, +0x13,0xf1,0x80,0x12,0x14,0x38,0xfd,0x7b,0x4, 0xd1,0x54,0x60,0x7, 0xe4,0xf5,0x39, +0xf5,0x3a,0x80,0xa, 0x5, 0x3a,0xe5,0x3a,0x70,0x2, 0x5, 0x39,0x80,0xa2,0xe5,0x3a, +0x45,0x39,0x70,0x68,0xb1,0xea,0xc0,0x83,0xc0,0x82,0xb1,0xbf,0xc0,0x0, 0xc0,0x1, +0xc0,0x2, 0xc0,0x3, 0x11,0x76,0xf1,0xc1,0xaf,0x2d,0xd1,0x1d,0xd0,0x3, 0xd0,0x2, +0xd0,0x1, 0xd0,0x0, 0xb1,0x97,0xd0,0x82,0xd0,0x83,0xb1,0xac,0xc0,0x83,0xc0,0x82, +0xb1,0xbf,0xc0,0x0, 0xc0,0x1, 0xc0,0x2, 0xc0,0x3, 0x11,0x76,0xf1,0xc1,0xd1,0x1b, +0xd0,0x3, 0xd0,0x2, 0xd0,0x1, 0xd0,0x0, 0xb1,0x97,0xd0,0x82,0xd0,0x83,0xb1,0xcb, +0xc0,0x83,0xc0,0x82,0x11,0x6b,0xf1,0x51,0xb1,0x90,0xd0,0x82,0xd0,0x83,0xd1,0x27, +0xf5,0x83,0xc0,0x83,0xc0,0x82,0x11,0x6b,0xf1,0x51,0x80,0x6d,0xe5,0x3a,0xf4,0x70, +0x3, 0xe5,0x39,0xf4,0x60,0x6c,0xb1,0xea,0xc0,0x83,0xc0,0x82,0xb1,0xbf,0xc0,0x0, +0xc0,0x1, 0xc0,0x2, 0xc0,0x3, 0x11,0x76,0xf1,0x64,0xaf,0x2d,0xd1,0x1d,0xd0,0x3, +0xd0,0x2, 0xd0,0x1, 0xd0,0x0, 0xb1,0x97,0xd0,0x82,0xd0,0x83,0xb1,0xac,0xc0,0x83, +0xc0,0x82,0xb1,0xbf,0xc0,0x0, 0xc0,0x1, 0xc0,0x2, 0xc0,0x3, 0x11,0x76,0xd1,0xf, +0xd0,0x3, 0xd0,0x2, 0xd0,0x1, 0xd0,0x0, 0xb1,0x97,0xd0,0x82,0xd0,0x83,0xb1,0xcb, +0xc0,0x83,0xc0,0x82,0x11,0x6b,0xb1,0x8d,0xd0,0x82,0xd0,0x83,0xd1,0x27,0xf5,0x83, +0xc0,0x83,0xc0,0x82,0x11,0x6b,0xfe,0xa3,0xe0,0xb1,0x90,0xd0,0x82,0xd0,0x83,0x12, +0x4, 0xdc,0x5, 0x2e,0x21,0xf7,0x5, 0x2d,0x21,0xd0,0x5, 0x2f,0x21,0x7, 0xe4,0xf5, +0x2f,0xb1,0xa5,0x12,0x17,0x22,0xff,0xe5,0x2f,0xc3,0x9f,0x40,0x2, 0xa1,0x71,0xe5, +0x2f,0x75,0xf0,0x2, 0xd1,0x78,0x12,0x14,0x38,0xf1,0x49,0xa9,0x2c,0x75,0xf0,0x2, +0xe5,0x2f,0x12,0x14,0x2b,0x12,0x1, 0x65,0xf1,0xf2,0x2d,0xff,0xec,0x35,0xf0,0x12, +0x17,0x2e,0x11,0x7d,0xfe,0xa3,0xe0,0xff,0x12,0x1c,0xc2,0xf1,0x59,0x50,0x2, 0xa1, +0x6d,0xb1,0xaf,0xc0,0x83,0xc0,0x82,0xb1,0xde,0x78,0x6, 0x12,0x4, 0xc9,0xd0,0x82, +0xd0,0x83,0xd1,0x27,0xf5,0x83,0xb1,0xbf,0xb1,0xaf,0xb1,0xde,0x12,0x3, 0xfd,0xef, +0x24,0x20,0xf5,0x31,0xe4,0x3e,0xf5,0x30,0xb1,0xea,0xc0,0x83,0xc0,0x82,0xb1,0xde, +0x78,0x6, 0x12,0x4, 0xc9,0xd0,0x82,0xd0,0x83,0xb1,0xcb,0xb1,0xbf,0xb1,0xea,0xb1, +0xde,0x12,0x3, 0xfd,0xef,0x24,0x20,0xf5,0x35,0xe4,0x3e,0xf5,0x34,0xb1,0x7c,0x90, +0x0, 0xa, 0xe5,0x30,0x85,0x31,0xf0,0x12,0x3, 0x45,0x90,0x0, 0xc, 0xe5,0x34,0x85, +0x35,0xf0,0x12,0x3, 0x45,0xb1,0xce,0xc0,0x83,0xc0,0x82,0xb1,0xde,0x12,0x1c,0xc2, +0x90,0x0, 0x12,0x12,0x1, 0x65,0xf9,0xf8,0x12,0x4, 0xb6,0xd0,0x82,0xd0,0x83,0xb1, +0xcb,0xb1,0xde,0xe4,0x7b,0x7f,0xfa,0xf9,0xf8,0xc3,0x12,0x4, 0xa5,0x50,0x9, 0xb1, +0xce,0x12,0x4, 0xe8,0x0, 0x0, 0x0, 0x7f,0xb1,0xce,0xa3,0xa3,0xa3,0xe0,0xfd,0xb1, +0x7c,0x12,0x6e,0xda,0xe5,0x2f,0xb1,0x7e,0xd1,0x38,0xfd,0xe5,0x38,0x75,0xf0,0x7, +0xa4,0xb1,0x84,0x90,0x0, 0x10,0xed,0x12,0x1, 0xd7,0xd1,0x38,0xd3,0x94,0xf, 0x40, +0xa, 0xb1,0x7c,0x90,0x0, 0x10,0x74,0xf, 0x12,0x1, 0xd7,0x5, 0x38,0x5, 0x2f,0x81, +0x61,0xb1,0xa5,0x90,0x0, 0x2d,0xe5,0x38,0x12,0x1, 0xd7,0x22,0xe5,0x38,0x75,0xf0, +0x7, 0xa4,0xab,0x2a,0x25,0x2c,0xf9,0xe5,0x2b,0x35,0xf0,0xfa,0x22,0xfe,0xa3,0xe0, +0xff,0xee,0x33,0x95,0xe0,0xfd,0xfc,0xeb,0x2f,0xff,0xea,0x3e,0xfe,0xe9,0x3d,0xfd, +0xe8,0x3c,0xfc,0x22,0xff,0xab,0x2a,0xaa,0x2b,0xa9,0x2c,0x22,0x12,0x4, 0xdc,0xe5, +0x2f,0x25,0xe0,0x25,0xe0,0x24,0xcd,0xf5,0x82,0xe4,0x34,0xb, 0xf5,0x83,0x22,0xe0, +0xf8,0xa3,0xe0,0xf9,0xa3,0xe0,0xfa,0xa3,0xe0,0xfb,0x22,0x12,0x4, 0xdc,0xe5,0x2f, +0x25,0xe0,0x25,0xe0,0x24,0xf5,0xf5,0x82,0xe4,0x34,0xb, 0xf5,0x83,0x22,0xe0,0xfc, +0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x22,0xe5,0x2f,0x25,0xe0,0x25,0xe0, +0x24,0xe1,0xf5,0x82,0xe4,0x34,0xb, 0xf5,0x83,0x22,0x7e,0x0, 0x7c,0x0, 0x12,0x61, +0x37,0xeb,0xfd,0xd3,0xef,0x9d,0xee,0x9c,0x7f,0x0, 0x50,0x2, 0x7f,0x1, 0x22,0xfe, +0xa3,0xe0,0xfb,0xaa,0x6, 0xea,0x33,0x95,0xe0,0xf9,0xf8,0xaf,0x2e,0xef,0x33,0x95, +0xe0,0xfe,0xfd,0xfc,0x2, 0x3, 0x72,0x12,0x4, 0xdc,0xe5,0x2f,0x25,0xe0,0x25,0xe0, +0x24,0x9, 0xf5,0x82,0xe4,0x34,0xc, 0x22,0x90,0x0, 0x10,0x2, 0x1, 0x65,0xfd,0x7b, +0x2, 0xaf,0x3d,0xb1,0xfa,0xef,0x22,0x12,0x1, 0x65,0xc3,0x13,0xff,0x90,0xc, 0x1d, +0x22,0xfd,0x7b,0x2, 0xaf,0x3e,0xb1,0xfa,0xef,0x22,0x12,0x2, 0xa1,0xff,0xe5,0x39, +0x25,0xe0,0x25,0xe0,0x24,0x3d,0xf5,0x82,0xe4,0x34,0xc, 0xf5,0x83,0xe5,0xf0,0xf0, +0xa3,0xef,0xf0,0xe5,0x38,0x75,0xf0,0x7, 0xa4,0x29,0xf9,0xea,0x35,0xf0,0xfa,0x22, +0x8b,0x33,0x8a,0x34,0x89,0x35,0xae,0x2, 0xaf,0x1, 0x7b,0x92,0xe4,0xfd,0xf1,0x1b, +0xae,0x37,0xaf,0x38,0x7b,0x4f,0xf1,0x1b,0xe4,0xf5,0x39,0xab,0x33,0xe5,0x35,0x24, +0xa, 0xf9,0xe4,0x35,0x34,0xfa,0xe5,0x39,0xd1,0x75,0xf1,0x2, 0xe5,0x39,0x75,0xf0, +0x7, 0xa4,0xab,0x36,0x25,0x38,0xf9,0xe5,0x37,0x35,0xf0,0xfa,0xf1,0x2, 0xab,0x36, +0xe5,0x38,0x24,0x23,0xf9,0xe4,0x35,0x37,0xfa,0xe5,0x39,0xd1,0x75,0xf1,0x2, 0x5, +0x39,0xe5,0x39,0xc3,0x94,0x5, 0x40,0xc3,0xf1,0x3a,0x90,0x0, 0x4e,0x74,0x1, 0x12, +0x1, 0xd7,0xe4,0xf5,0x9, 0xf5,0xd, 0xf5,0xe, 0xf5,0xc, 0x12,0x46,0x1d,0xe4,0xa3, +0xf0,0x90,0xc, 0x8e,0xf0,0xa3,0xf0,0xa3,0xf0,0xc2,0x0, 0x90,0xc, 0x82,0xf0,0xa3, +0xf0,0x22,0x74,0xff,0xf5,0xf0,0x12,0x3, 0x26,0x90,0x0, 0x2, 0x74,0xff,0xf5,0xf0, +0x12,0x3, 0x45,0x90,0x0, 0x4, 0x74,0xff,0x2, 0x1, 0xd7,0x8e,0x3a,0x8f,0x3b,0x5, +0x3b,0xe5,0x3b,0xae,0x3a,0x70,0x2, 0x5, 0x3a,0x14,0xf5,0x82,0x8e,0x83,0xed,0xf0, +0xdb,0xed,0x22,0xce,0xa2,0xe7,0x13,0xce,0x13,0x22,0xab,0x36,0xaa,0x37,0xa9,0x38, +0x22,0xe5,0x3a,0x25,0xe0,0xff,0xe5,0x39,0x22,0xc3,0x13,0xfd,0x7c,0x0, 0xaa,0x2b, +0x22,0xa2,0xe7,0x13,0xfe,0xa3,0xe0,0x13,0x22,0x12,0x2, 0x76,0xfd,0xc3,0xef,0x9d, +0xee,0x95,0xf0,0x22,0xfe,0xa3,0xe0,0xfb,0xaa,0x6, 0xea,0x33,0x95,0xe0,0xf9,0xf8, +0x22,0xc3,0x13,0x75,0x3b,0x0, 0xf5,0x3c,0xd3,0x94,0x0, 0xe5,0x3b,0x94,0x0, 0x22, +0xe5,0x3a,0x25,0xe0,0xff,0xe5,0x39,0x33,0xfe,0xab,0x2a,0xe5,0x2c,0x2f,0xf9,0xe5, +0x2b,0x3e,0xfa,0x22,0x24,0xff,0xff,0xe4,0x34,0xff,0xcf,0xc3,0x95,0x3c,0xcf,0x95, +0x3b,0xfe,0xd3,0xef,0x94,0x0, 0xee,0x94,0x0, 0x22,0xff,0xe4,0x33,0xfe,0xad,0x2d, +0xed,0x33,0x95,0xe0,0xfc,0xd3,0xed,0x9f,0xee,0x64,0x80,0xf8,0xec,0x64,0x80,0x98, +0x22,0xfe,0xa3,0xe0,0xff,0xee,0x33,0x95,0xe0,0xfd,0xfc,0x78,0x1, 0x12,0x4, 0xb6, +0xa8,0x4, 0xa9,0x5, 0xaa,0x6, 0xab,0x7, 0x22,0xaf,0x3b,0xef,0x33,0x95,0xe0,0xfe, +0xef,0x25,0xe0,0xfd,0xee,0x33,0xfc,0x74,0xcd,0x2d,0xf5,0x82,0x74,0xb, 0x3c,0xf5, +0x83,0xe0,0xc3,0x13,0x75,0xf0,0x10,0xa4,0x22,0x12,0x4f,0xd1,0x12,0x63,0xa9,0xd3, +0x9f,0x50,0x2, 0x1, 0xaf,0x90,0x0, 0x4d,0x12,0x1, 0x65,0xfe,0xe5,0x14,0xd3,0x9e, +0x40,0x2, 0x1, 0xb2,0x5, 0x14,0x8f,0x27,0x12,0x17,0x9e,0x12,0x63,0xb0,0xff,0xe5, +0x27,0xc3,0x9f,0x50,0x7c,0xe5,0x27,0x12,0x6b,0xda,0x29,0xf9,0xea,0x3e,0x11,0xc6, +0xfd,0x7c,0x0, 0xab,0x24,0xe5,0x26,0x24,0x28,0xf9,0xe4,0x35,0x25,0x12,0x6c,0x90, +0x12,0x1c,0xad,0x90,0x0, 0x4, 0x12,0x0, 0x1e,0xff,0x7e,0x0, 0xab,0x24,0xe5,0x26, +0x24,0x23,0xf9,0xe4,0x35,0x25,0xfa,0xe9,0x2f,0xf9,0xee,0x12,0x6c,0x95,0xab,0x24, +0xe5,0x26,0x24,0x2d,0xf9,0xe4,0x35,0x25,0xfa,0xc0,0x3, 0xc0,0x2, 0xc0,0x1, 0xe5, +0x27,0x12,0x14,0x12,0xd0,0x1, 0xd0,0x2, 0xd0,0x3, 0xd1,0xd4,0xab,0x24,0xe5,0x26, +0x24,0x37,0xf9,0xe4,0x35,0x25,0xfa,0xc0,0x3, 0xc0,0x2, 0xc0,0x1, 0xab,0x21,0xe5, +0x23,0x2f,0x12,0x14,0x1d,0xd0,0x1, 0xd0,0x2, 0xd0,0x3, 0xd1,0xd4,0x5, 0x27,0x1, +0x18,0x12,0x17,0x9e,0x12,0x6c,0xb2,0x90,0x0, 0x48,0x12,0x1, 0xd7,0x80,0x3, 0xe4, +0xf5,0x14,0x12,0x17,0x9e,0x12,0x63,0xb0,0x70,0xb, 0xe9,0x24,0x4c,0x12,0x57,0xcc, +0x54,0xfe,0x12,0x1, 0xc5,0x22,0xfa,0x90,0x0, 0x4, 0x2, 0x1, 0x65,0x12,0x4f,0xd1, +0x12,0x4f,0xbb,0x85,0x25,0x36,0x85,0x26,0x37,0x12,0x3e,0x3f,0x12,0x17,0x9e,0x12, +0x6d,0xee,0x20,0xe0,0x11,0x13,0x13,0x54,0x3f,0x20,0xe0,0xa, 0x12,0x6d,0xee,0xc3, +0x13,0x20,0xe0,0x2, 0x81,0xf6,0x12,0x63,0xb0,0xf5,0x2e,0x12,0x10,0x9c,0x12,0x1, +0x4c,0xff,0xe5,0x2e,0xd3,0x9f,0x40,0x2, 0x8f,0x2e,0x20,0x1, 0x8, 0x75,0x2c,0xd, +0x75,0x2d,0xb0,0x80,0x6, 0x75,0x2c,0xd, 0x75,0x2d,0xca,0x85,0x2d,0x82,0x85,0x2c, +0x83,0x74,0xaa,0xf0,0xa3,0x12,0x6d,0xa4,0x74,0x1a,0x12,0x6d,0xa4,0xa3,0xe5,0x2e, +0xf0,0x12,0x17,0x9e,0x90,0x0, 0x46,0x12,0x1, 0x65,0xff,0xe5,0x2d,0x24,0x4, 0x12, +0x6c,0xe9,0xef,0xf0,0xe4,0xf5,0x2f,0x12,0x10,0x9c,0x12,0x1, 0x4c,0xff,0xe5,0x2f, +0xc3,0x9f,0x50,0x1d,0xe5,0x2f,0x12,0x1c,0x5b,0x11,0xc7,0xff,0x12,0x10,0x9c,0x12, +0x6e,0x1a,0x50,0x9, 0x74,0x87,0x25,0x2f,0xd1,0xf4,0x74,0x1, 0xf0,0x5, 0x2f,0x80, +0xd6,0xe4,0xf5,0x2a,0x74,0x7d,0x25,0x2a,0x12,0x6c,0xf5,0xe4,0xf0,0x5, 0x2a,0xe5, +0x2a,0xb4,0x5, 0xf0,0xe4,0xf5,0x2a,0xe5,0x2a,0x12,0x1c,0x5b,0x11,0xc7,0xff,0x12, +0x10,0x9c,0x12,0x6e,0x1a,0x50,0x9, 0x74,0x7d,0x2f,0x12,0x6c,0xf5,0x74,0x1, 0xf0, +0x5, 0x2a,0xe5,0x2a,0xb4,0x5, 0xe0,0xe4,0xf5,0x2a,0x12,0x10,0x9c,0x12,0x6b,0xa3, +0x40,0x2, 0x61,0x56,0xd1,0xf0,0xe0,0x60,0x2, 0x61,0x52,0xe5,0x2a,0x12,0x1c,0x5b, +0x11,0xc7,0xf4,0x70,0x2, 0x61,0x52,0x12,0x10,0x9c,0x12,0x1, 0x4c,0xf5,0x2f,0xe5, +0x2f,0xc3,0x94,0x5, 0x40,0x2, 0x41,0xc4,0xe5,0x2f,0x12,0x1c,0x5b,0x11,0xc7,0xff, +0x12,0x10,0x9c,0x12,0x6e,0x1a,0x40,0x2, 0x41,0xc0,0x12,0x62,0x3a,0x64,0x1, 0x70, +0x7c,0x12,0x17,0x9e,0x75,0xf0,0x7, 0xe5,0x2a,0x12,0x14,0x2b,0x12,0x1c,0x87,0x12, +0x6c,0xce,0xc0,0x3, 0xc0,0x2, 0xc0,0x1, 0xe5,0x2f,0x12,0x1c,0x5b,0x12,0x14,0x22, +0xd0,0x1, 0xd0,0x2, 0xd0,0x3, 0x12,0x6d,0x4e,0xe5,0x2a,0x12,0x1c,0x5b,0x90,0x0, +0x2, 0x12,0x1c,0x87,0x12,0x6c,0xa7,0xfa,0xc0,0x3, 0xc0,0x2, 0xc0,0x1, 0xe5,0x2f, +0x12,0x1c,0x5b,0x12,0x14,0x22,0xd0,0x1, 0xd0,0x2, 0xd0,0x3, 0x12,0x6d,0x4e,0x12, +0x6c,0xce,0xc0,0x3, 0xc0,0x2, 0xc0,0x1, 0x12,0x14,0x10,0xd0,0x1, 0xd0,0x2, 0xd0, +0x3, 0xd1,0xd4,0x12,0x6c,0xa7,0xfa,0xc0,0x3, 0xc0,0x2, 0xc0,0x1, 0xab,0x21,0xe5, +0x23,0x2f,0x12,0x14,0x1d,0xd0,0x1, 0xd0,0x2, 0xd0,0x3, 0xd1,0xd4,0x12,0x17,0x9e, +0x75,0xf0,0x7, 0xe5,0x2f,0x12,0x14,0x2b,0x12,0x1c,0xa2,0x75,0xf0,0x7, 0xe5,0x2a, +0x12,0x14,0x2b,0x12,0x5f,0x65,0xe5,0x2f,0x12,0x2e,0x75,0x90,0x0, 0x2, 0x12,0x1c, +0x87,0xe5,0x2a,0x12,0x1c,0x5b,0x90,0x0, 0x2, 0x12,0x6d,0x4e,0xe5,0x2f,0x12,0x1c, +0x5b,0x11,0xc7,0xfd,0x12,0x6d,0x60,0x12,0x1c,0x61,0x90,0x0, 0x4, 0xed,0x12,0x1, +0xd7,0xe5,0x2f,0x12,0x1c,0x5b,0x12,0x6b,0xfd,0xd1,0xf0,0x74,0x1, 0xf0,0x80,0x4, +0x5, 0x2f,0x21,0xcf,0xe5,0x2f,0x64,0x5, 0x60,0x2, 0x61,0x52,0xf5,0x2b,0x12,0x10, +0x9c,0x12,0x1, 0x4c,0xff,0xe5,0x2b,0xc3,0x9f,0x50,0x77,0x12,0x6c,0xf1,0xe0,0x70, +0x6d,0x12,0x6c,0xf1,0x74,0x1, 0xf0,0xd1,0xf0,0x74,0x1, 0xf0,0x12,0x17,0x9e,0x75, +0xf0,0x7, 0xe5,0x2a,0x12,0x14,0x2b,0x12,0x1c,0xa2,0x12,0x1c,0xc2,0x12,0x6d,0xb9, +0x12,0x5f,0x62,0xe5,0x2a,0x12,0x1c,0x5b,0x12,0x1c,0x9f,0x12,0x1c,0xc2,0x12,0x6d, +0x36,0xe5,0x2b,0x12,0x5f,0x62,0x12,0x6c,0xce,0xc0,0x3, 0xc0,0x2, 0xc0,0x1, 0x12, +0x14,0x10,0xd0,0x1, 0xd0,0x2, 0xd0,0x3, 0xd1,0xd4,0x12,0x6c,0xa7,0xfa,0xc0,0x3, +0xc0,0x2, 0xc0,0x1, 0xab,0x21,0xe5,0x23,0x2f,0x12,0x14,0x1d,0xd0,0x1, 0xd0,0x2, +0xd0,0x3, 0xd1,0xd4,0xe5,0x2a,0x12,0x1c,0x5b,0x12,0x6c,0x6b,0x80,0x4, 0x5, 0x2b, +0x41,0xce,0x5, 0x2a,0x21,0xaa,0xe4,0xf5,0x2f,0x74,0x87,0x25,0x2f,0xd1,0xf4,0xe4, +0xf0,0x5, 0x2f,0xe5,0x2f,0xb4,0x5, 0xf1,0x12,0x10,0x9c,0x12,0x1, 0x4c,0xf5,0x2a, +0xe5,0x2a,0xc3,0x94,0x5, 0x50,0x1e,0x12,0x17,0x9e,0x75,0xf0,0x7, 0xe5,0x2a,0x12, +0x14,0x2b,0xd1,0xd4,0xe5,0x2a,0x12,0x2e,0x75,0x90,0x0, 0x2, 0xd1,0xd4,0x12,0x6b, +0xfd,0x5, 0x2a,0x80,0xdb,0xe4,0xf5,0x2e,0xf5,0x2a,0x12,0x10,0x9c,0x12,0x6b,0xa3, +0x40,0x2, 0x81,0x96,0xe5,0x2a,0x25,0xe0,0x25,0xe0,0xf5,0x2b,0xe5,0x2a,0x12,0x1c, +0x5b,0x90,0x0, 0x5, 0x12,0x1, 0x65,0xff,0xa2,0x1, 0xe4,0xfc,0x33,0xfd,0x90,0xd, +0xec,0x75,0xf0,0xa, 0xb1,0x1, 0xef,0xf0,0x90,0x0, 0x6, 0x12,0x1, 0x65,0xc4,0x54, +0xf0,0xff,0x90,0xd, 0x9c,0x75,0xf0,0xa, 0xed,0xb1,0x1, 0xef,0xf0,0xaa,0x22,0xa9, +0x23,0x75,0xf0,0x7, 0xe5,0x2a,0x12,0x14,0x2b,0x12,0x6f,0x56,0xff,0xe5,0x2b,0x24, +0x5, 0xfd,0xec,0xd1,0xe3,0xef,0xf0,0x75,0xf0,0x7, 0xe5,0x2a,0x12,0x14,0x2b,0x12, +0x2, 0xa1,0xff,0xe5,0x2b,0x24,0x6, 0xd1,0xe1,0xef,0xf0,0xe5,0x2a,0x12,0x2e,0x75, +0x90,0x0, 0x2, 0x12,0x6f,0x56,0xd1,0xdc,0x12,0x6d,0x5e,0x12,0x1c,0x61,0x90,0x0, +0x2, 0x12,0x2, 0xa1,0xff,0xe5,0x2b,0x24,0x8, 0xd1,0xe1,0x12,0x6d,0x5e,0x12,0x1c, +0x61,0x11,0xc7,0xc4,0x54,0xf0,0xd1,0xdc,0xe0,0x2f,0x12,0x6d,0x5f,0x12,0x1c,0x61, +0x11,0xc7,0xff,0xf4,0x60,0x36,0x12,0x62,0x3a,0xc4,0x33,0x33,0x54,0xc0,0xff,0xe5, +0x2b,0x24,0x5, 0xd1,0xe1,0xe0,0x2f,0xf0,0xe5,0x2a,0x12,0x1c,0x5b,0x11,0xc7,0xff, +0x12,0x62,0x3a,0xb4,0x1, 0x12,0xa2,0x1, 0xe4,0x33,0x90,0xd, 0xec,0x75,0xf0,0xa, +0x12,0x5, 0x19,0xee,0xb1,0x5, 0xe4,0xf0,0x5, 0x2e,0x80,0x16,0xe5,0x2b,0x24,0x5, +0xff,0xe4,0x33,0xfe,0xe5,0x2d,0x2f,0xf5,0x82,0xe5,0x2c,0x3e,0xf5,0x83,0xe0,0x24, +0xc0,0xf0,0x5, 0x2a,0x61,0x9a,0xe5,0x2e,0xc4,0x54,0xf0,0xff,0x12,0x6d,0xa5,0xa3, +0xe0,0x2f,0xf0,0x12,0x6c,0xe5,0xe4,0xf0,0xf5,0x2a,0x12,0x6c,0xe5,0xc0,0x83,0xc0, +0x82,0xe0,0xff,0xe5,0x2d,0x25,0x2a,0x12,0x6c,0xe9,0xe0,0xfe,0xef,0x6e,0xd0,0x82, +0xd0,0x83,0xf0,0x5, 0x2a,0xe5,0x2a,0xb4,0x19,0xe0,0xb2,0x1, 0x7f,0x1, 0x91,0xf8, +0x12,0x17,0x9e,0x12,0x6d,0xee,0xff,0x13,0x13,0x54,0x3f,0x30,0xe0,0x6, 0x12,0x1c, +0xc2,0x12,0x3d,0xf0,0x12,0x63,0xd2,0x54,0xfe,0x12,0x1, 0xc5,0x54,0xfb,0x12,0x1, +0xc5,0x54,0xfd,0x2, 0x1, 0xc5,0xe4,0xff,0xef,0x70,0x3, 0xd2,0x98,0x22,0xc2,0x98, +0x22,0x12,0x5, 0x19,0xec,0x75,0xf0,0xa, 0xa4,0x25,0x83,0xf5,0x83,0xe5,0x82,0x25, +0x2a,0xf5,0x82,0xe4,0x35,0x83,0xf5,0x83,0x22,0x8e,0x21,0x8f,0x22,0x90,0xe, 0x1, +0x74,0x2d,0xf0,0xa3,0x74,0x3c,0xf0,0x90,0xe, 0x6, 0x74,0xa0,0xf0,0xa3,0x74,0x1, +0xf0,0xa3,0x74,0xc8,0xf0,0xa3,0x74,0x7, 0xf0,0xa3,0x74,0x28,0xf0,0x90,0xe, 0x11, +0x74,0x2, 0xf0,0x90,0xe, 0x21,0x74,0xff,0xf0,0x90,0xe, 0x25,0x74,0x1, 0xf0,0xe4, +0xa3,0xf0,0xa3,0x74,0x11,0xf0,0xa3,0x74,0x1, 0xf0,0xa3,0x74,0x57,0xf0,0xe4,0xa3, +0xf0,0xa3,0xf0,0x90,0xe, 0x30,0x4, 0xf0,0x90,0xe, 0x33,0x74,0x5, 0xf0,0xa3,0x74, +0x2, 0xf0,0x8d,0x82,0x8c,0x83,0xe4,0xf0,0xa3,0x4, 0xf0,0xed,0x24,0x9, 0xd1,0xc6, +0xe4,0xf0,0x8d,0x82,0x8c,0x83,0xa3,0xa3,0xa3,0x74,0xe, 0xf0,0xed,0x24,0x4, 0xd1, +0xc6,0x74,0x7, 0xf0,0xed,0x24,0x5, 0xd1,0xc6,0x74,0x28,0xf0,0xed,0x24,0x6, 0xd1, +0xc6,0x74,0x28,0xf0,0xed,0x24,0x8, 0xd1,0xc6,0x74,0xc8,0xf0,0xed,0x24,0xa, 0xd1, +0xc6,0x74,0x1, 0xf0,0xed,0x24,0x7, 0xd1,0xc6,0xe4,0xf0,0x8f,0x82,0x8e,0x83,0xf0, +0xa3,0x74,0xb4,0x12,0x6f,0x2e,0x74,0x2d,0x12,0x6f,0x2e,0xa3,0xe4,0xf0,0xa3,0x74, +0x3c,0xd1,0xaf,0x24,0x15,0xb1,0x11,0x74,0x3, 0xd1,0xaf,0x24,0x16,0xb1,0x11,0x74, +0x3, 0xd1,0xaf,0x24,0x1a,0xb1,0x11,0xe4,0xd1,0xaf,0x24,0x1b,0xb1,0x11,0x74,0xe, +0xd1,0xaf,0x24,0x17,0xb1,0x11,0xe4,0xd1,0xaf,0x24,0x18,0xb1,0x11,0x74,0x1, 0xf0, +0xa3,0x74,0x11,0xd1,0xaf,0x24,0x1c,0xb1,0x11,0xe4,0xf0,0xa3,0x74,0xfa,0xd1,0xaf, +0x24,0x1e,0xb1,0x11,0x74,0xa, 0xd1,0xaf,0x24,0x1f,0xb1,0x11,0x74,0x5, 0xd1,0xaf, +0x24,0x20,0xb1,0x11,0x74,0x1e,0xd1,0xaf,0x24,0x21,0xb1,0x11,0x74,0x2, 0xd1,0xaf, +0x24,0x9, 0xb1,0x11,0x74,0x2, 0xf0,0xa3,0x74,0x44,0xd1,0xaf,0x24,0xf, 0xb1,0x11, +0xe4,0xd1,0xaf,0x24,0x10,0xb1,0x11,0x74,0x3, 0xd1,0xaf,0x24,0x11,0xb1,0x11,0x74, +0x2, 0xd1,0xaf,0x24,0x12,0xb1,0x11,0x74,0x4, 0xd1,0xaf,0x24,0x13,0xb1,0x11,0xd1, +0xaa,0x24,0xb, 0xb1,0x11,0xd1,0xaa,0x24,0xd, 0xb1,0x11,0x74,0x19,0xf0,0x8b,0x82, +0x8a,0x83,0x74,0x2, 0xf0,0xa3,0x74,0xa, 0xf0,0xa3,0xe4,0xf0,0x12,0x67,0xcc,0x74, +0xa0,0xf0,0xeb,0x24,0x4, 0xf5,0x82,0xe4,0x3a,0xf5,0x83,0xe4,0xf0,0xa3,0x74,0xb4, +0xf0,0xeb,0x24,0x6, 0xf5,0x82,0xe4,0x3a,0xf5,0x83,0x74,0x5, 0xf0,0xeb,0x24,0x7, +0xf5,0x82,0xe4,0x3a,0xf5,0x83,0x74,0x2, 0xf0,0x22,0xe4,0xf0,0xa3,0x74,0x64,0xf0, +0x8f,0x82,0x8e,0x83,0xe5,0x82,0x22,0x24,0x4, 0xff,0xe4,0x33,0xa2,0xe7,0x13,0xfe, +0xef,0x13,0xff,0xed,0x24,0x10,0xf5,0x82,0xe4,0x3c,0xf5,0x83,0x22,0x75,0xf0,0x2, +0xef,0x12,0x5, 0x19,0x74,0x7f,0x75,0xf0,0xff,0x2, 0x3, 0x45,0xff,0xe5,0x2b,0x24, +0x7, 0xfd,0xe4,0x33,0xfc,0xe5,0x2d,0x2d,0xf5,0x82,0xe5,0x2c,0x3c,0xf5,0x83,0x22, +0x74,0x87,0x25,0x2a,0xf5,0x82,0xe4,0x34,0xc, 0xf5,0x83,0x22,0xad,0x7, 0xac,0x6, +0xe4,0xf9,0xe9,0x20,0xe0,0xa, 0xc3,0xd1,0xc1,0xe5,0x82,0x2f,0xb1,0x11,0xe4,0xf0, +0xe9,0xc3,0x94,0xa, 0x50,0x21,0x74,0xd9,0x29,0xf5,0x82,0xe4,0x34,0xc, 0xf5,0x83, +0xe0,0xff,0xe9,0x90,0x6, 0xc5,0x93,0x24,0x4, 0xfb,0xe4,0x33,0xfa,0xed,0x2b,0xf5, +0x82,0xec,0x3a,0xf5,0x83,0xef,0xf0,0x9, 0xb9,0x10,0xc7,0xe4,0xf9,0xe9,0x20,0xe0, +0x5, 0x12,0x6e,0x1, 0x80,0x7, 0xe9,0x12,0x6e,0x1, 0x54,0xf0,0xc4,0x54,0xf, 0xf5, +0x29,0xe9,0xc3,0x94,0xa, 0x50,0x30,0xe9,0x90,0x6, 0xc5,0x93,0xff,0x24,0x4, 0x20, +0xe0,0xe, 0xef,0xd1,0xb7,0x12,0x6e,0x9b,0xf5,0x83,0xe0,0x45,0x29,0xf0,0x80,0x17, +0xe9,0x90,0x6, 0xc5,0x93,0xd1,0xb7,0x12,0x6e,0x9b,0xf5,0x83,0xe0,0xff,0xe5,0x29, +0xc4,0x54,0xf0,0xfe,0xef,0x4e,0xf0,0x9, 0xe9,0x64,0x10,0x70,0xb0,0x90,0xc, 0x93, +0xe0,0xff,0xed,0x24,0x18,0xd1,0xc6,0xef,0xf0,0x90,0xc, 0xbd,0xe0,0xff,0xed,0x24, +0x19,0xd1,0xc6,0xef,0xf0,0x90,0xc, 0xe9,0xe0,0xff,0xed,0x24,0x1a,0xd1,0xc6,0xef, +0xf0,0xed,0x24,0x1b,0xd1,0xc6,0xe4,0xf0,0x90,0xc, 0x95,0xe0,0xff,0xed,0x24,0x1c, +0xd1,0xc6,0xef,0xf0,0xed,0x24,0x1e,0xd1,0xc6,0x74,0x13,0xf0,0xed,0x24,0x20,0xd1, +0xc6,0x74,0x3, 0xf0,0xed,0x24,0x21,0xd1,0xc6,0x74,0x3f,0xf0,0xed,0x24,0x22,0xd1, +0xc6,0x74,0x3f,0xf0,0xed,0x24,0x1d,0xd1,0xc6,0x74,0xa, 0xf0,0xed,0x24,0x1f,0xd1, +0xc6,0x74,0x1, 0xf0,0xae,0x4, 0xaf,0x5, 0xaa,0x6, 0xa9,0x7, 0xfb,0x12,0x38,0x3, +0x8f,0x29,0x22,0x8b,0x32,0x8a,0x33,0x89,0x34,0xe4,0xff,0x12,0x6a,0x2a,0xab,0x32, +0xaa,0x33,0xa9,0x34,0x90,0x0, 0x18,0x12,0x1, 0x65,0xff,0x12,0x6a,0x12,0x7f,0x1, +0x31,0xd9,0x31,0xc8,0xef,0x70,0x2, 0xff,0x22,0x7d,0x7f,0x7f,0x14,0x31,0xad,0xef, +0x70,0x2, 0xff,0x22,0x12,0x6e,0x92,0x85,0x32,0x38,0xf5,0x39,0x89,0x3a,0xab,0x32, +0xaa,0x33,0xa9,0x34,0x11,0xe0,0xab,0x32,0xaa,0x33,0xa9,0x34,0x11,0x5c,0xe4,0xff, +0x31,0xd9,0x31,0xbf,0xef,0x7f,0x0, 0x60,0x2, 0x7f,0x1, 0x22,0x8b,0x35,0x8a,0x36, +0x89,0x37,0x90,0x0, 0x19,0x12,0x1, 0x65,0xfd,0x7f,0x6, 0x11,0xd7,0x90,0x0, 0x1a, +0x12,0x1, 0x65,0xfd,0x7f,0xa, 0x11,0xd7,0x90,0x0, 0x20,0x12,0x1, 0x65,0xfd,0x7f, +0x8, 0x11,0xd7,0x90,0x0, 0x1c,0x12,0x1, 0x65,0xfd,0x7f,0xc, 0x11,0xd7,0x90,0x0, +0x1d,0x12,0x1, 0x65,0xfd,0x7f,0x2a,0x11,0xd7,0x51,0x29,0xfd,0x7f,0x2e,0x11,0xba, +0xe4,0xfd,0x7f,0x1c,0x11,0xd7,0x90,0x0, 0x21,0x12,0x1, 0x65,0xfd,0x7f,0x2, 0x11, +0xd7,0x90,0x0, 0x22,0x12,0x1, 0x65,0xfd,0x7f,0x4, 0x12,0x6a,0x51,0x44,0x40,0xf5, +0xa1,0xe5,0xdb,0x30,0xe3,0xfb,0x53,0xdb,0xf3,0x8d,0xa1,0xe5,0xdb,0x30,0xe3,0xfb, +0x53,0xdb,0xf3,0x43,0xab,0x4, 0x22,0x11,0xba,0xab,0x35,0xaa,0x36,0xa9,0x37,0x22, +0x8b,0x35,0x8a,0x36,0x89,0x37,0xe4,0xf5,0x3b,0x11,0xd9,0x31,0xa4,0xfd,0xe4,0xff, +0x31,0xfb,0x8e,0x3c,0x8f,0x3d,0xe5,0x3b,0x70,0x3, 0x43,0x3c,0x20,0x31,0x98,0xc3, +0x94,0x10,0x40,0xe5,0x75,0x3b,0x10,0xe4,0xfd,0x7f,0xc0,0x31,0x9d,0xc3,0x94,0x20, +0x40,0xf5,0xe4,0xf5,0x3b,0xab,0x38,0xaa,0x39,0xa9,0x3a,0x31,0xa4,0xfe,0x54,0xf, +0xff,0xee,0xc4,0x54,0xf, 0xfd,0x51,0xb, 0x8e,0x3c,0x8f,0x3d,0x31,0x98,0xc3,0x94, +0x8, 0x40,0xe2,0x75,0x3b,0x8, 0xe4,0xfd,0x7f,0xc0,0x31,0x9d,0xc3,0x94,0x20,0x40, +0xf5,0xe4,0xf5,0x3b,0x75,0xf0,0x2, 0xe5,0x3b,0xa4,0x24,0x54,0xf5,0x82,0xe5,0xf0, +0x34,0xc, 0xf5,0x83,0xe4,0x93,0xf5,0x3c,0x74,0x1, 0x93,0xf5,0x3d,0x31,0x98,0xc3, +0x94,0xff,0x40,0xe0,0x90,0xe, 0x52,0xe4,0x93,0xfc,0x74,0x1, 0x93,0xfd,0xec,0xff, +0x53,0xab,0x3, 0x53,0xdb,0xf3,0x8f,0xa1,0xe5,0xdb,0x30,0xe3,0xfb,0x85,0xa1,0x17, +0x53,0xdb,0xf3,0x8d,0xa1,0xe5,0xdb,0x30,0xe3,0xfb,0x85,0xa1,0x18,0x53,0xdb,0xf3, +0x43,0xab,0x4, 0xae,0x17,0xaf,0x18,0x22,0xe5,0x3c,0xff,0xad,0x3d,0x31,0x70,0x5, +0x3b,0xe5,0x3b,0x22,0x85,0x3b,0x82,0x75,0x83,0x0, 0x2, 0x1, 0x65,0xae,0x5, 0xac, +0x7, 0x11,0xba,0x12,0x6a,0x35,0xef,0x7f,0x0, 0xb5,0x6, 0x2, 0x7f,0x1, 0x22,0xe4, +0xfd,0x31,0xd2,0x60,0x2, 0x7f,0x1, 0x22,0x7d,0x3, 0xe4,0x31,0xd2,0x60,0x2, 0x7f, +0x1, 0x22,0xff,0x31,0xad,0xef,0x7f,0x0, 0x22,0xef,0x24,0xfe,0x60,0xb, 0x14,0x60, +0xc, 0x24,0x2, 0x70,0xc, 0x7d,0x9, 0x80,0xa, 0x7d,0x6, 0x80,0x6, 0x7d,0x3, 0x80, +0x2, 0xe4,0xfd,0xe5,0xdc,0x54,0xf0,0x2d,0xf5,0xdc,0x22,0x7b,0x0, 0x7a,0xc0,0xef, +0x51,0x17,0xed,0x2b,0xfb,0xe4,0x3a,0xfe,0xaf,0x3, 0x22,0xac,0x7, 0x7b,0x0, 0x7a, +0xc0,0xed,0x51,0x17,0xec,0x80,0xec,0x75,0xf0,0x80,0xa4,0x2b,0xfb,0xe5,0xf0,0x3a, +0xfa,0x22,0xff,0xab,0x36,0xaa,0x37,0xa9,0x38,0x90,0x0, 0x1e,0x2, 0x1, 0x65,0xd1, +0x38,0x12,0x1, 0x4c,0x13,0x13,0x54,0x3f,0xf5,0x3b,0x12,0x14,0x38,0x13,0x13,0x54, +0x3f,0xf5,0x3c,0xe4,0xf5,0x3d,0xf5,0x3e,0xf5,0x3f,0xf5,0x39,0x71,0x1f,0x12,0x1, +0x4c,0xff,0xe5,0x39,0xc3,0x9f,0x50,0x58,0xe4,0xf5,0x3a,0x71,0x1f,0x12,0x14,0x38, +0xff,0xe5,0x3a,0xc3,0x9f,0x50,0x41,0xb1,0x7a,0xe5,0x3a,0x12,0x17,0xea,0x51,0x22, +0x12,0x6e,0xf0,0x65,0xf0,0x98,0x40,0x4, 0x5, 0x3d,0x80,0x22,0xb1,0x7a,0xe5,0x3a, +0x12,0x17,0xea,0x51,0x22,0xfd,0xc3,0xe4,0x9d,0xfd,0xe4,0x94,0x0, 0xfc,0xc3,0xef, +0x9d,0xec,0x64,0x80,0xf8,0xe5,0xf0,0x64,0x80,0x98,0x50,0x2, 0x5, 0x3e,0x5, 0x3f, +0xe5,0x3c,0x25,0x3a,0xf5,0x3a,0x80,0xb3,0xe5,0x3b,0x25,0x39,0xf5,0x39,0x80,0x9c, +0xe5,0x3f,0xc3,0x13,0xff,0xe5,0x3d,0xd3,0x9f,0x40,0x23,0xb1,0x98,0xb1,0xe0,0xfe, +0xab,0x33,0xaa,0x34,0xa9,0x35,0x90,0x9, 0x25,0x12,0x1, 0x65,0xc3,0x9e,0x90,0x9, +0x25,0x50,0x2, 0x80,0x27,0xe4,0x12,0x1, 0xd7,0x75,0x8, 0x1, 0x80,0x3e,0xe5,0x3e, +0xd3,0x9f,0x40,0x28,0xab,0x33,0xaa,0x34,0xa9,0x35,0x90,0x9, 0x25,0xb1,0xe0,0xff, +0xb1,0x98,0x12,0x1, 0x65,0xc3,0x9f,0x90,0x9, 0x26,0x50,0x7, 0x74,0x1, 0x12,0x1, +0x92,0x80,0x19,0xe4,0x12,0x1, 0xd7,0x75,0x8, 0x2, 0x80,0x10,0xb1,0x98,0xe4,0x12, +0x1, 0xd7,0x90,0x9, 0x25,0xe4,0x12,0x1, 0xd7,0xe4,0xf5,0x8, 0xaf,0x8, 0x22,0xab, +0x30,0xaa,0x31,0xa9,0x32,0x22,0xd1,0x38,0x12,0x17,0x22,0xf5,0x3d,0x12,0x4e,0xc3, +0xf5,0x3e,0xe5,0x3d,0xd3,0x94,0x0, 0x50,0x8, 0xe5,0x3e,0x94,0x0, 0x50,0x2, 0xa1, +0x42,0x71,0x1f,0x90,0x0, 0x82,0x74,0x1, 0x12,0x1, 0x92,0x12,0x5c,0x37,0x64,0x5, +0x60,0x2, 0xa1,0x52,0x71,0x1f,0x90,0x0, 0x82,0x12,0x1, 0xd7,0xb1,0x6d,0x60,0x2, +0x81,0x49,0x71,0x1f,0x90,0x0, 0x81,0x12,0x0, 0x20,0x60,0x2, 0x81,0x49,0x90,0x0, +0x83,0x12,0x1, 0xd7,0x90,0x0, 0x80,0xe5,0x3d,0x12,0x1, 0xd7,0x90,0x0, 0x81,0xe5, +0x3e,0x12,0x1, 0xd7,0xe4,0xf5,0x39,0xe5,0x3d,0x25,0x3e,0xff,0xe4,0x33,0xfe,0xc3, +0xe5,0x39,0xb1,0x8f,0x40,0x2, 0xa1,0x52,0xe5,0x39,0xc3,0x95,0x3d,0x50,0x27,0xe5, +0x32,0x24,0x30,0xf9,0xe4,0x35,0x31,0xb1,0xa8,0x35,0xf0,0xb1,0x73,0x71,0x1f,0x75, +0xf0,0x2, 0xe5,0x39,0x12,0x14,0x2b,0xb1,0xb3,0xe5,0x39,0x75,0xf0,0x2, 0x12,0x2e, +0x78,0x90,0x0, 0x1, 0x80,0x40,0xab,0x30,0xe5,0x32,0x24,0x58,0xf9,0xe4,0x35,0x31, +0xfa,0xc3,0xe5,0x39,0x95,0x3d,0xfd,0xe4,0x94,0x0, 0xfc,0xed,0xae,0x4, 0x78,0x3, +0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0x29,0xf9,0xea,0x3e,0xb1,0x73,0xed,0x25,0xe0, +0xff,0xec,0x33,0xfe,0xab,0x30,0xe5,0x32,0x2f,0xf9,0xe5,0x31,0x3e,0xfa,0x90,0x0, +0x87,0xb1,0xb3,0x90,0x0, 0x88,0x12,0x1, 0x65,0xc3,0x13,0xf5,0x3b,0xb1,0x5e,0xa3, +0xe5,0x3c,0xf0,0xb1,0x5e,0xe5,0x3b,0xf0,0xe5,0x40,0xb1,0x53,0x74,0x1, 0xf0,0xab, +0x33,0xaa,0x34,0xa9,0x35,0x90,0x3, 0x80,0x75,0xf0,0x20,0xe5,0x3c,0xb1,0x88,0xe5, +0x3b,0x12,0x17,0xea,0xff,0xb1,0x5e,0xa3,0xa3,0xf1,0x9e,0xe5,0x40,0x24,0x5, 0xb1, +0x55,0xe4,0xf0,0xa3,0xf0,0x5, 0x39,0x61,0x87,0x71,0x1f,0xb1,0x66,0x2f,0xf5,0x3a, +0xe4,0xf5,0x39,0x71,0x1f,0xb1,0x66,0xb1,0xbb,0xc3,0xb1,0x8f,0x40,0x2, 0x81,0xe2, +0xe5,0x39,0xc3,0x9d,0x50,0x6, 0xb1,0xa2,0x35,0xf0,0x80,0xf, 0x71,0x1f,0xb1,0x6d, +0xb1,0xc4,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xb1,0xd2,0xb1,0x73,0xab,0x33,0xe5, +0x35,0x24,0x80,0xf9,0xe5,0x34,0x34,0x3, 0xb1,0x5d,0xa3,0xe0,0x75,0xf0,0x20,0xa4, +0x29,0xf9,0xe5,0xf0,0x3a,0xb1,0x5d,0xe0,0x12,0x14,0x28,0x12,0x1c,0xa2,0xe5,0x40, +0xb1,0x53,0xe0,0x70,0x4, 0x15,0x3a,0x80,0x35,0xb1,0x5e,0xa3,0xa3,0xe0,0xfc,0xa3, +0xe0,0xfd,0xc3,0xef,0x9d,0xff,0xee,0x9c,0xfe,0x12,0x0, 0x6, 0x12,0x2f,0x3a,0x90, +0x0, 0x20,0x12,0x1, 0x65,0x12,0x6e,0xf0,0x6e,0x98,0xe5,0x40,0x40,0x6, 0xb1,0x53, +0xe4,0xf0,0x80,0xa, 0x24,0x5, 0xb1,0x55,0xee,0x8f,0xf0,0x12,0x2, 0x60,0x5, 0x39, +0x81,0x53,0xe5,0x3a,0x70,0x7, 0x71,0x1f,0x90,0x0, 0x80,0x80,0x62,0x71,0x1f,0x90, +0x0, 0x83,0x12,0x1, 0x65,0xc3,0x94,0xc, 0x40,0x3e,0xe4,0xf5,0x39,0x71,0x1f,0xb1, +0x66,0xb1,0xbb,0xc3,0xb1,0x8f,0x50,0x4a,0xe5,0x39,0xc3,0x9d,0x50,0x6, 0xb1,0xa2, +0x35,0xf0,0x80,0xf, 0x71,0x1f,0xb1,0x6d,0xb1,0xc4,0xc3,0x33,0xce,0x33,0xce,0xd8, +0xf9,0xb1,0xd2,0xb1,0x73,0xe5,0x40,0xb1,0x53,0xe0,0xb4,0x1, 0x7, 0xe5,0x40,0xb1, +0x53,0x74,0x2, 0xf0,0x5, 0x39,0x80,0xc5,0x71,0x1f,0x90,0x0, 0x83,0x74,0x1, 0x2, +0x1, 0x92,0x71,0x1f,0x90,0x0, 0x83,0xe4,0x12,0x1, 0xd7,0x90,0x0, 0x80,0xe4,0x12, +0x4f,0xd8,0x22,0x24,0x7, 0xf5,0x82,0xe4,0x35,0x3f,0xf5,0x83,0x22,0xfa,0x85,0x40, +0x82,0x85,0x3f,0x83,0xa3,0x22,0x90,0x0, 0x81,0x12,0x1, 0x65,0xff,0x90,0x0, 0x80, +0x2, 0x1, 0x65,0xaf,0x1, 0xf5,0x3f,0x8f,0x40,0x22,0xab,0x33,0xaa,0x34,0xa9,0x35, +0x90,0x3, 0x80,0x75,0xf0,0x20,0xe5,0x39,0x12,0x5, 0x19,0x75,0xf0,0x2, 0x22,0x9f, +0xee,0x64,0x80,0xf8,0x74,0x80,0x98,0x22,0xab,0x33,0xaa,0x34,0xa9,0x35,0x90,0x9, +0x26,0x22,0xe9,0x24,0x30,0xf9,0xe4,0x3a,0xfa,0xe5,0x39,0x75,0xf0,0x8, 0xa4,0x29, +0xf9,0xea,0x22,0x12,0x1, 0x65,0xc3,0x13,0xf5,0x3c,0x22,0xfd,0x2f,0xff,0xe4,0x33, +0xfe,0xe5,0x39,0x22,0xff,0xc3,0xe5,0x39,0x9f,0xff,0xe4,0x94,0x0, 0xfe,0xef,0x78, +0x3, 0x22,0xff,0xe9,0x24,0x58,0xf9,0xe4,0x3a,0xfa,0xe9,0x2f,0xf9,0xea,0x3e,0x22, +0xe4,0x12,0x1, 0xd7,0xab,0x36,0xaa,0x37,0xa9,0x38,0x90,0x0, 0x1f,0x2, 0x1, 0x65, +0xd1,0x38,0xe4,0xff,0xab,0x30,0xe5,0x32,0x24,0x28,0xf9,0xe4,0x35,0x31,0xfa,0xef, +0xfd,0x7c,0x0, 0x29,0x12,0x6c,0x93,0xab,0x30,0xe5,0x32,0x24,0x23,0xf9,0xe4,0x35, +0x31,0x12,0x6c,0x90,0x71,0x1f,0x90,0x0, 0x2d,0x12,0x36,0xcd,0x71,0x1f,0x90,0x0, +0x37,0x12,0x36,0xcd,0xf, 0xbf,0x5, 0xcc,0x71,0x1f,0x90,0x0, 0x41,0xe4,0x12,0x1, +0xd7,0x90,0x0, 0x42,0xe4,0x2, 0x1, 0xd7,0x8b,0x30,0x8a,0x31,0x89,0x32,0x22,0xd1, +0x38,0x12,0x63,0xb0,0xf5,0x3c,0x12,0x6c,0xb2,0x65,0x3c,0x60,0x36,0xe4,0xf5,0x38, +0x12,0x6d,0x94,0x12,0x30,0xc6,0xf5,0x39,0xf4,0x60,0x11,0x12,0x6e,0xe8,0xe5,0x38, +0x12,0x14,0x2b,0x12,0x2e,0x5a,0xf1,0x89,0xf5,0x83,0xf1,0x9e,0x5, 0x38,0xe5,0x38, +0xb4,0x5, 0xdd,0xe5,0x3c,0x60,0x2, 0xe1,0x7b,0xe5,0x37,0x24,0x6, 0xf1,0x80,0xff, +0x2, 0x5f,0x6b,0xe4,0xf5,0x38,0x71,0x1f,0x90,0x0, 0x48,0x12,0x0, 0x20,0xff,0xe5, +0x38,0xc3,0x9f,0x40,0x2, 0xe1,0x7b,0x12,0x2e,0x73,0x12,0x30,0xc7,0xf5,0x39,0xf4, +0x70,0x2, 0xe1,0x77,0x12,0x6e,0xe8,0xe5,0x38,0x12,0x14,0x2b,0x12,0x1c,0xa2,0x12, +0x6e,0xe, 0x34,0xc, 0xf1,0xb6,0x12,0x61,0x37,0x8e,0x3a,0x8f,0x3b,0x12,0x6d,0x94, +0xfa,0x12,0x1c,0x9f,0xf1,0x90,0xf1,0xb6,0x12,0x61,0x37,0xad,0xa, 0x7c,0x0, 0xc3, +0xe5,0x3b,0x9d,0xe5,0x3a,0x9c,0x50,0x71,0xc3,0xef,0x9d,0xee,0x9c,0x50,0x6a,0x12, +0x6e,0xe, 0x34,0xc, 0x12,0x6b,0xac,0x71,0x1f,0x75,0xf0,0x7, 0xe5,0x38,0x12,0x14, +0x2b,0x12,0x5f,0x65,0xf1,0x90,0xf1,0xb6,0x12,0x2e,0x73,0x90,0x0, 0x2, 0x12,0x6d, +0x4e,0xab,0x33,0xe5,0x35,0x24,0x23,0xf9,0xe4,0x35,0x34,0xfa,0x7e,0x0, 0xe9,0x25, +0x39,0x12,0x62,0x49,0xb4,0x2, 0x9, 0xe5,0x3c,0xd3,0x94,0x0, 0x40,0x2, 0x15,0x3c, +0xe5,0x3c,0x70,0x53,0x5, 0xb, 0xf1,0x7c,0xff,0xe5,0xa, 0xc3,0x9f,0x50,0x5, 0x5, +0xa, 0xe4,0xf5,0xb, 0xab,0x30,0xe5,0x32,0x24,0x4c,0xf9,0xe4,0x35,0x31,0xfa,0x12, +0x1, 0x4c,0x54,0xfe,0x12,0x1, 0xc5,0x80,0x2e,0x71,0x1f,0x75,0xf0,0x7, 0xe5,0x38, +0x12,0x14,0x2b,0x12,0x2e,0x5a,0xf1,0x89,0xf5,0x83,0xf1,0x9e,0xe5,0x37,0x24,0x6, +0xf1,0x80,0xb5,0xa, 0x6, 0xf1,0x7c,0xf5,0xa, 0x80,0x9, 0xe5,0xa, 0xd3,0x94,0x1, +0x40,0x2, 0x15,0xa, 0xe4,0xf5,0xb, 0x5, 0x38,0xc1,0x86,0x22,0xe5,0x37,0x24,0x7, +0xf5,0x82,0xe4,0x35,0x36,0xf5,0x83,0xe0,0x22,0x90,0x0, 0x2, 0x12,0x2, 0xa1,0xff, +0xe5,0x39,0x25,0xe0,0x25,0xe0,0x24,0x3f,0xf5,0x82,0xe4,0x34,0xc, 0x22,0xe5,0xf0, +0xf0,0xa3,0xef,0xf0,0x22,0xe5,0x2d,0x25,0xe0,0xff,0xe5,0x2c,0x33,0xfe,0xe5,0x31, +0x2f,0xf5,0x82,0xe5,0x30,0x3e,0xf5,0x83,0xe0,0xfc,0xa3,0xe0,0xfd,0x22,0xe4,0x12, +0x46,0x1d,0x12,0x6c,0x81,0x12,0x41,0xf, 0x12,0x46,0x94,0x12,0x25,0x8d,0x53,0xdb, +0xf0,0x12,0x43,0xe3,0x90,0xd, 0x3, 0x74,0x1, 0xf0,0xa3,0x74,0x2c,0xf0,0x90,0xd, +0xea,0x74,0x1, 0xf0,0xf5,0x24,0x75,0x25,0x0, 0x75,0x26,0x0, 0xf5,0x27,0x75,0x28, +0x0, 0x75,0x29,0x83,0xf5,0x2a,0x75,0x2b,0x9, 0x75,0x2c,0xaf,0xfb,0x12,0xe, 0x9d, +0x90,0xd, 0xea,0x74,0x2, 0xf0,0x11,0x18,0x90,0xe, 0x28,0x74,0x3, 0xf0,0x90,0xd, +0xe9,0xe0,0x54,0x8f,0x44,0x40,0xf0,0x22,0xe4,0xff,0xfd,0xfc,0xe5,0xdb,0x20,0xe1, +0xf, 0xf, 0xbf,0xff,0x5, 0xd, 0xbd,0x0, 0x1, 0xc, 0xbc,0x3, 0xef,0xbd,0xe8,0xec, +0x53,0xdb,0xfe,0x53,0xdb,0xfd,0xc2,0xba,0x22,0x75,0x15,0x4, 0x75,0x16,0x3, 0x12, +0x6c,0x81,0x12,0x4c,0xf9,0xf1,0x82,0x31,0xf, 0x7e,0x9, 0x7f,0xaf,0x12,0x36,0xfc, +0x90,0x0, 0x55,0x74,0x21,0xf0,0xd1,0x9b,0x71,0xe0,0x90,0x0, 0x1, 0xe0,0x90,0xe, +0x69,0xf0,0x90,0x0, 0x0, 0xe0,0x90,0xe, 0x68,0xf0,0xe4,0xd1,0x1d,0xd1,0x9, 0xa3, +0x74,0x7, 0xf0,0x90,0xd, 0xea,0xe0,0xb4,0x2, 0xa, 0x74,0x4, 0xf0,0xe4,0x90,0xe, +0x65,0xf0,0x80,0x2, 0xb1,0xfb,0x90,0xe, 0x66,0x74,0x3, 0xf0,0xe4,0xd1,0x1d,0x90, +0xe, 0x65,0xe0,0x70,0x2f,0x12,0x0, 0x4e,0x90,0xe, 0x65,0x74,0x1, 0xf0,0x7f,0x0, +0x7e,0x7c,0x12,0x7, 0x81,0x12,0x6c,0x9d,0x75,0x27,0x4, 0x7b,0x1, 0x7a,0x0, 0x79, +0x0, 0x71,0xef,0xe4,0xfd,0xff,0xfe,0xb1,0x4e,0x7f,0x4, 0x71,0x47,0x90,0xd, 0xea, +0x74,0x5, 0xb1,0xfa,0x90,0xe, 0x66,0xe0,0x64,0x3, 0x70,0x39,0x90,0xd, 0xe9,0xe0, +0xc4,0x13,0x13,0x13,0x54,0x1, 0x30,0xe0,0xb3,0x31,0xf, 0x11,0x18,0x53,0xdb,0xf0, +0xd1,0x94,0x12,0x25,0x8d,0x71,0xe3,0xd1,0x9, 0x90,0x0, 0x55,0x74,0x21,0xf0,0x12, +0x5c,0x99,0x64,0xaa,0x60,0xf9,0x75,0x15,0x4, 0x75,0x16,0x3, 0x90,0xd, 0xe9,0xe0, +0x54,0x7f,0xf0,0x80,0x87,0x90,0xe, 0x66,0xe0,0x90,0xe, 0x28,0xf0,0x1, 0x18,0x7e, +0x0, 0x7f,0x0, 0x8e,0x29,0x8f,0x2a,0x75,0x42,0x0, 0x75,0x43,0x0, 0x75,0x44,0x2b, +0x12,0x6d,0x85,0xe5,0x2a,0x24,0x52,0x31,0xe0,0xe4,0xf0,0xe5,0x2a,0x24,0x53,0x31, +0xe0,0x74,0x1, 0xf0,0xe5,0x2a,0x24,0x54,0x31,0xe0,0x74,0x7, 0xf0,0x90,0xc, 0x91, +0xe0,0x31,0xeb,0xf0,0x90,0xc, 0x92,0xe0,0x31,0xeb,0xa3,0xf0,0x31,0xeb,0xa3,0xe0, +0xff,0x31,0xeb,0xe0,0xfb,0x8f,0xf0,0xa4,0xff,0xa3,0xa3,0x12,0x3f,0x9e,0xe5,0x2a, +0x24,0x31,0xff,0xe4,0x35,0x29,0xfe,0x7c,0xc, 0x7d,0xbd,0x12,0x5f,0x71,0xe5,0x2a, +0x24,0x56,0xff,0xe4,0x7c,0x7, 0x7d,0x11,0x31,0xe8,0xe0,0xfb,0x31,0xf2,0xe5,0x2a, +0x24,0x72,0xff,0xe4,0x7c,0x7, 0x7d,0x20,0x31,0xe8,0xa3,0xe0,0xfb,0x31,0xf2,0x90, +0xc, 0x94,0xe0,0xff,0xe5,0x2a,0x24,0x30,0x31,0xe0,0xef,0xf0,0xe5,0x2a,0x24,0x31, +0x31,0xe0,0xe0,0xff,0xe5,0x2a,0x24,0x51,0x31,0xe0,0xef,0xf0,0x90,0xc, 0xe9,0xe0, +0xff,0xe5,0x2a,0x24,0x4d,0x31,0xe0,0xef,0xf0,0x90,0xc, 0x95,0xe0,0xff,0xe5,0x2a, +0x24,0x4e,0x31,0xe0,0xef,0xf0,0xe5,0x2a,0x24,0x4f,0x31,0xe0,0xef,0xf0,0xe5,0x2a, +0x24,0x50,0x31,0xe0,0xef,0xf0,0xe5,0x2a,0x24,0x82,0x31,0xe0,0x74,0x1, 0xf0,0x22, +0xf5,0x82,0xe4,0x35,0x29,0xf5,0x83,0x22,0x35,0x29,0xfe,0x85,0x2a,0x82,0x85,0x29, +0x83,0x22,0x8e,0x3d,0x8f,0x3e,0x8c,0x3f,0x8d,0x40,0x5, 0x40,0xe5,0x40,0xae,0x3f, +0x70,0x2, 0x5, 0x3f,0x14,0xf5,0x82,0x8e,0x83,0xe4,0x93,0xff,0x5, 0x3e,0xe5,0x3e, +0xac,0x3d,0x70,0x2, 0x5, 0x3d,0xf1,0x9a,0xdb,0xe0,0x22,0x75,0x40,0x0, 0x75,0x41, +0x0, 0x75,0x42,0x2e,0x75,0x43,0xf, 0x75,0x44,0x77,0x7b,0xff,0x7a,0x6, 0x79,0xb6, +0x12,0x8, 0x0, 0xe4,0xff,0xfe,0x71,0x7f,0x8f,0x29,0x90,0xe, 0x21,0xe0,0x70,0x3, +0x75,0x29,0xff,0xe5,0x29,0xf4,0x60,0x56,0x7f,0xf0,0x7e,0x3, 0x71,0x7f,0x8f,0x2a, +0x7f,0xf1,0x7e,0x3, 0x71,0x7f,0x8f,0x2b,0xe5,0x2a,0xb4,0xff,0x8, 0xe5,0x2b,0xb4, +0xff,0x3, 0x75,0x29,0xff,0xe5,0x2a,0x45,0x2b,0xf4,0x60,0x3, 0x75,0x29,0xff,0xe4, +0xf5,0x2b,0xf5,0x2c,0xf5,0x2d,0xe5,0x2d,0x24,0x4, 0xff,0xe4,0x35,0x2c,0xfe,0x71, +0x7f,0xef,0x62,0x2b,0x5, 0x2d,0xe5,0x2d,0x70,0x2, 0x5, 0x2c,0xc3,0x94,0xa, 0xe5, +0x2c,0x94,0x1, 0x40,0xe1,0xe5,0x2a,0x65,0x2b,0x60,0x3, 0x75,0x29,0xff,0xe5,0x29, +0xf4,0x60,0x2, 0x61,0x45,0x90,0xc, 0x91,0x74,0xf, 0xf0,0xa3,0x74,0xa, 0xf0,0xa3, +0x74,0x2, 0xf0,0xe4,0xa3,0xf0,0xa3,0x74,0x2c,0xf0,0x90,0xc, 0x9f,0x74,0x21,0xf0, +0xa3,0x74,0x34,0xf0,0x12,0x6e,0x50,0xe4,0xf5,0x29,0x90,0xc, 0x91,0xe0,0xff,0xe5, +0x29,0xc3,0x9f,0x40,0xb, 0x74,0xa1,0x25,0x29,0xd1,0x15,0x74,0xff,0xf0,0x80,0xf, +0x74,0x2e,0x25,0x29,0xf8,0xe6,0xff,0x74,0xa1,0x25,0x29,0xd1,0x15,0xef,0xf0,0xe5, +0x29,0x90,0x6, 0xcf,0x93,0xff,0x74,0xbd,0x25,0x29,0x12,0x6f,0x4e,0xef,0xf0,0x5, +0x29,0xe5,0x29,0xb4,0x1c,0xc4,0x7e,0xc, 0x7f,0xe9,0x7c,0x6, 0x7d,0xfb,0x7b,0xe, +0x31,0xf2,0x7e,0xc, 0x7f,0xd9,0x7c,0x6, 0x7d,0xeb,0x7b,0x10,0x31,0xf2,0x7e,0xc, +0x7f,0xf7,0x7c,0x7, 0x7d,0x9, 0x7b,0x8, 0x31,0xf2,0xe4,0xf5,0x2c,0xf5,0x2d,0x74, +0x5, 0x25,0x2d,0xf1,0xb2,0xf0,0x5, 0x2d,0xe5,0x2d,0x70,0x2, 0x5, 0x2c,0x64,0x96, +0x45,0x2c,0x70,0xeb,0x22,0x7f,0x4, 0x8f,0x3d,0x75,0x3e,0xc, 0x75,0x3f,0x91,0xe4, +0xf5,0x40,0xf5,0x41,0x7e,0x0, 0xe5,0x41,0x25,0x3d,0xff,0xee,0x35,0x40,0xfe,0x71, +0x7f,0x5, 0x3f,0xe5,0x3f,0xac,0x3e,0x70,0x2, 0x5, 0x3e,0xf1,0x9a,0x5, 0x41,0xe5, +0x41,0x70,0x2, 0x5, 0x40,0xc3,0x94,0xa, 0xe5,0x40,0x94,0x1, 0x40,0xd6,0x22,0xf1, +0xaa,0xb1,0xb6,0xf1,0xa2,0x75,0xf8,0xe0,0xaf,0xfb,0x43,0xfc,0x3, 0xf5,0xf8,0xd2, +0xaf,0x22,0x12,0x67,0xd4,0x11,0x18,0x53,0xdb,0xf0,0x51,0x1b,0xaf,0x22,0xae,0x21, +0x31,0x13,0xaf,0x24,0xae,0x23,0x12,0x36,0xfc,0xe5,0x22,0x24,0x55,0xf5,0x82,0xe4, +0x35,0x21,0xf5,0x83,0x74,0x21,0xf0,0xaa,0x27,0xa9,0x28,0x7b,0x1, 0x12,0x26,0xb2, +0xaa,0x27,0xa9,0x28,0x7b,0x1, 0x12,0x25,0x8d,0x71,0xe3,0xaa,0x21,0xa9,0x22,0x7b, +0x1, 0xc0,0x3, 0x8b,0x2c,0x85,0x25,0x2d,0x85,0x26,0x2e,0xd0,0x3, 0x2, 0x27,0x9b, +0x12,0x25,0x8d,0x53,0xdb,0xfd,0xd2,0xba,0x43,0xdb,0x1, 0x43,0xdb,0x20,0x22,0x12, +0x4f,0xd1,0xe4,0xf5,0x42,0xf5,0x43,0x74,0x5, 0x25,0x43,0xf1,0xb2,0xf0,0x5, 0x43, +0xe5,0x43,0x70,0x2, 0x5, 0x42,0x64,0x96,0x45,0x42,0x70,0xeb,0x11,0x18,0x71,0xe3, +0x85,0x24,0x49,0x85,0x25,0x4a,0x85,0x26,0x4b,0x12,0x17,0x9e,0x12,0x59,0xfa,0xef, +0x64,0xaa,0x60,0xec,0x12,0x66,0x58,0x34,0x3, 0xaf,0x1, 0xf5,0x15,0x8f,0x16,0xe4, +0xf5,0x2a,0xf5,0x2b,0xe4,0xf5,0x41,0xe5,0x2b,0x45,0x2a,0x70,0x7, 0xb1,0xaf,0xf8, +0xe4,0xf6,0x8, 0xf6,0xe5,0x2b,0xae,0x2a,0x78,0x5, 0xc3,0x33,0xce,0x33,0xce,0xd8, +0xf9,0xb1,0x99,0xf8,0xe6,0xfc,0x8, 0xe6,0xfd,0xd3,0xef,0x9d,0xee,0x9c,0x40,0x8, +0xb1,0xaf,0xf8,0xa6,0x6, 0x8, 0xa6,0x7, 0x5, 0x41,0xe5,0x41,0xb4,0xa, 0xc8,0x5, +0x2b,0xe5,0x2b,0x70,0x2, 0x5, 0x2a,0x64,0xf, 0x45,0x2a,0x70,0xb7,0xe4,0xf5,0x44, +0xf5,0x45,0xf5,0x2a,0xf5,0x2b,0xe4,0xf5,0x41,0xe5,0x2b,0xae,0x2a,0x78,0x5, 0xc3, +0x33,0xce,0x33,0xce,0xd8,0xf9,0xb1,0x99,0xf8,0xe6,0xfc,0x8, 0xe6,0xc3,0x9f,0xf5, +0x43,0xec,0x9e,0xf5,0x42,0xe5,0x43,0xae,0x42,0x78,0x3, 0xce,0xc3,0x13,0xce,0x13, +0xd8,0xf9,0xf5,0x43,0x8e,0x42,0xd3,0x94,0xff,0xe5,0x42,0x94,0x0, 0x40,0x6, 0x75, +0x42,0x0, 0x75,0x43,0xff,0x5, 0x45,0xe5,0x45,0xac,0x44,0x70,0x2, 0x5, 0x44,0x14, +0x24,0x5, 0xf5,0x82,0x74,0xd, 0x3c,0xf5,0x83,0xe5,0x43,0xf0,0x5, 0x41,0xe5,0x41, +0x64,0xa, 0x70,0xa5,0x5, 0x2b,0xe5,0x2b,0x70,0x2, 0x5, 0x2a,0x64,0xf, 0x45,0x2a, +0x70,0x94,0x75,0x28,0xc, 0x75,0x29,0x91,0xe4,0xf5,0x2c,0xf5,0x2a,0xf5,0x2b,0x85, +0x29,0x82,0x85,0x28,0x83,0xe0,0x62,0x2c,0x7e,0x0, 0xe5,0x2b,0x25,0x27,0xff,0xee, +0x35,0x2a,0xfe,0x5, 0x29,0xe5,0x29,0xac,0x28,0x70,0x2, 0x5, 0x28,0x14,0xf5,0x82, +0x8c,0x83,0xe0,0xfd,0xb1,0x4e,0x5, 0x2b,0xe5,0x2b,0x70,0x2, 0x5, 0x2a,0xc3,0x94, +0xa, 0xe5,0x2a,0x94,0x1, 0x40,0xc8,0xad,0x2c,0x7f,0xf0,0x7e,0x3, 0xb1,0x4e,0xc3, +0x74,0xff,0x95,0x2c,0xfd,0x7f,0xf1,0x7e,0x3, 0xb1,0x4e,0x7f,0x1, 0x22,0xf1,0xaa, +0xab,0x7, 0xaa,0x6, 0xb1,0xba,0x8a,0xf9,0x8b,0xfa,0x8d,0xfb,0x43,0xfc,0x3, 0x75, +0xf8,0x82,0x7f,0x5, 0xb1,0x83,0xd2,0xf8,0x7f,0xf, 0xb1,0x83,0xd2,0xfe,0x7f,0x23, +0xb1,0x83,0xc2,0xfe,0xc2,0xf9,0xd1,0x2, 0xb1,0xbc,0xd2,0xaf,0x22,0x7f,0xfa,0xb1, +0x83,0x7f,0xfa,0xae,0x7, 0x1f,0xee,0x60,0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80,0xeb,0x22,0x25,0x16,0xf5,0x82,0xe5,0x15,0x3e, +0xf5,0x83,0x75,0xf0,0x2, 0xe5,0x41,0x12,0x5, 0x19,0xe0,0xfe,0xa3,0xe0,0xff,0xe5, +0x41,0x25,0xe0,0x24,0x2d,0x22,0xad,0x7, 0xac,0x6, 0xc2,0xaf,0x43,0xfc,0x3, 0xe4, +0xf5,0xf8,0x22,0xb1,0xb6,0xf1,0xa2,0x75,0xf8,0x88,0x7f,0xa, 0xb1,0x83,0x75,0xf8, +0x89,0x7f,0x1e,0xb1,0xe2,0xc2,0xfb,0xd1,0x2, 0x7f,0x5, 0xb1,0x83,0xb1,0xbc,0xd2, +0xaf,0x22,0xad,0x7, 0xaf,0x5, 0x1d,0xef,0x60,0x6, 0xb1,0x7d,0xb1,0x7d,0x80,0xf4, +0x22,0xe5,0x92,0x60,0x4, 0xd2,0xae,0xd2,0xbe,0x22,0xf0,0x90,0xe, 0x65,0x74,0xff, +0xf0,0x22,0x7f,0xa, 0xb1,0x83,0xc2,0xf8,0x22,0xe4,0x90,0x0, 0x52,0xf0,0xa3,0xf0, +0x22,0x74,0xa1,0x25,0x2c,0xf5,0x82,0xe4,0x34,0xc, 0xf5,0x83,0x22,0x90,0xc, 0x8c, +0xf0,0xa3,0xf0,0x90,0xc, 0x7a,0x74,0xd, 0xf0,0xa3,0x74,0xac,0xf0,0x22,0xe4,0xd1, +0x1d,0xf1,0x8c,0x7f,0x1, 0x12,0x69,0xd7,0xf1,0xbb,0x51,0x1b,0x90,0xe, 0x28,0x74, +0x1, 0xf0,0x90,0xe, 0x28,0xe0,0x24,0xfd,0x60,0x14,0x14,0x60,0x15,0x24,0xaf,0x60, +0x24,0x24,0xab,0x60,0x12,0x24,0xa9,0x70,0xe9,0x12,0x20,0xcf,0x80,0xe4,0x11,0x39, +0x80,0xe0,0x12,0x3f,0xbe,0x80,0xdb,0xd1,0x8c,0x90,0xc, 0x7c,0xf0,0x90,0xc, 0x8e, +0x74,0xaa,0xf0,0x80,0xcd,0xd1,0x8c,0x90,0xc, 0x8e,0xe0,0xb4,0xaa,0xc4,0x74,0x55, +0xf0,0xe4,0xff,0xf, 0xbf,0xfa,0xfc,0x75,0xe9,0xff,0x80,0xb6,0xe4,0x90,0xc, 0x8c, +0xf0,0xa3,0xf0,0x22,0x7e,0x9, 0x7f,0xaf,0x12,0x36,0xfc,0x7b,0x1, 0x7a,0x9, 0x79, +0xd2,0x12,0x26,0xb2,0x7b,0x1, 0x7a,0x9, 0x79,0xd2,0x22,0x8b,0x2d,0x8a,0x2e,0x89, +0x2f,0x8d,0x30,0xe4,0xf5,0x34,0xf5,0x33,0xf5,0x32,0xf5,0x31,0x75,0x38,0x1, 0xf5, +0x37,0xf5,0x36,0xf5,0x35,0x75,0x42,0x1, 0x75,0x43,0xb, 0x75,0x44,0xcd,0x12,0x6d, +0x85,0x90,0xc, 0x91,0xe0,0xf5,0x39,0xa3,0xe0,0xfb,0xe5,0x30,0x70,0x2a,0xf5,0x3a, +0xe5,0x3a,0xc3,0x95,0x39,0x50,0xf, 0x74,0xa1,0xf1,0x59,0xd1,0x15,0x12,0x6c,0x52, +0xf5,0x31,0x5, 0x3a,0x80,0xea,0xe4,0xf5,0x3a,0x74,0x3b,0x25,0x3a,0xf8,0xa6,0x34, +0x12,0x6c,0x11,0xb4,0x4, 0xf3,0x80,0x2c,0xe4,0xf5,0x3a,0xe5,0x3a,0xc3,0x9b,0x50, +0x10,0x74,0xcd,0xf1,0x59,0x12,0x2d,0xb7,0x12,0x6c,0x52,0xf5,0x31,0x5, 0x3a,0x80, +0xea,0xe4,0xf5,0x3a,0xe5,0x34,0xff,0x74,0x3b,0x25,0x3a,0xf8,0xa6,0x7, 0x12,0x6c, +0x11,0xb4,0x2, 0xf0,0xe5,0x30,0x70,0x10,0xf5,0x3a,0xf1,0x64,0x24,0x75,0xf1,0x70, +0x5, 0x3a,0xe5,0x3a,0xb4,0x4, 0xf3,0x22,0xe4,0xf5,0x3a,0xf1,0x64,0x24,0x79,0xf1, +0x70,0x5, 0x3a,0xe5,0x3a,0xb4,0x2, 0xf3,0x22,0xaf,0x38,0xae,0x37,0xad,0x36,0xac, +0x35,0x25,0x3a,0x22,0x74,0x3b,0x25,0x3a,0xf8,0xe6,0xff,0xab,0x2d,0xe5,0x2f,0x22, +0xf9,0xe4,0x35,0x2e,0xfa,0xe5,0x3a,0x7c,0x0, 0x29,0xf9,0xec,0x3a,0xfa,0xef,0x2, +0x1, 0xc5,0xe4,0x90,0xe, 0x6f,0xf0,0x90,0xe, 0x42,0xf0,0x22,0x12,0x69,0x22,0xc2, +0x8e,0x43,0xa2,0x10,0x12,0x69,0x0, 0xd2,0xab,0x22,0x14,0xf5,0x82,0x8c,0x83,0xef, +0xf0,0x22,0x8c,0xf9,0x8d,0xfa,0x43,0xfc,0x3, 0x22,0xe4,0x2f,0xff,0xee,0x34,0x7c, +0xfe,0x22,0xf5,0x82,0xe4,0x34,0xd, 0xf5,0x83,0xe4,0x22,0xe4,0x90,0xd, 0xe9,0xf0, +0x12,0x68,0x14,0xe4,0x90,0xd, 0xe8,0xf0,0x90,0xd, 0xe4,0xf0,0x12,0x4b,0x2b,0x70, +0x5, 0x12,0x4c,0x3a,0x80,0xa, 0x12,0x4b,0x2b,0xff,0xbf,0x4, 0x3, 0x12,0x4b,0x3e, +0xe4,0x90,0xd, 0xe6,0xf0,0x90,0xd, 0xe5,0xf0,0x90,0xd, 0xb0,0x74,0xaa,0xf0,0xa3, +0xf0,0x90,0xd, 0xca,0xf0,0xa3,0xf0,0x22,0x8d,0x67,0xef,0xc3,0x94,0xa, 0x50,0xa, +0x74,0x65,0x2f,0xf5,0x82,0xe4,0x34,0xe, 0x80,0x30,0xef,0x24,0xf6,0xf5,0x68,0xc3, +0x94,0xa, 0x74,0x80,0x94,0x81,0x50,0x27,0xe5,0x68,0xc3,0x94,0x10,0x40,0x17,0xe5, +0x68,0xd3,0x94,0x1f,0x50,0x10,0x7d,0x77,0xaf,0x67,0x12,0x6, 0x93,0x11,0x40,0x34, +0xc, 0xf5,0x83,0xef,0xf0,0x22,0x11,0x40,0x34,0xc, 0xf5,0x83,0xe5,0x67,0xf0,0x22, +0x74,0x91,0x25,0x68,0xf5,0x82,0xe4,0x22,0x7b,0x1, 0x7a,0xd, 0x79,0xe9,0xef,0x12, +0x1, 0xc5,0x53,0x7, 0x70,0xef,0xc4,0x54,0xf, 0xff,0xbf,0x4, 0xd, 0x90,0xe, 0x28, +0xe0,0x7d,0x3, 0xb4,0x3, 0x2, 0x80,0xb, 0x80,0xd, 0x90,0xe, 0x28,0xe0,0x7d,0x1, +0xb4,0x3, 0x4, 0x7f,0x1, 0x80,0x81,0x7f,0x27,0xef,0xd3,0x94,0x3f,0x50,0x22,0xef, +0x64,0x26,0x60,0x1d,0xef,0x64,0x28,0x60,0x18,0xef,0x64,0x2f,0x60,0x13,0x74,0x1, +0x2f,0xf5,0x82,0xe4,0x34,0xe, 0xf5,0x83,0xed,0xf0,0x90,0xe, 0x41,0xe0,0x44,0x1, +0xf0,0x22,0x8f,0x65,0x8d,0x66,0xe5,0x65,0x24,0xb3,0x60,0x6d,0x24,0x4d,0xb4,0x8, +0x0, 0x50,0x75,0x90,0x48,0xba,0xf8,0x28,0x28,0x73,0x2, 0x48,0xd2,0x2, 0x48,0xd6, +0x2, 0x48,0xed,0x2, 0x49,0x0, 0x2, 0x49,0x5, 0x2, 0x49,0xa, 0x2, 0x49,0xf, 0x2, +0x49,0x14,0xaf,0x66,0x1, 0x48,0x90,0xd, 0xe7,0xe5,0x66,0xf0,0xe0,0x75,0xf0,0x20, +0xa4,0xae,0xf0,0x25,0x16,0xf5,0x10,0xee,0x35,0x15,0xf5,0xf, 0x22,0xe5,0x66,0xb4, +0x4, 0x2, 0x80,0x2d,0xe5,0x66,0x64,0x5, 0x60,0x2, 0x21,0xb3,0xfd,0xff,0x80,0x25, +0x90,0xc, 0x91,0x21,0xb0,0x90,0xc, 0x92,0x21,0xb0,0x90,0xc, 0x93,0x21,0xb0,0x90, +0xc, 0x94,0x21,0xb0,0x90,0xc, 0x95,0x21,0xb0,0xe5,0x66,0x64,0x4, 0x60,0x2, 0x21, +0xb3,0x7d,0x4, 0x7f,0x1, 0x2, 0x47,0xf8,0xe5,0x65,0xc3,0x94,0x50,0x40,0x17,0xe5, +0x65,0xd3,0x94,0x77,0x50,0x10,0x7d,0x77,0xaf,0x66,0x12,0x6, 0x93,0x74,0x51,0x25, +0x65,0x91,0x90,0xef,0xf0,0x22,0xe5,0x65,0xc3,0x94,0x78,0x40,0x14,0xe5,0x65,0xd3, +0x94,0x9f,0x50,0xd, 0x74,0x45,0x25,0x65,0xf5,0x82,0xe4,0x34,0xc, 0xf5,0x83,0x80, +0x4f,0xe5,0x65,0xc3,0x94,0xa0,0x40,0x14,0xe5,0x65,0xd3,0x94,0xbe,0x50,0xd, 0x74, +0x39,0x25,0x65,0xf5,0x82,0xe4,0x34,0xc, 0xf5,0x83,0x80,0x34,0xe5,0x65,0xc3,0x94, +0xbf,0x40,0x14,0xe5,0x65,0xd3,0x94,0xd2,0x50,0xd, 0x74,0x2a,0x25,0x65,0xf5,0x82, +0xe4,0x34,0xc, 0xf5,0x83,0x80,0x19,0xe5,0x65,0xc3,0x94,0xd3,0x40,0x15,0xe5,0x65, +0xd3,0x94,0xe1,0x50,0xe, 0x74,0x24,0x25,0x65,0xf5,0x82,0xe4,0x34,0xc, 0xf5,0x83, +0xe5,0x66,0xf0,0x22,0x30,0x95,0x4b,0x90,0xd, 0xe6,0xe0,0x4, 0xf0,0xe0,0xff,0xb4, +0x1, 0x8, 0x90,0xe, 0x0, 0xe5,0x95,0xf0,0x80,0x2a,0x90,0xd, 0xe9,0xe0,0xfe,0xc4, +0x54,0x7, 0x70,0xe, 0x90,0xe, 0x0, 0xe0,0x2f,0x24,0xfe,0xff,0xad,0x95,0x91,0x62, +0x80,0x12,0x71,0x2b,0xff,0xbf,0x4, 0xc, 0x90,0xd, 0xe6,0x71,0x36,0x24,0xfe,0xff, +0xad,0x95,0x11,0xa2,0x71,0x2b,0xfa,0x70,0x4, 0x91,0x3a,0x80,0x5, 0xba,0x4, 0x2, +0x71,0x3e,0x30,0x94,0x16,0x90,0xd, 0xe4,0xe0,0x4, 0xf0,0x71,0x2b,0xfa,0x70,0x4, +0x71,0x33,0x81,0x3e,0xba,0x4, 0x4, 0x71,0x33,0x71,0x42,0x22,0x91,0x98,0x15,0x19, +0x15,0x19,0xe5,0x19,0x24,0x3, 0xf8,0xe6,0xfe,0x14,0x60,0x16,0x14,0x60,0x1a,0x24, +0xfa,0x50,0x1a,0x24,0xbb,0x60,0x3c,0x24,0x4d,0x70,0x42,0x90,0xd, 0xe9,0xe0,0xff, +0x61,0x1c,0x90,0xd, 0xe7,0xe0,0xff,0x61,0x1c,0x7f,0xff,0x61,0x1c,0xa8,0x19,0x76, +0x1, 0x8, 0x76,0xc, 0x8, 0x76,0x91,0xee,0x7e,0x0, 0x24,0xfd,0xf5,0x82,0xee,0x34, +0xff,0xf5,0x83,0xa8,0x19,0x86,0x3, 0x8, 0xe6,0xfa,0x8, 0xe6,0xf9,0x12,0x1, 0x65, +0xff,0x61,0x1c,0x90,0xd, 0xea,0xe0,0xc4,0x54,0xf0,0xff,0x61,0x1c,0x71,0x23,0xc3, +0x94,0x10,0x40,0x1b,0xef,0x94,0x24,0x50,0x16,0xe5,0x10,0x2f,0xf5,0x82,0xe4,0x35, +0xf, 0xf5,0x83,0xe5,0x82,0x24,0xf0,0xf5,0x82,0xe5,0x83,0x34,0xff,0x80,0x75,0x71, +0x23,0xc3,0x94,0x50,0x40,0x14,0xef,0xd3,0x94,0x77,0x50,0xe, 0x74,0x51,0x2f,0x91, +0x90,0xe0,0xff,0x7d,0x77,0x12,0x0, 0x26,0x80,0x62,0x71,0x23,0xc3,0x94,0x78,0x40, +0x10,0xef,0xd3,0x94,0x9f,0x50,0xa, 0x74,0x45,0x2f,0xf5,0x82,0xe4,0x34,0xc, 0x80, +0x43,0x71,0x23,0xc3,0x94,0xa0,0x40,0x10,0xef,0xd3,0x94,0xbe,0x50,0xa, 0x74,0x39, +0x2f,0xf5,0x82,0xe4,0x34,0xc, 0x80,0x2c,0x71,0x23,0xc3,0x94,0xbf,0x40,0x10,0xef, +0xd3,0x94,0xd2,0x50,0xa, 0x74,0x2a,0x2f,0xf5,0x82,0xe4,0x34,0xc, 0x80,0x15,0x71, +0x23,0xc3,0x94,0xd3,0x40,0x14,0xef,0xd3,0x94,0xe1,0x50,0xe, 0x74,0x24,0x2f,0xf5, +0x82,0xe4,0x34,0xc, 0xf5,0x83,0xe0,0xff,0x80,0x2, 0x7f,0xff,0xe5,0x19,0x24,0x4, +0xf5,0x19,0x22,0xe5,0x19,0x24,0x3, 0xf8,0xe6,0xff,0x22,0x90,0xd, 0xe9,0xe0,0xc4, +0x54,0x7, 0x22,0x90,0xd, 0xe4,0xe0,0xff,0x90,0xe, 0x0, 0xe0,0x2f,0x22,0x90,0xe, +0x0, 0xe0,0xff,0x51,0x1c,0x8f,0x95,0x22,0x91,0x98,0xa8,0x19,0x8, 0xe6,0xff,0xc3, +0x94,0x80,0x40,0x10,0xef,0xd3,0x94,0xc3,0x50,0xa, 0x74,0x81,0x2f,0xf5,0x82,0xe4, +0x34,0xd, 0x81,0x17,0xa8,0x19,0x8, 0xe6,0xff,0xc3,0x94,0x3, 0x50,0x2, 0x61,0xf3, +0xef,0xd3,0x94,0x3e,0x50,0x7d,0xa8,0x19,0x8, 0xe6,0xfb,0x24,0xfd,0xff,0xe4,0x34, +0xff,0xfe,0x7c,0x0, 0x7d,0x6, 0x12,0x2, 0xb, 0xa8,0x19,0xef,0xf6,0x75,0xf0,0x6, +0xa4,0xff,0xc3,0xeb,0x9f,0x24,0xfd,0x24,0xfc,0x50,0x7, 0x60,0x28,0x14,0x60,0x3c, +0x80,0x51,0x91,0x44,0xa8,0x19,0xe6,0x25,0xe0,0xff,0xe4,0x33,0xfe,0x8, 0xe6,0x24, +0x2, 0xfd,0xe4,0x33,0xcd,0xc3,0x9f,0xff,0xed,0x9e,0xfe,0xe5,0x12,0x2f,0xf5,0x82, +0xe5,0x11,0x3e,0x80,0x52,0x7f,0x0, 0x20,0x1, 0x2, 0x7f,0x1, 0xef,0x75,0xf0,0xa, +0xa4,0x24,0xec,0xf5,0x82,0xe4,0x34,0xd, 0x91,0x55,0x80,0x3b,0x7f,0x0, 0x20,0x1, +0x2, 0x7f,0x1, 0xef,0x75,0xf0,0xa, 0xa4,0x24,0x9c,0xf5,0x82,0xe4,0x34,0xd, 0x91, +0x55,0x80,0x24,0xa8,0x19,0x8, 0xe6,0x14,0x60,0x12,0x14,0x60,0x20,0x24,0x6, 0x60, +0x2b,0x24,0xfc,0x70,0x2e,0x90,0xd, 0xe9,0xe0,0xff,0x80,0x29,0x91,0x44,0xe5,0x12, +0x24,0x4, 0xf5,0x82,0xe4,0x35,0x11,0xf5,0x83,0xe0,0xff,0x80,0x18,0x91,0x44,0x85, +0x12,0x82,0x85,0x11,0x83,0xa3,0xa3,0xa3,0xe0,0xff,0x80,0x9, 0x90,0xe, 0x28,0xe0, +0xff,0x80,0x2, 0x7f,0x0, 0x5, 0x19,0x5, 0x19,0x22,0x90,0xe, 0x0, 0xe0,0xff,0x71, +0x48,0x8f,0x95,0x22,0x30,0x1, 0x7, 0x75,0x11,0xd, 0x75,0x12,0xb0,0x22,0x75,0x11, +0xd, 0x75,0x12,0xca,0x22,0xf5,0x83,0xa8,0x19,0xe6,0x25,0x82,0xf5,0x82,0xe4,0x35, +0x83,0x22,0x8f,0x65,0x8d,0x66,0xe5,0x65,0xc3,0x94,0x80,0x40,0xe, 0xe5,0x65,0xd3, +0x94,0xc3,0x50,0x7, 0xe5,0x65,0x24,0x80,0xff,0x80,0x12,0xe5,0x65,0x24,0x4, 0x60, +0x8, 0x24,0xfc,0x70,0xa, 0xaf,0x66,0x1, 0x48,0xad,0x66,0x7f,0x27,0x11,0x79,0x22, +0xf5,0x82,0xe4,0x34,0xc, 0xf5,0x83,0x22,0x15,0x19,0xa8,0x19,0xa6,0x7, 0x15,0x19, +0x22,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x0, 0xc0,0x0, +0xc0,0x1, 0xc0,0x2, 0xc0,0x3, 0xc0,0x4, 0xc0,0x5, 0xc0,0x6, 0xc0,0x7, 0xe5,0xc9, +0x54,0x3, 0xff,0xbf,0x1, 0x6, 0x53,0xc9,0xfc,0x43,0xc9,0x2, 0x31,0xb4,0x30,0x95, +0x2, 0xc2,0x95,0x30,0x94,0x2, 0xc2,0x94,0x90,0xd, 0xe5,0x74,0x1, 0xf0,0xd0,0x7, +0xd0,0x6, 0xd0,0x5, 0xd0,0x4, 0xd0,0x3, 0xd0,0x2, 0xd0,0x1, 0xd0,0x0, 0xd0,0xd0, +0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32,0x90,0xe, 0x66,0x74,0x3, 0xf0,0xe4, +0x90,0xe, 0x6d,0x2, 0x45,0xfa,0xc3,0xee,0x64,0x80,0x94,0x80,0x50,0x9, 0xc3,0xe4, +0x9f,0xfd,0xe4,0x9e,0xfc,0x80,0x4, 0xac,0x6, 0xad,0x7, 0xaf,0x5, 0xae,0x4, 0x22, +0x8b,0x34,0x8a,0x35,0x89,0x36,0xe4,0xf5,0x43,0xf5,0x42,0xf5,0x41,0xf5,0x40,0xf5, +0x47,0xf5,0x46,0xf5,0x45,0xf5,0x44,0xf5,0x48,0x12,0x1, 0x4c,0xc3,0x13,0xf5,0x3c, +0x12,0x14,0x38,0xc3,0x13,0xf5,0x3e,0xf1,0xc5,0xc3,0x13,0xf5,0x3d,0xf1,0xcb,0xc3, +0x13,0xf5,0x3f,0x75,0x3a,0xff,0xd3,0xe5,0x3a,0x64,0x80,0x94,0x81,0x40,0x2, 0xc1, +0x37,0xd1,0xa4,0xad,0x3c,0xd1,0x7a,0xd1,0x85,0x50,0x2, 0xc1,0x33,0xd1,0xbb,0x94, +0x80,0x40,0x2, 0xc1,0x33,0xd1,0xa4,0xad,0x3d,0xd1,0x7a,0xd1,0x85,0x50,0x2, 0xc1, +0x33,0xd1,0xbb,0x94,0x80,0x40,0x2, 0xc1,0x33,0x75,0x3b,0xff,0xd3,0xe5,0x3b,0x64, +0x80,0x94,0x81,0x40,0x2, 0xc1,0x33,0xd1,0x91,0xfe,0xad,0x3e,0xd1,0x7a,0xd1,0x85, +0x50,0x2, 0xc1,0x2f,0xd1,0xb3,0x94,0x80,0x40,0x2, 0xc1,0x2f,0xd1,0x91,0xfe,0xad, +0x3f,0xd1,0x7a,0xd1,0x85,0x40,0x78,0xd1,0xb3,0x94,0x80,0x50,0x72,0xd1,0x98,0xad, +0x3c,0xd1,0x7a,0xfe,0xef,0x78,0x5, 0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xd1,0x8c, +0xfe,0xad,0x3e,0xd1,0x7a,0x12,0x17,0x2e,0x12,0x17,0x7c,0xd1,0xac,0xb1,0x6, 0xe4, +0xfc,0xfd,0xe5,0x43,0x2f,0xf5,0x43,0xe5,0x42,0x3e,0xf5,0x42,0xed,0x35,0x41,0xf5, +0x41,0xec,0x35,0x40,0xf5,0x40,0xd1,0x98,0xad,0x3d,0xd1,0x7a,0xfe,0xef,0x78,0x5, +0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xd1,0x8c,0xfe,0xad,0x3f,0xd1,0x7a,0x12,0x17, +0x2e,0x12,0x17,0x7c,0xd1,0xac,0xb1,0x6, 0xe4,0xfc,0xfd,0xe5,0x47,0x2f,0xf5,0x47, +0xe5,0x46,0x3e,0xf5,0x46,0xed,0x35,0x45,0xf5,0x45,0xec,0x35,0x44,0xf5,0x44,0x5, +0x3b,0xa1,0x8c,0x5, 0x3a,0xa1,0x56,0xc3,0xe5,0x43,0x95,0x47,0xff,0xe5,0x42,0x95, +0x46,0xfe,0x12,0x0, 0x6, 0xee,0x33,0x95,0xe0,0x8f,0x43,0x8e,0x42,0xf5,0x41,0xf5, +0x40,0x90,0xc, 0x85,0xe0,0xfe,0xa3,0xe0,0xff,0xe4,0xfc,0xfd,0xab,0x43,0xaa,0x42, +0xa9,0x41,0xa8,0x40,0xc3,0x12,0x4, 0xa5,0x40,0xa, 0xab,0x34,0xaa,0x35,0xa9,0x36, +0xd1,0xc3,0x70,0x3, 0x7f,0x1, 0x22,0x7f,0x0, 0x22,0xed,0x33,0x95,0xe0,0xfc,0xed, +0x2f,0xff,0xec,0x3e,0x22,0xfe,0xc3,0x64,0x80,0x94,0x80,0x22,0x29,0xf9,0xea,0x3e, +0xfa,0xaf,0x3b,0xef,0x33,0x95,0xe0,0x22,0xab,0x37,0xe5,0x39,0x24,0x80,0xf9,0xe5, +0x38,0x34,0x3, 0xfa,0xaf,0x3a,0xef,0x33,0x95,0xe0,0xfe,0x22,0x12,0x2, 0x76,0xff, +0xae,0xf0,0x22,0xd3,0xef,0x94,0x9, 0xee,0x64,0x80,0x22,0xd3,0xef,0x94,0xe, 0xee, +0x64,0x80,0x22,0x90,0x0, 0x86,0x2, 0x1, 0x65,0xf1,0xd1,0x75,0x2f,0x1, 0xf1,0xbb, +0xf1,0xb1,0x12,0x10,0x9c,0xf1,0xe2,0x8f,0x2d,0xf1,0xbb,0xf1,0xb1,0x12,0x10,0x9c, +0x12,0x3a,0x2f,0x8f,0x2e,0x12,0x1c,0xc2,0x90,0x9, 0x2b,0x12,0x1, 0x65,0xff,0x70, +0x31,0x90,0x9, 0x24,0x4, 0x12,0x1, 0xd7,0xe5,0x2d,0xb4,0x2, 0xa, 0x90,0x9, 0x24, +0x74,0x6, 0x12,0x1, 0xd7,0x80,0x5b,0x12,0x17,0x1c,0x70,0xc, 0xd1,0xc3,0x70,0x8, +0x12,0x1c,0xc2,0x90,0x9, 0x2b,0x80,0x3d,0x12,0x1c,0xc2,0x90,0x9, 0x24,0x74,0x4, +0x80,0x6f,0xef,0x64,0x1, 0x70,0x40,0x12,0x1c,0xc2,0x90,0x9, 0x24,0x12,0x1, 0xd7, +0xe5,0x2e,0x60,0x7, 0x90,0x9, 0x2b,0x74,0x3, 0x80,0x56,0xe5,0x2d,0xb4,0x2, 0x6, +0x90,0x9, 0x24,0xe4,0x80,0x4b,0x12,0x17,0x1c,0x70,0xd, 0xd1,0xc3,0x70,0x9, 0x12, +0x1c,0xc2,0x90,0x9, 0x24,0x4, 0x80,0x39,0xf1,0xbb,0xf1,0xb1,0x12,0x17,0x9e,0x12, +0x3b,0x26,0xe4,0xf5,0x2f,0x80,0x2d,0x12,0x1c,0xc2,0x90,0x9, 0x2b,0x12,0x1, 0x65, +0xb4,0x3, 0x21,0xe5,0x2e,0x60,0x15,0x24,0xfe,0x60,0xa, 0x4, 0x70,0x16,0x90,0x9, +0x24,0x74,0x3, 0x80,0xc, 0x90,0x9, 0x24,0x74,0x2, 0x80,0x5, 0x90,0x9, 0x2b,0x74, +0x1, 0x12,0x1, 0xd7,0xe5,0x2f,0xb4,0x1, 0x17,0x12,0x17,0x9e,0x90,0x0, 0x80,0xe4, +0xf1,0xd8,0x90,0x0, 0x82,0xe4,0x12,0x1, 0xd7,0x90,0x0, 0x84,0xe4,0x12,0x1, 0xd7, +0x22,0x85,0x2a,0x36,0x85,0x2b,0x37,0x85,0x2c,0x38,0x22,0x85,0x27,0x33,0x85,0x28, +0x34,0x85,0x29,0x35,0x22,0x90,0x0, 0x2, 0x2, 0x1, 0x65,0x90,0x0, 0x3, 0x2, 0x1, +0x65,0x8b,0x21,0x8a,0x22,0x89,0x23,0x22,0x12,0x1, 0xd7,0x90,0x0, 0x81,0xe4,0x2, +0x1, 0xd7,0x12,0x3e,0x38,0x75,0x3f,0x1, 0xaa,0x34,0xa9,0x35,0xae,0x2, 0xaf,0x1, +0x8e,0x40,0x8f,0x41,0x12,0x57,0xb1,0xaf,0x1, 0xf5,0x42,0x8f,0x43,0xe4,0xf5,0x39, +0x12,0x3b,0x1f,0x12,0x14,0x38,0xff,0xe5,0x39,0xc3,0x9f,0x40,0x2, 0x1, 0xb2,0xe4, +0xf5,0x3b,0xf5,0x3c,0x75,0x3d,0x7f,0x75,0x3e,0xff,0x12,0x2f,0x3a,0x90,0x0, 0x1a, +0xf1,0x21,0xfd,0x75,0xf0,0x10,0xa4,0xff,0xae,0xf0,0xe5,0x39,0x7a,0x0, 0x2f,0xf5, +0x45,0xea,0x3e,0xf5,0x44,0x8d,0x3a,0x12,0x2f,0x3a,0x90,0x0, 0x1b,0xf1,0x21,0xff, +0xe5,0x3a,0xd3,0x9f,0x50,0x46,0xe5,0x45,0x25,0xe0,0xff,0xe5,0x44,0x33,0xfe,0xe5, +0x41,0x2f,0xf5,0x82,0xe5,0x40,0x12,0x3f,0xb5,0x11,0xe2,0xfe,0xa3,0xe0,0x2d,0xff, +0xee,0x3c,0xfe,0xd3,0xef,0x95,0x3c,0xee,0x95,0x3b,0x40,0x4, 0x8e,0x3b,0x8f,0x3c, +0xc3,0xef,0x95,0x3e,0xee,0x95,0x3d,0x50,0x4, 0x8e,0x3d,0x8f,0x3e,0x74,0x10,0x25, +0x45,0xf5,0x45,0xe4,0x35,0x44,0xf5,0x44,0x5, 0x3a,0x80,0xab,0x12,0x2f,0x3a,0x90, +0x0, 0x1c,0x12,0x2, 0xa1,0xff,0xc3,0xe5,0x3c,0x95,0x3e,0xfd,0xe5,0x3b,0x95,0x3d, +0xfc,0xd3,0xed,0x9f,0xec,0x95,0xf0,0x40,0x5, 0x75,0x3f,0x2, 0x80,0x4, 0x5, 0x39, +0x1, 0x0, 0xaf,0x3f,0x22,0x3c,0xf5,0x83,0xe0,0xc3,0x13,0x7c,0x0, 0x2f,0xff,0xec, +0x35,0xf0,0xfe,0xef,0x25,0xe0,0xff,0xee,0x33,0xfe,0xe5,0x43,0x2f,0xf5,0x82,0xe5, +0x42,0x3e,0xf5,0x83,0xe0,0xfc,0xa3,0xe0,0xfd,0xe5,0x3f,0x25,0xe0,0xff,0xe5,0x3e, +0x33,0xfe,0xe5,0x43,0x2f,0xf5,0x82,0xe5,0x42,0x3e,0xf5,0x83,0xe0,0x22,0x12,0x4f, +0xd1,0xe4,0xf5,0x2e,0xf5,0x2f,0xf1,0xd3,0xf5,0x3a,0x75,0x3b,0xff,0xf5,0x40,0xf5, +0x41,0x12,0x1c,0xc2,0x90,0x0, 0xb, 0xf1,0xb9,0xe4,0xf5,0x46,0xf5,0x47,0xf5,0x48, +0x90,0x0, 0x3, 0x12,0x2, 0xa1,0xf5,0x4a,0x85,0xf0,0x49,0x12,0x17,0x8d,0xaf,0x1, +0xf5,0x42,0x8f,0x43,0x12,0x2d,0xa5,0x90,0x0, 0x2f,0x12,0x1, 0x65,0xc3,0x13,0x20, +0xe0,0x5, 0x75,0x2d,0x2, 0x80,0x3, 0x75,0x2d,0x4, 0xe4,0xf5,0x2e,0x12,0x10,0x9c, +0x12,0x1, 0x4c,0xff,0xe5,0x2e,0xc3,0x9f,0x40,0x2, 0xa1,0xa7,0xe5,0x2e,0x75,0xf0, +0x10,0xa4,0x85,0xf0,0x3e,0xf5,0x3f,0xe4,0xf5,0x2f,0x12,0x14,0x32,0xff,0xe5,0x2f, +0xc3,0x9f,0x40,0x2, 0xa1,0xa3,0x11,0xd9,0xf1,0x2d,0xd3,0xef,0x95,0x45,0xee,0x95, +0x44,0x40,0x8, 0x5, 0x47,0xe5,0x47,0x70,0x2, 0x5, 0x46,0x11,0xd9,0xf1,0x2d,0xd3, +0xd1,0xed,0x50,0x2, 0xa1,0x97,0xe5,0x2e,0x70,0x6, 0xf5,0x30,0xf5,0x31,0x80,0x14, +0xe5,0x3f,0x24,0xf0,0xff,0xe5,0x3e,0x34,0xff,0x12,0x17,0x2e,0x11,0xe0,0xf5,0x30, +0xa3,0xe0,0xf5,0x31,0x12,0x10,0x9c,0x12,0x1, 0x4c,0x14,0xb5,0x2e,0x7, 0xe4,0xf5, +0x32,0xf5,0x33,0x80,0x13,0xe5,0x3f,0x24,0x10,0xff,0xe4,0x35,0x3e,0x12,0x17,0x2e, +0x11,0xe0,0xf5,0x32,0xa3,0xe0,0xf5,0x33,0xe5,0x2f,0x70,0x6, 0xf5,0x36,0xf5,0x37, +0x80,0x14,0xe5,0x3f,0x24,0xff,0xff,0xe5,0x3e,0x34,0xff,0x12,0x17,0x2e,0x11,0xe0, +0xf5,0x36,0xa3,0xe0,0xf5,0x37,0x12,0x14,0x38,0x14,0xb5,0x2f,0x7, 0xe4,0xf5,0x34, +0xf5,0x35,0x80,0x13,0xe5,0x3f,0x24,0x1, 0xff,0xe4,0x35,0x3e,0x12,0x17,0x2e,0x11, +0xe0,0xf5,0x34,0xa3,0xe0,0xf5,0x35,0x11,0xd9,0xfe,0xc3,0xee,0x64,0x80,0x94,0x80, +0x50,0x28,0xe5,0x31,0x95,0x33,0xe5,0x32,0xf1,0x0, 0x40,0x6, 0x85,0x32,0x30,0x85, +0x33,0x31,0xd3,0xe5,0x31,0x95,0x35,0xe5,0x34,0xf1,0x0, 0x40,0x6, 0x85,0x34,0x30, +0x85,0x35,0x31,0xd3,0xd1,0xfa,0x40,0x2f,0x80,0x27,0xc3,0xe5,0x31,0x95,0x33,0xe5, +0x32,0xf1,0x0, 0x50,0x6, 0x85,0x32,0x30,0x85,0x33,0x31,0xc3,0xe5,0x31,0x95,0x35, +0xe5,0x34,0xf1,0x0, 0x50,0x6, 0x85,0x34,0x30,0x85,0x35,0x31,0xc3,0xd1,0xfa,0x50, +0x6, 0x85,0x36,0x30,0x85,0x37,0x31,0xe5,0x2e,0x25,0xe0,0xf5,0x40,0xe5,0x2f,0x25, +0xe0,0xf5,0x41,0xc3,0xee,0x64,0x80,0x94,0x80,0x40,0x2, 0x61,0x43,0x11,0xd9,0xfe, +0xa3,0xe0,0xff,0xd3,0x95,0x31,0xe5,0x30,0xd1,0xf2,0x40,0x2, 0x61,0x39,0xc3,0xe4, +0x95,0x4a,0xfd,0xe4,0x95,0x49,0xfc,0xd3,0xef,0x9d,0xec,0xd1,0xf2,0x40,0x2, 0x61, +0x39,0xe5,0x48,0x70,0x9, 0x90,0xc, 0x1d,0xe5,0x40,0xf0,0xa3,0x61,0x34,0xe5,0x48, +0xc3,0x94,0x5, 0x40,0x5, 0x75,0x48,0x5, 0x80,0x7f,0xe4,0xf5,0x3b,0xf1,0x44,0xc3, +0xed,0x95,0x48,0x74,0x80,0xf8,0x6c,0x98,0x50,0x5c,0xed,0x25,0xe0,0xff,0xec,0xf1, +0x7b,0xe0,0xfd,0x7b,0x2, 0xaf,0x40,0x12,0x2d,0xfa,0xef,0x60,0x45,0x12,0x17,0x28, +0x33,0xfe,0xf1,0x4c,0xf1,0x24,0x60,0x3a,0xaf,0x3b,0xf1,0x1a,0x25,0xe0,0xfd,0xee, +0x33,0xfc,0x74,0x1d,0x2d,0xf5,0x82,0x74,0xc, 0x12,0x2f,0xee,0xff,0x74,0x1e,0x2d, +0xf5,0x82,0x74,0xc, 0x11,0xb5,0xfe,0xa3,0xe0,0xff,0xc3,0x12,0x2f,0xb6,0x50,0xd, +0x12,0x17,0x28,0xf1,0x7b,0xe5,0x40,0xf0,0xf1,0x4c,0xe5,0x41,0xf0,0x75,0x3b,0xff, +0x80,0x4, 0x5, 0x3b,0x80,0x97,0xe5,0x48,0xb5,0x3b,0xe, 0xf1,0x63,0xe5,0x40,0xf0, +0xe5,0x48,0xf1,0x57,0xe5,0x41,0xf0,0x5, 0x48,0x5, 0x3f,0xe5,0x3f,0x70,0x2, 0x5, +0x3e,0xa1,0x9f,0x11,0xd9,0xfe,0xa3,0xe0,0xff,0xc3,0x95,0x31,0xe5,0x30,0xd1,0xf2, +0x50,0x2, 0xa1,0x97,0xd1,0xed,0x50,0x2, 0xa1,0x97,0xe5,0x3a,0x70,0x9, 0x90,0xb, +0xcd,0xe5,0x40,0xf0,0xa3,0xa1,0x92,0xe5,0x3a,0xc3,0x94,0x14,0x40,0x5, 0x75,0x3a, +0x14,0xa1,0x97,0xe4,0xf5,0x3b,0xf1,0x44,0xc3,0xed,0x95,0x3a,0x74,0x80,0xf8,0x6c, +0x98,0x40,0x2, 0xa1,0x83,0xd1,0xce,0xe0,0xfd,0xab,0x2d,0xaf,0x40,0x12,0x2d,0xfa, +0xef,0x60,0x35,0x12,0x17,0x28,0xd1,0xe0,0xe0,0xfd,0xab,0x2d,0xf1,0x26,0x60,0x28, +0x12,0x2f,0xd9,0xff,0x74,0xce,0x2d,0xf5,0x82,0x74,0xb, 0x11,0xb5,0xfe,0xa3,0xe0, +0xff,0xc3,0x12,0x2f,0xb6,0x40,0x2, 0xa1,0x7a,0x12,0x17,0x28,0xd1,0xd3,0xe5,0x40, +0xf0,0xd1,0xe2,0xe5,0x41,0xf0,0xa1,0x7a,0x12,0x17,0x28,0xd1,0xd3,0xe0,0xfd,0x7b, +0x6, 0xaf,0x40,0x12,0x2d,0xfa,0xef,0x70,0x2, 0xa1,0x7f,0x12,0x17,0x28,0xd1,0xe0, +0xf1,0x24,0x70,0x2, 0xa1,0x7f,0x12,0x17,0x28,0xd1,0xd3,0xe0,0xc3,0x13,0x25,0x2e, +0xf5,0x3c,0xd1,0xe2,0xe0,0xc3,0x13,0x25,0x2f,0xf5,0x3d,0xe4,0xf5,0x30,0xf5,0x31, +0xc3,0xe5,0x31,0x95,0x3a,0x74,0x80,0xf8,0x65,0x30,0x98,0x50,0x37,0xaf,0x3b,0xf1, +0x1a,0x65,0x31,0x70,0x3, 0xee,0x65,0x30,0x60,0x20,0xf1,0x3c,0xd1,0xd3,0xe0,0xfd, +0x7b,0x2, 0xaf,0x3c,0x12,0x2d,0xfa,0xef,0x60,0x10,0xf1,0x3c,0xd1,0xe0,0xe0,0xfd, +0x12,0x2e,0x41,0x60,0x5, 0x75,0x3c,0xff,0x80,0xa, 0x5, 0x31,0xe5,0x31,0x70,0x2, +0x5, 0x30,0x80,0xbc,0xe5,0x3c,0xf4,0x70,0x2, 0xa1,0x7f,0x12,0x2f,0xd9,0xff,0x74, +0xce,0x2d,0xf5,0x82,0x74,0xb, 0x3c,0xf5,0x83,0xe0,0xc3,0x13,0xf9,0x11,0xbb,0xfe, +0xa3,0xe0,0xff,0x12,0x2f,0xb5,0x40,0x11,0x12,0x17,0x28,0xd1,0xd3,0x12,0x2f,0xf1, +0xff,0xe9,0xf1,0x34,0x12,0x17,0x2e,0x80,0x7, 0xe5,0x3f,0x25,0xe0,0xff,0xe5,0x3e, +0x11,0xe0,0xf5,0x32,0xa3,0xe0,0xf5,0x33,0xe5,0x33,0xae,0x32,0x78,0x2, 0x12,0x2f, +0x33,0xd8,0xfb,0xfd,0xac,0x6, 0xe5,0x32,0xa2,0xe7,0x13,0xfe,0xe5,0x33,0x13,0x2d, +0xf5,0x33,0xee,0x3c,0xf5,0x32,0x12,0x1c,0xc2,0x12,0x4e,0xac,0xc3,0xe5,0x33,0x9f, +0xe5,0x32,0x9e,0x50,0x4, 0x8e,0x32,0x8f,0x33,0xaf,0x3c,0xf1,0x1a,0x24,0x1, 0xff, +0xe4,0x3e,0xf1,0x10,0xf1,0x9c,0xe5,0x3d,0xc3,0x13,0xfd,0x7c,0x0, 0x2f,0xff,0xec, +0x3e,0x12,0x17,0x2e,0x11,0xe0,0xfa,0xa3,0xe0,0xfb,0xe5,0x3c,0xa2,0xe7,0x13,0xf9, +0xff,0xf1,0x97,0xef,0x2d,0xff,0xec,0x3e,0x12,0x17,0x2e,0x11,0xe0,0xfe,0xa3,0xe0, +0x2b,0xf5,0x35,0xee,0x3a,0xf5,0x34,0xa2,0xe7,0x13,0xf5,0x34,0xe5,0x35,0x13,0xf5, +0x35,0xaf,0x3c,0xf1,0x1a,0x24,0x1, 0xff,0xe4,0x3e,0xf1,0x10,0xc4,0xf8,0x54,0xf, +0xc8,0x68,0xfd,0xee,0xc4,0x54,0xf0,0x48,0xfc,0xf1,0x9, 0x2d,0xff,0xee,0x3c,0x12, +0x17,0x2e,0x11,0xe0,0xfc,0xa3,0xe0,0xfd,0xe9,0xff,0x33,0x95,0xe0,0xfe,0xef,0xc4, +0xf8,0x54,0xf, 0xc8,0x68,0xfb,0xee,0xc4,0x54,0xf0,0x48,0xfa,0xf1,0x9, 0x2b,0xff, +0xee,0x3a,0x12,0x17,0x2e,0x11,0xe0,0xfe,0xa3,0xe0,0x2d,0xf5,0x37,0xee,0x3c,0xf5, +0x36,0xa2,0xe7,0x13,0xf5,0x36,0xe5,0x37,0x13,0xf5,0x37,0x25,0x35,0xff,0xe5,0x34, +0x35,0x36,0xf1,0x10,0xc3,0x95,0x33,0xe5,0x32,0xd1,0xf2,0x40,0x12,0x12,0x17,0x28, +0xd1,0xd3,0xe5,0x3c,0xf0,0xd1,0xe2,0xe5,0x3d,0xf0,0x75,0x3b,0xff,0x80,0x4, 0x5, +0x3b,0x61,0x76,0xe5,0x3a,0xb5,0x3b,0xf, 0x12,0x2d,0xb3,0xe5,0x40,0xf0,0xe5,0x3a, +0xf1,0x6f,0xe5,0x41,0xf0,0x5, 0x3a,0x5, 0x3f,0xe5,0x3f,0x70,0x2, 0x5, 0x3e,0x5, +0x2f,0x21,0x5a,0x5, 0x2e,0x21,0x3d,0xe4,0xf5,0x2e,0xe5,0x2e,0xc3,0x95,0x3a,0x50, +0x68,0xe4,0xf5,0x38,0xf5,0x39,0xf5,0x3c,0xf5,0x2f,0xe5,0x2f,0xc3,0x95,0x3a,0x50, +0x35,0xe5,0x2f,0x12,0x2d,0xb3,0xe0,0xff,0xf4,0x60,0x27,0xef,0x12,0x2f,0xf2,0xff, +0xe5,0x2f,0xf1,0x6f,0xe0,0xc3,0x13,0xf1,0x34,0x12,0x17,0x2e,0x11,0xe0,0xfe,0xa3, +0xe0,0xff,0xd3,0x95,0x39,0xe5,0x38,0xd1,0xf2,0x40,0x7, 0x8e,0x38,0x8f,0x39,0x85, +0x2f,0x3c,0x5, 0x2f,0x80,0xc4,0xe5,0x3c,0xfd,0x33,0x95,0xe0,0xfc,0xd1,0xce,0xe0, +0xfb,0xe5,0x2e,0x12,0x2d,0xd2,0xeb,0xf0,0xd1,0xe2,0xe0,0xff,0xf1,0x88,0xef,0xf0, +0xd1,0xce,0x74,0xff,0xf0,0x5, 0x2e,0x80,0x91,0xe5,0x3a,0xd3,0x94,0x5, 0x40,0x3, +0x75,0x3a,0x5, 0xe4,0xf5,0x2e,0xe5,0x2e,0xc3,0x95,0x3a,0x50,0x27,0xe5,0x2e,0x12, +0x2d,0xd2,0xe0,0x12,0x2d,0xa4,0x75,0xf0,0x2, 0xe5,0x2e,0x12,0x14,0x2b,0xef,0x12, +0x1, 0xd7,0xf1,0x88,0xe0,0xfd,0xe5,0x2e,0x75,0xf0,0x2, 0x12,0x2e,0x78,0xf1,0xaa, +0x5, 0x2e,0x80,0xd2,0xe5,0x48,0xd3,0x94,0x0, 0x40,0x2e,0xe4,0xf5,0x2e,0xe5,0x2e, +0xc3,0x95,0x48,0x50,0x24,0xe5,0x2e,0xf1,0x63,0xe0,0xfd,0xe5,0x2e,0x75,0xf0,0x2, +0x12,0x2d,0x81,0x90,0x0, 0x87,0xed,0x12,0x1, 0xd7,0xe5,0x2e,0xf1,0x57,0xe0,0x90, +0x0, 0x88,0x12,0x1, 0xd7,0x5, 0x2e,0x80,0xd5,0x12,0x2d,0xa5,0x90,0x0, 0x86,0xe5, +0x48,0x12,0x1, 0xd7,0x90,0x0, 0x2d,0xe5,0x3a,0x12,0x1, 0xd7,0xe9,0x24,0x2f,0xf1, +0xcc,0x54,0xfe,0x12,0x1, 0xc5,0x12,0x1c,0xc2,0x90,0x0, 0xd, 0x12,0x1, 0x65,0xff, +0xd3,0xe5,0x47,0x9f,0xe5,0x46,0x94,0x0, 0x40,0x13,0xab,0x2a,0xe5,0x2c,0x24,0x2f, +0xf9,0xe4,0x35,0x2b,0xfa,0x12,0x1, 0x4c,0x44,0x1, 0x12,0x1, 0xc5,0x22,0xed,0x25, +0xe0,0xff,0xec,0x33,0xfe,0x74,0xcd,0x2f,0xf5,0x82,0x74,0xb, 0x3e,0xf5,0x83,0x22, +0x33,0xfe,0x74,0xce,0x2f,0xf5,0x82,0x74,0xb, 0x3e,0xf5,0x83,0x22,0xef,0x95,0x4a, +0xe5,0x49,0x64,0x80,0xf8,0xee,0x64,0x80,0x98,0x22,0xe5,0x31,0x95,0x37,0xe5,0x36, +0x64,0x80,0xf8,0xe5,0x30,0x64,0x80,0x98,0x22,0xe5,0x3d,0x24,0x1, 0xff,0xe4,0x33, +0xa2,0xe7,0x13,0xfe,0xef,0x13,0x22,0xfa,0xaf,0x2a,0xef,0x33,0x95,0xe0,0xfe,0xef, +0x22,0x2, 0x1, 0x65,0xe0,0xfd,0xaf,0x41,0x12,0x2d,0xfa,0xef,0x22,0xfe,0xa3,0xe0, +0xff,0x2, 0x0, 0x6, 0x7c,0x0, 0x2f,0xff,0xec,0x35,0xf0,0x22,0xe5,0x31,0x25,0xe0, +0xff,0xe5,0x30,0x22,0xad,0x3b,0xed,0x33,0x95,0xe0,0xfc,0x22,0x74,0x1e,0x2f,0xf5, +0x82,0x74,0xc, 0x3e,0xf5,0x83,0x22,0x25,0xe0,0x24,0x1e,0xf5,0x82,0xe4,0x34,0xc, +0xf5,0x83,0x22,0x25,0xe0,0x24,0x1d,0xf5,0x82,0xe4,0x34,0xc, 0xf5,0x83,0x22,0x25, +0xe0,0x24,0xce,0xf5,0x82,0xe4,0x34,0xb, 0xf5,0x83,0x22,0x33,0xfe,0x74,0x1d,0x2f, +0xf5,0x82,0x74,0xc, 0x3e,0xf5,0x83,0x22,0xe5,0x2e,0x25,0xe0,0x24,0xf6,0xf5,0x82, +0xe4,0x34,0xb, 0xf5,0x83,0x22,0xef,0x33,0x95,0xe0,0xfe,0xef,0xc4,0xf8,0x54,0xf, +0xc8,0x68,0xff,0xee,0xc4,0x54,0xf0,0x48,0xfe,0x22,0x90,0x0, 0x1, 0xed,0x2, 0x1, +0xd7,0xe9,0x24,0x80,0xf9,0xea,0x34,0x3, 0x22,0x12,0x2, 0xa1,0xf5,0x45,0x85,0xf0, +0x44,0x22,0x90,0x0, 0x16,0xe4,0x12,0x1, 0xd7,0xe9,0x24,0x17,0xf9,0xe4,0x3a,0xfa, +0x2, 0x1, 0x4c,0xf5,0x30,0xf5,0x31,0xf5,0x32,0xf5,0x33,0xf5,0x34,0xf5,0x35,0xf5, +0x36,0xf5,0x37,0x22,0x12,0x4f,0xd1,0x12,0x1c,0xc2,0x12,0x63,0xa9,0xfe,0xd3,0x9f, +0x50,0x9, 0xee,0xc3,0x94,0x5, 0x50,0x3, 0x2, 0x58,0xff,0xe4,0xf5,0x2c,0xe5,0x2c, +0xc3,0x94,0x5, 0x50,0x12,0xe5,0x26,0x24,0x30,0xf9,0xe4,0x35,0x25,0xfa,0xe5,0x2c, +0x12,0x3d,0xab,0x35,0xf0,0x80,0xf, 0xe5,0x2c,0x75,0xf0,0x8, 0xa4,0x24,0x30,0xff, +0xe4,0x35,0xf0,0xfe,0x31,0x14,0xaf,0x1, 0xf5,0x2d,0x8f,0x2e,0x31,0x1c,0xe0,0x64, +0x2, 0x60,0x2, 0x1, 0xf4,0x31,0x1c,0xe4,0xf0,0x31,0x0, 0xa3,0xe0,0x24,0xfe,0xf5, +0x2a,0x31,0x0, 0xa3,0x31,0x8, 0xad,0x2a,0xed,0x33,0x95,0xe0,0xfc,0xc3,0x12,0x2f, +0xb6,0x40,0x2, 0x1, 0xf4,0x31,0x0, 0xe0,0x24,0xfe,0xf5,0x2b,0x31,0x0, 0x31,0x8, +0xad,0x2b,0xed,0x33,0x95,0xe0,0xfc,0xc3,0x12,0x2f,0xb6,0x40,0x2, 0x1, 0xf0,0xc3, +0xe5,0x2a,0x64,0x80,0x94,0x80,0x40,0x74,0xe5,0x2a,0x64,0x80,0x94,0x9c,0x50,0x6c, +0xc3,0xe5,0x2b,0x64,0x80,0x94,0x80,0x40,0x63,0xe5,0x2b,0x64,0x80,0x94,0x90,0x50, +0x5b,0x12,0x17,0x8b,0x12,0x57,0x17,0x78,0x5, 0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9, +0x12,0x17,0x72,0x12,0x2, 0x76,0xfd,0xaf,0x2a,0x12,0x57,0x96,0xab,0x2b,0xeb,0x33, +0x95,0xe0,0xfa,0xef,0x2b,0xff,0xee,0x3a,0x12,0x17,0x2e,0x33,0x12,0x17,0x9e,0x8f, +0x82,0xf5,0x83,0xe5,0xf0,0x8d,0xf0,0x12,0x2, 0xd9,0x12,0x57,0xb1,0x12,0x57,0x17, +0x78,0x5, 0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0x29,0xf9,0xea,0x3e,0xfa,0xaf,0x2b, +0x12,0x17,0x2a,0x12,0x17,0x7c,0xe4,0xf5,0xf0,0x12,0x3, 0x26,0x5, 0x2b,0x1, 0x5c, +0x5, 0x2a,0x1, 0x41,0x5, 0x2c,0xe5,0x2c,0x64,0xa, 0x60,0x3, 0x2, 0x57,0xfe,0x22, +0x85,0x2e,0x82,0x85,0x2d,0x83,0xa3,0x22,0xe0,0x24,0x2, 0xff,0xe4,0x33,0xfe,0x22, +0x33,0xfe,0xab,0x24,0xe5,0x26,0x2f,0xf9,0xe5,0x25,0x3e,0x22,0xe5,0x2e,0x24,0x7, +0xf5,0x82,0xe4,0x35,0x2d,0xf5,0x83,0x22,0x12,0x4f,0xd1,0x12,0x17,0x22,0xc3,0x94, +0x2, 0x50,0x2, 0x21,0xf1,0x12,0x17,0x9e,0x12,0x4f,0xc5,0xff,0x12,0x1, 0x4c,0x91, +0x1d,0x12,0x2f,0x33,0xd8,0xfb,0xf5,0x29,0x12,0x4f,0xcb,0xff,0x12,0x14,0x38,0x91, +0x1d,0x12,0x2f,0x33,0xd8,0xfb,0xf5,0x2a,0x12,0x10,0x9c,0x90,0x3, 0x80,0x75,0xf0, +0x20,0xe5,0x29,0x12,0x5, 0x19,0x91,0x83,0x12,0x2, 0xa1,0xc3,0x94,0xd4,0xe5,0xf0, +0x64,0x80,0x94,0x7e,0x40,0x7b,0xe4,0xf5,0x27,0x12,0x17,0x1c,0xff,0xe5,0x27,0xc3, +0x9f,0x50,0x6e,0x75,0xf0,0x2, 0xe5,0x27,0x12,0x14,0x2b,0x12,0x1, 0x65,0xf5,0x29, +0xe5,0x27,0x75,0xf0,0x2, 0x12,0x2e,0x78,0x12,0x14,0x38,0xf5,0x2a,0xe4,0xf5,0x28, +0x12,0x17,0x1c,0xff,0xe5,0x28,0xc3,0x9f,0x50,0x43,0xe5,0x27,0x65,0x28,0x60,0x39, +0x75,0xf0,0x2, 0xe5,0x28,0x12,0x14,0x2b,0x12,0x1, 0x65,0xfd,0xaf,0x29,0x12,0x17, +0x35,0xef,0xd3,0x94,0x4, 0x40,0x12,0xe5,0x28,0x75,0xf0,0x2, 0x12,0x1c,0x5e,0x12, +0x14,0x38,0xfd,0x91,0x49,0x94,0x4, 0x50,0x10,0x12,0x10,0x9c,0x90,0x3, 0x80,0xe5, +0x29,0x91,0x59,0xe5,0x2a,0x31,0xf2,0x91,0x51,0x5, 0x28,0x80,0xb3,0x5, 0x27,0x80, +0x88,0x22,0xc3,0x13,0x75,0xf0,0x2, 0x2, 0x5, 0x19,0x8b,0x46,0x8a,0x47,0x89,0x48, +0x75,0x4f,0x20,0x90,0x0, 0x55,0x12,0x1, 0x65,0xf5,0x57,0x12,0x14,0x38,0xf5,0x5e, +0x12,0x1, 0x4c,0xf5,0x5f,0x85,0x5e,0x60,0xe5,0x5e,0x25,0xe0,0xf5,0x61,0x90,0x0, +0x53,0x12,0x1, 0x65,0xf5,0x62,0x91,0x8b,0xef,0x70,0x3, 0x7f,0xaa,0x22,0xab,0x49, +0xaa,0x4a,0xa9,0x4b,0x90,0x9, 0x21,0x12,0x5, 0x25,0xaf,0x1, 0x8a,0x63,0x8f,0x64, +0xaf,0x5f,0x7e,0x0, 0xab,0x46,0xe5,0x48,0x24,0x56,0xf9,0xe4,0x35,0x47,0xfa,0x78, +0x69,0x7c,0x0, 0x7d,0x0, 0x12,0x1, 0x26,0xaf,0x5e,0x7e,0x0, 0xab,0x46,0xe5,0x48, +0x24,0x72,0xf9,0xe4,0x35,0x47,0xfa,0x78,0x85,0x7c,0x0, 0x7d,0x0, 0x12,0x1, 0x26, +0xe5,0x57,0x54,0x30,0x60,0x74,0x75,0x4c,0x10,0x75,0x4d,0x0, 0xe4,0x25,0x4b,0xf9, +0xe5,0x4a,0x34,0x7, 0xaf,0x1, 0xf5,0x5a,0x8f,0x5b,0xe4,0xf5,0x4e,0xe5,0x4e,0xc3, +0x95,0x5e,0x50,0x56,0x91,0x5, 0xe0,0xfe,0xa3,0xe0,0xff,0x91,0x14,0x25,0x4e,0xf8, +0xe6,0x31,0xf4,0xee,0xf0,0xa3,0xef,0xf0,0xe5,0x57,0x30,0xe5,0x15,0x91,0x5, 0x75, +0xf0,0x2, 0xe5,0x60,0x91,0x26,0x24,0x20,0x91,0xc, 0xe6,0x31,0xf4,0xee,0xf0,0xa3, +0xef,0xf0,0xe5,0x57,0x54,0x30,0x64,0x30,0x70,0x1a,0x91,0x5, 0x75,0xf0,0x2, 0xe5, +0x61,0x91,0x26,0x24,0x40,0x91,0xc, 0x74,0x85,0x25,0x4e,0xf8,0xe6,0x31,0xf4,0xee, +0xf0,0xa3,0xef,0xf0,0x91,0x3d,0x5, 0x4e,0x80,0xa3,0xe5,0x57,0x54,0x3, 0xf5,0x56, +0x70,0x2, 0x61,0xff,0x91,0x31,0xff,0xb4,0x1, 0x8, 0x75,0x4c,0x10,0x75,0x4d,0x60, +0x80,0x9, 0xef,0x70,0x6, 0x75,0x4c,0x10,0x75,0x4d,0x48,0x85,0x4c,0x50,0x85,0x4d, +0x51,0xe5,0x4b,0x24,0x80,0xf9,0xe5,0x4a,0x34,0x3, 0xaf,0x1, 0xf5,0x52,0x8f,0x53, +0x85,0x4a,0x54,0x85,0x4b,0x55,0xe4,0xf5,0x4e,0xe5,0x4e,0xc3,0x95,0x5f,0x40,0x2, +0x61,0xff,0x74,0x69,0x25,0x4e,0xf8,0xe6,0x85,0x4f,0xf0,0xa4,0xff,0xae,0xf0,0x25, +0x53,0xfd,0xe5,0x52,0x3e,0xf5,0x58,0x8d,0x59,0xe5,0x55,0x2f,0xff,0xe5,0x54,0x3e, +0xf5,0x5a,0x8f,0x5b,0xe4,0xfd,0xed,0xc3,0x95,0x5e,0x40,0x2, 0x61,0xdd,0x91,0x5, +0xe0,0xf5,0x5c,0xa3,0xe0,0xf5,0x5d,0x74,0x69,0x25,0x4e,0xf8,0xe6,0x85,0x5e,0xf0, +0xa4,0x25,0x64,0xf5,0x82,0xe5,0x63,0x35,0xf0,0xf5,0x83,0x74,0x85,0x2d,0xf8,0xe6, +0xf9,0x25,0x82,0x12,0x35,0x11,0xe0,0x75,0xf0,0x8, 0xa4,0xae,0xf0,0x25,0x5d,0xf5, +0x5d,0xee,0x35,0x5c,0xf5,0x5c,0xe5,0x62,0x60,0x2a,0x91,0x14,0x2d,0xf8,0xe6,0xff, +0x31,0xf4,0xe0,0xfa,0xa3,0xe0,0xfb,0xc3,0xe5,0x5d,0x9b,0xfb,0xe5,0x5c,0x9a,0xfa, +0x85,0x58,0x83,0x85,0x59,0x82,0x75,0xf0,0x2, 0xef,0x12,0x5, 0x19,0xea,0xf0,0xa3, +0xeb,0xf0,0x80,0x14,0x85,0x59,0x82,0x85,0x58,0x83,0x75,0xf0,0x2, 0xe9,0x12,0x5, +0x19,0xe5,0x5c,0xf0,0xa3,0xe5,0x5d,0xf0,0x91,0x3d,0xd, 0x61,0x56,0x91,0x31,0xff, +0xb4,0x1, 0x4, 0x74,0x20,0x80,0x5, 0xef,0x70,0xb, 0x74,0x48,0x25,0x51,0xf5,0x51, +0xe4,0x35,0x50,0xf5,0x50,0x85,0x50,0x4c,0x85,0x51,0x4d,0x5, 0x4e,0x61,0x29,0x12, +0x43,0xe3,0x7f,0x0, 0x22,0x85,0x4d,0x82,0x85,0x4c,0x83,0x22,0xf5,0x82,0xe4,0x35, +0x5a,0xf5,0x83,0x22,0x85,0x5b,0x82,0x85,0x5a,0x83,0x74,0x85,0x22,0x2f,0xff,0xe4, +0x33,0xfe,0xef,0x78,0x4, 0x22,0x12,0x5, 0x19,0xe0,0xfe,0xa3,0xe0,0xff,0xe5,0x5b, +0x22,0xab,0x46,0xaa,0x47,0xa9,0x48,0x90,0x0, 0x82,0x2, 0x1, 0x65,0x74,0x2, 0x25, +0x4d,0xf5,0x4d,0xe4,0x35,0x4c,0xf5,0x4c,0x22,0xaf,0x2a,0x12,0x17,0x35,0xef,0xd3, +0x22,0x74,0x1, 0x75,0xf0,0x18,0x2, 0x3, 0x45,0xc3,0x13,0x75,0xf0,0x20,0x2, 0x5, +0x19,0xab,0x27,0xaa,0x28,0xa9,0x29,0x90,0x0, 0x2d,0x75,0xf0,0x2, 0xe5,0x2a,0x12, +0x5, 0x19,0x74,0x7f,0x75,0xf0,0xff,0x12,0x3, 0x45,0xab,0x27,0xaa,0x28,0xa9,0x29, +0x90,0x0, 0x37,0x75,0xf0,0x2, 0xe5,0x2a,0x2, 0x5, 0x19,0xe5,0xdb,0x20,0xe1,0x3, +0x7f,0x0, 0x22,0x53,0xdb,0xfd,0x7f,0x1, 0x22,0x75,0x49,0x1, 0x75,0x4a,0x0, 0x75, +0x4b,0x83,0x7b,0x1, 0x7a,0x0, 0x79,0x0, 0x31,0xfa,0xef,0x22,0x12,0x4f,0xd1,0xe5, +0x9, 0x70,0x2, 0xc1,0x8f,0xd1,0x99,0xf5,0x24,0xe4,0xf5,0x25,0x12,0x17,0x9e,0xd1, +0x90,0x12,0x3d,0x88,0xe5,0x25,0x12,0x17,0xea,0xff,0xae,0xf0,0xc3,0x90,0xc, 0xa, +0xe0,0x9f,0xee,0x64,0x80,0xf8,0x90,0xc, 0x9, 0xe0,0x64,0x80,0x98,0x50,0x5, 0xee, +0xf0,0xa3,0xef,0xf0,0x5, 0x25,0xe5,0x25,0xb4,0xa, 0xd1,0x5, 0x24,0xe5,0x24,0xb4, +0xf, 0xc7,0xc3,0x90,0xc, 0xa, 0xe0,0x94,0xfa,0xd1,0xa1,0x50,0x2, 0xc1,0x8f,0xe4, +0xf5,0x26,0xe5,0x26,0x12,0x2d,0xb3,0xe4,0xf0,0xa3,0xf0,0xe5,0x26,0x12,0x2d,0xee, +0xe4,0xf0,0xa3,0xf0,0x12,0x17,0x9e,0x90,0x3, 0x80,0x75,0xf0,0x2, 0xe5,0x26,0x12, +0x17,0xea,0xff,0xe5,0x26,0x12,0x2d,0xd2,0x12,0x3f,0x9e,0x5, 0x26,0xe5,0x26,0xb4, +0xa, 0xd0,0xe4,0xf5,0x24,0xe4,0xf5,0x26,0xe5,0x26,0x12,0x2d,0xee,0xe0,0xfe,0xa3, +0xe0,0xff,0xe5,0x26,0x12,0x2d,0xb3,0xee,0xf0,0xa3,0xef,0xf0,0xe5,0x26,0x12,0x2d, +0xd2,0xe0,0xfe,0xa3,0xe0,0xff,0xe5,0x26,0x12,0x2d,0xee,0xee,0xf0,0xa3,0xef,0xf0, +0xaf,0x24,0x7e,0x0, 0xef,0x24,0x1, 0xfd,0xee,0x33,0xfc,0xc3,0xed,0x94,0xf, 0xec, +0x64,0x80,0x94,0x80,0x40,0xb, 0xe5,0x26,0x12,0x2d,0xd2,0xe4,0xf0,0xa3,0xf0,0x80, +0x17,0xef,0xd1,0xaa,0x12,0x17,0x9e,0x75,0xf0,0x2, 0xe5,0x26,0x12,0x17,0xea,0xff, +0xe5,0x26,0x12,0x2d,0xd2,0x12,0x3f,0x9e,0x5, 0x26,0xe5,0x26,0x64,0xa, 0x70,0x98, +0xe4,0xf5,0x25,0x12,0x17,0x9e,0xd1,0x90,0x12,0x3d,0x88,0xe5,0x25,0x12,0x17,0xea, +0xd3,0x94,0x32,0xf1,0x5b,0x50,0x2, 0xc1,0x7b,0xe4,0xf5,0x28,0xf5,0x29,0xf5,0x26, +0xe4,0xf5,0x27,0xaf,0x27,0x7e,0x0, 0xad,0x25,0x7c,0x0, 0xed,0x2f,0xfb,0xec,0x33, +0xfa,0xc3,0xeb,0x94,0x1, 0xea,0x64,0x80,0x94,0x80,0x40,0x3b,0xed,0x24,0xff,0xfd, +0xec,0x34,0xff,0xcd,0x2f,0xff,0xee,0x3d,0xfe,0xc3,0xef,0x94,0xa, 0xee,0x64,0x80, +0x94,0x80,0x50,0x23,0xe5,0x26,0x75,0xf0,0x14,0xa4,0x24,0xcb,0xf5,0x82,0xe4,0x34, +0xb, 0xf5,0x83,0xe5,0x25,0x25,0x27,0x31,0xf4,0xe0,0xff,0xa3,0xe0,0x90,0xc, 0x9, +0xcf,0xf0,0xa3,0xef,0xf0,0x80,0x2, 0xd1,0x99,0xc3,0xd1,0xa1,0x50,0x4, 0xe4,0xf0, +0xa3,0xf0,0x90,0xc, 0x9, 0xe0,0x12,0x2f,0x64,0xe5,0x26,0x75,0xf0,0x3, 0xa4,0x24, +0x2a,0xf5,0x82,0xe4,0x34,0x7, 0xf5,0x83,0xe5,0x82,0x25,0x27,0x12,0x35,0x11,0xe4, +0x93,0xff,0x12,0x2e,0x1e,0xef,0x25,0x29,0xf5,0x29,0xee,0x35,0x28,0xf5,0x28,0x5, +0x27,0xe5,0x27,0x64,0x3, 0x60,0x2, 0xa1,0xc3,0x5, 0x26,0xe5,0x26,0x64,0x3, 0x60, +0x2, 0xa1,0xc0,0xe5,0x29,0xae,0x28,0x78,0x5, 0x12,0x2f,0x33,0xd8,0xfb,0xff,0x12, +0x17,0x9e,0xd1,0x90,0x12,0x3d,0x88,0xe5,0x25,0xf1,0x62,0x5, 0x25,0xe5,0x25,0x64, +0xa, 0x60,0x2, 0xa1,0xa3,0x5, 0x24,0xe5,0x24,0x64,0xf, 0x60,0x2, 0xa1,0x35,0x22, +0x90,0x3, 0x80,0x75,0xf0,0x20,0xe5,0x24,0x22,0xe4,0x90,0xc, 0x9, 0xf0,0xa3,0xf0, +0x22,0x90,0xc, 0x9, 0xe0,0x64,0x80,0x94,0x80,0x22,0x75,0xf0,0x20,0xa4,0x24,0xa0, +0xf5,0x82,0x74,0x3, 0x35,0xf0,0xf5,0x83,0x22,0x12,0x10,0x96,0x12,0x17,0x22,0x60, +0x8, 0x90,0x0, 0x2e,0x12,0x1, 0x65,0x60,0x3, 0x7f,0x0, 0x22,0x12,0x1, 0x4c,0xc3, +0x13,0xf5,0x28,0xe4,0xff,0xf5,0x27,0x12,0x17,0x9e,0x12,0x17,0xda,0xc3,0x94,0x14, +0xf1,0x5b,0x50,0x9, 0xf, 0xef,0x94,0x2, 0x40,0x3, 0x7f,0x0, 0x22,0x5, 0x27,0xe5, +0x27,0xb4,0xa, 0xe3,0xe5,0x28,0xd3,0x94,0x0, 0x40,0x2e,0xe4,0xf5,0x27,0x12,0x17, +0x9e,0x12,0x17,0xda,0xfd,0xac,0xf0,0xe5,0x28,0x75,0xf0,0x20,0xa4,0x24,0x60,0xd1, +0xb0,0x12,0x17,0xe5,0xff,0xc3,0xed,0x9f,0xe5,0xf0,0x12,0x2f,0xb9,0x50,0x3, 0x7f, +0x0, 0x22,0x5, 0x27,0xe5,0x27,0xb4,0xa, 0xd5,0xe5,0x28,0xc3,0x94,0xe, 0x50,0x28, +0xe4,0xf5,0x27,0x12,0x17,0x9e,0x12,0x17,0xda,0xfd,0xac,0xf0,0xe5,0x28,0xd1,0xaa, +0x12,0x17,0xe5,0xff,0xc3,0xed,0x9f,0xe5,0xf0,0x12,0x2f,0xb9,0x50,0x3, 0x7f,0x0, +0x22,0x5, 0x27,0xe5,0x27,0xb4,0xa, 0xdb,0x7f,0x1, 0x22,0xe5,0xf0,0x64,0x80,0x94, +0x80,0x22,0x12,0x5, 0x19,0xee,0x8f,0xf0,0x2, 0x3, 0x45,0x8f,0xa, 0xe4,0xf5,0xb, +0x22,0x8e,0x35,0x8f,0x36,0x8c,0x37,0x8d,0x38,0x5, 0x38,0xe5,0x38,0xae,0x37,0x70, +0x2, 0x5, 0x37,0x14,0xf5,0x82,0x8e,0x83,0xe0,0xff,0x5, 0x36,0xe5,0x36,0xac,0x35, +0x70,0x2, 0x5, 0x35,0x12,0x47,0x9a,0xdb,0xe0,0x22,0xef,0x24,0x24,0xf1,0xc0,0xef, +0x24,0x26,0xf1,0xc0,0xef,0x24,0x25,0xf1,0xc0,0xef,0x24,0x29,0xf1,0xc0,0xa3,0xf0, +0xef,0x24,0x24,0xf5,0x82,0xee,0x34,0x9, 0xf5,0x83,0x74,0x1, 0xf0,0xef,0x24,0x2b, +0xf5,0x82,0xee,0x34,0x9, 0xf5,0x83,0xe4,0xf0,0x22,0x12,0x4f,0xd1,0xe4,0x90,0xb, +0xcd,0xf0,0xa3,0xf0,0x90,0x0, 0x41,0x12,0x1, 0x65,0x64,0x1, 0x60,0x3, 0x2, 0x60, +0x63,0x90,0xc, 0x76,0xe0,0xb4,0x1, 0xe, 0xe4,0xf0,0x78,0x51,0x7c,0xc, 0x7d,0x1, +0xfe,0x7f,0x7, 0x2, 0x1, 0x26,0x12,0x17,0x9e,0x12,0x30,0xc7,0xff,0x90,0xc, 0x55, +0xe0,0x6f,0x70,0x5f,0x12,0x1c,0x9f,0x90,0xc, 0x53,0xe0,0xfc,0xa3,0xe0,0xfd,0x31, +0x37,0xc0,0x6, 0xc0,0x7, 0x12,0x17,0x9e,0x12,0x4e,0xac,0x90,0xc, 0x51,0xe0,0xfc, +0xa3,0xe0,0xfd,0x31,0x37,0xd0,0xe0,0x2f,0xff,0xd0,0xe0,0x3e,0x90,0xb, 0xcd,0xf0, +0xa3,0xef,0xf0,0xd3,0x90,0xc, 0x75,0xe0,0x94,0x64,0x90,0xc, 0x74,0xe0,0x94,0x0, +0x40,0x21,0xd3,0x90,0xb, 0xce,0xe0,0x94,0x64,0x90,0xb, 0xcd,0xe0,0x94,0x0, 0x40, +0x12,0x78,0x51,0x7c,0xc, 0x7d,0x1, 0x12,0x17,0x9e,0x7e,0x0, 0x7f,0x7, 0x12,0x1, +0x26,0x21,0x86,0x31,0x86,0xe4,0xf5,0x27,0x12,0x17,0x9e,0x12,0x1f,0xe0,0xe5,0x27, +0xc3,0x9f,0x40,0x2, 0x21,0x0, 0xe5,0x27,0x12,0x2e,0x75,0x12,0x30,0xc7,0xff,0xf4, +0x60,0x7a,0x31,0x55,0x51,0x46,0x60,0x4, 0x64,0x2, 0x70,0x70,0xe4,0xf5,0x28,0xe5, +0x27,0x12,0x1c,0x5b,0x12,0x30,0xc7,0xff,0xe5,0x28,0x31,0x78,0xe0,0x6f,0x70,0x53, +0x12,0x1c,0x9f,0xe5,0x28,0x31,0x60,0x12,0x3f,0xb6,0x31,0x37,0xc0,0x6, 0xc0,0x7, +0x12,0x17,0x9e,0x75,0xf0,0x7, 0xe5,0x27,0x12,0x14,0x2b,0x12,0x1c,0xa2,0xe5,0x28, +0x31,0x6c,0x12,0x3f,0xb6,0x31,0x37,0xd0,0xe0,0x2f,0xff,0xd0,0xe0,0x3e,0xfe,0x12, +0x10,0x9c,0x90,0x0, 0x4, 0x12,0x2, 0xa1,0xfd,0xd3,0xef,0x9d,0xee,0x95,0xf0,0x40, +0x12,0xe5,0x27,0x12,0x1c,0x5b,0x12,0x30,0xc7,0xff,0x31,0x55,0x51,0x26,0x74,0x1, +0x12,0x1, 0xc5,0x5, 0x28,0xe5,0x28,0xc3,0x94,0x5, 0x40,0x93,0x5, 0x27,0x1, 0x68, +0xe4,0xf5,0x27,0x12,0x17,0x9e,0x75,0xf0,0x7, 0xe5,0x27,0x12,0x14,0x2b,0x12,0x1c, +0xa2,0xe5,0x27,0x31,0x6c,0x31,0x4d,0xe5,0x27,0x12,0x2e,0x75,0x12,0x1c,0x9f,0xe5, +0x27,0x31,0x60,0x31,0x4d,0x12,0x30,0xc7,0xff,0xe5,0x27,0x31,0x78,0xef,0xf0,0x5, +0x27,0xe5,0x27,0xb4,0x5, 0xcd,0x22,0xd3,0xef,0x9d,0xee,0x9c,0x40,0x7, 0xef,0x9d, +0xff,0xee,0x9c,0xfe,0x22,0xc3,0xed,0x9f,0xff,0xec,0x9e,0xfe,0x22,0xf5,0x83,0xee, +0xf0,0xa3,0xef,0xf0,0x22,0x7e,0x0, 0xe5,0x23,0x24,0x23,0xf9,0xe4,0x35,0x22,0x22, +0x75,0xf0,0x7, 0xa4,0x24,0x53,0xf5,0x82,0xe4,0x34,0xc, 0x22,0x75,0xf0,0x7, 0xa4, +0x24,0x51,0xf5,0x82,0xe4,0x34,0xc, 0x22,0x75,0xf0,0x7, 0xa4,0x24,0x55,0xf5,0x82, +0xe4,0x34,0xc, 0xf5,0x83,0x22,0x90,0xb, 0xcd,0xe0,0xff,0xa3,0xe0,0x90,0xc, 0x74, +0xcf,0xf0,0xa3,0xef,0xf0,0x22,0x12,0x4f,0xd1,0x12,0x17,0x22,0x64,0x2, 0x70,0x6a, +0x90,0x0, 0x11,0x12,0x1c,0xa2,0x90,0x0, 0xa, 0x12,0x1c,0x87,0x51,0x1d,0xe4,0x8f, +0x27,0x8e,0x26,0xf5,0x25,0xf5,0x24,0x12,0x17,0x9e,0x90,0x0, 0x13,0x12,0x1c,0xa2, +0x90,0x0, 0xc, 0x12,0x1c,0x87,0x51,0x1d,0xe4,0xfc,0xfd,0xe5,0x27,0x2f,0xf5,0x27, +0xe5,0x26,0x3e,0xf5,0x26,0xed,0x35,0x25,0xf5,0x25,0xec,0x35,0x24,0xf5,0x24,0x7f, +0x28,0x7e,0x9a,0xd, 0xab,0x27,0xaa,0x26,0xa9,0x25,0xf8,0xd3,0x12,0x4, 0xa5,0x40, +0x2, 0x80,0x26,0xe4,0x7f,0xe8,0x7e,0xfd,0xfd,0xfc,0xab,0x27,0xaa,0x26,0xa9,0x25, +0xa8,0x24,0xc3,0x12,0x4, 0xa5,0x50,0x14,0x80,0xb, 0x12,0x17,0x1c,0xb4,0x1, 0x9, +0xe5,0x9, 0xb4,0x1, 0x4, 0x75,0x9, 0x1, 0x22,0xe4,0xf5,0x9, 0x22,0x31,0x37,0xad, +0x7, 0xac,0x6, 0x2, 0x1, 0xf9,0xfa,0xe9,0x2f,0xf9,0xee,0x3a,0xfa,0x22,0x31,0x37, +0x8e,0x2a,0x8f,0x2b,0xe5,0x2b,0xa8,0x2c,0x8, 0x22,0x7e,0x0, 0xab,0x27,0xe5,0x29, +0x24,0x23,0xf9,0xe4,0x35,0x28,0xfa,0xe9,0x2f,0xf9,0xee,0x3a,0xfa,0x2, 0x1, 0x4c, +0xe5,0xe8,0x54,0xc0,0x64,0xc0,0x60,0x3, 0x12,0x47,0xbb,0x22,0x12,0x4f,0xd1,0x85, +0xc9,0x30,0x12,0x10,0x9c,0x12,0x1, 0x4c,0xff,0x70,0x41,0x12,0x17,0x9e,0x71,0xb0, +0xd3,0x94,0x0, 0x40,0xc, 0x12,0x10,0x9c,0x90,0x0, 0x7, 0xe4,0x12,0x1, 0xd7,0x61, +0x59,0x12,0x14,0x32,0x20,0xe0,0x2, 0x61,0x59,0x90,0x0, 0x8, 0x12,0x1, 0x65,0xfe, +0x90,0x0, 0x7, 0x74,0x1, 0x12,0x1, 0x92,0x6e,0x60,0x2, 0x61,0x59,0x12,0x10,0x9c, +0x90,0x0, 0x7, 0x12,0x1, 0xd7,0x74,0x1, 0x71,0xa1,0x61,0x59,0xef,0xb4,0x1, 0x13, +0x12,0x17,0x9e,0x71,0xb0,0x70,0x2, 0x61,0x59,0x12,0x10,0x9c,0x71,0xa0,0x75,0xd, +0x20,0x61,0x59,0x12,0x10,0x9c,0x12,0x1, 0x4c,0x64,0x3, 0x60,0x2, 0x61,0x59,0xff, +0x71,0xc9,0xe4,0x12,0x46,0x1d,0x12,0x0, 0x4e,0xe5,0xdb,0x30,0xe1,0xfb,0xe4,0xf5, +0x99,0xd2,0x98,0x75,0xf7,0xfe,0xc2,0x89,0xd2,0xa8,0x7f,0x2, 0x71,0xb6,0xc2,0xaf, +0xe4,0xf5,0x32,0x30,0x89,0x7, 0xc2,0x89,0xe4,0xf5,0x32,0x80,0x2, 0x5, 0x32,0xe5, +0x32,0xd3,0x94,0xfa,0x50,0x9, 0xe4,0x12,0x46,0x1d,0x12,0x0, 0x4e,0x80,0xe4,0x75, +0xf7,0xff,0x75,0x99,0x1, 0xd2,0x98,0xd2,0xaf,0xc2,0xa8,0xe4,0x12,0x46,0x1d,0x12, +0x0, 0x4e,0x53,0xdb,0xf0,0x12,0x43,0xe3,0x85,0x21,0x36,0x85,0x22,0x37,0x85,0x23, +0x38,0xab,0x2d,0xaa,0x2e,0xa9,0x2f,0x12,0x2e,0x80,0x12,0x10,0x9c,0x71,0xa0,0x12, +0x2d,0xa5,0x71,0xe0,0x90,0xd, 0x9b,0x74,0x19,0xf0,0x90,0xd, 0x9b,0xe0,0x70,0xfa, +0x12,0x4f,0xb1,0x12,0x1c,0xc2,0x12,0x27,0xb9,0xe4,0xf5,0x31,0xe5,0xc, 0x70,0x22, +0xff,0x71,0xb6,0xe5,0xdb,0x30,0xe1,0xf4,0xc2,0xcd,0x12,0x10,0x9c,0x12,0x1, 0x4c, +0xb4,0x1, 0xe9,0xe5,0x31,0x70,0xe5,0x75,0x31,0x1, 0x53,0xc9,0xfc,0x43,0xc9,0x1, +0x80,0xda,0xe4,0xf5,0xd, 0xf5,0xc, 0x85,0x30,0xc9,0xd2,0xcd,0x71,0xd2,0x54,0xef, +0x12,0x1, 0xc5,0x12,0x17,0x9e,0x71,0xb0,0x90,0x0, 0x49,0x12,0x1, 0xd7,0x41,0x50, +0xe4,0x12,0x1, 0xc5,0x90,0xe, 0x26,0xf0,0x22,0x90,0x0, 0x49,0x12,0x1, 0x65,0xff, +0x90,0x0, 0x48,0x2, 0x1, 0x65,0xef,0x70,0x3, 0x43,0x87,0x1, 0xbf,0x1, 0x3, 0x43, +0x87,0x2, 0xbf,0x2, 0x3, 0x43,0x87,0x2, 0x22,0xef,0x70,0x3, 0xd2,0x84,0x22,0xc2, +0x84,0x22,0xab,0x21,0xe5,0x23,0x24,0x4c,0xf9,0xe4,0x35,0x22,0xfa,0x2, 0x1, 0x4c, +0x90,0xe, 0x22,0x74,0x23,0xf0,0xa3,0x74,0xda,0xf0,0x90,0x9, 0x2b,0xe4,0x12,0x1, +0xd7,0xae,0x2, 0xaf,0x1, 0xad,0x7, 0xac,0x6, 0xe9,0x24,0x60,0xf9,0xea,0x34,0x7, +0x8b,0x37,0xf5,0x38,0x89,0x39,0xe4,0xf5,0x35,0xf5,0x36,0xf5,0x33,0xe4,0xf5,0x34, +0xe5,0x36,0x25,0xe0,0xff,0xe5,0x35,0x33,0xfe,0xed,0x2f,0xf5,0x82,0xec,0x3e,0xf5, +0x83,0xe4,0xf0,0xa3,0xf0,0xab,0x37,0xaa,0x38,0xa9,0x39,0x85,0x36,0x82,0x85,0x35, +0x83,0x4, 0x12,0x1, 0xd7,0x5, 0x36,0xe5,0x36,0x70,0x2, 0x5, 0x35,0x5, 0x34,0xe5, +0x34,0xb4,0x10,0xcc,0x5, 0x33,0xe5,0x33,0xb4,0x1c,0xc2,0x22,0x12,0x4f,0xd1,0xe4, +0x12,0x1, 0xc5,0x12,0x17,0x9e,0x90,0x0, 0x15,0x12,0x1, 0xd7,0x12,0x57,0xc2,0x54, +0xfe,0x12,0x1, 0xc5,0x54,0xfd,0x2, 0x1, 0xc5,0x12,0x4f,0xd1,0x75,0x2d,0xff,0x12, +0x1c,0xc2,0x12,0x17,0x22,0x70,0x2, 0xa1,0x30,0x12,0x17,0x9e,0x12,0x57,0xc2,0x44, +0x2, 0x12,0x1, 0xc5,0xd1,0x42,0x12,0x1c,0xc2,0x12,0x17,0x22,0xff,0xe5,0x2e,0xc3, +0x9f,0x50,0x46,0xab,0x24,0xd1,0x58,0x34,0x3, 0xfa,0xc0,0x3, 0xc0,0x2, 0xc0,0x1, +0x12,0x1c,0xc2,0x75,0xf0,0x2, 0xe5,0x2e,0x12,0x14,0x2b,0xd1,0x60,0xd0,0x1, 0xd0, +0x2, 0xd0,0x3, 0x12,0x0, 0x12,0xc0,0x3, 0xc0,0x2, 0xc0,0x1, 0xe5,0x2e,0x75,0xf0, +0x2, 0x12,0x1c,0x78,0x12,0x14,0x38,0xc3,0x13,0x12,0x14,0x28,0xd0,0x1, 0xd0,0x2, +0xd0,0x3, 0x12,0x2, 0xa1,0xd1,0x4a,0x80,0xad,0xae,0x2f,0xaf,0x30,0x12,0x1c,0xc2, +0x12,0x17,0x22,0xfd,0x7c,0x0, 0xd1,0x3a,0xab,0x21,0xe5,0x23,0x24,0x1, 0xf9,0xe4, +0x35,0x22,0xfa,0xc0,0x2, 0xc0,0x1, 0xaa,0x22,0xa9,0x23,0x90,0x0, 0x15,0x12,0x14, +0x25,0xd0,0x1, 0xd0,0x2, 0xe5,0x2f,0x85,0x30,0xf0,0x12,0x3, 0x45,0x12,0x17,0x9e, +0x90,0x0, 0x15,0x74,0x1, 0x12,0x1, 0x92,0x90,0x0, 0x15,0x12,0x1, 0x65,0xc3,0x94, +0xa, 0x40,0x5a,0x12,0x17,0x9e,0x90,0x0, 0x15,0x12,0x57,0xc5,0x44,0x1, 0x80,0x4a, +0x12,0x17,0x9e,0x90,0x0, 0x17,0x12,0x1, 0x65,0xc3,0x13,0x30,0xe0,0x2e,0x90,0x0, +0x16,0x74,0x1, 0x12,0x1, 0x92,0x90,0x0, 0x16,0x12,0x1, 0x65,0xc3,0x94,0x3c,0x40, +0x2c,0x12,0x17,0x9e,0x12,0x57,0xc2,0x54,0xfd,0x12,0x1, 0xc5,0xe4,0xf5,0x2d,0x12, +0x17,0x9e,0x90,0x0, 0x15,0x12,0x57,0xc6,0x54,0xfe,0x80,0xe, 0xe4,0xf5,0x2d,0x12, +0x17,0x9e,0x90,0x0, 0x15,0x12,0x57,0xc6,0x54,0xfe,0x12,0x1, 0xc5,0xe5,0x2d,0xf4, +0x70,0x69,0xf5,0x2d,0x12,0x17,0x9e,0x90,0x0, 0x17,0x12,0x1, 0x65,0x30,0xe0,0x5b, +0xd1,0x42,0x12,0x17,0x9e,0x90,0x0, 0x1, 0x75,0xf0,0x2, 0xe5,0x2e,0x12,0x17,0xea, +0xd1,0x4a,0xe5,0x2e,0xb4,0xa, 0xeb,0xae,0x2f,0xaf,0x30,0x7c,0x0, 0x7d,0xa, 0xd1, +0x3a,0xe4,0xf5,0x2e,0xe5,0x2e,0x75,0xf0,0x3, 0xa4,0x24,0x33,0xf5,0x82,0xe4,0x34, +0x7, 0xf5,0x83,0xd3,0x74,0x1, 0x93,0x95,0x30,0xe4,0x93,0x95,0x2f,0x50,0x15,0xe5, +0x2e,0x75,0xf0,0x3, 0xa4,0x24,0x35,0xf5,0x82,0xe4,0x34,0x7, 0xf5,0x83,0xe4,0x93, +0xf5,0x2d,0x80,0x7, 0x5, 0x2e,0xe5,0x2e,0xb4,0x3, 0xc9,0xe4,0xff,0x12,0x1c,0xc2, +0x12,0x17,0x22,0xb4,0x2, 0x16,0x12,0x4f,0xc5,0xfe,0x12,0x1, 0x4c,0x6e,0x60,0xa, +0x12,0x4f,0xcb,0xfe,0x12,0x14,0x38,0xb5,0x6, 0x2, 0x7f,0x1, 0xe5,0x2d,0x25,0xe0, +0x24,0x3c,0xf5,0x82,0xe4,0x34,0x7, 0xf5,0x83,0xe5,0x82,0x2f,0x12,0x35,0x11,0xe4, +0x93,0x12,0x17,0x9e,0x12,0x1, 0xc5,0x12,0x17,0x9e,0x12,0x1, 0x4c,0x90,0x7, 0x44, +0x93,0x12,0x2d,0xa4,0xe4,0x8f,0xf0,0x2, 0x3, 0x26,0x12,0x2, 0xb, 0x8e,0x2f,0x8f, +0x30,0x22,0xe4,0xf5,0x2f,0xf5,0x30,0xf5,0x2e,0x22,0xae,0xf0,0x25,0x30,0xf5,0x30, +0xee,0x35,0x2f,0xf5,0x2f,0x5, 0x2e,0x22,0xe5,0x26,0x24,0x80,0xf9,0xe5,0x25,0x22, +0x12,0x1, 0x65,0xc3,0x13,0x75,0xf0,0x20,0xa4,0x22,0xf1,0xd4,0x7d,0x1, 0x7c,0xe, +0x90,0xe, 0x41,0xe0,0x20,0xe0,0x2, 0xe1,0xa9,0x54,0xfe,0xf0,0x8d,0x82,0x8c,0x83, +0xf1,0xba,0xa3,0xa3,0xf0,0xef,0x75,0xf0,0x4, 0xa4,0xf1,0xbb,0x12,0x3f,0x9e,0x8d, +0x82,0x8c,0x83,0xa3,0xf1,0xba,0xa3,0xa3,0xa3,0xe4,0xf0,0xa3,0xef,0xf0,0x85,0x26, +0x82,0x85,0x25,0x83,0xa3,0xa3,0xa3,0xe0,0xff,0xed,0x24,0x5, 0x12,0x36,0xc6,0xe0, +0xfe,0x6f,0x60,0x18,0xf1,0xcc,0xee,0xf0,0xed,0x24,0x5, 0x12,0x36,0xc6,0xe0,0x75, +0xf0,0x20,0xa4,0xff,0x8b,0x82,0x8a,0x83,0xa3,0x12,0x3f,0x9e,0x85,0x26,0x82,0x85, +0x25,0x83,0xe0,0x12,0x36,0xc2,0xe0,0xfe,0x6f,0x60,0x8, 0x85,0x26,0x82,0x85,0x25, +0x83,0xee,0xf0,0xed,0x24,0x25,0x12,0x36,0xc6,0xf1,0xb2,0xf0,0xed,0x24,0x6, 0x12, +0x36,0xc6,0xf1,0xb2,0xa3,0xf0,0xe5,0x24,0x24,0x4, 0xf1,0xaa,0xe0,0xff,0xed,0x24, +0x8, 0x12,0x36,0xc6,0xe0,0xfe,0x6f,0x60,0x2d,0xe5,0x24,0x24,0x4, 0xf1,0xaa,0xee, +0xf0,0xed,0x24,0x8, 0x12,0x36,0xc6,0xe0,0xc3,0x94,0xf, 0x40,0x8, 0xed,0x24,0x8, +0x12,0x36,0xc6,0xe4,0xf0,0xed,0x24,0x8, 0x12,0x36,0xc6,0xe0,0x90,0x7, 0x4d,0x93, +0xf1,0xb3,0xa3,0xa3,0xa3,0xf0,0xe5,0x24,0x24,0x6, 0xf1,0xaa,0xe0,0xff,0xed,0x24, +0x9, 0x12,0x36,0xc6,0xe0,0xfe,0x6f,0x60,0x18,0xe5,0x24,0x24,0x6, 0xf1,0xaa,0xee, +0xf0,0xed,0x24,0x9, 0x12,0x36,0xc6,0xe0,0xff,0xe5,0x24,0x24,0x5, 0xf1,0xaa,0xef, +0xf0,0xed,0x24,0x7, 0x12,0x36,0xc6,0xe0,0xff,0xe5,0x24,0x24,0x8, 0xf1,0xaa,0xef, +0xf0,0xed,0x24,0x24,0x12,0x36,0xc6,0xe0,0xff,0xe5,0x24,0x24,0xa, 0xf1,0xaa,0xef, +0xf0,0xed,0x24,0x32,0x12,0x36,0xc6,0xe0,0xff,0xd3,0x94,0x32,0x50,0x7, 0xe5,0x26, +0x24,0x6, 0xf1,0xc3,0xf0,0xed,0x24,0x33,0x12,0x36,0xc6,0xe0,0xff,0xd3,0x94,0xa, +0x50,0x7, 0xe5,0x26,0x24,0x7, 0xf1,0xc3,0xf0,0x22,0xf5,0x82,0xe4,0x35,0x23,0xf5, +0x83,0x22,0xe0,0x85,0x24,0x82,0x85,0x23,0x83,0x22,0xe0,0xff,0x85,0x22,0x82,0x85, +0x21,0x83,0x22,0xf5,0x82,0xe4,0x35,0x25,0xf5,0x83,0xef,0x22,0x8b,0x82,0x8a,0x83, +0xa3,0xa3,0xa3,0x22,0x8e,0x21,0x8f,0x22,0x8c,0x23,0x8d,0x24,0x8a,0x25,0x8b,0x26, +0x22,0xc0,0xe0,0xc0,0x83,0xc0,0x82,0xc2,0x93,0x90,0xd, 0xe4,0xe4,0xf0,0x90,0xd, +0xe6,0xf0,0xd0,0x82,0xd0,0x83,0xd0,0xe0,0x32,0x75,0x90,0x4, 0x75,0x93,0xe0,0xd2, +0xac,0x53,0xe8,0x3f,0x43,0xe8,0xc0,0xd2,0xec,0xd2,0xb9,0xc2,0xc1,0x43,0xb9,0x10, +0x53,0xa9,0xef,0x22,0x80,0xe3,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0, +0x75,0xd0,0x0, 0xc0,0x0, 0xc0,0x1, 0xc0,0x2, 0xc0,0x3, 0xc0,0x4, 0xc0,0x5, 0xc0, +0x6, 0xc0,0x7, 0x11,0xfe,0x90,0xd, 0x9b,0xe0,0x60,0x2, 0x14,0xf0,0x90,0xc, 0x8d, +0xe0,0x4, 0xf0,0x70,0x6, 0x90,0xc, 0x8c,0xe0,0x4, 0xf0,0x90,0xc, 0x7a,0xe0,0xfe, +0xa3,0xe0,0xff,0xc3,0x90,0xc, 0x8d,0xe0,0x9f,0x90,0xc, 0x8c,0xe0,0x9e,0x50,0x3, +0x12,0x0, 0x4e,0x90,0xe, 0x28,0xe0,0xb4,0xaa,0x13,0x90,0xc, 0x7c,0xe0,0xff,0x4, +0xf0,0xef,0xd3,0x94,0x64,0x40,0x6, 0x90,0xe, 0x28,0x74,0x1, 0xf0,0xe5,0xd, 0xc3, +0x95,0xe, 0x50,0x12,0x5, 0xd, 0xe5,0xc9,0x54,0x3, 0xff,0xbf,0x1, 0xb, 0x74,0x3, +0x25,0xd, 0xf5,0xd, 0x80,0x3, 0x75,0xc, 0x1, 0x90,0xd, 0xe5,0xe0,0xff,0x60,0x10, +0xc3,0x94,0x28,0x50,0x5, 0xe0,0x4, 0xf0,0x80,0x6, 0x12,0x47,0xc3,0x12,0x47,0x82, +0x90,0xc, 0x8f,0xe0,0xfe,0xa3,0xe0,0xff,0x4e,0x60,0x16,0xef,0x64,0x1, 0x4e,0x70, +0x2, 0xd2,0x0, 0x90,0xc, 0x90,0xe0,0x24,0xff,0xf0,0x90,0xc, 0x8f,0xe0,0x34,0xff, +0xf0,0x31,0x9, 0x40,0xe, 0x90,0xc, 0x83,0xe0,0x4, 0xf0,0x70,0x6, 0x90,0xc, 0x82, +0xe0,0x4, 0xf0,0xd0,0x7, 0xd0,0x6, 0xd0,0x5, 0xd0,0x4, 0xd0,0x3, 0xd0,0x2, 0xd0, +0x1, 0xd0,0x0, 0xd0,0xd0,0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32,0xc2,0x8e, +0x75,0xa6,0xf0,0x75,0xa5,0x5f,0xd2,0x8e,0x22,0x90,0xc, 0x82,0xe0,0xfe,0xa3,0xe0, +0xff,0xe4,0xfc,0xfd,0x7b,0x40,0x7a,0x9c,0xf9,0xf8,0xd3,0x2, 0x4, 0x8f,0x53,0xdb, +0xbf,0x22,0x31,0x1e,0x7f,0x1, 0x31,0x41,0x31,0x54,0x31,0x70,0x31,0x39,0x7f,0x1, +0xef,0x70,0x3, 0xc2,0xaf,0x22,0xd2,0xaf,0x22,0x75,0x92,0xe8,0xd2,0xae,0xd2,0xbe, +0x22,0x53,0xc9,0xf8,0xef,0x70,0x5, 0x43,0xc9,0x3, 0x80,0x3, 0x43,0xc9,0x2, 0xc2, +0xce,0xc2,0xca,0x22,0xaf,0xe6,0x75,0x99,0x1, 0xd2,0x98,0xbf,0xff,0x2, 0x7f,0x6a, +0xef,0x64,0x6a,0x60,0x3, 0xbf,0x6b,0x4, 0x53,0xea,0x7f,0x22,0x43,0xea,0x80,0x22, +0xe4,0xff,0xa2,0xaf,0x33,0xfe,0xc2,0x88,0xd2,0xa8,0xc2,0xaf,0x30,0x89,0x6, 0xc2, +0x89,0xe4,0xff,0x80,0x1, 0xf, 0xef,0xd3,0x94,0xfa,0x40,0xf0,0xee,0x24,0xff,0x92, +0xaf,0x75,0xf7,0xff,0x22,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75, +0xd0,0x0, 0xc0,0x0, 0xc0,0x1, 0xc0,0x2, 0xc0,0x3, 0xc0,0x4, 0xc0,0x5, 0xc0,0x6, +0xc0,0x7, 0x12,0x45,0xf1,0x90,0xd, 0xe9,0xe0,0x54,0xfd,0xf0,0xd0,0x7, 0xd0,0x6, +0xd0,0x5, 0xd0,0x4, 0xd0,0x3, 0xd0,0x2, 0xd0,0x1, 0xd0,0x0, 0xd0,0xd0,0xd0,0x82, +0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32,0xbf,0x1, 0x5, 0x43,0xdb,0x80,0x80,0x6, 0xef, +0x70,0x3, 0x53,0xdb,0x7f,0xc2,0xea,0x43,0xdb,0x10,0xd2,0xd9,0xc2,0xdd,0xc2,0xdc, +0xc2,0xdb,0xc2,0xda,0xd2,0xd8,0x75,0xab,0x6, 0xe4,0xf5,0x9a,0x53,0xe8,0xfc,0x43, +0xe8,0x2, 0x53,0xdb,0xfd,0xd2,0xed,0xd2,0xba,0xc2,0xc2,0x43,0xa9,0x4, 0x43,0xb9, +0x4, 0x22,0x53,0xc9,0x7, 0x43,0xc9,0x30,0x75,0xeb,0x80,0xef,0x25,0xe0,0x4, 0x25, +0xeb,0xf5,0xeb,0x22,0xc2,0xc2,0x53,0xdb,0xbf,0x32,0xef,0x70,0x4, 0x53,0xdb,0xbf, +0x22,0x43,0xdb,0x40,0x22,0x51,0x51,0x44,0x80,0xf5,0xa1,0xe5,0xdb,0x30,0xe3,0xfb, +0x53,0xdb,0xf3,0xe4,0xf5,0xa1,0xe5,0xdb,0x30,0xe3,0xfb,0xaf,0xa1,0x43,0xab,0x4, +0x22,0x53,0xab,0x3, 0x53,0xdb,0xf3,0xef,0x22,0x12,0x10,0x96,0x90,0x9, 0x24,0x12, +0x1, 0x65,0xff,0xf5,0x32,0x12,0x1c,0xc2,0x90,0x0, 0x15,0x12,0x1, 0x65,0xf5,0x33, +0x90,0x0, 0x16,0x12,0x1, 0x65,0xf5,0x34,0x90,0x0, 0x9, 0x12,0x2, 0xa1,0xf5,0x36, +0x85,0xf0,0x35,0xef,0x70,0x2, 0x61,0x80,0x12,0x10,0x9c,0x90,0x9, 0x24,0x12,0x1, +0x65,0xb4,0x4, 0x8, 0xe5,0x33,0x25,0xe0,0x25,0xe0,0xf5,0x33,0xae,0x2, 0xaf,0x1, +0x8e,0x2e,0x8f,0x2f,0x12,0x57,0xb1,0xaf,0x1, 0xf5,0x30,0x8f,0x31,0xe4,0xf5,0x2a, +0x12,0x17,0x9e,0x71,0xa3,0x40,0x2, 0x61,0x80,0xe5,0x2a,0x75,0xf0,0x10,0xa4,0x85, +0xf0,0x2c,0xf5,0x2d,0xe4,0xf5,0x2b,0x12,0x17,0x9e,0x12,0x14,0x38,0xff,0xe5,0x2b, +0xc3,0x9f,0x40,0x2, 0x61,0x7c,0xe5,0x32,0xb4,0x3, 0x5, 0x71,0x81,0xe4,0x80,0x5b, +0xe5,0x32,0xb4,0x2, 0xf, 0x71,0x84,0xc0,0x83,0xc0,0x82,0x71,0x98,0xd5,0x82,0x2, +0x15,0x83,0x80,0x70,0xe5,0x32,0xb4,0x5, 0x8, 0x12,0x3f,0xa5,0x71,0x8d,0xec,0x80, +0x3a,0xe5,0x2d,0x25,0xe0,0xff,0xe5,0x2c,0x33,0xfe,0xe5,0x31,0x2f,0xf5,0x82,0xe5, +0x30,0x3e,0x71,0xac,0xd3,0x95,0x34,0x74,0x80,0xf8,0xee,0x64,0x80,0x98,0x40,0x22, +0xd3,0xef,0x95,0x36,0xe5,0x35,0x12,0x56,0xf2,0x40,0xd, 0xef,0x95,0x36,0xfd,0xee, +0x95,0x35,0xfc,0x71,0x84,0xec,0x80,0x3, 0x71,0x81,0xe4,0x8d,0xf0,0x12,0x2, 0x60, +0x80,0x2e,0x12,0x3f,0xa5,0xc3,0xe4,0x95,0x34,0xfb,0xe4,0x94,0x0, 0xfa,0xc3,0xed, +0x9b,0xea,0x12,0x2f,0xb9,0x50,0x19,0x71,0x8d,0xc0,0x83,0xc0,0x82,0x71,0x98,0xd5, +0x82,0x2, 0x15,0x83,0x15,0x82,0xe0,0x9e,0xd0,0x82,0xd0,0x83,0xf0,0xa3,0xef,0xf0, +0x5, 0x2d,0xe5,0x2d,0x70,0x2, 0x5, 0x2c,0x5, 0x2b,0x41,0xc7,0x5, 0x2a,0x41,0xb0, +0x22,0xe5,0x33,0xfd,0xe5,0x2d,0x25,0xe0,0xff,0xe5,0x2c,0x33,0xfe,0xe5,0x2f,0x2f, +0xf5,0x82,0xe5,0x2e,0x3e,0xf5,0x83,0x22,0x7e,0x0, 0xc3,0xa3,0xe0,0x95,0x33,0xff, +0x5, 0x82,0x22,0x12,0x1, 0x4c,0xff,0xe5,0x2a,0xc3,0x9f,0x22,0xf5,0x83,0xe0,0xfe, +0xa3,0xe0,0xff,0x22,0xab,0x27,0xe5,0x29,0x24,0x23,0xf9,0xe4,0x35,0x28,0xfa,0x7e, +0x0, 0xe9,0x25,0x2a,0x22,0x12,0x2, 0xa1,0xff,0xe5,0xf0,0xc4,0xf8,0x54,0xf0,0xc8, +0x68,0xfc,0xef,0xc4,0x54,0xf, 0x48,0xfd,0xe5,0x2e,0x75,0xf0,0x7, 0xa4,0xff,0xae, +0xf0,0x22,0x7c,0x0, 0x12,0x5, 0x55,0x8f,0x57,0x8e,0x56,0x8d,0x55,0x8c,0x54,0x78, +0x8, 0x12,0x4, 0xb6,0x8f,0x57,0x8e,0x56,0x8d,0x55,0x8c,0x54,0x22,0x90,0x0, 0x4, +0x74,0xff,0x2, 0x1, 0xd7,0x74,0x5, 0x25,0x2d,0xf5,0x82,0xe4,0x34,0xc, 0xf5,0x83, +0x22,0xaf,0x34,0xae,0x33,0xad,0x32,0xac,0x31,0x78,0x8, 0x12,0x4, 0xb6,0x8f,0x34, +0x8e,0x33,0x8d,0x32,0x8c,0x31,0x5, 0x3a,0xe5,0x3a,0x22,0xab,0x27,0xe5,0x29,0x24, +0x4c,0xf9,0xe4,0x35,0x28,0xfa,0x2, 0x1, 0x4c,0xf9,0xe4,0x3a,0xfa,0x12,0x2, 0x76, +0xc4,0xf8,0x54,0xf, 0xc8,0x68,0xff,0xe5,0xf0,0xc4,0x54,0xf0,0x48,0x8f,0xf0,0x2, +0x3, 0x26,0xe0,0xf9,0xf8,0x12,0x4, 0xc9,0xe5,0x34,0x4f,0xf5,0x34,0xe5,0x33,0x4e, +0xf5,0x33,0xe5,0x32,0x4d,0xf5,0x32,0xe5,0x31,0x4c,0x22,0x90,0x0, 0x4, 0xe5,0x2b, +0x2, 0x1, 0xd7,0x75,0x2c,0x1, 0x75,0x2d,0x0, 0x75,0x2e,0x83,0x7b,0x1, 0x7a,0x0, +0x22,0x90,0x9, 0xa4,0x74,0x1, 0xf0,0xa3,0x74,0xd, 0xf0,0xa3,0x74,0x5, 0xf0,0x22, +0xfa,0xe9,0x2d,0xf9,0xec,0x3a,0xfa,0x74,0x3, 0x2, 0x1, 0xc5,0xf0,0x75,0x24,0x1, +0x75,0x25,0x0, 0x75,0x26,0x83,0x22,0xab,0x27,0xe5,0x29,0x24,0x37,0xf9,0xe4,0x35, +0x28,0x22,0x90,0x0, 0x49,0x2, 0x1, 0x65,0x75,0x24,0x1, 0x75,0x25,0x0, 0x75,0x26, +0x0, 0x75,0x27,0x1, 0x75,0x28,0x0, 0x75,0x29,0x83,0x75,0x2a,0x1, 0x22,0xab,0x27, +0xe5,0x29,0x24,0x2d,0xf9,0xe4,0x35,0x28,0xfa,0x22,0xff,0xe0,0xfd,0x12,0x17,0x35, +0xef,0xd3,0x94,0x6, 0x22,0xe5,0x2d,0x24,0x19,0xf5,0x82,0xe4,0x35,0x2c,0xf5,0x83, +0x22,0x74,0x7d,0x25,0x2b,0xf5,0x82,0xe4,0x34,0xc, 0xf5,0x83,0x22,0x7e,0x1, 0xfd, +0xfc,0xab,0x57,0xaa,0x56,0xa9,0x55,0xa8,0x54,0xc3,0x2, 0x4, 0xa5,0xe5,0x2d,0x25, +0xe0,0xff,0xe4,0x33,0xfe,0x74,0x6, 0x2f,0xf5,0x82,0x74,0xc, 0x3e,0xf5,0x83,0x22, +0xf9,0xe4,0x3a,0xfa,0x12,0x2, 0x76,0xc3,0x95,0x2b,0xff,0xe5,0xf0,0x95,0x2a,0x8f, +0xf0,0x22,0xaa,0x28,0xa9,0x29,0x90,0x0, 0x37,0x75,0xf0,0x2, 0x22,0xe0,0x13,0x75, +0xf0,0x20,0xa4,0x24,0x3, 0xf5,0x82,0xe5,0xf0,0x34,0x4, 0xf5,0x83,0x22,0xec,0x8d, +0xf0,0x2, 0x3, 0x45,0x75,0x27,0x1, 0x75,0x28,0xa, 0x75,0x29,0x4c,0x22,0xef,0xf0, +0xe5,0x2a,0x75,0xf0,0x7, 0xa4,0x22,0x90,0x0, 0xe, 0x12,0x1, 0x65,0xfd,0xe5,0x2d, +0x22,0x75,0x24,0x1, 0x75,0x25,0xb, 0x75,0x26,0xa4,0x22,0xad,0x2d,0xaf,0x2c,0x12, +0x17,0x35,0xef,0xd3,0x22,0x75,0x45,0xa, 0x75,0x46,0x77,0x7b,0xff,0x7a,0x6, 0x79, +0xc5,0x2, 0xa, 0x57,0xe5,0x38,0x75,0xf0,0x7, 0xa4,0xab,0x30,0x25,0x32,0xf9,0xe5, +0x31,0x35,0xf0,0x22,0xf0,0x85,0x2d,0x82,0x85,0x2c,0x83,0xa3,0xa3,0x22,0x74,0x21, +0x2d,0xf5,0x82,0xe4,0x34,0xc, 0xf5,0x83,0x22,0x90,0x0, 0x2d,0x75,0xf0,0x2, 0xe5, +0x2b,0x22,0x74,0x2f,0x25,0x2c,0xf8,0xe6,0x64,0x1, 0x22,0xff,0xc3,0xe5,0x2b,0x9f, +0xe5,0x2a,0x9e,0x22,0x7e,0xa, 0x7f,0x9b,0x7c,0x9, 0x7d,0xaf,0x7a,0xb, 0x7b,0xa4, +0x22,0xe0,0xfe,0xa3,0xe0,0xd3,0x94,0xa0,0xee,0x64,0x80,0x94,0x80,0x22,0x90,0x0, +0x4c,0x2, 0x1, 0x65,0xc3,0x13,0x24,0xe9,0xf5,0x82,0xe4,0x34,0xc, 0xf5,0x83,0xe0, +0x22,0xc3,0x13,0x24,0xf7,0xf5,0x82,0xe4,0x34,0xc, 0xf5,0x83,0xe0,0x22,0xe5,0x39, +0x25,0xe0,0x25,0xe0,0x24,0x3d,0xf5,0x82,0xe4,0x22,0x12,0x1, 0x4c,0xfe,0xef,0xc3, +0x9e,0x22,0xab,0x21,0xe5,0x23,0x24,0xa, 0xf9,0xe4,0x35,0x22,0xfa,0x22,0xab,0x21, +0xe5,0x23,0x24,0x66,0xf9,0xe4,0x35,0x22,0xfa,0x22,0x12,0x2, 0xa1,0xd3,0x9d,0xe5, +0xf0,0x9c,0xe5,0x2d,0x22,0x12,0x2, 0xa1,0xc3,0x9f,0xff,0xe5,0xf0,0x9e,0xfe,0x22, +0x90,0xd, 0x3, 0x74,0x3, 0xf0,0xa3,0x74,0xe8,0xf0,0x22,0x74,0x5, 0x2f,0xf5,0x82, +0x74,0xc, 0x3e,0xf5,0x83,0x22,0xed,0x12,0x1, 0xd7,0x5, 0x2e,0xe5,0x2e,0x22,0x90, +0x3, 0x80,0x75,0xf0,0x20,0xe5,0x2a,0x22,0xe0,0xfc,0xa3,0xe0,0xc3,0x9f,0xec,0x9e, +0x22,0xe0,0xfc,0xa3,0xe0,0xd3,0x9f,0xec,0x9e,0x22,0xe5,0x2a,0x85,0x2b,0xf0,0x2, +0x2, 0xd9,0xe5,0x34,0x24,0x10,0xf9,0xe4,0x35,0x33,0x22,0xe5,0x82,0x2f,0xf5,0x82, +0xe5,0x83,0x3e,0x22,0x90,0x0, 0x27,0x12,0x1, 0x65,0xff,0x6d,0x22,0x90,0x3, 0x80, +0x75,0xf0,0x20,0xe5,0x2b,0x22,0xff,0xe4,0x33,0xa2,0xe7,0x13,0xef,0x13,0x22,0xfd, +0x12,0x17,0x35,0xef,0xc3,0x94,0xc, 0x22,0xe5,0x26,0x24,0xa, 0xf9,0xe4,0x35,0x25, +0x22,0x74,0xfb,0x2f,0xff,0x74,0xff,0x3e,0xfe,0x22,0x90,0x0, 0xf, 0xed,0x2, 0x1, +0xd7,0x7e,0x0, 0x7f,0x23,0x2, 0x1, 0x26,0xaa,0x31,0xa9,0x32,0x75,0xf0,0x7, 0x22, +0xfd,0xd3,0xef,0x9d,0x74,0x80,0xf8,0x22,0xd3,0x94,0x2c,0xe5,0xf0,0x64,0x80,0x22, +0x24,0x37,0xf8,0xa6,0x7, 0x5, 0x2c,0x22,0xc3,0xe5,0x2d,0x64,0x80,0x94,0x80,0x22, +0x90,0x0, 0x52,0xe4,0x2, 0x1, 0xd7,0x90,0x0, 0x53,0xe4,0x2, 0x1, 0xd7,0xff,0xab, +0x29,0xe5,0x2b,0x24,0x1c,0x22,0x8b,0x29,0x8a,0x2a,0x89,0x2b,0xe4,0x22,0xf0,0x8f, +0x82,0x8e,0x83,0xa3,0xa3,0x22,0xe4,0x90,0xa, 0x96,0xf0,0xa3,0xf0,0x22,0x90,0xc, +0x77,0x74,0x1, 0xf0,0xa3,0x22,0xff,0xe4,0x33,0xfe,0xef,0x78,0x2, 0x22,0xf5,0x82, +0xe4,0x34,0xc, 0xf5,0x83,0x22,0x12,0x2, 0xa1,0xe5,0xf0,0x54,0xf, 0x22,0xc3,0xef, +0x94,0x5, 0xee,0x94,0x0, 0x22,0x6f,0x66,0x90,0x99,0x28,0xd7,0x11,0xee, \ No newline at end of file diff --git a/drivers/input/touchscreen/Ver11_20110808_043_9485_skate_app.i b/drivers/input/touchscreen/Ver11_20110808_043_9485_skate_app.i new file mode 100644 index 00000000..33a7bed1 --- /dev/null +++ b/drivers/input/touchscreen/Ver11_20110808_043_9485_skate_app.i @@ -0,0 +1,1754 @@ +0x2, 0x5, 0xf0,0x2, 0x5e,0xc2,0xee,0x30,0xe7,0x7, 0xc3,0xe4,0x9f,0xff,0xe4,0x9e, +0xfe,0x22,0x1, 0x2, 0x4, 0x8, 0x10,0x20,0x40,0x80,0x22,0x2, 0x5d,0xc2,0x2, 0x17, +0x3, 0x22,0xff,0x2, 0x3d,0x7d,0xbd,0x77,0xb, 0xef,0xc3,0x94,0x13,0x40,0x19,0x74, +0xf3,0x2f,0xff,0x22,0xbd,0x78,0xb, 0xef,0xc3,0x94,0x13,0x40,0xb, 0x74,0xf8,0x2f, +0xff,0x22,0xbd,0x79,0x1, 0x22,0x7f,0xff,0x22,0xff,0xff,0x2, 0x5d,0x18,0x8f,0xd9, +0x8d,0xda,0x22,0x2, 0x62,0xab,0xe7,0x9, 0xf6,0x8, 0xdf,0xfa,0x80,0x46,0xe7,0x9, +0xf2,0x8, 0xdf,0xfa,0x80,0x3e,0x88,0x82,0x8c,0x83,0xe7,0x9, 0xf0,0xa3,0xdf,0xfa, +0x80,0x32,0xe3,0x9, 0xf6,0x8, 0xdf,0xfa,0x80,0x78,0xe3,0x9, 0xf2,0x8, 0xdf,0xfa, +0x80,0x70,0x88,0x82,0x8c,0x83,0xe3,0x9, 0xf0,0xa3,0xdf,0xfa,0x80,0x64,0x89,0x82, +0x8a,0x83,0xe0,0xa3,0xf6,0x8, 0xdf,0xfa,0x80,0x58,0x89,0x82,0x8a,0x83,0xe0,0xa3, +0xf2,0x8, 0xdf,0xfa,0x80,0x4c,0x80,0xd2,0x80,0xfa,0x80,0xc6,0x80,0xd4,0x80,0x69, +0x80,0xf2,0x80,0x33,0x80,0x10,0x80,0xa6,0x80,0xea,0x80,0x9a,0x80,0xa8,0x80,0xda, +0x80,0xe2,0x80,0xca,0x80,0x33,0x89,0x82,0x8a,0x83,0xec,0xfa,0xe4,0x93,0xa3,0xc8, +0xc5,0x82,0xc8,0xcc,0xc5,0x83,0xcc,0xf0,0xa3,0xc8,0xc5,0x82,0xc8,0xcc,0xc5,0x83, +0xcc,0xdf,0xe9,0xde,0xe7,0x80,0xd, 0x89,0x82,0x8a,0x83,0xe4,0x93,0xa3,0xf6,0x8, +0xdf,0xf9,0xec,0xfa,0xa9,0xf0,0xed,0xfb,0x22,0x89,0x82,0x8a,0x83,0xec,0xfa,0xe0, +0xa3,0xc8,0xc5,0x82,0xc8,0xcc,0xc5,0x83,0xcc,0xf0,0xa3,0xc8,0xc5,0x82,0xc8,0xcc, +0xc5,0x83,0xcc,0xdf,0xea,0xde,0xe8,0x80,0xdb,0x89,0x82,0x8a,0x83,0xe4,0x93,0xa3, +0xf2,0x8, 0xdf,0xf9,0x80,0xcc,0x88,0xf0,0xef,0x60,0x1, 0xe, 0x4e,0x60,0xc3,0x88, +0xf0,0xed,0x24,0x2, 0xb4,0x4, 0x0, 0x50,0xb9,0xf5,0x82,0xeb,0x24,0x2, 0xb4,0x4, +0x0, 0x50,0xaf,0x23,0x23,0x45,0x82,0x23,0x90,0x0, 0xa6,0x73,0xbb,0x1, 0x6, 0x89, +0x82,0x8a,0x83,0xe0,0x22,0x50,0x2, 0xe7,0x22,0xbb,0xfe,0x2, 0xe3,0x22,0x89,0x82, +0x8a,0x83,0xe4,0x93,0x22,0xbb,0x1, 0xc, 0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a, +0xf5,0x83,0xe0,0x22,0x50,0x6, 0xe9,0x25,0x82,0xf8,0xe6,0x22,0xbb,0xfe,0x6, 0xe9, +0x25,0x82,0xf8,0xe2,0x22,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe4, +0x93,0x22,0xbb,0x1, 0xf, 0xf8,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83, +0xe0,0x28,0xf0,0x22,0x50,0x9, 0xc5,0x82,0x29,0xf8,0xe5,0x82,0x26,0xf6,0x22,0xbb, +0xfe,0x9, 0xc5,0x82,0x29,0xf8,0xe2,0x25,0x82,0xf2,0x22,0xf8,0xea,0x25,0x83,0xf5, +0x83,0xe9,0x93,0x28,0x22,0xbb,0x1, 0x6, 0x89,0x82,0x8a,0x83,0xf0,0x22,0x50,0x2, +0xf7,0x22,0xbb,0xfe,0x1, 0xf3,0x22,0xf8,0xbb,0x1, 0xd, 0xe5,0x82,0x29,0xf5,0x82, +0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0x22,0x50,0x6, 0xe9,0x25,0x82,0xc8,0xf6,0x22, +0xbb,0xfe,0x5, 0xe9,0x25,0x82,0xc8,0xf2,0x22,0xef,0x8d,0xf0,0xa4,0xa8,0xf0,0xcf, +0x8c,0xf0,0xa4,0x28,0xce,0x8d,0xf0,0xa4,0x2e,0xfe,0x22,0xbc,0x0, 0xb, 0xbe,0x0, +0x29,0xef,0x8d,0xf0,0x84,0xff,0xad,0xf0,0x22,0xe4,0xcc,0xf8,0x75,0xf0,0x8, 0xef, +0x2f,0xff,0xee,0x33,0xfe,0xec,0x33,0xfc,0xee,0x9d,0xec,0x98,0x40,0x5, 0xfc,0xee, +0x9d,0xfe,0xf, 0xd5,0xf0,0xe9,0xe4,0xce,0xfd,0x22,0xed,0xf8,0xf5,0xf0,0xee,0x84, +0x20,0xd2,0x1c,0xfe,0xad,0xf0,0x75,0xf0,0x8, 0xef,0x2f,0xff,0xed,0x33,0xfd,0x40, +0x7, 0x98,0x50,0x6, 0xd5,0xf0,0xf2,0x22,0xc3,0x98,0xfd,0xf, 0xd5,0xf0,0xea,0x22, +0xc5,0xf0,0xf8,0xa3,0xe0,0x28,0xf0,0xc5,0xf0,0xf8,0xe5,0x82,0x15,0x82,0x70,0x2, +0x15,0x83,0xe0,0x38,0xf0,0x22,0xa3,0xf8,0xe0,0xc5,0xf0,0x25,0xf0,0xf0,0xe5,0x82, +0x15,0x82,0x70,0x2, 0x15,0x83,0xe0,0xc8,0x38,0xf0,0xe8,0x22,0xbb,0x1, 0xa, 0x89, +0x82,0x8a,0x83,0xe0,0xf5,0xf0,0xa3,0xe0,0x22,0x50,0x6, 0x87,0xf0,0x9, 0xe7,0x19, +0x22,0xbb,0xfe,0x7, 0xe3,0xf5,0xf0,0x9, 0xe3,0x19,0x22,0x89,0x82,0x8a,0x83,0xe4, +0x93,0xf5,0xf0,0x74,0x1, 0x93,0x22,0xbb,0x1, 0x10,0xe5,0x82,0x29,0xf5,0x82,0xe5, +0x83,0x3a,0xf5,0x83,0xe0,0xf5,0xf0,0xa3,0xe0,0x22,0x50,0x9, 0xe9,0x25,0x82,0xf8, +0x86,0xf0,0x8, 0xe6,0x22,0xbb,0xfe,0xa, 0xe9,0x25,0x82,0xf8,0xe2,0xf5,0xf0,0x8, +0xe2,0x22,0xe5,0x83,0x2a,0xf5,0x83,0xe9,0x93,0xf5,0xf0,0xa3,0xe9,0x93,0x22,0xbb, +0x1, 0xd, 0xc5,0x82,0x29,0xc5,0x82,0xc5,0x83,0x3a,0xc5,0x83,0x2, 0x2, 0x60,0x50, +0x11,0xc5,0x82,0x29,0xf8,0x8, 0xe5,0xf0,0x26,0xf6,0x18,0xf5,0xf0,0xe5,0x82,0x36, +0xf6,0x22,0xbb,0xfe,0x11,0xc5,0x82,0x29,0xf8,0x8, 0xe2,0x25,0xf0,0xf5,0xf0,0xf2, +0x18,0xe2,0x35,0x82,0xf2,0x22,0xf8,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x2a,0xf5, +0x83,0x74,0x1, 0x93,0x25,0xf0,0xf5,0xf0,0xe4,0x93,0x38,0x22,0xbb,0x1, 0xa, 0x89, +0x82,0x8a,0x83,0xf0,0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x6, 0xf7,0x9, 0xa7,0xf0,0x19, +0x22,0xbb,0xfe,0x6, 0xf3,0xe5,0xf0,0x9, 0xf3,0x19,0x22,0xf8,0xbb,0x1, 0x11,0xe5, +0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0xe5,0xf0,0xa3,0xf0,0x22, +0x50,0x9, 0xe9,0x25,0x82,0xc8,0xf6,0x8, 0xa6,0xf0,0x22,0xbb,0xfe,0x9, 0xe9,0x25, +0x82,0xc8,0xf2,0xe5,0xf0,0x8, 0xf2,0x22,0xe8,0x8f,0xf0,0xa4,0xcc,0x8b,0xf0,0xa4, +0x2c,0xfc,0xe9,0x8e,0xf0,0xa4,0x2c,0xfc,0x8a,0xf0,0xed,0xa4,0x2c,0xfc,0xea,0x8e, +0xf0,0xa4,0xcd,0xa8,0xf0,0x8b,0xf0,0xa4,0x2d,0xcc,0x38,0x25,0xf0,0xfd,0xe9,0x8f, +0xf0,0xa4,0x2c,0xcd,0x35,0xf0,0xfc,0xeb,0x8e,0xf0,0xa4,0xfe,0xa9,0xf0,0xeb,0x8f, +0xf0,0xa4,0xcf,0xc5,0xf0,0x2e,0xcd,0x39,0xfe,0xe4,0x3c,0xfc,0xea,0xa4,0x2d,0xce, +0x35,0xf0,0xfd,0xe4,0x3c,0xfc,0x22,0x75,0xf0,0x8, 0x75,0x82,0x0, 0xef,0x2f,0xff, +0xee,0x33,0xfe,0xcd,0x33,0xcd,0xcc,0x33,0xcc,0xc5,0x82,0x33,0xc5,0x82,0x9b,0xed, +0x9a,0xec,0x99,0xe5,0x82,0x98,0x40,0xc, 0xf5,0x82,0xee,0x9b,0xfe,0xed,0x9a,0xfd, +0xec,0x99,0xfc,0xf, 0xd5,0xf0,0xd6,0xe4,0xce,0xfb,0xe4,0xcd,0xfa,0xe4,0xcc,0xf9, +0xa8,0x82,0x22,0xb8,0x0, 0xc1,0xb9,0x0, 0x59,0xba,0x0, 0x2d,0xec,0x8b,0xf0,0x84, +0xcf,0xce,0xcd,0xfc,0xe5,0xf0,0xcb,0xf9,0x78,0x18,0xef,0x2f,0xff,0xee,0x33,0xfe, +0xed,0x33,0xfd,0xec,0x33,0xfc,0xeb,0x33,0xfb,0x10,0xd7,0x3, 0x99,0x40,0x4, 0xeb, +0x99,0xfb,0xf, 0xd8,0xe5,0xe4,0xf9,0xfa,0x22,0x78,0x18,0xef,0x2f,0xff,0xee,0x33, +0xfe,0xed,0x33,0xfd,0xec,0x33,0xfc,0xc9,0x33,0xc9,0x10,0xd7,0x5, 0x9b,0xe9,0x9a, +0x40,0x7, 0xec,0x9b,0xfc,0xe9,0x9a,0xf9,0xf, 0xd8,0xe0,0xe4,0xc9,0xfa,0xe4,0xcc, +0xfb,0x22,0x75,0xf0,0x10,0xef,0x2f,0xff,0xee,0x33,0xfe,0xed,0x33,0xfd,0xcc,0x33, +0xcc,0xc8,0x33,0xc8,0x10,0xd7,0x7, 0x9b,0xec,0x9a,0xe8,0x99,0x40,0xa, 0xed,0x9b, +0xfd,0xec,0x9a,0xfc,0xe8,0x99,0xf8,0xf, 0xd5,0xf0,0xda,0xe4,0xcd,0xfb,0xe4,0xcc, +0xfa,0xe4,0xc8,0xf9,0x22,0xeb,0x9f,0xf5,0xf0,0xea,0x9e,0x42,0xf0,0xe9,0x9d,0x42, +0xf0,0xec,0x64,0x80,0xc8,0x64,0x80,0x98,0x45,0xf0,0x22,0xeb,0x9f,0xf5,0xf0,0xea, +0x9e,0x42,0xf0,0xe9,0x9d,0x42,0xf0,0xe8,0x9c,0x45,0xf0,0x22,0xe8,0x60,0xf, 0xec, +0xc3,0x13,0xfc,0xed,0x13,0xfd,0xee,0x13,0xfe,0xef,0x13,0xff,0xd8,0xf1,0x22,0xe8, +0x60,0xf, 0xef,0xc3,0x33,0xff,0xee,0x33,0xfe,0xed,0x33,0xfd,0xec,0x33,0xfc,0xd8, +0xf1,0x22,0xec,0xf0,0xa3,0xed,0xf0,0xa3,0xee,0xf0,0xa3,0xef,0xf0,0x22,0xa8,0x82, +0x85,0x83,0xf0,0xd0,0x83,0xd0,0x82,0x12,0x5, 0x15,0x12,0x5, 0x15,0x12,0x5, 0x15, +0x12,0x5, 0x15,0xe4,0x73,0xe4,0x93,0xa3,0xc5,0x83,0xc5,0xf0,0xc5,0x83,0xc8,0xc5, +0x82,0xc8,0xf0,0xa3,0xc5,0x83,0xc5,0xf0,0xc5,0x83,0xc8,0xc5,0x82,0xc8,0x22,0xf5, +0xf0,0xc5,0x82,0xa4,0xc5,0x82,0xc5,0xf0,0xc5,0x83,0xa4,0x25,0x83,0xf5,0x83,0x22, +0xa4,0x25,0x82,0xf5,0x82,0xe5,0xf0,0x35,0x83,0xf5,0x83,0x22,0xbb,0x1, 0x7, 0x89, +0x82,0x8a,0x83,0x2, 0x5, 0xd2,0x50,0x5, 0xe9,0xf8,0x2, 0x5, 0xc9,0xbb,0xfe,0x5, +0xe9,0xf8,0x2, 0x5, 0xdb,0x89,0x82,0x8a,0x83,0x2, 0x5, 0xe4,0xbb,0x1, 0xd, 0xe5, +0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0x2, 0x5, 0xd2,0x50,0x7, 0xe9,0x25, +0x82,0xf8,0x2, 0x5, 0xc9,0xbb,0xfe,0x7, 0xe9,0x25,0x82,0xf8,0x2, 0x5, 0xdb,0xe5, +0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0x2, 0x5, 0xe4,0xec,0x8e,0xf0,0xa4, +0xcc,0xc5,0xf0,0xcc,0xcd,0xf8,0xef,0xa4,0xce,0xc5,0xf0,0x2d,0xfd,0xe4,0x3c,0xfc, +0xe8,0xa4,0x2e,0xc8,0xc5,0xf0,0x3d,0xfd,0xe4,0x3c,0xfc,0xef,0xa4,0xff,0xe5,0xf0, +0x28,0xfe,0xe4,0x3d,0xfd,0xe4,0x3c,0xfc,0x22,0xe6,0xfb,0x8, 0xe6,0xfa,0x8, 0xe6, +0xf9,0x22,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x22,0xe2,0xfb,0x8, 0xe2,0xfa, +0x8, 0xe2,0xf9,0x22,0xe4,0x93,0xfb,0x74,0x1, 0x93,0xfa,0x74,0x2, 0x93,0xf9,0x22, +0x78,0xff,0xe4,0xf6,0xd8,0xfd,0x75,0x81,0x96,0x2, 0x6, 0x37,0x2, 0x3d,0xd5,0xe4, +0x93,0xa3,0xf8,0xe4,0x93,0xa3,0x40,0x3, 0xf6,0x80,0x1, 0xf2,0x8, 0xdf,0xf4,0x80, +0x29,0xe4,0x93,0xa3,0xf8,0x54,0x7, 0x24,0xc, 0xc8,0xc3,0x33,0xc4,0x54,0xf, 0x44, +0x20,0xc8,0x83,0x40,0x4, 0xf4,0x56,0x80,0x1, 0x46,0xf6,0xdf,0xe4,0x80,0xb, 0x1, +0x2, 0x4, 0x8, 0x10,0x20,0x40,0x80,0x90,0x6, 0xcb,0xe4,0x7e,0x1, 0x93,0x60,0xbc, +0xa3,0xff,0x54,0x3f,0x30,0xe5,0x9, 0x54,0x1f,0xfe,0xe4,0x93,0xa3,0x60,0x1, 0xe, +0xcf,0x54,0xc0,0x25,0xe0,0x60,0xa8,0x40,0xb8,0xe4,0x93,0xa3,0xfa,0xe4,0x93,0xa3, +0xf8,0xe4,0x93,0xa3,0xc8,0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,0xf0,0xa3,0xc8,0xc5, +0x82,0xc8,0xca,0xc5,0x83,0xca,0xdf,0xe9,0xde,0xe7,0x80,0xbe,0xab,0x43,0xaa,0x44, +0xa9,0x45,0x85,0x48,0x82,0x75,0x83,0x0, 0x22,0xab,0x5d,0xaa,0x5e,0xa9,0x5f,0x85, +0x62,0x82,0x75,0x83,0x0, 0x22,0xe5,0x47,0xab,0x43,0xaa,0x44,0xa9,0x45,0x22,0xe5, +0x61,0xab,0x5d,0xaa,0x5e,0xa9,0x5f,0x22,0xbd,0x77,0xb, 0xef,0xc3,0x94,0x6, 0x40, +0x19,0x74,0xd, 0x2f,0xff,0x22,0xbd,0x78,0xb, 0xef,0xc3,0x94,0xb, 0x40,0xb, 0x74, +0x8, 0x2f,0xff,0x22,0xbd,0x79,0x1, 0x22,0x7f,0xff,0x22,0x1, 0xc, 0x0, 0x41,0xa, +0xe6,0x0, 0x41,0xc, 0x8c,0x0, 0x41,0xc, 0x85,0x0, 0x41,0xc, 0x87,0x0, 0x41,0xc, +0xa1,0x0, 0x41,0xc, 0x88,0x0, 0x1, 0x16,0x0, 0x0, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, +0xf, 0x10,0x11,0x12,0x13,0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x2, 0x3, 0x4, +0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d, +0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d, +0x1d,0x1d,0x1d,0x3a,0x3a,0x3a,0x3a,0x3a,0x3a,0x3a,0x3a,0x3a,0x3a,0x3a,0x3a,0x3a, +0x3a,0x3a,0x3a,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x40,0x3, 0x0, 0xe6,0x2, 0x0, 0x0, 0x1, 0x0, 0x1, +0x2, 0x3, 0x1, 0x2, 0x0, 0x0, 0xa0,0x78,0x64,0x64,0x1, 0x1, 0x1, 0x1, 0x1, 0x2, +0x34,0xd8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x8b,0x40,0x8a,0x41,0x89,0x42,0xe4,0xf5,0x48,0xe5,0x48,0xc3,0x95,0x46,0x40,0x3, +0x2, 0xa, 0x56,0xab,0x40,0xaa,0x41,0xa9,0x42,0x12,0x6, 0x82,0x12,0x1, 0x65,0xb4, +0x1c,0x0, 0x40,0x3, 0x2, 0xa, 0x51,0x90,0x8, 0x2e,0xf8,0x28,0x28,0x73,0x2, 0x8, +0x82,0x2, 0x8, 0x89,0x2, 0x8, 0x91,0x2, 0x8, 0x99,0x2, 0x8, 0xa1,0x2, 0x8, 0xa9, +0x2, 0x8, 0xb1,0x2, 0x8, 0xc7,0x2, 0x8, 0xdd,0x2, 0x8, 0xf3,0x2, 0x9, 0x9, 0x2, +0x9, 0x1f,0x2, 0x9, 0x42,0x2, 0x9, 0x65,0x2, 0x9, 0x88,0x2, 0x9, 0xab,0x2, 0x9, +0xc1,0x2, 0x9, 0xd7,0x2, 0x9, 0xed,0x2, 0xa, 0x3, 0x2, 0xa, 0x18,0x2, 0xa, 0x1f, +0x2, 0xa, 0x26,0x2, 0xa, 0x2d,0x2, 0xa, 0x34,0x2, 0xa, 0x3b,0x2, 0xa, 0x42,0x2, +0xa, 0x49,0x12,0x6, 0x7c,0xe4,0x2, 0xa, 0x4e,0x12,0x6, 0x7c,0x74,0x1, 0x2, 0xa, +0x4e,0x12,0x6, 0x7c,0x74,0x2, 0x2, 0xa, 0x4e,0x12,0x6, 0x7c,0x74,0x3, 0x2, 0xa, +0x4e,0x12,0x6, 0x7c,0x74,0x4, 0x2, 0xa, 0x4e,0x12,0x6, 0x7c,0x74,0x5, 0x2, 0xa, +0x4e,0x12,0x6, 0x96,0xb4,0x77,0x8, 0x12,0x6, 0x82,0x74,0x13,0x2, 0xa, 0x4e,0x12, +0x6, 0x82,0x74,0x6, 0x2, 0xa, 0x4e,0x12,0x6, 0x96,0xb4,0x77,0x8, 0x12,0x6, 0x82, +0x74,0x14,0x2, 0xa, 0x4e,0x12,0x6, 0x82,0x74,0x7, 0x2, 0xa, 0x4e,0x12,0x6, 0x96, +0xb4,0x77,0x8, 0x12,0x6, 0x82,0x74,0x15,0x2, 0xa, 0x4e,0x12,0x6, 0x82,0x74,0x8, +0x2, 0xa, 0x4e,0x12,0x6, 0x96,0xb4,0x77,0x8, 0x12,0x6, 0x82,0x74,0x16,0x2, 0xa, +0x4e,0x12,0x6, 0x82,0x74,0x9, 0x2, 0xa, 0x4e,0x12,0x6, 0x96,0xb4,0x77,0x8, 0x12, +0x6, 0x82,0x74,0x17,0x2, 0xa, 0x4e,0x12,0x6, 0x82,0x74,0xa, 0x2, 0xa, 0x4e,0xe5, +0x47,0xb4,0x77,0x8, 0x12,0x6, 0x7c,0x74,0x18,0x2, 0xa, 0x4e,0x12,0x6, 0x96,0xb4, +0x78,0x8, 0x12,0x6, 0x82,0x74,0x13,0x2, 0xa, 0x4e,0x12,0x6, 0x82,0x74,0xb, 0x2, +0xa, 0x4e,0xe5,0x47,0xb4,0x77,0x8, 0x12,0x6, 0x7c,0x74,0x19,0x2, 0xa, 0x4e,0x12, +0x6, 0x96,0xb4,0x78,0x8, 0x12,0x6, 0x82,0x74,0x14,0x2, 0xa, 0x4e,0x12,0x6, 0x82, +0x74,0xc, 0x2, 0xa, 0x4e,0xe5,0x47,0xb4,0x77,0x8, 0x12,0x6, 0x7c,0x74,0x1a,0x2, +0xa, 0x4e,0x12,0x6, 0x96,0xb4,0x78,0x8, 0x12,0x6, 0x82,0x74,0x15,0x2, 0xa, 0x4e, +0x12,0x6, 0x82,0x74,0xd, 0x2, 0xa, 0x4e,0xe5,0x47,0xb4,0x77,0x8, 0x12,0x6, 0x7c, +0x74,0x1b,0x2, 0xa, 0x4e,0x12,0x6, 0x96,0xb4,0x78,0x8, 0x12,0x6, 0x82,0x74,0x16, +0x2, 0xa, 0x4e,0x12,0x6, 0x82,0x74,0xe, 0x2, 0xa, 0x4e,0x12,0x6, 0x96,0xb4,0x78, +0x8, 0x12,0x6, 0x82,0x74,0x17,0x2, 0xa, 0x4e,0x12,0x6, 0x82,0x74,0xf, 0x2, 0xa, +0x4e,0x12,0x6, 0x96,0xb4,0x78,0x8, 0x12,0x6, 0x82,0x74,0x18,0x2, 0xa, 0x4e,0x12, +0x6, 0x82,0x74,0x10,0x2, 0xa, 0x4e,0x12,0x6, 0x96,0xb4,0x78,0x8, 0x12,0x6, 0x82, +0x74,0x19,0x2, 0xa, 0x4e,0x12,0x6, 0x82,0x74,0x11,0x2, 0xa, 0x4e,0x12,0x6, 0x96, +0xb4,0x78,0x8, 0x12,0x6, 0x82,0x74,0x1a,0x2, 0xa, 0x4e,0x12,0x6, 0x82,0x74,0x12, +0x2, 0xa, 0x4e,0x12,0x6, 0x96,0xb4,0x78,0x8, 0x12,0x6, 0x82,0x74,0x1b,0x2, 0xa, +0x4e,0x12,0x6, 0x82,0x74,0x13,0x80,0x36,0x12,0x6, 0x7c,0x74,0x14,0x80,0x2f,0x12, +0x6, 0x7c,0x74,0x15,0x80,0x28,0x12,0x6, 0x7c,0x74,0x16,0x80,0x21,0x12,0x6, 0x7c, +0x74,0x17,0x80,0x1a,0x12,0x6, 0x7c,0x74,0x18,0x80,0x13,0x12,0x6, 0x7c,0x74,0x19, +0x80,0xc, 0x12,0x6, 0x7c,0x74,0x1a,0x80,0x5, 0x12,0x6, 0x7c,0x74,0x1b,0x12,0x1, +0xd7,0x5, 0x48,0x2, 0x8, 0x9, 0x22,0x8b,0x5a,0x8a,0x5b,0x89,0x5c,0xe4,0xf5,0x62, +0xe5,0x62,0xc3,0x95,0x60,0x40,0x3, 0x2, 0xc, 0x53,0xab,0x5a,0xaa,0x5b,0xa9,0x5c, +0x12,0x6, 0x8f,0x12,0x1, 0x65,0xb4,0x10,0x0, 0x40,0x3, 0x2, 0xc, 0x4e,0x90,0xa, +0x85,0xf8,0x28,0x28,0x73,0x2, 0xa, 0xb5,0x2, 0xa, 0xcf,0x2, 0xa, 0xf2,0x2, 0xb, +0x15,0x2, 0xb, 0x38,0x2, 0xb, 0x5b,0x2, 0xb, 0x7e,0x2, 0xb, 0xa1,0x2, 0xb, 0xc4, +0x2, 0xb, 0xe7,0x2, 0xc, 0x9, 0x2, 0xc, 0x1d,0x2, 0xc, 0x31,0x2, 0xc, 0x38,0x2, +0xc, 0x3f,0x2, 0xc, 0x46,0xe5,0x61,0xb4,0x77,0x5, 0x12,0x6, 0xa1,0x80,0x23,0x12, +0x6, 0x9f,0xb4,0x78,0x3, 0x2, 0xb, 0x30,0x12,0x6, 0x8f,0xe4,0x2, 0xc, 0x4b,0xe5, +0x61,0xb4,0x77,0x8, 0x12,0x6, 0x89,0x74,0x5, 0x2, 0xc, 0x4b,0x12,0x6, 0x9f,0xb4, +0x78,0x8, 0x12,0x6, 0x8f,0x74,0x4, 0x2, 0xc, 0x4b,0x12,0x6, 0x8f,0x74,0x1, 0x2, +0xc, 0x4b,0xe5,0x61,0xb4,0x77,0x8, 0x12,0x6, 0x89,0x74,0x6, 0x2, 0xc, 0x4b,0x12, +0x6, 0x9f,0xb4,0x78,0x8, 0x12,0x6, 0x8f,0x74,0x5, 0x2, 0xc, 0x4b,0x12,0x6, 0x8f, +0x74,0x2, 0x2, 0xc, 0x4b,0xe5,0x61,0xb4,0x77,0x8, 0x12,0x6, 0x89,0x74,0x7, 0x2, +0xc, 0x4b,0x12,0x6, 0x9f,0xb4,0x78,0x8, 0x12,0x6, 0x8f,0x74,0x6, 0x2, 0xc, 0x4b, +0x12,0x6, 0x8f,0x74,0x3, 0x2, 0xc, 0x4b,0xe5,0x61,0xb4,0x77,0x8, 0x12,0x6, 0x89, +0x74,0x8, 0x2, 0xc, 0x4b,0x12,0x6, 0x9f,0xb4,0x78,0x8, 0x12,0x6, 0x8f,0x74,0x7, +0x2, 0xc, 0x4b,0x12,0x6, 0x8f,0x74,0x4, 0x2, 0xc, 0x4b,0xe5,0x61,0xb4,0x77,0x8, +0x12,0x6, 0x89,0x74,0x9, 0x2, 0xc, 0x4b,0x12,0x6, 0x9f,0xb4,0x78,0x8, 0x12,0x6, +0x8f,0x74,0x8, 0x2, 0xc, 0x4b,0x12,0x6, 0x8f,0x74,0x5, 0x2, 0xc, 0x4b,0xe5,0x61, +0xb4,0x77,0x8, 0x12,0x6, 0x89,0x74,0xa, 0x2, 0xc, 0x4b,0x12,0x6, 0x9f,0xb4,0x78, +0x8, 0x12,0x6, 0x8f,0x74,0x9, 0x2, 0xc, 0x4b,0x12,0x6, 0x8f,0x74,0x6, 0x2, 0xc, +0x4b,0xe5,0x61,0xb4,0x77,0x8, 0x12,0x6, 0x89,0x74,0xb, 0x2, 0xc, 0x4b,0x12,0x6, +0x9f,0xb4,0x78,0x8, 0x12,0x6, 0x8f,0x74,0xa, 0x2, 0xc, 0x4b,0x12,0x6, 0x8f,0x74, +0x7, 0x2, 0xc, 0x4b,0xe5,0x61,0xb4,0x77,0x8, 0x12,0x6, 0x89,0x74,0xc, 0x2, 0xc, +0x4b,0x12,0x6, 0x9f,0xb4,0x78,0x8, 0x12,0x6, 0x8f,0x74,0xb, 0x2, 0xc, 0x4b,0x12, +0x6, 0x8f,0x74,0x8, 0x2, 0xc, 0x4b,0xe5,0x61,0xb4,0x77,0x8, 0x12,0x6, 0x89,0x74, +0xd, 0x2, 0xc, 0x4b,0x12,0x6, 0x9f,0xb4,0x78,0x8, 0x12,0x6, 0x8f,0x74,0xc, 0x2, +0xc, 0x4b,0x12,0x6, 0x8f,0x74,0x9, 0x80,0x42,0x12,0x6, 0x9f,0xb4,0x78,0x7, 0x12, +0x6, 0x8f,0x74,0xd, 0x80,0x35,0x12,0x6, 0x8f,0x74,0xa, 0x80,0x2e,0x12,0x6, 0x9f, +0xb4,0x78,0x7, 0x12,0x6, 0x8f,0x74,0xe, 0x80,0x21,0x12,0x6, 0x8f,0x74,0xb, 0x80, +0x1a,0x12,0x6, 0x89,0x74,0xc, 0x80,0x13,0x12,0x6, 0x89,0x74,0xd, 0x80,0xc, 0x12, +0x6, 0x89,0x74,0xe, 0x80,0x5, 0x12,0x6, 0x89,0x74,0xf, 0x12,0x1, 0xd7,0x5, 0x62, +0x2, 0xa, 0x60,0x22,0xc0,0x0, 0xc0,0x3f,0xdf,0xbf,0xdf,0xbf,0xc0,0x1, 0xc0,0x82, +0xc1,0x2, 0xc1,0x1, 0xc0,0x3f,0xdf,0x3d,0xde,0x3c,0xde,0xbe,0xc0,0x2, 0xc1,0x85, +0xc2,0x85,0xc2,0x2, 0xc0,0x3e,0xde,0x3a,0xdd,0x3a,0xdd,0xbd,0xc0,0x3, 0xc2,0x87, +0xc4,0x7, 0xc3,0x3, 0xc0,0x3d,0xdd,0x38,0xdb,0xb7,0xdc,0xbc,0xc0,0x4, 0xc3,0x8a, +0xc5,0x8a,0xc4,0x4, 0xc0,0x3c,0xdc,0x35,0xda,0x35,0xdb,0xbb,0xc0,0x5, 0xc4,0x8c, +0xc6,0x8d,0xc5,0x5, 0xc0,0x3b,0xdb,0x32,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8d,0xc5,0x5, 0xc0,0x3b,0xdb,0x34,0xd9,0xb4,0xdb,0xbb,0xc0,0x5, 0xc4,0x8b, +0xc6,0xb, 0xc4,0x4, 0xc0,0x3c,0xdc,0x36,0xdb,0x36,0xdc,0xbc,0xc0,0x4, 0xc3,0x89, +0xc4,0x88,0xc3,0x3, 0xc0,0x3d,0xdd,0x39,0xdc,0x39,0xdd,0xbd,0xc0,0x3, 0xc2,0x86, +0xc3,0x6, 0xc2,0x2, 0xc0,0x3e,0xde,0x3b,0xdd,0xbc,0xde,0xbe,0xc0,0x2, 0xc1,0x83, +0xc1,0x83,0xc1,0x1, 0xc0,0x3f,0xdf,0x3e,0xdf,0x3e,0xdf,0xbf,0xc0,0x0, 0xc0,0x81, +0xc0,0x80,0xc0,0x0, 0x10,0x10,0x10,0x1c,0x19,0x14,0x10,0xe, 0xc, 0xb, 0xa, 0x9, +0x8, 0x7, 0x6, 0xf1,0xde,0xe5,0x37,0xd3,0x94,0xb, 0x50,0x37,0xed,0x94,0xf, 0x50, +0x32,0xe5,0x37,0xc3,0x94,0xb, 0x50,0x2b,0xe5,0x37,0x90,0x6, 0xfc,0x93,0xff,0x24, +0x3, 0xab,0x33,0x20,0xe0,0xe, 0x12,0x6d,0x0, 0xfa,0xef,0xd1,0xb8,0x54,0xf0,0xd1, +0xa4,0x4d,0x80,0xc, 0xd1,0xa9,0x54,0xf, 0xd1,0xa4,0xff,0xed,0xc4,0x54,0xf0,0x4f, +0x12,0x1, 0xc5,0x22,0x12,0x1, 0xc5,0xab,0x33,0xe5,0x35,0x24,0x10,0xf9,0xe4,0x35, +0x34,0xfa,0xe5,0x37,0x90,0x6, 0xfc,0x93,0x24,0x3, 0xff,0xe4,0x33,0xa2,0xe7,0x13, +0xfe,0xef,0x13,0x29,0xf9,0xea,0x3e,0xfa,0x2, 0x1, 0x4c,0xf1,0xe5,0xe4,0xf5,0x2d, +0xe5,0x2d,0x20,0xe0,0x13,0xab,0x29,0xf1,0xbf,0xe5,0x2d,0xc3,0x13,0x7e,0x0, 0x29, +0xf9,0xee,0x3a,0xfa,0xe4,0x12,0x1, 0xc5,0xe5,0x2d,0xc3,0x94,0xb, 0x50,0x21,0x74, +0x36,0x25,0x2d,0xf5,0x82,0xe4,0x34,0xb, 0xf5,0x83,0xe0,0xff,0xe5,0x2d,0x90,0x6, +0xfc,0x93,0xf5,0x82,0x75,0x83,0x0, 0xa3,0xa3,0xa3,0xf1,0xca,0xef,0x12,0x1, 0xd7, +0x5, 0x2d,0xe5,0x2d,0xb4,0x10,0xb9,0xe4,0xf5,0x2d,0xe5,0x2d,0x20,0xe0,0x4, 0xf1, +0xd1,0x80,0x8, 0xe5,0x2d,0xf1,0xd1,0x54,0xf0,0xff,0xc4,0x54,0xf, 0xf5,0x2c,0xe5, +0x2d,0xc3,0x94,0xb, 0x50,0x2a,0xe5,0x2d,0x90,0x6, 0xfc,0x93,0xff,0x24,0x3, 0xab, +0x29,0x20,0xe0,0x9, 0xf1,0xbf,0xef,0xd1,0xb8,0x45,0x2c,0x80,0x10,0xf1,0xbf,0xe5, +0x2d,0x90,0x6, 0xfc,0xd1,0xb7,0xff,0xe5,0x2c,0xc4,0x54,0xf0,0x4f,0x12,0x1, 0xc5, +0x5, 0x2d,0xe5,0x2d,0x64,0x10,0x70,0xb2,0x90,0xa, 0xf0,0xf1,0xc9,0x90,0x0, 0x18, +0x12,0x1, 0xd7,0x90,0xb, 0x1a,0xe0,0x90,0x0, 0x19,0xf1,0xf4,0x90,0x0, 0x1a,0x12, +0x1, 0xd7,0x90,0x0, 0x1b,0xe4,0xf1,0xec,0x90,0x0, 0x1c,0x12,0x1, 0xd7,0x90,0x0, +0x1e,0x74,0x13,0x12,0x1, 0xd7,0x90,0x0, 0x20,0x74,0x3, 0x12,0x1, 0xd7,0x90,0x0, +0x21,0x74,0x3f,0x12,0x1, 0xd7,0x90,0x0, 0x22,0x74,0x3f,0x12,0x1, 0xd7,0x90,0x0, +0x1d,0x12,0x5d,0x4, 0x74,0x1, 0x12,0x1, 0xd7,0x12,0x2f,0x66,0x8f,0x2c,0x22,0xe5, +0x2b,0x24,0x10,0xf9,0xe4,0x35,0x2a,0xfa,0x22,0xe0,0xab,0x29,0xaa,0x2a,0xa9,0x2b, +0x22,0xc3,0x13,0x24,0x54,0xf5,0x82,0xe4,0x34,0xb, 0xf5,0x83,0xe0,0x22,0x8b,0x33, +0x8a,0x34,0x89,0x35,0x22,0x8b,0x29,0x8a,0x2a,0x89,0x2b,0x22,0x12,0x1, 0xd7,0x90, +0xa, 0xf2,0xe0,0x22,0x12,0x1, 0xd7,0x90,0xb, 0x46,0xe0,0x22,0x7a,0xa, 0x79,0xee, +0xf1,0xdb,0xb1,0x71,0x90,0x0, 0x52,0x12,0x1, 0x65,0xf5,0x30,0x12,0x2f,0xf3,0xf5, +0x31,0x12,0x6c,0x37,0xe4,0x12,0x1, 0xd7,0xe4,0xf5,0x2d,0xab,0x21,0xe5,0x23,0x24, +0x58,0x12,0x6a,0xbf,0xed,0xf0,0x5, 0x2d,0xe5,0x2d,0xb4,0xe, 0xee,0xe4,0xf5,0x2f, +0xf5,0x2d,0xb1,0xa6,0xe0,0xff,0xc3,0x95,0x2f,0x40,0x2, 0x8f,0x2f,0x5, 0x2d,0xe5, +0x2d,0xb4,0x12,0xee,0xe5,0x2f,0xc3,0x94,0xf, 0x50,0x9, 0xc3,0x74,0xf, 0x95,0x2f, +0xf5,0x2f,0x80,0x3, 0xe4,0xf5,0x2f,0xe4,0xf5,0x2d,0xab,0x21,0xe5,0x23,0x24,0x66, +0x12,0x6a,0xbf,0xed,0xf0,0x5, 0x2d,0xe5,0x2d,0xb4,0x8, 0xee,0x85,0x2f,0x2e,0xaf, +0x2e,0x15,0x2e,0xef,0x70,0x2, 0x21,0xd4,0x12,0x0, 0x1e,0x12,0x35,0x8c,0xf1,0xea, +0x12,0x2f,0x66,0x12,0x32,0xe4,0x85,0x27,0x4b,0x85,0x28,0x4c,0x85,0x29,0x4d,0xb1, +0x71,0x12,0x35,0xa9,0x60,0xf0,0xe4,0xf5,0x2d,0xb1,0x71,0x12,0x6c,0xf7,0x50,0x61, +0xe4,0xfd,0xb1,0x71,0xf1,0xcf,0xff,0xed,0xc3,0x9f,0x50,0x51,0xe5,0x2d,0x70,0xc, +0x12,0x6b,0xeb,0xe4,0xf0,0xed,0x51,0x22,0xe4,0xf0,0xa3,0xf0,0xb1,0x25,0x12,0x2f, +0xbe,0xe5,0x2d,0x12,0x2f,0xda,0xed,0x12,0x45,0x31,0xff,0xae,0xf0,0xd3,0x94,0xf8, +0xee,0x64,0x80,0x94,0xaa,0x50,0x23,0xc3,0xef,0x94,0x70,0xee,0x64,0x80,0x94,0x97, +0x40,0x18,0xef,0x78,0x5, 0x12,0x46,0xb5,0xd8,0xfb,0xff,0xed,0x51,0x22,0xee,0x8f, +0xf0,0x12,0x2, 0x60,0x12,0x6b,0xeb,0xe0,0x4, 0xf0,0xd, 0x80,0xa5,0x5, 0x2d,0x80, +0x98,0xe4,0xf5,0x32,0xf5,0x2d,0xb1,0x71,0xf1,0xcf,0xff,0xe5,0x2d,0xc3,0x9f,0x40, +0x2, 0x21,0xca,0x74,0x98,0x25,0x2d,0x12,0x6b,0xee,0xe0,0xfd,0x70,0x9, 0xe5,0x2d, +0x51,0x22,0x12,0x6d,0x6d,0x80,0x3a,0xe5,0x2d,0x51,0x22,0xc0,0x83,0xc0,0x82,0xe0, +0xfe,0xa3,0xe0,0xff,0x7c,0x0, 0x12,0x2, 0xb, 0xd0,0x82,0xd0,0x83,0xee,0xf0,0xa3, +0xef,0xf0,0xe5,0x2d,0x51,0x22,0xc0,0x83,0xc0,0x82,0xe0,0xfe,0xa3,0xe0,0x78,0x5, +0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xd0,0x82,0xd0,0x83,0xee,0xf0,0xa3,0xef, +0xf0,0xf1,0x25,0x90,0x0, 0x72,0xf1,0xf, 0x90,0x0, 0xe, 0x12,0x6c,0xb7,0xe5,0x2d, +0x51,0x22,0xf1,0xf7,0x9e,0x50,0x12,0xb1,0xa6,0xe0,0xc3,0x95,0x2f,0x50,0x6, 0xb1, +0xa6,0xe0,0x4, 0x80,0x2d,0x5, 0x32,0x80,0x3d,0xf1,0x25,0x90,0x0, 0x72,0xf1,0xf, +0x90,0x0, 0xe, 0x12,0x2, 0xb7,0x2f,0xff,0xe5,0xf0,0x3e,0xfe,0xe5,0x2d,0x51,0x22, +0x12,0x6d,0x45,0x9e,0x40,0x1e,0xb1,0xa6,0xe0,0xd3,0x94,0x0, 0x40,0x12,0xb1,0xa6, +0xe0,0x14,0xf1,0xe9,0xb1,0xa6,0xe0,0xfd,0x85,0x2d,0x37,0x12,0xe, 0x63,0x80,0x6, +0x5, 0x32,0x80,0x2, 0x5, 0x32,0x5, 0x2d,0x21,0x6, 0xb1,0x71,0xf1,0xcf,0x65,0x32, +0x60,0x2, 0x1, 0x6f,0xe4,0xf5,0x2d,0x12,0x6a,0xf0,0xe0,0xc4,0x54,0xf0,0xfd,0x74, +0x7c,0x2f,0xf5,0x82,0x74,0xa, 0x3e,0xf5,0x83,0xe0,0x54,0xf, 0x4d,0xff,0xab,0x21, +0xe5,0x23,0x24,0x66,0xf9,0xe4,0x35,0x22,0xfa,0xe5,0x2d,0x12,0x26,0x2a,0xef,0x12, +0x1, 0xc5,0x5, 0x2d,0xe5,0x2d,0xb4,0x8, 0xce,0xb1,0x71,0x90,0x0, 0x52,0xe5,0x30, +0x12,0x6c,0x3b,0xe5,0x31,0x12,0x1, 0xd7,0x7f,0x1, 0x22,0x12,0x4, 0xf2,0xe5,0x2f, +0x25,0xe0,0x25,0xe0,0x24,0x44,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0x22,0x12,0x6c, +0xe6,0xe4,0x90,0xa, 0x58,0xf0,0xf5,0x2a,0xb1,0x41,0x74,0xff,0xf1,0xf1,0xb1,0x53, +0x74,0xff,0xf0,0xe5,0x2a,0x51,0x22,0x74,0xff,0xf0,0xa3,0xf0,0xb1,0x9a,0xe4,0xf0, +0x5, 0x2a,0xe5,0x2a,0xb4,0x5, 0xe1,0xb1,0x25,0x90,0x0, 0x41,0x12,0x1, 0x65,0x70, +0x26,0x90,0x0, 0x42,0x12,0x1, 0x65,0x70,0x2, 0x81,0x3d,0xe4,0xf5,0x2a,0xb1,0x25, +0xf1,0x16,0xe5,0x2a,0xf1,0xb4,0xb1,0x25,0xf1,0xe2,0xe5,0x2a,0xf1,0xb4,0x5, 0x2a, +0xe5,0x2a,0xb4,0x5, 0xe9,0x81,0x3d,0xb1,0x25,0x90,0x0, 0x42,0x12,0x1, 0x65,0x70, +0x2d,0xf5,0x2a,0xb1,0x25,0xf1,0x9f,0x9f,0x40,0x2, 0x81,0x3d,0x75,0xf0,0x7, 0xe5, +0x2a,0xb1,0x93,0xf1,0xf, 0xf1,0x16,0xe5,0x2a,0xb1,0x38,0xf1,0xd5,0xff,0xe5,0x2a, +0xb1,0x2c,0x12,0x6b,0x53,0xb1,0x9a,0x74,0x1, 0xf0,0x5, 0x2a,0x80,0xd5,0xe4,0xf5, +0x2a,0xb1,0x25,0xf1,0x9f,0x9f,0x50,0x62,0xe4,0xf5,0x2b,0xb1,0x25,0xf1,0xe2,0xe5, +0x2b,0x12,0x45,0x31,0xfd,0xac,0xf0,0x12,0x1f,0x55,0xfa,0xf1,0xd5,0x12,0x6c,0xa2, +0xc0,0x6, 0xc0,0x7, 0xb1,0x25,0xf1,0x16,0xe5,0x2b,0x12,0x45,0x31,0xff,0xae,0xf0, +0x75,0xf0,0x7, 0xe5,0x2a,0xb1,0x93,0x12,0x6c,0xb7,0x12,0x0, 0x6, 0xd0,0xe0,0x2f, +0xff,0xd0,0xe0,0x3e,0xfe,0xe5,0x2a,0x51,0x22,0x12,0x6d,0x45,0x9e,0x40,0xe, 0xb1, +0x53,0xe5,0x2b,0xf0,0xe5,0x2a,0x51,0x22,0xee,0xf0,0xa3,0xef,0xf0,0x5, 0x2b,0xe5, +0x2b,0xc3,0x94,0x5, 0x40,0xa5,0x5, 0x2a,0x80,0x97,0xe4,0xf5,0x2a,0xb1,0x25,0xf1, +0x9f,0x9f,0x40,0x2, 0x61,0xc8,0x90,0xa, 0x58,0x74,0x1, 0xf0,0xe4,0xf5,0x2b,0xb1, +0x25,0x90,0x0, 0x41,0x12,0x4c,0xc7,0xc3,0x9f,0x50,0x31,0xe5,0x2a,0x65,0x2b,0x60, +0x27,0x74,0x4e,0x25,0x2b,0xb1,0x57,0xe0,0xff,0xb1,0x53,0xe0,0xb5,0x7, 0x19,0xe5, +0x2b,0x51,0x22,0xe0,0xfe,0xa3,0xe0,0xff,0xe5,0x2a,0x51,0x22,0xf1,0xf7,0x9e,0x40, +0x7, 0xe4,0x90,0xa, 0x58,0xf0,0x80,0x4, 0x5, 0x2b,0x80,0xc3,0x90,0xa, 0x58,0xe0, +0x64,0x1, 0x70,0x40,0xb1,0x53,0xe0,0x24,0x53,0xb1,0x9e,0x74,0x1, 0xf0,0xb1,0x53, +0xe0,0xfd,0xb1,0x41,0xed,0xf1,0xf1,0xb1,0x25,0x75,0xf0,0x7, 0xe5,0x2a,0xb1,0x93, +0xf1,0xf, 0xe9,0x24,0x2d,0xf9,0xe4,0x3a,0xb1,0x52,0xe0,0xb1,0x90,0xb1,0x3b,0x90, +0x0, 0x2, 0xf1,0xf, 0xe5,0x29,0x24,0x37,0xf9,0xe4,0x35,0x28,0xb1,0x52,0xe0,0xb1, +0x90,0x12,0x6b,0xd6,0x5, 0x2a,0x61,0x2d,0xe4,0xf5,0x2a,0xb1,0x25,0xf1,0x9f,0x9f, +0x50,0x4c,0x12,0x1f,0x55,0xfa,0x12,0x2c,0xe4,0xf4,0x70,0x3e,0xf5,0x2b,0x74,0x53, +0x25,0x2b,0xb1,0x9e,0xe0,0x70,0x2b,0x74,0x53,0x25,0x2b,0xb1,0x9e,0x74,0x1, 0xf0, +0xb1,0x25,0x75,0xf0,0x7, 0xe5,0x2a,0xb1,0x93,0xf1,0xf, 0xf1,0x16,0xe5,0x2b,0xb1, +0x38,0xf1,0xd5,0xff,0xe5,0x2b,0xb1,0x2c,0x90,0x0, 0x4, 0xe5,0x2b,0x12,0x1, 0xd7, +0x80,0x8, 0x5, 0x2b,0xe5,0x2b,0x64,0x5, 0x70,0xc4,0x5, 0x2a,0x80,0xad,0xe4,0xf5, +0x2a,0xb1,0x9a,0xe0,0x70,0x10,0xb1,0x25,0xf1,0x16,0xe5,0x2a,0xf1,0xb4,0xb1,0x25, +0xf1,0xe2,0xe5,0x2a,0xf1,0xb4,0x5, 0x2a,0xe5,0x2a,0xb4,0x5, 0xe4,0xb1,0x25,0x90, +0x0, 0x41,0x12,0x1, 0x65,0xf5,0x2b,0xe4,0xf5,0x2a,0xb1,0x9a,0xe0,0x64,0x1, 0x70, +0x33,0xab,0x27,0xe5,0x29,0x24,0x28,0xf1,0x90,0x12,0x1, 0x4c,0xb4,0x1, 0x5, 0x74, +0x3, 0x12,0x1, 0xc5,0x12,0x1, 0x4c,0xff,0xb4,0x3, 0x10,0xab,0x27,0x12,0x2d,0x2a, +0x35,0x28,0xfa,0xe5,0x2a,0x12,0x26,0x2a,0xe4,0x80,0x33,0xef,0x70,0x33,0xf1,0x8a, +0x74,0x2, 0x80,0x2a,0xab,0x27,0xe5,0x29,0x24,0x28,0xf1,0x90,0x12,0x1, 0x4c,0xff, +0x64,0x2, 0x60,0x3, 0xef,0x70,0x13,0xf1,0x8a,0x74,0x1, 0x12,0x1, 0xc5,0xaf,0x2b, +0x5, 0x2b,0xef,0xb1,0x43,0x12,0x6b,0x53,0x80,0x7, 0xf1,0x8a,0x74,0x3, 0x12,0x1, +0xc5,0xab,0x27,0x12,0x2d,0x2a,0x35,0x28,0xfa,0xaf,0x2a,0x7e,0x0, 0x12,0x1f,0x86, +0x12,0x1, 0x4c,0x12,0x6d,0x36,0x35,0x28,0x12,0x1f,0x85,0xed,0x12,0x1, 0xc5,0x5, +0x2a,0xe5,0x2a,0x64,0x5, 0x60,0x2, 0x81,0x4a,0x22,0xe5,0x2f,0x75,0xf0,0x2, 0xa4, +0x29,0xf9,0xea,0x35,0xf0,0xfa,0x90,0x0, 0x1, 0x12,0x1, 0x65,0xc3,0x13,0xfd,0x7c, +0x0, 0xaa,0x2b,0xa9,0x2c,0x75,0xf0,0x2, 0xe5,0x2f,0xa4,0xf5,0x82,0x85,0xf0,0x83, +0x12,0x1, 0x65,0xc3,0x13,0x75,0xf0,0x10,0xa4,0x2d,0xff,0xec,0x35,0xf0,0xfe,0xef, +0x25,0xe0,0xff,0xee,0x33,0xfe,0xe5,0x40,0x2f,0xf5,0x82,0xe5,0x3f,0x3e,0xf5,0x83, +0xe0,0xfe,0xa3,0xe0,0xff,0xab,0x27,0xaa,0x28,0xa9,0x29,0x22,0xae,0xf0,0xaa,0x28, +0xa9,0x29,0x90,0x0, 0x37,0x75,0xf0,0x2, 0x12,0x5, 0x40,0xee,0x8f,0xf0,0x12,0x3, +0x5b,0xe5,0x2a,0x75,0xf0,0x7, 0xa4,0xab,0x27,0x25,0x29,0xf9,0xe5,0x28,0x35,0xf0, +0xfa,0x22,0xfa,0x74,0x4e,0x25,0x2a,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0x22,0x85, +0x27,0x33,0x85,0x28,0x34,0x85,0x29,0x35,0x85,0x2a,0x36,0x85,0x2b,0x37,0x85,0x2c, +0x38,0xab,0x24,0xaa,0x25,0xa9,0x26,0x22,0xe5,0x2a,0x75,0xf0,0x7, 0xa4,0xff,0xae, +0xf0,0xab,0x21,0x25,0x23,0xf9,0xe5,0x22,0x3e,0xfa,0x90,0x0, 0x7, 0x12,0x1, 0x65, +0x75,0xf0,0x2, 0xa4,0xf5,0x82,0x85,0xf0,0x83,0x22,0x74,0x53,0x25,0x2a,0xf5,0x82, +0xe4,0x34,0xa, 0xf5,0x83,0x22,0x74,0x7c,0x25,0x2d,0xf5,0x82,0xe4,0x34,0xa, 0xf5, +0x83,0x22,0xf1,0xdb,0x85,0xc9,0x30,0xb1,0x71,0x12,0x1, 0x4c,0xff,0x70,0x36,0xf1, +0x25,0x12,0x6d,0x5d,0x94,0x0, 0x40,0x7, 0xb1,0x71,0x12,0x5c,0xfd,0xc1,0xaa,0xb1, +0x71,0xf1,0xcf,0x20,0xe0,0x2, 0xc1,0xaa,0x12,0x4f,0x40,0xfe,0x90,0x0, 0x7, 0x74, +0x1, 0x12,0x1, 0x92,0x6e,0x60,0x2, 0xc1,0xaa,0xb1,0x71,0x12,0x1f,0xf0,0x74,0x1, +0x12,0x6c,0x43,0xc1,0xaa,0xef,0xb4,0x1, 0x16,0xf1,0x25,0x90,0x0, 0x4b,0x12,0x1, +0x65,0x70,0x2, 0xc1,0xaa,0xb1,0x71,0x12,0x6c,0x42,0x75,0x10,0x21,0xc1,0xaa,0xb1, +0x71,0x12,0x1, 0x4c,0x64,0x3, 0x60,0x2, 0xc1,0xaa,0xff,0x12,0x5f,0x17,0x12,0x35, +0xf, 0x12,0x0, 0x1e,0xe5,0xdb,0x30,0xe1,0xfb,0xe4,0xf5,0x99,0xd2,0x98,0x75,0xf7, +0xfe,0xc2,0x89,0xd2,0xa8,0x20,0x96,0xfd,0x43,0x87,0x2, 0xc2,0xaf,0xe4,0xf5,0x32, +0x30,0x89,0x7, 0xc2,0x89,0xe4,0xf5,0x32,0x80,0x2, 0x5, 0x32,0xe5,0x32,0xd3,0x94, +0xfa,0x50,0x8, 0x12,0x35,0xf, 0x12,0x0, 0x1e,0x80,0xe5,0x75,0xf7,0xff,0x75,0x99, +0x1, 0xd2,0x98,0xd2,0xaf,0xc2,0xa8,0x12,0x35,0xf, 0x12,0x0, 0x1e,0x53,0xdb,0xf0, +0x12,0x32,0xe4,0x85,0x21,0x36,0x85,0x22,0x37,0x85,0x23,0x38,0xab,0x2d,0xaa,0x2e, +0xa9,0x2f,0x12,0x4e,0x74,0xb1,0x71,0x12,0x6c,0x42,0xae,0x2b,0xaf,0x2c,0x12,0x57, +0xec,0xf1,0xea,0x12,0x37,0xf1,0x90,0xc, 0x28,0x74,0xa, 0xf0,0x90,0xc, 0x28,0xe0, +0x70,0xfa,0x12,0x61,0x12,0xb1,0x25,0x12,0x2d,0xb4,0xe4,0xf5,0x31,0xe5,0xf, 0x70, +0x22,0xff,0x12,0x5f,0x4, 0xe5,0xdb,0x30,0xe1,0xf3,0xc2,0xcd,0xb1,0x71,0x12,0x1, +0x4c,0xb4,0x1, 0xe9,0xe5,0x31,0x70,0xe5,0x75,0x31,0x1, 0x53,0xc9,0xfc,0x43,0xc9, +0x1, 0x80,0xda,0xe4,0xf5,0x10,0xf5,0xf, 0x85,0x30,0xc9,0xd2,0xcd,0x12,0x4f,0x71, +0xfa,0x12,0x1, 0x4c,0x54,0xef,0x12,0x1, 0xc5,0xf1,0x25,0x90,0x0, 0x4b,0x12,0x1, +0x65,0x90,0x0, 0x4c,0x12,0x1, 0xd7,0xe5,0xe8,0x54,0xc0,0x64,0xc0,0x60,0x3, 0x12, +0x3d,0x59,0x22,0xe5,0x92,0x60,0x4, 0xd2,0xae,0xd2,0xbe,0x22,0x90,0x0, 0xa, 0x12, +0x2, 0xb7,0xff,0xae,0xf0,0x22,0x90,0x0, 0x2d,0x75,0xf0,0x2, 0x22,0xf5,0x82,0x74, +0x3, 0x35,0xf0,0xf5,0x83,0xab,0x21,0xaa,0x22,0xa9,0x23,0x22,0xf1,0xdb,0xb1,0x71, +0x12,0x40,0xe8,0xf1,0x25,0x90,0x0, 0x41,0x12,0x1, 0xd7,0xab,0x24,0x12,0x6d,0x1b, +0xfa,0xa8,0x23,0xac,0x22,0xad,0x21,0x12,0x6c,0x83,0xf1,0x25,0x51,0x2e,0xf1,0x25, +0x90,0x0, 0x43,0x12,0x5, 0x6c,0x8b,0x2a,0x8a,0x2b,0x89,0x2c,0xf1,0x25,0x12,0x2a, +0xf1,0x12,0x6d,0x1b,0xa8,0x1, 0xfc,0xad,0x24,0xf1,0x25,0x12,0x6c,0x83,0xf1,0x25, +0x90,0x0, 0x41,0x12,0x1, 0x65,0x90,0x0, 0x42,0x12,0x1, 0xd7,0x90,0x0, 0x41,0x12, +0x1, 0x65,0xb1,0x71,0x90,0x0, 0x2d,0x2, 0x1, 0xd7,0xab,0x27,0xe5,0x29,0x24,0x23, +0xf9,0xe4,0x35,0x28,0xfa,0x7e,0x0, 0xe9,0x25,0x2a,0xf9,0xee,0x3a,0xfa,0x22,0x90, +0x0, 0x41,0x12,0x1, 0x65,0xff,0xe5,0x2a,0xc3,0x22,0xab,0x33,0xaa,0x34,0xa9,0x35, +0x75,0xf0,0x2, 0xef,0x12,0x5, 0x40,0x74,0x7f,0x75,0xf0,0xff,0x2, 0x3, 0x5b,0xe5, +0x2f,0x75,0xf0,0x2, 0xa4,0xab,0x2a,0x25,0x2c,0xf9,0xe5,0x2b,0x35,0xf0,0xfa,0x90, +0x0, 0x1, 0x2, 0x1, 0x65,0x90,0x0, 0x2, 0x2, 0x2, 0xb7,0x8b,0x21,0x8a,0x22,0x89, +0x23,0x22,0x90,0x0, 0x37,0x75,0xf0,0x2, 0x22,0xf0,0xab,0x2a,0xaa,0x2b,0xa9,0x2c, +0x22,0x90,0x0, 0x4, 0x2, 0x1, 0xd7,0xe0,0xfc,0xa3,0xe0,0xc3,0x9f,0xec,0x22,0x12, +0x20,0x28,0x40,0x5, 0x12,0x20,0x30,0x80,0x3, 0xe4,0xfe,0xff,0x7d,0xb1,0x12,0x20, +0x47,0x8c,0x31,0xe4,0x7f,0xe0,0x7e,0x1, 0x12,0x20,0x39,0x40,0xb, 0xe4,0x75,0x34, +0xdf,0x75,0x33,0x1, 0xf5,0x32,0xf5,0x31,0xae,0x33,0xaf,0x34,0x22,0x12,0x17,0xdb, +0x12,0x15,0x25,0x90,0x0, 0x4b,0x12,0x1, 0x65,0xf5,0x2f,0x12,0x27,0x25,0xf5,0x30, +0xe4,0xf5,0x2c,0xd1,0xeb,0xf1,0xe6,0x74,0xff,0xf0,0xd1,0xeb,0x12,0x12,0x24,0x12, +0x6c,0x7b,0xd1,0xeb,0x12,0x6c,0xc2,0x12,0x6c,0x7b,0x5, 0x2c,0xe5,0x2c,0xb4,0x5, +0xe2,0xe5,0x2f,0x70,0x32,0xe5,0x30,0xd3,0x94,0x0, 0x50,0x2, 0x81,0x0, 0xe4,0xf5, +0x2d,0xe5,0x2d,0x12,0x15,0x43,0x90,0x0, 0x2a,0x74,0xff,0x12,0x1, 0xd7,0x5, 0x2d, +0xe5,0x2d,0xb4,0x5, 0xec,0x12,0x6b,0x45,0x44,0x4, 0x12,0x1, 0xc5,0x54,0xf7,0x12, +0x1, 0xc5,0x54,0xdf,0x2, 0x1, 0xc5,0xe4,0xf5,0x2d,0xe5,0x2d,0xc3,0x95,0x2f,0x50, +0x33,0xe5,0x2d,0x75,0xf0,0x7, 0xa4,0xfd,0xac,0xf0,0xf1,0xf6,0x3c,0xfa,0xe9,0x24, +0xa, 0x12,0x6d,0x3e,0x12,0x4f,0x87,0x12,0x6c,0x4b,0xab,0x21,0xe5,0x23,0x2d,0xf9, +0xe5,0x22,0x3c,0xfa,0xe9,0x24,0xc, 0x12,0x6d,0x3e,0x12,0x4f,0x87,0x12,0x6c,0x4b, +0x5, 0x2d,0x80,0xc6,0xe5,0x30,0x70,0x24,0x12,0x6b,0x45,0x44,0x10,0x12,0x1, 0xc5, +0xe4,0xf5,0x2d,0x74,0x3d,0x25,0x2d,0x12,0x48,0xa3,0xe4,0xf0,0x74,0x7b,0x25,0x2d, +0x12,0x48,0x8d,0xe4,0xf0,0x5, 0x2d,0xe5,0x2d,0xb4,0x5, 0xe7,0xe4,0xf5,0x2c,0xf5, +0x2d,0xe4,0xf5,0x2e,0x91,0x17,0xf1,0x61,0xfd,0xe5,0x2d,0x12,0x15,0x43,0xf1,0xc1, +0xff,0x6d,0x70,0x5c,0xef,0xf4,0x60,0x58,0xe5,0x2d,0x75,0xf0,0x7, 0xa4,0x12,0x15, +0x49,0x90,0x0, 0x2a,0xd1,0xe7,0xf1,0xe6,0xef,0xf0,0x90,0x0, 0x26,0x12,0x17,0xf, +0xd1,0xeb,0x12,0x12,0x24,0xee,0xf0,0xa3,0xef,0xf0,0x90,0x0, 0x28,0x12,0x17,0xf, +0xd1,0xeb,0x12,0x6c,0xc2,0xee,0xf0,0xa3,0xef,0xf0,0x91,0x17,0x90,0x0, 0xf, 0xd1, +0xe7,0x24,0x49,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0xef,0xf0,0x90,0x0, 0x10,0xd1, +0xe7,0x24,0x4a,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0xef,0xf0,0x5, 0x2c,0x80,0x4, +0xf1,0xce,0x70,0x90,0x5, 0x2d,0xe5,0x2d,0x64,0x5, 0x70,0x85,0xe4,0xf5,0x2e,0xe4, +0xf5,0x2d,0xe5,0x2d,0xc3,0x95,0x2c,0x50,0x15,0x91,0x17,0xf1,0x61,0xff,0xe5,0x2d, +0x75,0xf0,0x7, 0xa4,0xf1,0xe6,0xe0,0x6f,0x60,0x4, 0x5, 0x2d,0x80,0xe4,0xe5,0x2d, +0x65,0x2c,0x70,0x1e,0x12,0x6c,0x96,0xe5,0x2e,0xf1,0x57,0xfa,0xc0,0x1, 0xd1,0xeb, +0x24,0x44,0xf9,0x74,0xa, 0x35,0xf0,0xa8,0x1, 0xfc,0x7d,0x1, 0xd0,0x1, 0xf1,0xc7, +0x5, 0x2c,0xf1,0xce,0x70,0xb9,0x12,0x6d,0x2d,0x7f,0x23,0x12,0x6b,0x26,0xe5,0x30, +0x70,0x18,0x12,0x6c,0x96,0xc0,0x2, 0xc0,0x1, 0x12,0x6d,0x2d,0xa8,0x1, 0xfc,0xad, +0x27,0xd0,0x1, 0xd0,0x2, 0x12,0x6c,0x83,0x61,0x5f,0x12,0x15,0x25,0x12,0x4d,0xfe, +0x13,0x13,0x13,0x54,0x1f,0x30,0xe0,0x2, 0x61,0x5f,0xe4,0xf5,0x2e,0xe5,0x2e,0xc3, +0x95,0x2f,0x40,0x2, 0x61,0x5f,0xe4,0xf5,0x2d,0x91,0x17,0xf1,0x61,0xfd,0xe5,0x2d, +0x12,0x15,0x43,0xf1,0xc1,0x6d,0x60,0x7, 0x5, 0x2d,0xe5,0x2d,0xb4,0x5, 0xea,0x91, +0x17,0x90,0x0, 0xc, 0x12,0x17,0xf, 0xc0,0x6, 0xc0,0x7, 0xe5,0x2d,0x12,0x15,0x43, +0xf1,0xb5,0xfd,0xac,0xf0,0xd0,0x7, 0xd0,0x6, 0xf1,0x67,0xc0,0x6, 0xc0,0x7, 0x91, +0x17,0x12,0x17,0xc, 0xc0,0x6, 0xc0,0x7, 0xe5,0x2d,0x12,0x15,0x43,0xf1,0xbb,0xfd, +0xac,0xf0,0xd0,0x7, 0xd0,0x6, 0xf1,0x67,0xd0,0xe0,0x2f,0xf5,0x2b,0xd0,0xe0,0x3e, +0xf5,0x2a,0x12,0x15,0x71,0x12,0x6d,0x85,0xac,0xf0,0xae,0x4, 0x78,0x3, 0xce,0xc3, +0x13,0xce,0x13,0xd8,0xf9,0xf1,0xdd,0x50,0x5, 0x75,0x2c,0x4, 0x80,0x3a,0xed,0xae, +0x4, 0x78,0x2, 0xce,0xc3,0x13,0xce,0x13,0xd8,0xf9,0xf1,0xdd,0x50,0x5, 0x75,0x2c, +0x3, 0x80,0x25,0x12,0x6d,0x85,0xac,0xf0,0xec,0xc3,0x13,0xfe,0xed,0x13,0xf1,0xdd, +0x50,0x5, 0x75,0x2c,0x2, 0x80,0x11,0xc3,0xe5,0x2b,0x9d,0xe5,0x2a,0x9c,0x50,0x5, +0x75,0x2c,0x1, 0x80,0x3, 0xe4,0xf5,0x2c,0x91,0x17,0x12,0x17,0xc, 0xc0,0x6, 0xc0, +0x7, 0xe5,0x2d,0x12,0x15,0x43,0xf1,0xbb,0xfd,0xac,0xf0,0xd0,0x7, 0xd0,0x6, 0x12, +0x6c,0x6e,0x80,0x5, 0xce,0xc3,0x13,0xce,0x13,0xd8,0xf9,0xf5,0x2b,0x8e,0x2a,0x90, +0x0, 0x26,0x91,0x1, 0x90,0x0, 0xa, 0x12,0x6c,0x1b,0x40,0x10,0x12,0x15,0x46,0x90, +0x0, 0x26,0xe5,0x2a,0x85,0x2b,0xf0,0x12,0x2, 0xef,0x80,0xc, 0x12,0x15,0x46,0xe9, +0x24,0x26,0x12,0x6b,0x8d,0x12,0x3, 0x3c,0x91,0x17,0x90,0x0, 0xc, 0x12,0x17,0xf, +0xc0,0x6, 0xc0,0x7, 0xe5,0x2d,0x12,0x15,0x43,0xf1,0xb5,0xfd,0xac,0xf0,0xd0,0x7, +0xd0,0x6, 0x12,0x6c,0x6e,0x80,0x5, 0xce,0xc3,0x13,0xce,0x13,0xd8,0xf9,0xf5,0x2b, +0x8e,0x2a,0x90,0x0, 0x28,0x91,0x1, 0x90,0x0, 0xc, 0x12,0x6c,0x1b,0x40,0x10,0x12, +0x15,0x46,0x90,0x0, 0x28,0xe5,0x2a,0x85,0x2b,0xf0,0x12,0x2, 0xef,0x80,0xc, 0x12, +0x15,0x46,0xe9,0x24,0x28,0x12,0x6b,0x8d,0x12,0x3, 0x3c,0x5, 0x2e,0x21,0xfd,0xe4, +0xf5,0x2e,0xe5,0x2e,0x12,0x15,0x43,0xf1,0xbb,0x90,0x0, 0xa, 0xf1,0x8d,0xf1,0x2e, +0xf1,0xb5,0x90,0x0, 0xc, 0xf1,0x8d,0xf1,0x2e,0xf1,0xc1,0xfd,0xf1,0xe, 0x90,0x0, +0xe, 0xed,0x12,0x1, 0xd7,0xf1,0x2e,0x90,0x0, 0x2b,0x12,0x1, 0x65,0xfd,0xf1,0xe, +0x90,0x0, 0xf, 0xed,0x12,0x1, 0xd7,0xf1,0x2e,0x90,0x0, 0x2c,0x12,0x1, 0x65,0xfd, +0xf1,0xe, 0x12,0x57,0xdd,0xf1,0xce,0x70,0xb9,0x12,0x6b,0x45,0x44,0x1, 0x12,0x1, +0xc5,0xe5,0x2f,0xd3,0x94,0x0, 0x40,0x48,0xe4,0xf5,0x2e,0x91,0x17,0x12,0x17,0xc, +0x12,0x17,0xff,0x90,0x0, 0x3, 0xd1,0xf2,0x90,0x0, 0xc, 0x12,0x17,0xf, 0xf1,0xfe, +0x90,0x0, 0x5, 0xd1,0xf2,0xf1,0x61,0xfd,0xf1,0x2e,0xed,0xf1,0xf0,0xf1,0xe, 0x90, +0x0, 0xf, 0x12,0x1, 0x65,0xfd,0xf1,0x2e,0xed,0x12,0x5c,0xf0,0xf1,0xe, 0x12,0x57, +0x16,0xfd,0xf1,0x2e,0x90,0x0, 0x9, 0xed,0x12,0x1, 0xd7,0x12,0x6d,0x65,0x40,0xbb, +0x22,0xe5,0x2d,0x75,0xf0,0x7, 0xa4,0xab,0x27,0x25,0x29,0xf9,0xe5,0x28,0x35,0xf0, +0xfa,0x12,0x2, 0xb7,0xfd,0xac,0xf0,0xe5,0x2e,0x75,0xf0,0x7, 0xa4,0xab,0x21,0x25, +0x23,0xf9,0xe5,0x22,0x35,0xf0,0xfa,0x22,0x12,0x17,0xdb,0x12,0x15,0x25,0x12,0x1, +0x4c,0x64,0x5, 0x70,0x2, 0xc1,0xe6,0xe4,0xf5,0x2a,0x74,0x2d,0x25,0x2a,0xf8,0xe4, +0xf6,0x74,0x32,0x25,0x2a,0xf8,0xe4,0xf6,0x5, 0x2a,0xe5,0x2a,0xb4,0x5, 0xeb,0xe4, +0xf5,0x2b,0x12,0x15,0x25,0x12,0x4e,0x10,0xc3,0x9f,0x50,0x18,0xe5,0x2b,0x91,0x19, +0xf1,0x1a,0x12,0x15,0x24,0xf1,0xd5,0x50,0x7, 0x74,0x32,0x25,0x2b,0xf8,0x76,0x1, +0x5, 0x2b,0x80,0xde,0xe4,0xf5,0x2a,0xe5,0x2a,0x91,0x19,0xf1,0x1a,0x12,0x15,0x24, +0xf1,0xd5,0x50,0x6, 0x74,0x2d,0x2f,0xf8,0x76,0x1, 0x5, 0x2a,0xe5,0x2a,0xb4,0x5, +0xe6,0xe4,0xf5,0x2a,0x12,0x15,0x25,0x12,0x6d,0x12,0x40,0x2, 0xc1,0xb0,0x74,0x32, +0x25,0x2a,0xf8,0xe6,0x60,0x2, 0xc1,0xac,0xe5,0x2a,0x91,0x19,0xf1,0x1a,0xf4,0x70, +0x2, 0xc1,0xac,0x12,0x15,0x25,0x12,0x1, 0x4c,0xf5,0x2b,0xe5,0x2b,0xc3,0x94,0x5, +0x40,0x2, 0xa1,0xd8,0xe5,0x2b,0x91,0x19,0xf1,0x1a,0x12,0x15,0x24,0xf1,0xd5,0x40, +0x2, 0xa1,0xd4,0xf1,0x79,0x12,0x1, 0x4c,0x64,0x1, 0x60,0x2, 0xa1,0xa3,0xf1,0x3b, +0xfa,0xc0,0x3, 0xc0,0x2, 0xc0,0x1, 0xe5,0x2a,0x91,0x19,0x12,0x15,0x8a,0xd0,0x1, +0xd0,0x2, 0xd0,0x3, 0x12,0x2, 0xb7,0xfd,0xac,0xf0,0xf1,0x39,0xfa,0xc0,0x3, 0xc0, +0x2, 0xc0,0x1, 0xe5,0x2b,0x91,0x19,0x12,0x15,0x8a,0xd0,0x1, 0xd0,0x2, 0xd0,0x3, +0xf1,0xaf,0xf1,0x44,0xc0,0x3, 0xc0,0x2, 0xc0,0x1, 0xe5,0x2a,0x91,0x19,0x12,0x15, +0x8a,0xd0,0x1, 0xd0,0x2, 0xd0,0x3, 0x12,0x2, 0xb7,0xfd,0xac,0xf0,0xf1,0x44,0xc0, +0x3, 0xc0,0x2, 0xc0,0x1, 0xe5,0x2b,0x91,0x19,0x12,0x15,0x8a,0xd0,0x1, 0xd0,0x2, +0xd0,0x3, 0xf1,0xaf,0xf1,0x39,0xfa,0xc0,0x3, 0xc0,0x2, 0xc0,0x1, 0x12,0x15,0x78, +0xd0,0x1, 0xd0,0x2, 0xd0,0x3, 0x12,0x17,0xb7,0xf1,0x44,0xc0,0x3, 0xc0,0x2, 0xc0, +0x1, 0xab,0x21,0xe5,0x23,0x2f,0x12,0x15,0x85,0xd0,0x1, 0xd0,0x2, 0xd0,0x3, 0x12, +0x17,0xb7,0xab,0x21,0xe5,0x23,0x24,0x26,0xf1,0x50,0xfa,0xc0,0x3, 0xc0,0x2, 0xc0, +0x1, 0xe5,0x23,0x24,0x26,0x12,0x6d,0x7d,0xf1,0x57,0xa8,0x1, 0xfc,0xad,0x3, 0xd0, +0x1, 0xd0,0x2, 0xd0,0x3, 0xf1,0xc7,0xe5,0x2b,0x91,0x19,0xf1,0x1a,0x90,0x0, 0x2a, +0x12,0x1, 0xd7,0xab,0x21,0xe5,0x23,0x24,0x3, 0x12,0x6d,0x7d,0xf1,0x57,0xfa,0xc0, +0x3, 0xc0,0x2, 0xc0,0x1, 0xe5,0x23,0x24,0x3, 0xf1,0x50,0xa8,0x1, 0xfc,0xad,0x3, +0xd0,0x1, 0xd0,0x2, 0xd0,0x3, 0xf1,0xc7,0xe5,0x2b,0x91,0x19,0x12,0x6b,0x85,0x12, +0x6d,0x75,0x80,0x4, 0x5, 0x2b,0x81,0xbb,0xe5,0x2b,0x64,0x5, 0x60,0x2, 0xc1,0xac, +0xf5,0x2c,0x12,0x15,0x25,0x12,0x6d,0x24,0x40,0x2, 0xc1,0xac,0x74,0x2d,0x25,0x2c, +0xf8,0xe6,0x60,0x2, 0xc1,0xa8,0xe5,0x2a,0x91,0x19,0xf1,0x1a,0xff,0xf1,0x79,0x12, +0x1, 0x4c,0x64,0x1, 0x70,0x2, 0xc1,0xa8,0x74,0x2d,0x25,0x2c,0xf8,0x76,0x1, 0x12, +0x6d,0x75,0xf1,0x39,0xfa,0xc0,0x3, 0xc0,0x2, 0xc0,0x1, 0xe5,0x2a,0x91,0x19,0x12, +0x15,0x8a,0xd0,0x1, 0xd0,0x2, 0xd0,0x3, 0x12,0x17,0xf, 0x12,0x15,0x71,0x12,0x17, +0x16,0x12,0x6b,0xd1,0xf1,0x44,0xc0,0x3, 0xc0,0x2, 0xc0,0x1, 0xe5,0x2a,0x91,0x19, +0x12,0x15,0x8a,0xd0,0x1, 0xd0,0x2, 0xd0,0x3, 0x12,0x17,0xf, 0x12,0x15,0x71,0x12, +0x17,0xe2,0x12,0x6b,0xd1,0xf1,0x39,0xfa,0xc0,0x3, 0xc0,0x2, 0xc0,0x1, 0x12,0x15, +0x78,0xd0,0x1, 0xd0,0x2, 0xd0,0x3, 0x12,0x17,0xb7,0xf1,0x44,0xc0,0x3, 0xc0,0x2, +0xc0,0x1, 0xab,0x21,0xe5,0x23,0x2f,0x12,0x15,0x85,0xd0,0x1, 0xd0,0x2, 0xd0,0x3, +0x12,0x17,0xb7,0xe5,0x2a,0x91,0x19,0xe5,0x2c,0xf1,0xf0,0xab,0x24,0xe5,0x26,0x24, +0x28,0xf9,0xe4,0x35,0x25,0xfa,0xaf,0x2c,0x7e,0x0, 0xf1,0x86,0xe4,0x12,0x1, 0xc5, +0xf1,0x7b,0xe4,0x12,0x1, 0xc5,0x80,0x4, 0x5, 0x2c,0xa1,0xe2,0x5, 0x2a,0x81,0x94, +0xe4,0xf5,0x2a,0xe5,0x2a,0x75,0xf0,0x7, 0xa4,0xff,0xae,0xf0,0xf1,0xf6,0x3e,0xf1, +0x19,0xfd,0x12,0x15,0x25,0x12,0x1, 0x4c,0xfc,0xed,0xc3,0x9c,0x40,0x11,0xf1,0xe, +0x90,0x0, 0x3, 0x12,0x17,0xb7,0x90,0x0, 0x5, 0x12,0x17,0xb7,0x12,0x6b,0x85,0x5, +0x2a,0xe5,0x2a,0xb4,0x5, 0xcd,0x22,0x12,0x1, 0x65,0xff,0xe5,0x2c,0x75,0xf0,0x7, +0xa4,0x22,0xac,0x6, 0xad,0x7, 0xe5,0x2e,0x75,0xf0,0x7, 0xa4,0xff,0xae,0xf0,0xab, +0x27,0x25,0x29,0xf9,0xe5,0x28,0x3e,0xfa,0xec,0x8d,0xf0,0x12,0x3, 0x5b,0xab,0x21, +0xe5,0x23,0x2f,0xf9,0xe5,0x22,0x3e,0xfa,0x22,0xfa,0x90,0x0, 0x7, 0x2, 0x1, 0x65, +0xaf,0x2d,0xef,0x33,0x95,0xe0,0xfe,0x7c,0x0, 0x7d,0x7, 0x12,0x1, 0xf9,0xab,0x27, +0xe5,0x29,0x2f,0xf9,0xe5,0x28,0x3e,0xfa,0x22,0xab,0x24,0xe5,0x26,0x24,0x2d,0xf9, +0xe4,0x35,0x25,0x22,0xab,0x24,0xe5,0x26,0x24,0x37,0xf9,0xe4,0x35,0x25,0xfa,0x22, +0xf9,0xe4,0x35,0x22,0xfa,0xe5,0x2a,0x75,0xf0,0x7, 0xa4,0x29,0xf9,0xea,0x35,0xf0, +0x22,0x90,0x0, 0xe, 0x2, 0x1, 0x65,0xd3,0xef,0x9d,0xee,0x9c,0x40,0x3, 0x2, 0x2d, +0x19,0xc3,0xed,0x9f,0xff,0xec,0x9e,0xfe,0x22,0x7e,0x0, 0xab,0x24,0xe5,0x26,0x24, +0x23,0xf9,0xe4,0x35,0x25,0xfa,0xe9,0x2f,0xf9,0xee,0x3a,0xfa,0x22,0xff,0xe5,0xf0, +0xc4,0xf8,0x54,0xf0,0xc8,0x68,0xfc,0xef,0xc4,0x54,0xf, 0x48,0xfd,0xe5,0x2e,0x75, +0xf0,0x7, 0xa4,0xff,0xae,0xf0,0xab,0x21,0x25,0x23,0xf9,0xe5,0x22,0x3e,0xfa,0xec, +0x8d,0xf0,0x2, 0x3, 0x5b,0x90,0x0, 0x28,0x2, 0x2, 0xb7,0x90,0x0, 0x26,0x2, 0x2, +0xb7,0x90,0x0, 0x2a,0x2, 0x1, 0x65,0x7e,0x0, 0x7f,0x7, 0x2, 0x1, 0x26,0x5, 0x2e, +0xe5,0x2e,0x64,0x5, 0x22,0x12,0x1, 0x4c,0xfe,0xef,0xc3,0x9e,0x22,0xff,0xc3,0xe5, +0x2b,0x9f,0xe5,0x2a,0x9e,0x22,0x24,0x48,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0x22, +0x90,0x0, 0x7, 0x2, 0x1, 0xd7,0xab,0x21,0x25,0x23,0xf9,0xe5,0x22,0x22,0x11,0x28, +0x40,0x4, 0x11,0x30,0x80,0x3, 0xe4,0xfe,0xff,0x7d,0xb3,0x11,0x47,0x8c,0x31,0xe4, +0x7f,0x20,0x7e,0x3, 0x11,0x39,0x40,0xb, 0xe4,0x75,0x34,0x1f,0x75,0x33,0x3, 0xf5, +0x32,0xf5,0x31,0xae,0x33,0xaf,0x34,0x22,0xc3,0xef,0x94,0x5, 0xee,0x94,0x0, 0x22, +0x74,0xfb,0x2f,0xff,0x74,0xff,0x3e,0xfe,0x22,0xfd,0xfc,0xab,0x34,0xaa,0x33,0xa9, +0x32,0xa8,0x31,0xc3,0x2, 0x4, 0xbb,0x7c,0x0, 0x12,0x5, 0x9c,0x8f,0x34,0x8e,0x33, +0x8d,0x32,0x8c,0x31,0x78,0x8, 0x12,0x4, 0xcc,0x8f,0x34,0x8e,0x33,0x8d,0x32,0x22, +0x8e,0x25,0x8f,0x26,0x12,0x6c,0xe6,0xc3,0xe5,0x25,0x94,0x0, 0x50,0x5, 0xe4,0xf5, +0x25,0xf5,0x26,0xc3,0xec,0x94,0x0, 0x50,0x3, 0xe4,0xfc,0xfd,0xd3,0xe5,0x26,0x94, +0x3f,0xe5,0x25,0x94,0x0, 0x50,0x12,0xe5,0x26,0x25,0xe0,0xff,0xe5,0x25,0x31,0x39, +0x50,0x39,0xe4,0xf5,0x2a,0xf5,0x2b,0x80,0x32,0xc3,0xe5,0x26,0x94,0x80,0xe5,0x25, +0x94,0x2, 0x40,0x2d,0xe5,0x26,0x24,0x80,0xff,0xe5,0x25,0x34,0xfd,0xfe,0xe5,0x26, +0x2f,0xf5,0x2b,0xe5,0x25,0x3e,0xf5,0x2a,0xd3,0xe5,0x2b,0x94,0xbd,0xe5,0x2a,0x64, +0x80,0x94,0x82,0x40,0x6, 0x75,0x2a,0x2, 0x75,0x2b,0xbf,0x85,0x2a,0x25,0x85,0x2b, +0x26,0xd3,0xed,0x94,0x3f,0xec,0x94,0x0, 0x50,0x10,0xed,0x25,0xe0,0xff,0xec,0x31, +0x39,0x50,0x32,0xe4,0xf5,0x2a,0xf5,0x2b,0x80,0x2b,0xc3,0xed,0x94,0x40,0xec,0x94, +0x4, 0x40,0x26,0xed,0x24,0xc0,0xff,0xec,0x34,0xfb,0xcf,0x2d,0xf5,0x2b,0xef,0x3c, +0xf5,0x2a,0xd3,0xe5,0x2b,0x94,0x7d,0xe5,0x2a,0x64,0x80,0x94,0x84,0x40,0x6, 0x75, +0x2a,0x4, 0x75,0x2b,0x7f,0xac,0x2a,0xad,0x2b,0x12,0x15,0x25,0xe5,0x25,0x85,0x26, +0xf0,0x12,0x3, 0x3c,0xab,0x27,0x74,0x2, 0x25,0x29,0xf9,0xf5,0x29,0xe4,0x35,0x28, +0xfa,0xf5,0x28,0xec,0x8d,0xf0,0x2, 0x3, 0x3c,0x33,0xfe,0xef,0x24,0xc1,0xf5,0x2b, +0xee,0x34,0xff,0xf5,0x2a,0xc3,0xe5,0x2b,0x94,0x2, 0xe5,0x2a,0x64,0x80,0x94,0x80, +0x22,0x12,0x17,0xdb,0xe4,0xf5,0x24,0x90,0x0, 0x2d,0x12,0x6a,0xa0,0xff,0xe5,0x24, +0xc3,0x9f,0x50,0x1f,0xe5,0x24,0x12,0x1f,0x57,0xfa,0x12,0x17,0xc, 0x90,0x0, 0xc, +0x12,0x2, 0xb7,0xfd,0xac,0xf0,0xe9,0x24,0xa, 0xf9,0xe4,0x3a,0xfa,0x11,0x60,0x5, +0x24,0x80,0xd4,0x22,0x12,0x6b,0x7a,0x74,0x62,0xf1,0x7f,0x7a,0x9, 0x79,0x17,0x12, +0x5b,0x74,0x12,0x30,0x4e,0x75,0x36,0x1, 0x75,0x37,0x8, 0x75,0x38,0xc5,0x91,0xed, +0x12,0x4e,0x74,0x7b,0x1, 0x7a,0x9, 0x79,0xde,0x12,0x4f,0x8e,0xf1,0x50,0x12,0x58, +0x18,0xe4,0x90,0xd, 0x29,0xf0,0x7b,0x1, 0x7a,0x9, 0x79,0x3a,0x12,0xe, 0xcb,0x90, +0xc, 0x28,0x74,0xa, 0xf0,0x90,0xc, 0x28,0xe0,0x70,0xfa,0x12,0x35,0x85,0x7b,0x1, +0x7a,0x9, 0x79,0x5d,0xd1,0x3f,0x7b,0x1, 0x7a,0x9, 0x79,0x5d,0xb1,0xb, 0x12,0x32, +0xe4,0x12,0x6c,0x64,0xf1,0x2b,0xf1,0x96,0x75,0x2a,0x1, 0x75,0x2b,0x9, 0x75,0x2c, +0x3a,0x7b,0x1, 0x12,0xf, 0xfc,0x7e,0x0, 0x7f,0x83,0x12,0x57,0xec,0x91,0xdf,0x12, +0x37,0xf1,0xf1,0x9d,0x90,0xa, 0xe1,0xf0,0xa3,0x74,0x64,0xf0,0x75,0x36,0x1, 0x75, +0x37,0x0, 0x75,0x38,0x83,0x7b,0x1, 0x7a,0x0, 0x79,0x0, 0x12,0x2d,0xb4,0x12,0x35, +0x7e,0x4, 0xf0,0xa3,0x74,0x8, 0xf0,0x12,0x5e,0xa6,0xe4,0x90,0xa, 0xe9,0xf0,0xa3, +0xf0,0x90,0xa, 0x2a,0xe0,0xff,0xf1,0xf6,0x90,0xc, 0xc9,0xe0,0x64,0x1, 0x60,0x2, +0x81,0x92,0xf1,0x9e,0x90,0xa, 0xe1,0xf0,0x74,0x64,0xf1,0x7f,0x7a,0x9, 0x79,0x17, +0x12,0x4b,0x5, 0x90,0x8, 0x29,0xe0,0x90,0x9, 0x17,0x30,0xe1,0x8, 0xe4,0xf0,0xa3, +0x74,0xdc,0xf0,0x80,0xb, 0xe4,0xf0,0xa3,0x74,0xa0,0xf0,0xf1,0x50,0x12,0x58,0x18, +0xe4,0xf5,0x10,0xf5,0xf, 0x90,0xc, 0xc7,0xe0,0x70,0x5, 0x90,0x8, 0x2b,0x80,0x3, +0x90,0x8, 0x2d,0xe0,0xf5,0x11,0x90,0xc, 0xc2,0xe0,0xf4,0x60,0x1b,0x7e,0x0, 0x7f, +0x0, 0x7c,0x9, 0x7d,0x3a,0x7a,0x0, 0x7b,0x83,0x75,0x27,0x9, 0x75,0x28,0x5d,0x12, +0x35,0x21,0x90,0xc, 0xc2,0x74,0xff,0xf0,0x12,0x35,0x9a,0x60,0xfb,0x90,0x8, 0x32, +0xe0,0xb4,0x1, 0x5, 0xe4,0xff,0x12,0x4a,0xf0,0xf1,0x2c,0xf1,0x49,0xf1,0x68,0x91, +0xdf,0x12,0x62,0xde,0x90,0x8, 0x29,0xe0,0x30,0xe1,0x5, 0x91,0xd6,0x12,0x5a,0x34, +0xf1,0x2c,0xf1,0x96,0xf1,0xc1,0x91,0xed,0x12,0x60,0xc, 0x90,0x8, 0x20,0xe0,0x64, +0x6, 0x70,0x4e,0x12,0x5e,0xad,0x40,0x20,0x75,0x33,0x1, 0x75,0x34,0x0, 0x75,0x35, +0x83,0x75,0x36,0x1, 0x75,0x37,0x9, 0x75,0x38,0x17,0x75,0x39,0x1, 0x75,0x3a,0x0, +0x75,0x3b,0x0, 0x91,0xed,0x12,0x40,0xee,0x90,0x8, 0x62,0xe0,0x20,0xe0,0x5, 0x91, +0xdf,0x12,0x43,0xff,0xf1,0x72,0x75,0x28,0x0, 0x75,0x29,0x0, 0xf1,0x68,0x91,0xe6, +0x12,0x37,0x62,0x90,0x8, 0x62,0xe0,0x30,0xe0,0xd, 0xe4,0x90,0x8, 0x20,0xf0,0x80, +0x6, 0x90,0x9, 0x20,0x12,0x6c,0x7b,0x90,0x8, 0x27,0xe0,0x70,0x10,0x90,0x8, 0x20, +0xe0,0xb4,0x4, 0x9, 0x90,0xa, 0xe9,0xe4,0xf0,0xa3,0x74,0xa, 0xf0,0xd3,0x90,0xa, +0xea,0xe0,0x94,0x0, 0x90,0xa, 0xe9,0xe0,0x94,0x0, 0x40,0x12,0xa3,0xe0,0x24,0xff, +0xf0,0x90,0xa, 0xe9,0xe0,0x34,0xff,0xf0,0x90,0x8, 0x20,0x74,0x4, 0xf0,0x90,0x8, +0x29,0xe0,0x20,0xe1,0xf, 0xf1,0x72,0x75,0x28,0x8, 0x75,0x29,0x33,0xf1,0xc1,0xf1, +0x50,0x12,0x58,0x35,0x75,0x24,0x1, 0x75,0x25,0x0, 0x75,0x26,0x83,0x91,0xed,0x12, +0x40,0x4, 0x91,0xd6,0x12,0x45,0x52,0x90,0x9, 0x15,0xef,0xf1,0x2b,0xf1,0x49,0xf1, +0x68,0x91,0xdf,0x12,0x50,0xd0,0x91,0xed,0x31,0x51,0x90,0x8, 0x20,0xe0,0xb4,0x6, +0xe, 0x90,0x8, 0x60,0xe0,0xd3,0x94,0x1, 0x40,0x5, 0xe4,0x90,0x8, 0x20,0xf0,0xf1, +0x72,0xf1,0x49,0x7b,0x1, 0x7a,0x0, 0x79,0x0, 0x12,0x29,0x84,0x90,0x8, 0x27,0xe0, +0x70,0xf, 0x90,0x8, 0x61,0xe0,0xff,0x90,0x8, 0x60,0xe0,0xd3,0x9f,0x40,0x7, 0x80, +0x0, 0x91,0xd6,0x12,0x4c,0xd6,0x90,0x8, 0x60,0xe0,0xa3,0xf0,0x90,0x9, 0x10,0xf0, +0x91,0xe6,0x91,0x98,0x91,0xe6,0xb1,0xda,0x90,0x9, 0x10,0xe0,0x90,0x8, 0x60,0xf0, +0x90,0xa, 0x21,0x74,0x1, 0xf0,0xa3,0x74,0xa, 0xf0,0xa3,0x74,0x24,0xf0,0x75,0x24, +0x1, 0x75,0x25,0x8, 0x75,0x26,0x33,0x7b,0x1, 0x7a,0x9, 0x79,0xde,0x12,0x17,0x2c, +0x90,0x8, 0xc5,0x74,0x1, 0xf0,0xa3,0x74,0x9, 0xf0,0xa3,0x74,0xde,0xf0,0x90,0x8, +0x60,0xe0,0x90,0x9, 0x10,0xf0,0xf1,0xb7,0x75,0x27,0x1, 0x75,0x28,0x8, 0x75,0x29, +0xc5,0x91,0xed,0x12,0x18,0x2d,0x75,0x24,0x1, 0x75,0x25,0x9, 0x75,0x26,0xde,0xf1, +0x8a,0x7a,0x8, 0x79,0xc5,0x12,0x1c,0x28,0x91,0xe6,0x7c,0xa, 0x7d,0x24,0xf1,0xfc, +0xf1,0xb7,0x91,0xe6,0x12,0x48,0xab,0x75,0x24,0x1, 0x75,0x25,0x8, 0x75,0x26,0x28, +0x75,0x27,0x1, 0x75,0x28,0x0, 0x75,0x29,0x0, 0x75,0x2a,0x1, 0x75,0x2b,0x0, 0x75, +0x2c,0x83,0x75,0x2d,0x1, 0x75,0x2e,0x8, 0x75,0x2f,0x33,0x91,0xe6,0x12,0x15,0xb2, +0x41,0x38,0x12,0x32,0xc3,0x2, 0x0, 0x1a,0x12,0x17,0xdb,0x90,0x0, 0x4b,0x12,0x1, +0x65,0x70,0x24,0xf1,0x25,0xff,0xd3,0x94,0x0, 0x40,0x1c,0xe5,0xc, 0x70,0x14,0x90, +0x0, 0x4b,0xef,0x12,0x1, 0xd7,0xe9,0x24,0x4f,0xf1,0xef,0x44,0x8, 0x12,0x1, 0xc5, +0x5, 0xc, 0x22,0xe4,0xf5,0xc, 0x22,0xe4,0xf5,0xc, 0x12,0x4f,0x71,0xfa,0x12,0x1, +0x4c,0x54,0xf7,0x2, 0x1, 0xc5,0x75,0x24,0x1, 0x75,0x25,0x8, 0x75,0x26,0x33,0x7b, +0x1, 0x7a,0x0, 0x79,0x83,0x22,0x7b,0x1, 0x7a,0x8, 0x79,0xc5,0x22,0x7b,0x1, 0x7a, +0x8, 0x79,0x33,0x22,0x7b,0x1, 0x7a,0x8, 0x79,0x28,0x12,0xe, 0xcb,0x7b,0x1, 0x7a, +0x8, 0x79,0x4b,0xd1,0x3f,0x7b,0x1, 0x7a,0x8, 0x79,0x4b,0x12,0xf, 0xe5,0xe4,0xf5, +0x2c,0x12,0xf, 0xca,0x85,0x2c,0x82,0x12,0x62,0x1e,0xfd,0xaf,0x2c,0x12,0x0, 0x4e, +0xe5,0x2c,0x24,0x1c,0xf1,0xa5,0xd1,0x23,0xf1,0xad,0x24,0x38,0xff,0xab,0x29,0xe5, +0x2b,0x24,0x38,0xd1,0x23,0xf1,0xad,0x24,0x54,0xd1,0x1c,0xd1,0x32,0x94,0x1c,0x40, +0xd0,0x90,0x0, 0x70,0xf1,0x5f,0xfd,0x7f,0x7e,0x12,0x0, 0x4e,0x12,0xf, 0xca,0x90, +0x0, 0x71,0x12,0x1, 0x65,0xfd,0x7f,0x7f,0x12,0x0, 0x4e,0x12,0xf, 0xca,0x90,0x0, +0x73,0x12,0x1, 0x65,0xfd,0x7f,0x81,0x12,0x0, 0x4e,0x12,0xf, 0xca,0x90,0x0, 0x74, +0x12,0x1, 0x65,0x7f,0x82,0xf1,0x57,0xe5,0x2c,0x24,0x83,0xff,0xab,0x29,0xe5,0x2b, +0x24,0x75,0xd1,0x23,0xd1,0x32,0x94,0x4, 0x40,0xed,0xe4,0xf5,0x2c,0xe5,0x2c,0x24, +0x87,0xff,0xab,0x29,0xe5,0x2b,0x24,0x79,0xd1,0x23,0xd1,0x32,0x94,0x2, 0x40,0xed, +0x12,0xf, 0xca,0x90,0x0, 0x7b,0x12,0x1, 0x65,0xfd,0x7f,0x89,0x12,0x0, 0x4e,0x12, +0xf, 0xca,0x90,0x0, 0x7c,0x12,0x1, 0x65,0x7f,0x8c,0xf1,0x57,0xe5,0x2c,0x24,0x8d, +0xff,0xab,0x29,0xe5,0x2b,0x24,0x7d,0xd1,0x23,0xd1,0x32,0x94,0x3, 0x40,0xed,0x90, +0x0, 0x80,0xf1,0x5f,0xfd,0x7f,0x90,0x2, 0x0, 0x4e,0xf1,0x25,0xff,0xd3,0x94,0x0, +0x50,0x39,0x12,0x6d,0x5d,0x9f,0x40,0x1c,0x90,0x0, 0x50,0x12,0x1, 0x65,0xff,0x90, +0xd, 0x29,0xe0,0xd3,0x9f,0x50,0x12,0xe0,0x4, 0xf0,0xf1,0x25,0x90,0x0, 0x4b,0x12, +0x1, 0xd7,0x80,0x5, 0xe4,0x90,0xd, 0x29,0xf0,0x90,0x0, 0x4b,0x12,0x1, 0x65,0x70, +0xa, 0xe9,0x24,0x4f,0xf1,0xef,0x54,0xfe,0x12,0x1, 0xc5,0x22,0xff,0xab,0x29,0xe5, +0x2b,0x24,0x54,0xf9,0xe4,0x35,0x2a,0xfa,0xe5,0x2c,0x7c,0x0, 0x29,0xf9,0xec,0x3a, +0xfa,0x22,0x12,0x1, 0x4c,0xfd,0x12,0x0, 0x4e,0x5, 0x2c,0xe5,0x2c,0xc3,0x22,0x12, +0xf, 0xe5,0x7a,0x7, 0x79,0x49,0x7f,0x1c,0x12,0x5b,0x65,0xf5,0x2c,0xf1,0x3d,0xe0, +0xff,0xc3,0x94,0x1c,0x50,0x43,0x12,0x6c,0x8a,0x12,0xf, 0xc9,0x8f,0x82,0x75,0x83, +0x0, 0x12,0x1, 0xd7,0xe5,0x2c,0x20,0xe0,0xd, 0xf1,0xd8,0x54,0xf, 0xff,0xe9,0x24, +0x1c,0xf9,0xe4,0x3a,0x80,0xd, 0xe5,0x2c,0xf1,0xd8,0xc4,0x54,0xf, 0xf1,0xa5,0xf9, +0xe4,0x35,0x2a,0xfa,0xf1,0x3d,0xe0,0xd1,0x2a,0xef,0x12,0x1, 0xc5,0xf1,0x3d,0xe0, +0x24,0x2d,0xf8,0xe6,0xd1,0x1c,0xef,0x80,0xb, 0xab,0x29,0xe5,0x2b,0x24,0x54,0xf1, +0xcb,0x3a,0xfa,0xe4,0x12,0x1, 0xc5,0xab,0x29,0xe5,0x2b,0x24,0x38,0xf1,0xcb,0x3a, +0xfa,0x74,0xc, 0x12,0x1, 0xc5,0x5, 0x2c,0xe5,0x2c,0x64,0x1c,0x70,0x8f,0x12,0xf, +0xca,0x90,0x0, 0x70,0xe4,0x12,0x1, 0xd7,0x90,0x0, 0x71,0x74,0x7, 0x12,0x1, 0xd7, +0x90,0x0, 0x72,0x74,0x17,0x12,0x1, 0xd7,0x90,0x0, 0x73,0x74,0x2, 0x12,0x1, 0xd7, +0x90,0x0, 0x74,0x74,0x7f,0x12,0x1, 0xd7,0xe4,0xfd,0x12,0x4f,0xe1,0x12,0xf, 0xca, +0x7d,0x1, 0x12,0x4f,0xe1,0x12,0xf, 0xca,0x90,0x0, 0x7b,0x74,0xf, 0x12,0x1, 0xd7, +0x90,0x0, 0x7c,0x74,0x21,0x12,0x1, 0xd7,0x90,0x0, 0x7d,0x74,0x8, 0x12,0x1, 0xd7, +0x90,0x0, 0x7e,0x74,0x8, 0x12,0x1, 0xd7,0x90,0x0, 0x7f,0x74,0x8, 0x12,0x47,0x88, +0x74,0x5d,0x2, 0x1, 0xd7,0x90,0x0, 0x4c,0x2, 0x1, 0x65,0xf0,0x75,0x24,0x1, 0x75, +0x25,0x0, 0x75,0x26,0x0, 0x75,0x27,0x1, 0x22,0xef,0x12,0x1, 0xc5,0x74,0xfe,0x25, +0x2c,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0x22,0x75,0x28,0x9, 0x75,0x29,0x17,0x22, +0x7b,0x1, 0x7a,0xa, 0x79,0x2c,0x22,0xfd,0x12,0x0, 0x4e,0xe4,0xf5,0x2c,0x22,0xab, +0x29,0xaa,0x2a,0xa9,0x2b,0x2, 0x1, 0x65,0x75,0x2a,0x1, 0x75,0x2b,0x8, 0x75,0x2c, +0x33,0x22,0x75,0x24,0x1, 0x75,0x25,0x0, 0x75,0x26,0x83,0x75,0x27,0x1, 0x22,0xa3, +0xf0,0x75,0x24,0x1, 0x75,0x25,0x8, 0x75,0x26,0x28,0x75,0x27,0x1, 0x75,0x28,0xa, +0x75,0x29,0x24,0x7b,0x1, 0x22,0x75,0x28,0x0, 0x75,0x29,0x83,0x22,0xe4,0x90,0xa, +0xe7,0xf0,0xa3,0xf0,0x22,0xff,0xab,0x29,0xe5,0x2b,0x24,0x1c,0x22,0x12,0x1, 0x4c, +0xfd,0x12,0x0, 0x4e,0xe5,0x2c,0x22,0x75,0x24,0x1, 0x75,0x25,0xa, 0x75,0x26,0x24, +0x22,0x75,0x2a,0x1, 0x75,0x2b,0x9, 0x75,0x2c,0x17,0x22,0xf9,0xe4,0x35,0x2a,0xfa, +0x7e,0x0, 0xe9,0x25,0x2c,0xf9,0xee,0x22,0xc3,0x13,0x24,0x46,0xf5,0x82,0xe4,0x34, +0xb, 0xf5,0x83,0xe0,0x22,0x90,0x0, 0x16,0xe4,0x12,0x1, 0xd7,0xe9,0x24,0x17,0xf9, +0xe4,0x3a,0xfa,0x2, 0x1, 0x4c,0x8f,0xd, 0xe4,0xf5,0xe, 0x22,0x8c,0x24,0x8d,0x25, +0x12,0x17,0xdb,0x90,0x0, 0x4b,0x12,0x1, 0x65,0xf5,0x2a,0x12,0x5, 0x4c,0xaf,0x1, +0x8a,0x2b,0x8f,0x2c,0x12,0x17,0x25,0x12,0x27,0x25,0x65,0x2a,0x60,0x2b,0xe4,0xf5, +0x26,0xe5,0x26,0x12,0x1c,0x19,0x12,0x1f,0x1a,0xf5,0x27,0xf4,0x60,0x6, 0x31,0x3a, +0xf5,0x83,0xb1,0x11,0x5, 0x26,0xe5,0x26,0xb4,0x5, 0xe6,0xe5,0x2a,0x60,0x2, 0x21, +0x39,0xb1,0x4f,0xf5,0x83,0xe0,0xff,0x80,0xad,0xe4,0xf5,0x26,0x12,0x17,0x25,0x90, +0x0, 0x4b,0x12,0x1, 0x65,0xff,0xe5,0x26,0xc3,0x9f,0x40,0x2, 0x21,0x39,0xe5,0x26, +0x12,0x1f,0x57,0x12,0x1f,0x19,0xf5,0x27,0xf4,0x70,0x2, 0x21,0x35,0x90,0x0, 0x3, +0x12,0x17,0xf, 0xb1,0x59,0xe4,0x34,0xd, 0x31,0x7c,0x12,0x1f,0x67,0x8e,0x28,0x8f, +0x29,0xe5,0x26,0x12,0x1c,0x19,0x90,0x0, 0x5, 0x12,0x17,0xf, 0x31,0x5d,0x31,0x7c, +0x12,0x1f,0x67,0xad,0xd, 0x7c,0x0, 0xc3,0xe5,0x29,0x9d,0xe5,0x28,0x9c,0x50,0x6d, +0xc3,0xef,0x9d,0xee,0x9c,0x50,0x66,0xb1,0x59,0xe4,0x34,0xd, 0x31,0x7c,0xe5,0x26, +0x12,0x1c,0x19,0x90,0x0, 0x3, 0x12,0x1f,0xaf,0x31,0x5d,0xf5,0x83,0xe0,0xff,0xa3, +0xe0,0x90,0x0, 0x5, 0xcf,0x8f,0xf0,0x12,0x3, 0x5b,0xe5,0x2c,0x24,0x23,0xf5,0x82, +0xe4,0x35,0x2b,0xf5,0x83,0xe5,0x82,0x25,0x27,0xb1,0x94,0xe0,0xb4,0x2, 0x9, 0xe5, +0x2a,0xd3,0x94,0x0, 0x40,0x2, 0x15,0x2a,0xe5,0x2a,0x70,0x49,0x5, 0xe, 0xb1,0x45, +0xf5,0x83,0xe0,0xff,0xe5,0xd, 0xc3,0x9f,0x50,0x5, 0x5, 0xd, 0xe4,0xf5,0xe, 0x12, +0x4f,0x71,0xfa,0x12,0x1, 0x4c,0x54,0xfe,0x12,0x1, 0xc5,0x80,0x28,0xe5,0x26,0x12, +0x1c,0x19,0x31,0x3a,0xf5,0x83,0xb1,0x11,0xb1,0x4f,0xf5,0x83,0xe0,0xb5,0xd, 0x9, +0xb1,0x45,0xf5,0x83,0xe0,0xf5,0xd, 0x80,0x9, 0xe5,0xd, 0xd3,0x94,0x1, 0x40,0x2, +0x15,0xd, 0xe4,0xf5,0xe, 0x5, 0x26,0x1, 0x4c,0x22,0x90,0x0, 0x3, 0x12,0x2, 0xb7, +0xff,0xe5,0x27,0x25,0xe0,0x25,0xe0,0x24,0x15,0xf5,0x82,0xe4,0x34,0xd, 0xf5,0x83, +0xe5,0xf0,0xf0,0xa3,0xef,0xf0,0x90,0x0, 0x5, 0x12,0x2, 0xb7,0xff,0xe5,0x27,0x25, +0xe0,0x25,0xe0,0x24,0x17,0xf5,0x82,0xe4,0x34,0xd, 0x22,0xe5,0x2d,0x25,0xe0,0xff, +0xe5,0x2c,0x33,0xfe,0xe5,0x31,0x2f,0xf5,0x82,0xe5,0x30,0x3e,0xf5,0x83,0xe0,0xfc, +0xa3,0xe0,0xfd,0x22,0x12,0x17,0xdb,0x12,0x15,0x71,0x90,0x7, 0x9d,0x12,0x1, 0x65, +0xff,0xf5,0x34,0x12,0x15,0x25,0x90,0x0, 0x15,0x12,0x1, 0x65,0xf5,0x35,0x90,0x0, +0x16,0x12,0x1, 0x65,0xf5,0x36,0xef,0x70,0x2, 0x41,0xdc,0x12,0x15,0x71,0x90,0x7, +0x9d,0x12,0x1, 0x65,0xb4,0x4, 0x8, 0xe5,0x35,0x25,0xe0,0x25,0xe0,0xf5,0x35,0xae, +0x2, 0xaf,0x1, 0x8e,0x2e,0x8f,0x2f,0x12,0x6b,0xb8,0xf5,0x30,0x8f,0x31,0xe5,0x26, +0x24,0x60,0xf9,0xe5,0x25,0x34,0x7, 0xaf,0x1, 0xf5,0x32,0x8f,0x33,0xe4,0xf5,0x2a, +0x12,0x17,0x25,0x12,0x6d,0x12,0x40,0x2, 0x41,0xdc,0xe5,0x2a,0x75,0xf0,0x10,0xa4, +0x85,0xf0,0x2c,0xf5,0x2d,0xe4,0xf5,0x2b,0x90,0x0, 0x1, 0x12,0x6a,0xa0,0xff,0xe5, +0x2b,0xc3,0x9f,0x40,0x2, 0x41,0xd8,0xe5,0x34,0xb4,0x3, 0x2, 0x41,0x9d,0xe5,0x34, +0xb4,0x2, 0xf, 0x51,0xdd,0xc0,0x83,0xc0,0x82,0x91,0xfb,0xd5,0x82,0x2, 0x15,0x83, +0x41,0xc0,0xe5,0x34,0xb4,0x5, 0x4, 0x31,0x6b,0x80,0x2f,0xe5,0x34,0x64,0x6, 0x70, +0x65,0xe5,0x2d,0xae,0x2c,0x78,0x3, 0xce,0xc3,0x13,0xce,0x13,0xd8,0xf9,0xb1,0x3b, +0xb1,0x72,0xfe,0xef,0x5e,0x60,0x30,0xb1,0x9c,0xb1,0x31,0x98,0x40,0x11,0xe5,0x35, +0xfd,0xe5,0x2d,0x25,0xe0,0xff,0xe5,0x2c,0x33,0xfe,0x51,0xe6,0xec,0x80,0x44,0x31, +0x6b,0xb1,0x64,0xf1,0xec,0x98,0x50,0x64,0x51,0xe6,0xc0,0x83,0xc0,0x82,0x91,0xfb, +0xd5,0x82,0x2, 0x15,0x83,0x80,0x49,0xe5,0x2d,0xae,0x2c,0x78,0x3, 0xce,0xc3,0x13, +0xce,0x13,0xd8,0xf9,0xb1,0x3b,0xc0,0x83,0xc0,0x82,0xb1,0x72,0xfe,0xef,0x4e,0xd0, +0x82,0xd0,0x83,0xf0,0x80,0x36,0xb1,0x9c,0xb1,0x31,0x98,0x40,0xd, 0xe5,0x35,0xfd, +0x51,0xdd,0xe4,0x8d,0xf0,0x12,0x2, 0x60,0x80,0x22,0x31,0x6b,0xb1,0x64,0xf1,0xec, +0x98,0x50,0x19,0x51,0xe6,0xc0,0x83,0xc0,0x82,0x91,0xfb,0xd5,0x82,0x2, 0x15,0x83, +0x15,0x82,0xe0,0x9e,0xd0,0x82,0xd0,0x83,0xf0,0xa3,0xef,0xf0,0x5, 0x2d,0xe5,0x2d, +0x70,0x2, 0x5, 0x2c,0x5, 0x2b,0x21,0xf8,0x5, 0x2a,0x21,0xe0,0x22,0xe5,0x2d,0x25, +0xe0,0xff,0xe5,0x2c,0x33,0xfe,0xe5,0x2f,0x2f,0xf5,0x82,0xe5,0x2e,0x3e,0xf5,0x83, +0x22,0x12,0x6c,0xe6,0xe4,0xf5,0x2f,0xf5,0x30,0x90,0x0, 0x41,0x12,0x1, 0x65,0xf5, +0x31,0x70,0x31,0xf5,0x2d,0xe5,0x2d,0xfd,0x33,0x95,0xe0,0xfc,0xed,0x25,0xe0,0xff, +0xec,0x33,0xfe,0x74,0xd7,0x2f,0xf5,0x82,0x74,0xa, 0x12,0x38,0x6f,0x90,0xa, 0xb8, +0x75,0xf0,0x7, 0xed,0x12,0x5, 0x40,0xec,0x75,0xf0,0x7, 0xa4,0x25,0x83,0x12,0x6a, +0x96,0xb4,0x5, 0xd1,0xe4,0xf5,0x2d,0x12,0x15,0x25,0x90,0x0, 0x41,0x12,0x1, 0x65, +0xfd,0xb1,0x20,0xc3,0xef,0x9d,0x74,0x80,0xf8,0x6e,0x98,0x40,0x2, 0x81,0xb8,0x7c, +0x0, 0x7d,0x7, 0x12,0x1, 0xf9,0x12,0x4e,0x6d,0x91,0xe4,0xff,0xf4,0x70,0x2, 0x81, +0xb4,0xb1,0x28,0x35,0x28,0x12,0x1f,0x85,0x12,0x1, 0x4c,0x60,0x6, 0x64,0x2, 0x60, +0x2, 0x81,0xb4,0xe4,0xf5,0x2e,0x12,0x1f,0x20,0x91,0xe4,0xff,0x91,0xea,0x6f,0x60, +0x2, 0x81,0xad,0x90,0x0, 0x2, 0x12,0x17,0xf, 0xe5,0x2e,0x75,0xf0,0x7, 0xa4,0x24, +0xb6,0xf5,0x82,0xe4,0x34,0xa, 0x31,0x7c,0xb1,0x18,0x12,0x0, 0x6, 0xc0,0x6, 0xc0, +0x7, 0x12,0x15,0x25,0xaf,0x2d,0xef,0x33,0x95,0xe0,0x8f,0x82,0xf5,0x83,0x74,0x7, +0x12,0x5, 0x2f,0x12,0x17,0xf, 0xe5,0x2e,0x75,0xf0,0x7, 0xa4,0x24,0xb4,0xf5,0x82, +0xe4,0x34,0xa, 0x31,0x7c,0xb1,0x18,0x12,0x0, 0x6, 0xd0,0xe0,0x2f,0xf5,0x30,0xd0, +0xe0,0x3e,0xf5,0x2f,0x91,0xea,0xb1,0x6, 0x31,0x7c,0xd3,0x94,0x64,0xec,0x94,0x0, +0x40,0xd, 0xd3,0xe5,0x30,0x94,0x64,0xe5,0x2f,0x94,0x0, 0x40,0x2, 0x80,0x22,0xed, +0x24,0x32,0xff,0xe4,0x3c,0xfe,0xd3,0xe5,0x30,0x9f,0xe5,0x2f,0x9e,0x40,0x15,0x91, +0xea,0xb1,0x6, 0xf5,0x83,0xe0,0xfc,0xa3,0xe0,0xd3,0x94,0x32,0xec,0x94,0x0, 0x40, +0x3, 0xef,0x81,0xa0,0x12,0x17,0xea,0x12,0x4f,0x60,0xd3,0xe5,0x30,0x9f,0xe5,0x2f, +0x95,0xf0,0x40,0x7a,0x12,0x1f,0x20,0x91,0xe4,0xff,0xb1,0x28,0x35,0x28,0x12,0x1f, +0x85,0x12,0x1, 0x4c,0x70,0x4, 0x74,0x3, 0x80,0x2, 0x74,0x1, 0x12,0x1, 0xc5,0x12, +0x1f,0x20,0x91,0xe4,0x12,0x6d,0x36,0x35,0x28,0x12,0x4f,0xd5,0x12,0x1f,0x2e,0x78, +0x44,0x7c,0xa, 0x7d,0x1, 0x12,0x1f,0xc7,0xe5,0x31,0xd3,0x94,0x0, 0x40,0x3f,0x15, +0x31,0xe5,0x31,0x12,0x15,0x43,0xc0,0x3, 0xc0,0x2, 0xc0,0x1, 0xb1,0x20,0x7c,0x0, +0x7d,0x7, 0x12,0x1, 0xf9,0xe5,0x29,0x2f,0xf9,0xe5,0x28,0x3e,0xa8,0x1, 0xfc,0xad, +0x3, 0xd0,0x1, 0xd0,0x2, 0xd0,0x3, 0x12,0x1f,0xc7,0xe5,0x31,0x75,0xf0,0x7, 0xa4, +0x25,0x29,0xf9,0xe5,0x28,0x35,0xf0,0x7f,0x7, 0x12,0x6b,0x26,0x15,0x2d,0x91,0xea, +0xb1,0x7, 0xf5,0x83,0xe5,0x2f,0xf0,0xa3,0xe5,0x30,0xf0,0x80,0x7, 0x12,0x6d,0x65, +0x50,0x2, 0x61,0x76,0x5, 0x2d,0x61,0x37,0x12,0x15,0x25,0x90,0x0, 0x41,0xe5,0x31, +0x12,0x1, 0xd7,0xe4,0xf5,0x2d,0x12,0x1f,0x20,0xc0,0x1, 0x74,0xb4,0x2f,0xf9,0x74, +0xa, 0x3e,0xa8,0x1, 0xfc,0x7d,0x1, 0xd0,0x1, 0x12,0x1f,0xc7,0x5, 0x2d,0xe5,0x2d, +0xb4,0x5, 0xe3,0x22,0x90,0x0, 0x4, 0x2, 0x1, 0x65,0xe5,0x2e,0x75,0xf0,0x7, 0xa4, +0x24,0xb8,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0xe0,0x22,0x7e,0x0, 0xc3,0xa3,0xe0, +0x95,0x35,0xff,0x5, 0x82,0x22,0xff,0x25,0xe0,0x24,0xd7,0xf5,0x82,0xe4,0x34,0xa, +0x22,0xe5,0xf0,0xf0,0xa3,0xef,0xf0,0x22,0xc3,0xef,0x9d,0xff,0xee,0x9c,0xfe,0x22, +0xaf,0x2d,0xef,0x33,0x95,0xe0,0xfe,0x22,0x7e,0x0, 0xe5,0x29,0x24,0x23,0xf9,0xe4, +0x22,0xd3,0x95,0x36,0x74,0x80,0xf8,0xee,0x64,0x80,0x22,0x25,0x33,0xf5,0x82,0xe5, +0x32,0x3e,0xf5,0x83,0x22,0xe5,0x25,0x24,0x7, 0xf5,0x82,0xe4,0x35,0x24,0x22,0xe5, +0x25,0x24,0x6, 0xf5,0x82,0xe4,0x35,0x24,0x22,0xe5,0x27,0x25,0xe0,0x25,0xe0,0x24, +0x15,0xf5,0x82,0x22,0xc3,0xe4,0x95,0x36,0xfb,0xe4,0x94,0x0, 0xfa,0xc3,0xed,0x9b, +0xea,0x22,0xe0,0xff,0x7c,0x0, 0xe5,0x2d,0x54,0x7, 0x24,0x12,0xf5,0x82,0xec,0x34, +0x0, 0xf5,0x83,0xe4,0x93,0x22,0xe5,0x32,0x24,0x23,0xf5,0x82,0xe4,0x35,0x31,0xf5, +0x83,0xe5,0x82,0x2f,0xf5,0x82,0xe4,0x35,0x83,0xf5,0x83,0x22,0xe5,0x2d,0x25,0xe0, +0xff,0xe5,0x2c,0x33,0xfe,0xe5,0x31,0x2f,0xf5,0x82,0xe5,0x30,0x3e,0xf5,0x83,0xe0, +0xfe,0xa3,0xe0,0x22,0x12,0xf, 0xde,0xf1,0xf3,0x90,0xa, 0x44,0xf0,0x90,0x0, 0x52, +0x12,0x1, 0x65,0x90,0xa, 0x45,0xf0,0x90,0x0, 0x53,0xe4,0x12,0x1, 0xd7,0x90,0x0, +0x52,0xe4,0x12,0x1, 0xd7,0xe5,0x38,0x24,0x80,0xf9,0xe5,0x37,0x34,0x3, 0xaf,0x1, +0xf5,0x3f,0x8f,0x40,0x85,0x37,0x3d,0x85,0x38,0x3e,0x75,0x39,0x1, 0x85,0x36,0x4b, +0x85,0x37,0x4c,0x85,0x38,0x4d,0xd1,0x55,0x12,0x35,0xa9,0x60,0xf0,0xe4,0xf5,0x3b, +0xf5,0x3c,0xf5,0x3a,0xe4,0xf9,0xf1,0x5c,0x12,0x57,0xe4,0xb1,0xac,0x78,0x2, 0x12, +0x46,0xb5,0xd8,0xfb,0xfd,0xac,0x6, 0xf1,0x5c,0xe5,0x3e,0x2f,0xf5,0x82,0xe5,0x3d, +0x12,0x6c,0xd6,0x5, 0x3c,0xe5,0x3c,0x70,0x2, 0x5, 0x3b,0x9, 0xb9,0x10,0xd7,0x5, +0x3a,0xe5,0x3a,0xb4,0x1c,0xce,0x5, 0x39,0xe5,0x39,0xd3,0x94,0x4, 0x40,0xae,0x90, +0xa, 0x44,0xe0,0xd1,0x55,0x90,0x0, 0x53,0x12,0x1, 0xd7,0x90,0xa, 0x45,0xe0,0x90, +0x0, 0x52,0x2, 0x1, 0xd7,0xab,0x33,0xaa,0x34,0xa9,0x35,0x22,0x12,0x6c,0xdf,0x12, +0x1, 0x4c,0x13,0x13,0x54,0x3f,0xf5,0x3b,0x12,0x17,0xcf,0x13,0x13,0x54,0x3f,0xf5, +0x3c,0xe4,0xf5,0x3d,0xf5,0x3e,0xf5,0x3f,0xf5,0x39,0xf1,0xb7,0x12,0x1, 0x4c,0xff, +0xe5,0x39,0xc3,0x9f,0x50,0x68,0xe4,0xf5,0x3a,0xf1,0xb7,0x12,0x17,0xcf,0xff,0xe5, +0x3a,0xc3,0x9f,0x50,0x51,0xd1,0x55,0xf1,0xbe,0xe5,0x39,0xf1,0xda,0xe5,0x3a,0x12, +0x45,0x31,0xf1,0xc5,0xfd,0xd3,0xef,0x9d,0x74,0x80,0xf8,0x65,0xf0,0x98,0x40,0x4, +0x5, 0x3d,0x80,0x28,0xd1,0x55,0xf1,0xbe,0xe5,0x39,0xf1,0xda,0xe5,0x3a,0x12,0x45, +0x31,0xf1,0xc5,0xfd,0xc3,0xe4,0x9d,0xfd,0xe4,0x94,0x0, 0xfc,0xc3,0xef,0x9d,0xec, +0x64,0x80,0xf8,0xe5,0xf0,0x64,0x80,0x98,0x50,0x2, 0x5, 0x3e,0x5, 0x3f,0xe5,0x3c, +0x25,0x3a,0xf5,0x3a,0x80,0xa3,0xe5,0x3b,0x25,0x39,0xf5,0x39,0x80,0x8c,0xe5,0x3f, +0xc3,0x13,0xff,0xe5,0x3d,0xd3,0x9f,0x40,0x21,0x90,0x7, 0x9f,0x12,0x6a,0xa9,0xfe, +0xd1,0x55,0x90,0x7, 0x9e,0x12,0x1, 0x65,0xc3,0x9e,0x90,0x7, 0x9e,0x50,0x2, 0x80, +0x25,0xe4,0x12,0x1, 0xd7,0x75,0x16,0x1, 0x80,0x3f,0xe5,0x3e,0xd3,0x9f,0x40,0x26, +0x90,0x7, 0x9e,0x12,0x6a,0xa9,0xff,0xd1,0x55,0x90,0x7, 0x9f,0x12,0x1, 0x65,0xc3, +0x9f,0x90,0x7, 0x9f,0x50,0x7, 0x74,0x1, 0x12,0x1, 0x92,0x80,0x1c,0xe4,0x12,0x1, +0xd7,0x75,0x16,0x2, 0x80,0x13,0xd1,0x55,0x90,0x7, 0x9f,0xe4,0x12,0x1, 0xd7,0x90, +0x7, 0x9e,0xe4,0x12,0x1, 0xd7,0xe4,0xf5,0x16,0xaf,0x16,0x22,0xe5,0x3c,0x25,0xe0, +0xff,0xe5,0x3b,0x33,0xfe,0x22,0x12,0xf, 0xde,0xe4,0xff,0x12,0x62,0xb1,0xd1,0x55, +0x90,0x0, 0x18,0x12,0x1, 0x65,0xff,0x12,0x62,0x8b,0x7f,0x1, 0x12,0x62,0xbc,0x12, +0x62,0x81,0xef,0x70,0x2, 0xff,0x22,0x7d,0x7f,0x7f,0x14,0x12,0x62,0x5f,0xef,0x70, +0x2, 0xff,0x22,0x12,0x6d,0x0, 0x85,0x33,0x39,0xf5,0x3a,0x89,0x3b,0xd1,0x55,0x12, +0x61,0x5d,0xd1,0x55,0x12,0x46,0xfa,0xe4,0xff,0x12,0x62,0xbc,0x12,0x62,0x71,0xef, +0x7f,0x0, 0x60,0x2, 0x7f,0x1, 0x22,0xab,0x30,0xaa,0x31,0xa9,0x32,0x22,0x90,0x3, +0x80,0x75,0xf0,0x20,0x22,0xff,0xab,0x36,0xaa,0x37,0xa9,0x38,0x90,0x0, 0x1e,0x2, +0x1, 0x65,0x90,0x3, 0x80,0x75,0xf0,0x20,0xe5,0x28,0x12,0x5, 0x40,0x75,0xf0,0x2, +0x22,0x33,0xfe,0xed,0x33,0x95,0xe0,0xfc,0xc3,0xed,0x9f,0xee,0x64,0x80,0xf8,0xec, +0x64,0x80,0x22,0x90,0x0, 0x53,0x2, 0x1, 0x65,0x12,0x35,0xf, 0x12,0x6b,0x7a,0xa3, +0x74,0x62,0xf0,0x11,0x4e,0x12,0x24,0xf4,0x53,0xdb,0xf0,0x51,0xe4,0x90,0xb, 0x60, +0x74,0x1, 0xf0,0xa3,0x74,0x2c,0xf0,0x90,0xc, 0x8b,0x74,0x1, 0xf0,0xf5,0x24,0x75, +0x25,0x0, 0x75,0x26,0x0, 0xf5,0x27,0x12,0x27,0x96,0xf5,0x2a,0x75,0x2b,0x8, 0x75, +0x2c,0x28,0xfb,0x12,0xf, 0xfc,0x90,0xc, 0x8b,0x74,0x2, 0xf0,0x51,0xc3,0x90,0xc, +0xc9,0x74,0x3, 0xf0,0x90,0xc, 0x8a,0xe0,0x54,0x8f,0x44,0x40,0xf0,0x22,0x7b,0x1, +0x7a,0x0, 0x79,0x0, 0x12,0xf, 0xe5,0x75,0x4b,0xff,0xe4,0xf5,0x4c,0x75,0x4d,0xff, +0xf5,0x4e,0xf5,0x5d,0x75,0x5e,0x0, 0x75,0x5f,0x4f,0x12,0x6b,0xc2,0x12,0xf, 0xca, +0x12,0x6c,0x37,0x74,0x1, 0x12,0x1, 0xd7,0x90,0x0, 0x54,0x74,0x8, 0x12,0x1, 0xd7, +0x90,0xa, 0xee,0xe0,0x12,0x1, 0xc5,0x90,0xa, 0xef,0x12,0xf, 0xc9,0x90,0x0, 0x1, +0x12,0x1, 0xd7,0x12,0x17,0xcf,0xff,0x12,0x1, 0x4c,0x8f,0xf0,0x90,0x0, 0x2, 0x12, +0x4f,0x68,0xe4,0xf5,0x2c,0x12,0xf, 0xca,0x12,0x6d,0x24,0x50,0x33,0x12,0x6c,0x8a, +0xe0,0xff,0xe9,0x24,0x31,0xf9,0xe4,0x3a,0xfa,0xe5,0x2c,0xfd,0x12,0x26,0x2a,0x12, +0x27,0x39,0xe0,0xff,0xab,0x29,0xe5,0x2b,0x24,0x4, 0xf9,0xe4,0x35,0x2a,0xfa,0xe9, +0x2d,0xf9,0xec,0x3a,0xfa,0x12,0x27,0x39,0xe0,0xff,0x74,0x2e,0x31,0xe0,0x80,0xc5, +0xe4,0xf5,0x2c,0x12,0xf, 0xca,0x12,0x17,0xcf,0xff,0xe5,0x2c,0xc3,0x9f,0x50,0x17, +0x31,0xe8,0xe9,0x24,0x20,0xf9,0xe4,0x3a,0x12,0x26,0x27,0xef,0x12,0x1, 0xc5,0x31, +0xe8,0x74,0x40,0x31,0xe0,0x80,0xdc,0xe4,0xf5,0x2c,0x90,0xa, 0xef,0xe0,0xff,0xe5, +0x2c,0xc3,0x9f,0x50,0x41,0xe4,0xf5,0x2d,0x90,0xa, 0xef,0xe0,0xff,0xe5,0x2d,0xc3, +0x9f,0x50,0x15,0x74,0x40,0x25,0x2d,0xf8,0xe6,0xff,0xc3,0x95,0x4d,0x50,0x5, 0x8f, +0x4d,0x85,0x2d,0x4e,0x5, 0x2d,0x80,0xe0,0x74,0x40,0x25,0x4e,0xf8,0x76,0xff,0x75, +0x4d,0xff,0xab,0x29,0xe5,0x2b,0x24,0x72,0x12,0x27,0xcb,0x3a,0xfa,0xe5,0x4e,0x12, +0x1, 0xc5,0x5, 0x2c,0x80,0xb4,0xe4,0xf5,0x2c,0x90,0xa, 0xee,0xe0,0xff,0xe5,0x2c, +0xc3,0x9f,0x50,0x41,0xe4,0xf5,0x2d,0x90,0xa, 0xee,0xe0,0xff,0xe5,0x2d,0xc3,0x9f, +0x50,0x15,0x74,0x2e,0x25,0x2d,0xf8,0xe6,0xff,0xc3,0x95,0x4b,0x50,0x5, 0x8f,0x4b, +0x85,0x2d,0x4c,0x5, 0x2d,0x80,0xe0,0x74,0x2e,0x25,0x4c,0xf8,0x76,0xff,0x75,0x4b, +0xff,0xab,0x29,0xe5,0x2b,0x24,0x56,0x12,0x27,0xcb,0x3a,0xfa,0xe5,0x4c,0x12,0x1, +0xc5,0x5, 0x2c,0x80,0xb4,0x90,0xa, 0xf1,0x12,0xf, 0xc9,0x90,0x0, 0x30,0x12,0x1, +0xd7,0x90,0x0, 0x31,0x12,0x1, 0x65,0x90,0x0, 0x51,0x12,0xf, 0xf4,0x90,0x0, 0x4d, +0x12,0xf, 0xec,0xff,0x90,0x0, 0x4e,0x12,0x1, 0xd7,0x90,0x0, 0x4f,0xef,0x12,0x1, +0xd7,0x90,0x0, 0x50,0xef,0x12,0x1, 0xd7,0x90,0x0, 0x82,0x74,0x1, 0x2, 0x1, 0xd7, +0x25,0x2c,0xf8,0xa6,0x7, 0x5, 0x2c,0x22,0x74,0x4f,0x25,0x2c,0xf8,0xe6,0xff,0x22, +0x75,0x12,0x4, 0x75,0x13,0x3, 0x12,0x6b,0x7a,0xa3,0x74,0x62,0xf0,0x12,0x3f,0xf7, +0xf1,0x3e,0x11,0x4e,0x7b,0x1, 0x7a,0x8, 0x79,0x28,0x12,0xe, 0xcb,0xb1,0x85,0x12, +0x24,0xfd,0x51,0xe4,0x90,0x0, 0x1, 0xe0,0x90,0xd, 0xa, 0xf0,0x90,0x0, 0x0, 0xe0, +0x90,0xd, 0x9, 0xf0,0xb1,0xf, 0xb1,0x7e,0xf0,0xa3,0x74,0x8, 0xf0,0x90,0xc, 0x8b, +0xe0,0xb4,0x2, 0xa, 0x74,0x4, 0xf0,0xe4,0x90,0xd, 0x6, 0xf0,0x80,0x2, 0xb1,0x93, +0x90,0xd, 0x7, 0x74,0x3, 0xf0,0xb1,0xf, 0x90,0xd, 0x6, 0xe0,0x70,0x36,0x12,0x0, +0x1e,0x90,0xd, 0x6, 0x74,0x1, 0xf0,0x7f,0x0, 0x7e,0x7c,0x12,0x7, 0x7f,0x75,0x24, +0x1, 0x75,0x25,0x0, 0x75,0x26,0x83,0x75,0x27,0x4, 0x7b,0x1, 0x7a,0x0, 0x79,0x0, +0x51,0xf0,0xe4,0xfd,0xff,0xfe,0x91,0x69,0x7f,0x4, 0x12,0x3f,0xa0,0x90,0xc, 0x8b, +0x74,0x5, 0xb1,0x92,0x90,0xd, 0x7, 0xe0,0x64,0x3, 0x70,0x2f,0x90,0xc, 0x8a,0xe0, +0xff,0xc4,0x13,0x13,0x13,0x54,0x1, 0x30,0xe0,0xac,0x11,0x4e,0xb1,0x8c,0x12,0x24, +0xf4,0x51,0xe4,0xb1,0x7e,0xf0,0xb1,0x85,0xb1,0x9a,0x60,0xfc,0x75,0x12,0x4, 0x75, +0x13,0x3, 0x90,0xc, 0x8a,0xe0,0x54,0x7f,0xf0,0x80,0x8b,0x90,0xd, 0x7, 0xe0,0x90, +0xc, 0xc9,0xf0,0xe4,0xff,0xfd,0xfc,0xe5,0xdb,0x20,0xe1,0xf, 0xf, 0xbf,0xff,0x5, +0xd, 0xbd,0x0, 0x1, 0xc, 0xbc,0x3, 0xef,0xbd,0xe8,0xec,0x53,0xdb,0xfe,0x53,0xdb, +0xfd,0xc2,0xba,0x22,0x53,0xdb,0xfd,0xd2,0xba,0x43,0xdb,0x1, 0x43,0xdb,0x20,0x22, +0x12,0x17,0xdb,0xe4,0xf5,0x44,0xf5,0x45,0x74,0x62,0x25,0x45,0x12,0x6c,0xed,0x5, +0x45,0xe5,0x45,0x70,0x2, 0x5, 0x44,0x64,0xc6,0x45,0x44,0x70,0xeb,0x51,0xc3,0x51, +0xe4,0x85,0x24,0x4b,0x85,0x25,0x4c,0x85,0x26,0x4d,0x12,0x17,0x25,0xb1,0xa9,0x60, +0xf0,0x12,0x5a,0x2a,0xaf,0x1, 0xf5,0x12,0x8f,0x13,0xe4,0xf5,0x2a,0xf5,0x2b,0xe4, +0xf5,0x43,0xe5,0x2b,0x45,0x2a,0x70,0x6, 0x91,0xbd,0xe4,0xf6,0x8, 0xf6,0xe5,0x2b, +0xae,0x2a,0x78,0x5, 0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0x12,0x6b,0x5b,0xff,0x91, +0xbd,0xe6,0xfc,0x8, 0xe6,0xfd,0xd3,0xef,0x9d,0xee,0x9c,0x40,0xf, 0xef,0x94,0x1c, +0xee,0x94,0x25,0x50,0x7, 0x91,0xbd,0xa6,0x6, 0x8, 0xa6,0x7, 0x5, 0x43,0xe5,0x43, +0xb4,0xb, 0xbf,0x5, 0x2b,0xe5,0x2b,0x70,0x2, 0x5, 0x2a,0x64,0x12,0x45,0x2a,0x70, +0xae,0xe4,0xf5,0x46,0xf5,0x47,0xf5,0x2a,0xf5,0x2b,0xe4,0xf5,0x43,0xe5,0x2b,0xae, +0x2a,0x78,0x5, 0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0x12,0x6b,0x5b,0xff,0xd3,0x94, +0x1c,0xee,0x94,0x25,0x40,0xa, 0x5, 0x47,0xe5,0x47,0x70,0x2, 0x5, 0x46,0x80,0x45, +0x91,0xbd,0xe6,0xfc,0x8, 0xe6,0xc3,0x9f,0xf5,0x45,0xec,0x9e,0xf5,0x44,0xe5,0x45, +0xae,0x44,0x78,0x3, 0xce,0xc3,0x13,0xce,0x13,0xd8,0xf9,0xf5,0x45,0x8e,0x44,0xd3, +0x94,0xff,0xe5,0x44,0x94,0x0, 0x40,0x6, 0x75,0x44,0x0, 0x75,0x45,0xff,0x5, 0x47, +0xe5,0x47,0xac,0x46,0x70,0x2, 0x5, 0x46,0x14,0x24,0x62,0xf5,0x82,0x74,0xb, 0x3c, +0xf5,0x83,0xe5,0x45,0xf0,0x5, 0x43,0xe5,0x43,0x64,0xb, 0x70,0x90,0x5, 0x2b,0xe5, +0x2b,0x70,0x2, 0x5, 0x2a,0x64,0x12,0x45,0x2a,0x60,0x2, 0x61,0x8a,0x75,0x28,0xa, +0x75,0x29,0xee,0xe4,0xf5,0x2c,0xf5,0x2a,0xf5,0x2b,0x85,0x29,0x82,0x85,0x28,0x83, +0xe0,0x62,0x2c,0x7e,0x0, 0xe5,0x2b,0x25,0x27,0xff,0xee,0x35,0x2a,0xfe,0x5, 0x29, +0xe5,0x29,0xac,0x28,0x70,0x2, 0x5, 0x28,0x14,0xf5,0x82,0x8c,0x83,0xe0,0xfd,0x91, +0x69,0x5, 0x2b,0xe5,0x2b,0x70,0x2, 0x5, 0x2a,0xc3,0x94,0x3a,0xe5,0x2a,0x94,0x1, +0x40,0xc8,0xad,0x2c,0x7f,0xf0,0x7e,0x3, 0x91,0x69,0xc3,0x74,0xff,0x95,0x2c,0xfd, +0x7f,0xf1,0x7e,0x3, 0x91,0x69,0x7f,0x1, 0x22,0x12,0x6d,0x55,0xab,0x7, 0xaa,0x6, +0xb1,0x4, 0x8a,0xf9,0x8b,0xfa,0x8d,0xfb,0x43,0xfc,0x3, 0x75,0xf8,0x82,0x7f,0xa, +0x91,0xa7,0xd2,0xf8,0x7f,0x4, 0x91,0xa7,0xd2,0xfe,0x7f,0x26,0x91,0xa7,0xc2,0xfe, +0xc2,0xf9,0x7f,0xc, 0x91,0xa7,0xc2,0xf8,0x7f,0x1, 0x91,0xa7,0xb1,0x6, 0xd2,0xaf, +0x22,0x7f,0xfa,0x91,0xa7,0x7f,0xfa,0xae,0x7, 0x1f,0xee,0x60,0xf, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80,0xeb,0x22,0xe5,0x43,0x25, +0xe0,0x24,0x2d,0xf8,0x22,0xad,0x7, 0xaf,0x5, 0x1d,0xef,0x60,0xa, 0x91,0xa1,0x7f, +0xfa,0x91,0xa7,0x91,0xa1,0x80,0xf0,0x22,0xb1,0x0, 0x8c,0xf9,0x8d,0xfa,0x43,0xfc, +0x3, 0x75,0xf8,0x88,0x7f,0x14,0x91,0xa7,0x75,0xf8,0x89,0x7f,0x2d,0x91,0xc5,0xc2, +0xfb,0x7f,0x14,0x91,0xa7,0xc2,0xf8,0x7f,0xa, 0x91,0xa7,0xb1,0x6, 0xd2,0xaf,0x22, +0xad,0x7, 0xac,0x6, 0xc2,0xaf,0x43,0xfc,0x3, 0xe4,0xf5,0xf8,0x22,0xf1,0xf1,0xe4, +0x90,0xa, 0xe7,0xf0,0xa3,0xf0,0x90,0xa, 0xe1,0x74,0xd, 0xf0,0xa3,0x74,0xac,0xf0, +0x22,0x8e,0x21,0x8f,0x22,0x8c,0x23,0x8d,0x24,0x8a,0x25,0x8b,0x26,0xb1,0x8c,0x12, +0x3e,0x52,0xaa,0x21,0xa9,0x22,0x7b,0x1, 0x11,0x54,0xaa,0x23,0xa9,0x24,0x7b,0x1, +0x12,0xe, 0xcb,0xe5,0x22,0x24,0x55,0xf5,0x82,0xe4,0x35,0x21,0xf5,0x83,0x74,0x21, +0xf0,0xaa,0x27,0xa9,0x28,0x7b,0x1, 0x12,0x26,0x3f,0xaa,0x27,0xa9,0x28,0x7b,0x1, +0x12,0x25,0xb, 0x51,0xe4,0xaa,0x25,0xa9,0x26,0x7b,0x1, 0xb1,0xd, 0xaa,0x21,0xa9, +0x22,0x7b,0x1, 0xc0,0x3, 0x8b,0x36,0xf1,0x5b,0xd0,0x3, 0x2, 0x2d,0xb4,0xe4,0x90, +0x0, 0x52,0xf0,0xa3,0x22,0x90,0x0, 0x55,0x74,0x21,0xf0,0x22,0x51,0xc3,0x53,0xdb, +0xf0,0x22,0xf0,0x90,0xd, 0x6, 0x74,0xff,0xf0,0x22,0x75,0x4b,0x1, 0x75,0x4c,0x0, +0x75,0x4d,0x83,0x7b,0x1, 0x7a,0x0, 0x79,0x0, 0xb1,0xaf,0xef,0x64,0xaa,0x22,0x8b, +0x48,0x8a,0x49,0x89,0x4a,0x75,0x51,0x20,0x90,0x0, 0x55,0x12,0x1, 0x65,0xf5,0x59, +0x12,0x17,0xcf,0xf5,0x60,0x12,0x1, 0x4c,0xf5,0x61,0x85,0x60,0x62,0xe5,0x60,0x25, +0xe0,0xf5,0x63,0x12,0x2f,0xf3,0xf5,0x64,0x12,0x62,0x9d,0xef,0x70,0x3, 0x7f,0xaa, +0x22,0xab,0x4b,0xaa,0x4c,0xa9,0x4d,0x90,0x7, 0x9a,0x12,0x5, 0x6c,0xaf,0x1, 0x8a, +0x65,0x8f,0x66,0xaf,0x61,0x7e,0x0, 0xab,0x48,0xe5,0x4a,0x24,0x56,0xf9,0xe4,0x78, +0x6b,0x7c,0x0, 0xf1,0x48,0xaf,0x60,0x7e,0x0, 0xab,0x48,0xe5,0x4a,0x24,0x72,0xf9, +0xe4,0x78,0x87,0x7c,0x0, 0xf1,0x48,0xe5,0x59,0x54,0x3, 0xf5,0x58,0x70,0x2, 0xe1, +0x39,0xf1,0xe5,0xff,0xb4,0x1, 0x8, 0x75,0x4e,0x10,0x75,0x4f,0x60,0x80,0x9, 0xef, +0x70,0x6, 0x75,0x4e,0x10,0x75,0x4f,0x48,0x85,0x4e,0x52,0x85,0x4f,0x53,0xe5,0x4d, +0x24,0x80,0xf9,0xe5,0x4c,0x34,0x3, 0xaf,0x1, 0xf5,0x54,0x8f,0x55,0x85,0x4c,0x56, +0x85,0x4d,0x57,0xe4,0xf5,0x50,0xe5,0x50,0xc3,0x95,0x61,0x40,0x2, 0xe1,0x39,0x85, +0x51,0xf0,0xf1,0x50,0xff,0xae,0xf0,0x25,0x55,0xfd,0xe5,0x54,0x3e,0xf5,0x5a,0x8d, +0x5b,0xe5,0x57,0x2f,0xff,0xe5,0x56,0x3e,0xf5,0x5c,0x8f,0x5d,0xe4,0xfd,0xed,0xc3, +0x95,0x60,0x40,0x2, 0xe1,0x17,0x85,0x4f,0x82,0x85,0x4e,0x83,0xe0,0xf5,0x5e,0xa3, +0xe0,0xf5,0x5f,0x85,0x60,0xf0,0xf1,0x50,0x25,0x66,0xf5,0x82,0xe5,0x65,0x35,0xf0, +0xf5,0x83,0x74,0x87,0x2d,0xf8,0xe6,0xf9,0x25,0x82,0x12,0x2d,0x94,0xe0,0x75,0xf0, +0x8, 0xa4,0xae,0xf0,0x25,0x5f,0xf5,0x5f,0xee,0x35,0x5e,0xf5,0x5e,0xe5,0x64,0x60, +0x34,0x85,0x5d,0x82,0x85,0x5c,0x83,0x74,0x87,0x2d,0xf8,0xe6,0xff,0x75,0xf0,0x2, +0x12,0x5, 0x40,0xe0,0xfa,0xa3,0xe0,0xfb,0xc3,0xe5,0x5f,0x9b,0xfb,0xe5,0x5e,0x9a, +0xfa,0x85,0x5a,0x83,0x85,0x5b,0x82,0x75,0xf0,0x2, 0xef,0x12,0x5, 0x40,0xea,0xf0, +0xa3,0xeb,0xf0,0x80,0x14,0x85,0x5b,0x82,0x85,0x5a,0x83,0x75,0xf0,0x2, 0xe9,0x12, +0x5, 0x40,0xe5,0x5e,0xf0,0xa3,0xe5,0x5f,0xf0,0x74,0x2, 0x25,0x4f,0xf5,0x4f,0xe4, +0x35,0x4e,0xf5,0x4e,0xd, 0xc1,0x7e,0xf1,0xe5,0xff,0xb4,0x1, 0x4, 0x74,0x20,0x80, +0x5, 0xef,0x70,0xb, 0x74,0x48,0x25,0x53,0xf5,0x53,0xe4,0x35,0x52,0xf5,0x52,0x85, +0x52,0x4e,0x85,0x53,0x4f,0x5, 0x50,0xc1,0x56,0x51,0xe4,0x7f,0x0, 0x22,0xe4,0x90, +0xd, 0x10,0xf0,0x90,0xc, 0xe3,0xf0,0x22,0x35,0x49,0xfa,0x7d,0x0, 0x2, 0x1, 0x26, +0x74,0x6b,0x25,0x50,0xf8,0xe6,0xa4,0x22,0x85,0x24,0x36,0x85,0x25,0x37,0x85,0x26, +0x38,0x22,0x12,0x17,0xdb,0x12,0x17,0xea,0x90,0x0, 0x2f,0x12,0x1, 0x65,0x30,0xe0, +0x35,0x12,0x17,0x25,0x90,0x0, 0x4d,0x12,0x2, 0xb7,0xc3,0x94,0x3c,0xe5,0xf0,0x94, +0x0, 0x50,0xc, 0x90,0x0, 0x4d,0xe4,0x75,0xf0,0x1, 0x12,0x2, 0xef,0x80,0x17,0x12, +0x15,0x71,0xb1,0xd, 0xf1,0x58,0x12,0x15,0x25,0x12,0x2d,0xb4,0x90,0xa, 0xec,0x74, +0x5, 0xf0,0xa3,0x74,0xdc,0xf0,0x12,0x17,0xea,0x90,0x0, 0x2f,0x12,0x1, 0x65,0x20, +0xe0,0x32,0x12,0x17,0x25,0x90,0x0, 0x4d,0xe4,0xf5,0xf0,0x12,0x3, 0x5b,0x12,0x40, +0xe2,0xff,0x70,0x8, 0x90,0xa, 0xec,0xf0,0xa3,0xf0,0xc2,0x0, 0x30,0x0, 0x15,0xc2, +0x0, 0xef,0xd3,0x94,0x0, 0x40,0xd, 0x12,0x15,0x71,0xb1,0xd, 0xf1,0x58,0x12,0x15, +0x25,0x12,0x2d,0xb4,0x22,0xab,0x48,0xaa,0x49,0xa9,0x4a,0x90,0x0, 0x82,0x2, 0x1, +0x65,0x90,0xc, 0xc3,0x74,0x30,0xf0,0xa3,0x74,0x1, 0xf0,0x90,0x7, 0xa4,0xe4,0x12, +0x1, 0xd7,0xae,0x2, 0xaf,0x1, 0x8e,0x37,0x8f,0x38,0xe9,0x24,0x60,0xf9,0xea,0x34, +0x7, 0x8b,0x39,0xf5,0x3a,0x89,0x3b,0xe4,0xf5,0x35,0xf5,0x36,0xf5,0x33,0xe4,0xf5, +0x34,0xe5,0x36,0x25,0xe0,0xff,0xe5,0x35,0x33,0xfe,0xe5,0x38,0x2f,0xf5,0x82,0xe5, +0x37,0x11,0x6f,0xe5,0x36,0xae,0x35,0x78,0x3, 0xce,0xc3,0x13,0xce,0x13,0xd8,0xf9, +0xab,0x39,0x25,0x3b,0xf9,0xe5,0x3a,0x3e,0xfa,0x12,0x1, 0x4c,0xff,0x7c,0x0, 0xe5, +0x36,0x12,0x2d,0x78,0x4f,0x12,0x1, 0xc5,0x5, 0x36,0xe5,0x36,0x70,0x2, 0x5, 0x35, +0x5, 0x34,0xe5,0x34,0xb4,0x10,0xba,0x5, 0x33,0xe5,0x33,0xb4,0x1c,0xb0,0x22,0x3e, +0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0x22,0x8d,0x69,0xef,0xc3,0x94,0xa, 0x50,0xa, 0x74, +0x6, 0x2f,0xf5,0x82,0xe4,0x34,0xd, 0x80,0x2c,0xef,0x24,0xf6,0xf5,0x6a,0xc3,0x94, +0x3a,0x74,0x80,0x94,0x81,0x50,0x23,0xe5,0x6a,0xc3,0x94,0x10,0x40,0x15,0xe5,0x6a, +0xd3,0x94,0x22,0x50,0xe, 0x7d,0x78,0xaf,0x69,0x12,0x6, 0xa8,0x11,0xbb,0xf5,0x83, +0xef,0xf0,0x22,0x11,0xbb,0xf5,0x83,0xe5,0x69,0xf0,0x22,0x74,0xee,0x25,0x6a,0xf5, +0x82,0xe4,0x34,0xa, 0x22,0x7b,0x1, 0x7a,0xc, 0x79,0x8a,0xef,0x12,0x1, 0xc5,0x53, +0x7, 0x70,0xef,0xc4,0x54,0xf, 0xff,0xbf,0x4, 0xd, 0x90,0xc, 0xc9,0xe0,0x7d,0x3, +0xb4,0x3, 0x2, 0x80,0xb, 0x80,0xd, 0x90,0xc, 0xc9,0xe0,0x7d,0x1, 0xb4,0x3, 0x4, +0x7f,0x1, 0x80,0x83,0x7f,0x27,0xef,0xd3,0x94,0x3f,0x50,0x27,0xef,0x64,0x26,0x60, +0x22,0xef,0x64,0x28,0x60,0x1d,0xef,0x64,0x23,0x60,0x18,0xef,0x64,0x2f,0x60,0x13, +0x74,0xa2,0x2f,0xf5,0x82,0xe4,0x34,0xc, 0xf5,0x83,0xed,0xf0,0x90,0xc, 0xe2,0xe0, +0x44,0x1, 0xf0,0x22,0x8f,0x67,0x8d,0x68,0xe5,0x67,0x24,0xb3,0x60,0x6d,0x24,0x4d, +0xb4,0x8, 0x0, 0x50,0x74,0x90,0x39,0x3c,0xf8,0x28,0x28,0x73,0x2, 0x39,0x54,0x2, +0x39,0x58,0x2, 0x39,0x6f,0x2, 0x39,0x82,0x2, 0x39,0x87,0x2, 0x39,0x8c,0x2, 0x39, +0x91,0x2, 0x39,0x96,0xaf,0x68,0x1, 0xc5,0x90,0xc, 0x88,0xe5,0x68,0xf0,0xe0,0x75, +0xf0,0x20,0xa4,0xae,0xf0,0x25,0x13,0xf5,0x9, 0xee,0x35,0x12,0xf5,0x8, 0x22,0xe5, +0x68,0xb4,0x4, 0x2, 0x80,0x2d,0xe5,0x68,0x64,0x5, 0x60,0x2, 0x41,0x34,0xfd,0xff, +0x80,0x25,0x90,0xa, 0xee,0x41,0x31,0x90,0xa, 0xef,0x41,0x31,0x90,0xa, 0xf0,0x41, +0x31,0x90,0xa, 0xf1,0x41,0x31,0x90,0xa, 0xf2,0x41,0x31,0xe5,0x68,0x64,0x4, 0x60, +0x2, 0x41,0x34,0x7d,0x4, 0x7f,0x1, 0x1, 0x77,0xe5,0x67,0xc3,0x94,0x50,0x40,0x17, +0xe5,0x67,0xd3,0x94,0x77,0x50,0x10,0x7d,0x78,0xaf,0x68,0x12,0x6, 0xa8,0x74,0xae, +0x25,0x67,0xb1,0x3f,0xef,0xf0,0x22,0xe5,0x67,0xc3,0x94,0x78,0x40,0x14,0xe5,0x67, +0xd3,0x94,0x9f,0x50,0xd, 0x74,0xa2,0x25,0x67,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83, +0x80,0x4f,0xe5,0x67,0xc3,0x94,0xa0,0x40,0x14,0xe5,0x67,0xd3,0x94,0xbe,0x50,0xd, +0x74,0x96,0x25,0x67,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0x80,0x34,0xe5,0x67,0xc3, +0x94,0xbf,0x40,0x14,0xe5,0x67,0xd3,0x94,0xd2,0x50,0xd, 0x74,0x87,0x25,0x67,0xf5, +0x82,0xe4,0x34,0xa, 0xf5,0x83,0x80,0x19,0xe5,0x67,0xc3,0x94,0xd3,0x40,0x15,0xe5, +0x67,0xd3,0x94,0xe1,0x50,0xe, 0x74,0x81,0x25,0x67,0xf5,0x82,0xe4,0x34,0xa, 0xf5, +0x83,0xe5,0x68,0xf0,0x22,0x30,0x95,0x49,0x90,0xc, 0x87,0xe0,0x4, 0xf0,0xe0,0xff, +0xb4,0x1, 0x8, 0x90,0xc, 0xa1,0xe5,0x95,0xf0,0x80,0x29,0x90,0xc, 0x8a,0xe0,0xfe, +0xc4,0x54,0x7, 0x70,0xe, 0x90,0xc, 0xa1,0xe0,0x2f,0x24,0xfe,0xff,0xad,0x95,0xb1, +0x11,0x80,0x11,0xb1,0x47,0xbf,0x4, 0xc, 0x90,0xc, 0x87,0x71,0xa7,0x24,0xfe,0xff, +0xad,0x95,0x31,0x24,0x91,0xfb,0x70,0x4, 0x91,0xab,0x80,0x5, 0xba,0x4, 0x2, 0x71, +0xaf,0x30,0x94,0x15,0x90,0xc, 0x85,0xe0,0x4, 0xf0,0x91,0xfb,0x70,0x4, 0x71,0xa4, +0x81,0xaf,0xba,0x4, 0x4, 0x71,0xa4,0x71,0xb3,0x22,0xb1,0x50,0x15,0x17,0x15,0x17, +0xe5,0x17,0x24,0x3, 0xf8,0xe6,0xfe,0x14,0x60,0x16,0x14,0x60,0x1a,0x24,0xfa,0x50, +0x1a,0x24,0xbb,0x60,0x3c,0x24,0x4d,0x70,0x42,0x90,0xc, 0x8a,0xe0,0xff,0x61,0x94, +0x90,0xc, 0x88,0xe0,0xff,0x61,0x94,0x7f,0xff,0x61,0x94,0xa8,0x17,0x76,0x1, 0x8, +0x76,0xa, 0x8, 0x76,0xee,0xee,0x7e,0x0, 0x24,0xfd,0xf5,0x82,0xee,0x34,0xff,0xf5, +0x83,0xa8,0x17,0x86,0x3, 0x8, 0xe6,0xfa,0x8, 0xe6,0xf9,0x12,0x1, 0x65,0xff,0x61, +0x94,0x90,0xc, 0x8b,0xe0,0xc4,0x54,0xf0,0xff,0x61,0x94,0x71,0x9b,0x94,0x10,0x40, +0x1b,0xef,0x94,0x26,0x50,0x16,0xe5,0x9, 0x2f,0xf5,0x82,0xe4,0x35,0x8, 0xf5,0x83, +0xe5,0x82,0x24,0xf0,0xf5,0x82,0xe5,0x83,0x34,0xff,0x80,0x70,0x71,0x9b,0x94,0x50, +0x40,0x14,0xef,0xd3,0x94,0x77,0x50,0xe, 0x74,0xae,0x2f,0xb1,0x3f,0xe0,0xff,0x7d, +0x78,0x12,0x0, 0x26,0x80,0x5e,0x71,0x9b,0x94,0x78,0x40,0x10,0xef,0xd3,0x94,0x9f, +0x50,0xa, 0x74,0xa2,0x2f,0xf5,0x82,0xe4,0x34,0xa, 0x80,0x40,0x71,0x9b,0x94,0xa0, +0x40,0x10,0xef,0xd3,0x94,0xbe,0x50,0xa, 0x74,0x96,0x2f,0xf5,0x82,0xe4,0x34,0xa, +0x80,0x2a,0x71,0x9b,0x94,0xbf,0x40,0x10,0xef,0xd3,0x94,0xd2,0x50,0xa, 0x74,0x87, +0x2f,0xf5,0x82,0xe4,0x34,0xa, 0x80,0x14,0x71,0x9b,0x94,0xd3,0x40,0x14,0xef,0xd3, +0x94,0xe1,0x50,0xe, 0x74,0x81,0x2f,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0xe0,0xff, +0x80,0x2, 0x7f,0xff,0xe5,0x17,0x24,0x4, 0xf5,0x17,0x22,0xe5,0x17,0x24,0x3, 0xf8, +0xe6,0xff,0xc3,0x22,0x90,0xc, 0x85,0xe0,0xff,0x90,0xc, 0xa1,0xe0,0x2f,0x22,0x90, +0xc, 0xa1,0xe0,0xff,0x51,0x9a,0x8f,0x95,0x22,0xb1,0x50,0xa8,0x17,0x8, 0xe6,0xff, +0xc3,0x94,0x80,0x40,0x10,0xef,0xd3,0x94,0xc3,0x50,0xa, 0x74,0x22,0x2f,0xf5,0x82, +0xe4,0x34,0xc, 0x81,0x88,0xa8,0x17,0x8, 0xe6,0xff,0xc3,0x94,0x3, 0x50,0x2, 0x81, +0x64,0xef,0xd3,0x94,0x3e,0x50,0x7d,0xa8,0x17,0x8, 0xe6,0xfb,0x24,0xfd,0xff,0xe4, +0x34,0xff,0xfe,0x7c,0x0, 0x7d,0x6, 0x12,0x2, 0xb, 0xa8,0x17,0xef,0xf6,0x75,0xf0, +0x6, 0xa4,0xff,0xc3,0xeb,0x9f,0x24,0xfd,0x24,0xfc,0x50,0x7, 0x60,0x28,0x14,0x60, +0x3c,0x80,0x51,0x91,0xea,0xa8,0x17,0xe6,0x25,0xe0,0xff,0xe4,0x33,0xfe,0x8, 0xe6, +0x24,0x2, 0xfd,0xe4,0x33,0xcd,0xc3,0x9f,0xff,0xed,0x9e,0xfe,0xe5,0xb, 0x2f,0xf5, +0x82,0xe5,0xa, 0x3e,0x80,0x52,0x7f,0x0, 0x20,0x1, 0x2, 0x7f,0x1, 0xef,0x75,0xf0, +0xa, 0xa4,0x24,0x8d,0xf5,0x82,0xe4,0x34,0xc, 0xb1,0x4, 0x80,0x3b,0x7f,0x0, 0x20, +0x1, 0x2, 0x7f,0x1, 0xef,0x75,0xf0,0xa, 0xa4,0x24,0x29,0xf5,0x82,0xe4,0x34,0xc, +0xb1,0x4, 0x80,0x24,0xa8,0x17,0x8, 0xe6,0x14,0x60,0x12,0x14,0x60,0x20,0x24,0x6, +0x60,0x2b,0x24,0xfc,0x70,0x2e,0x90,0xc, 0x8a,0xe0,0xff,0x80,0x29,0x91,0xea,0xe5, +0xb, 0x24,0x4, 0xf5,0x82,0xe4,0x35,0xa, 0xf5,0x83,0xe0,0xff,0x80,0x18,0x91,0xea, +0x85,0xb, 0x82,0x85,0xa, 0x83,0xa3,0xa3,0xa3,0xe0,0xff,0x80,0x9, 0x90,0xc, 0xc9, +0xe0,0xff,0x80,0x2, 0x7f,0x0, 0x5, 0x17,0x5, 0x17,0x22,0x90,0xc, 0xa1,0xe0,0xff, +0x71,0xb9,0x8f,0x95,0x22,0xe4,0x90,0xc, 0x89,0xf0,0x90,0xc, 0x85,0xf0,0x90,0xc, +0x8a,0xe0,0xc4,0x54,0x7, 0x70,0x4, 0x91,0xab,0x80,0x7, 0xb1,0x47,0xbf,0x4, 0x2, +0x71,0xaf,0xe4,0x90,0xc, 0x87,0xf0,0x90,0xc, 0x86,0xf0,0x90,0xc, 0x47,0x74,0xaa, +0xf0,0xa3,0xf0,0x90,0xc, 0x61,0xf0,0xa3,0xf0,0x22,0x30,0x1, 0x7, 0x75,0xa, 0xc, +0x75,0xb, 0x47,0x22,0x75,0xa, 0xc, 0x75,0xb, 0x61,0x22,0x90,0xc, 0x8a,0xe0,0xc4, +0x54,0x7, 0xfa,0x22,0xf5,0x83,0xa8,0x17,0xe6,0x25,0x82,0xf5,0x82,0xe4,0x35,0x83, +0x22,0x8f,0x67,0x8d,0x68,0xe5,0x67,0xc3,0x94,0x80,0x40,0xe, 0xe5,0x67,0xd3,0x94, +0xc3,0x50,0x7, 0xe5,0x67,0x24,0x80,0xff,0x80,0x12,0xe5,0x67,0x24,0x4, 0x60,0x8, +0x24,0xfc,0x70,0xa, 0xaf,0x68,0x1, 0xc5,0xad,0x68,0x7f,0x27,0x11,0xf6,0x22,0xf5, +0x82,0xe4,0x34,0xa, 0xf5,0x83,0x22,0x90,0xc, 0x8a,0xe0,0xc4,0x54,0x7, 0xff,0x22, +0x15,0x17,0xa8,0x17,0xa6,0x7, 0x15,0x17,0x22,0xe4,0x90,0xc, 0x8a,0xf0,0xb1,0x62, +0x81,0xb5,0x75,0x90,0x4, 0x75,0x93,0xe0,0xd2,0xac,0x53,0xe8,0x3f,0x43,0xe8,0xc0, +0xd2,0xec,0xd2,0xb9,0xc2,0xc1,0x43,0xb9,0x10,0x53,0xa9,0xef,0x22,0xc0,0xe0,0xc0, +0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x0, 0xc0,0x0, 0xc0,0x1, 0xc0,0x2, +0xc0,0x3, 0xc0,0x4, 0xc0,0x5, 0xc0,0x6, 0xc0,0x7, 0xe5,0xc9,0x54,0x3, 0xff,0xbf, +0x1, 0x6, 0x53,0xc9,0xfc,0x43,0xc9,0x2, 0x51,0x35,0x30,0x95,0x2, 0xc2,0x95,0x30, +0x94,0x2, 0xc2,0x94,0x90,0xc, 0x86,0x74,0x1, 0xf0,0xd0,0x7, 0xd0,0x6, 0xd0,0x5, +0xd0,0x4, 0xd0,0x3, 0xd0,0x2, 0xd0,0x1, 0xd0,0x0, 0xd0,0xd0,0xd0,0x82,0xd0,0x83, +0xd0,0xf0,0xd0,0xe0,0x32,0x12,0x35,0xf, 0x12,0x5f,0x20,0x12,0x5d,0x30,0x7f,0x1, +0x12,0x61,0x1c,0xb1,0x59,0xd1,0x52,0x12,0x5e,0xa6,0x90,0xc, 0xc9,0xe0,0x24,0xfd, +0x60,0x14,0x14,0x60,0x16,0x24,0xaf,0x60,0x2f,0x24,0xab,0x60,0x13,0x24,0xa9,0x70, +0xe9,0x12,0x21,0x84,0x80,0xe4,0x12,0x31,0xf0,0x80,0xdf,0x12,0x2f,0xf9,0x80,0xda, +0x12,0x27,0x9d,0x90,0xa, 0xeb,0xe0,0x64,0xaa,0x60,0xcf,0xe4,0x90,0xa, 0xe3,0xf0, +0x90,0xa, 0xeb,0x74,0xaa,0xf0,0x80,0xc2,0x12,0x27,0x9d,0x90,0xa, 0xeb,0xe0,0xb4, +0xaa,0xb8,0x74,0x55,0xf0,0x90,0xd, 0x34,0x12,0x6c,0x67,0xf0,0x90,0xd, 0x34,0x74, +0xff,0xf5,0xf0,0x12,0x2, 0x76,0x45,0xf0,0x70,0xf2,0x12,0x5f,0x23,0x75,0xe9,0xff, +0x80,0x98,0x75,0x43,0x0, 0x75,0x44,0x0, 0x75,0x45,0x2e,0x75,0x46,0x12,0x75,0x47, +0x78,0x7b,0xff,0x7a,0x6, 0x79,0xea,0x12,0x8, 0x0, 0xe4,0xff,0xfe,0xf1,0xdd,0x8f, +0x29,0x90,0xc, 0xc2,0xe0,0x70,0x3, 0x75,0x29,0xff,0xe5,0x29,0xf4,0x60,0x56,0x7f, +0xf0,0x7e,0x3, 0xf1,0xdd,0x8f,0x2a,0x7f,0xf1,0x7e,0x3, 0xf1,0xdd,0x8f,0x2b,0xe5, +0x2a,0xb4,0xff,0x8, 0xe5,0x2b,0xb4,0xff,0x3, 0x75,0x29,0xff,0xe5,0x2a,0x45,0x2b, +0xf4,0x60,0x3, 0x75,0x29,0xff,0xe4,0xf5,0x2b,0xf5,0x2c,0xf5,0x2d,0xe5,0x2d,0x24, +0x4, 0xff,0xe4,0x35,0x2c,0xfe,0xf1,0xdd,0xef,0x62,0x2b,0x5, 0x2d,0xe5,0x2d,0x70, +0x2, 0x5, 0x2c,0xc3,0x94,0x3a,0xe5,0x2c,0x94,0x1, 0x40,0xe1,0xe5,0x2a,0x65,0x2b, +0x60,0x3, 0x75,0x29,0xff,0xe5,0x29,0xf4,0x60,0x2, 0xe1,0x9e,0x90,0xa, 0xee,0x74, +0x12,0xf0,0xa3,0x74,0xb, 0xf0,0x74,0x2, 0x12,0x5c,0xf6,0x74,0x2c,0xf0,0x90,0xa, +0xfc,0x12,0x6d,0x6d,0x12,0x6c,0x64,0xf0,0xe4,0xf5,0x29,0x90,0xa, 0xee,0xe0,0xff, +0xe5,0x29,0xc3,0x9f,0x40,0xc, 0x74,0xfe,0x25,0x29,0x12,0x27,0x41,0x74,0xff,0xf0, +0x80,0x10,0x74,0x2e,0x25,0x29,0xf8,0xe6,0xff,0x74,0xfe,0x25,0x29,0x12,0x27,0x41, +0xef,0xf0,0xe5,0x29,0x90,0x7, 0x7, 0x93,0xff,0x74,0x1a,0x25,0x29,0xf5,0x82,0xe4, +0x34,0xb, 0x12,0x6b,0x71,0xb4,0x1c,0xc3,0xe4,0xf5,0x29,0xe5,0x29,0x90,0x7, 0x33, +0x93,0xff,0x74,0x46,0x25,0x29,0xf5,0x82,0xe4,0x34,0xb, 0x12,0x6b,0x71,0xb4,0xe, +0xea,0xe4,0xf5,0x29,0xe5,0x29,0x90,0x7, 0x23,0x93,0xff,0x74,0x36,0x25,0x29,0xf5, +0x82,0xe4,0x34,0xb, 0x12,0x6b,0x71,0xb4,0x10,0xea,0xe4,0xf5,0x29,0xe5,0x29,0x90, +0x7, 0x41,0x93,0xff,0x74,0x54,0x25,0x29,0xf5,0x82,0xe4,0x34,0xb, 0x12,0x6b,0x71, +0xb4,0x8, 0xea,0xe4,0xf5,0x2c,0xf5,0x2d,0x74,0x62,0x25,0x2d,0x12,0x6c,0xed,0x5, +0x2d,0xe5,0x2d,0x70,0x2, 0x5, 0x2c,0x64,0xc6,0x45,0x2c,0x70,0xeb,0x22,0x7f,0x4, +0x8f,0x40,0x75,0x41,0xa, 0x75,0x42,0xee,0xe4,0xf5,0x43,0xf5,0x44,0x7e,0x0, 0xe5, +0x44,0x25,0x40,0xff,0xee,0x35,0x43,0xfe,0xf1,0xdd,0x5, 0x42,0xe5,0x42,0xac,0x41, +0x70,0x2, 0x5, 0x41,0x14,0xf5,0x82,0x8c,0x83,0xef,0xf0,0x5, 0x44,0xe5,0x44,0x70, +0x2, 0x5, 0x43,0xc3,0x94,0x3a,0xe5,0x43,0x94,0x1, 0x40,0xd1,0x22,0x12,0x6d,0x55, +0x12,0x35,0x0, 0x8c,0xf9,0x8d,0xfa,0x43,0xfc,0x3, 0x75,0xf8,0xe0,0xaf,0xfb,0x43, +0xfc,0x3, 0xf5,0xf8,0xd2,0xaf,0x22,0x90,0xd, 0x7, 0x74,0x3, 0xf0,0xe4,0x90,0xd, +0xe, 0x2, 0x35,0x92,0x12,0x17,0xdb,0x11,0xe8,0xc3,0x94,0x2, 0x50,0x2, 0x1, 0xe1, +0x12,0x17,0x25,0x12,0x4f,0x52,0xff,0x12,0x1, 0x4c,0xf1,0x9e,0xd1,0xb5,0xd8,0xfc, +0xf5,0x29,0x90,0x0, 0x3, 0x12,0x1, 0x65,0xff,0x12,0x17,0xcf,0xf1,0x9e,0xd1,0xb5, +0xd8,0xfc,0xf5,0x2a,0x12,0x15,0x71,0x12,0x2f,0xbe,0xe5,0x29,0x12,0x2f,0xda,0xe5, +0x2a,0xb1,0x31,0xc3,0x94,0xd4,0xe5,0xf0,0x64,0x80,0x94,0x7e,0x50,0x2, 0x1, 0xe1, +0xe4,0xf5,0x27,0x12,0x17,0x25,0x11,0xe8,0xff,0xe5,0x27,0xc3,0x9f,0x40,0x2, 0x1, +0xe1,0x75,0xf0,0x2, 0xe5,0x27,0x12,0x15,0x93,0x12,0x1, 0x65,0xf5,0x29,0x12,0x5b, +0x54,0xea,0x12,0x17,0xcc,0xf5,0x2a,0xe4,0xf5,0x28,0x12,0x17,0x25,0x11,0xe8,0xff, +0xe5,0x28,0xc3,0x9f,0x50,0x57,0xe5,0x27,0x65,0x28,0x60,0x4d,0x75,0xf0,0x2, 0xe5, +0x28,0x12,0x15,0x93,0x12,0x1, 0x65,0xff,0xc3,0xe5,0x29,0x12,0x4e,0x23,0xf1,0xb1, +0x40,0x16,0xe5,0x28,0x75,0xf0,0x2, 0x12,0x1c,0x1c,0x12,0x17,0xcf,0xff,0xc3,0xe5, +0x2a,0x12,0x4e,0x23,0xf1,0xb1,0x50,0x21,0x12,0x15,0x71,0x90,0x3, 0x80,0xe5,0x29, +0xc3,0x13,0x75,0xf0,0x20,0x12,0x5, 0x40,0xe5,0x2a,0xc3,0x13,0x75,0xf0,0x2, 0x12, +0x5, 0x40,0xe4,0x75,0xf0,0xa0,0x12,0x2, 0xef,0x5, 0x28,0x80,0x9d,0x5, 0x27,0x1, +0x53,0x22,0xab,0x2a,0xaa,0x2b,0xa9,0x2c,0x90,0x0, 0x2d,0x2, 0x1, 0x65,0x12,0x6c, +0xdf,0x11,0xe8,0xf5,0x42,0x12,0x61,0x2, 0xf5,0x43,0xe5,0x42,0xd3,0x94,0x0, 0x50, +0x8, 0xe5,0x43,0x94,0x0, 0x50,0x2, 0x61,0xc2,0x12,0x2f,0xb7,0x90,0x0, 0x82,0x74, +0x1, 0x12,0x1, 0x92,0x12,0x37,0xeb,0x64,0x5, 0x60,0x2, 0x61,0xcf,0x12,0x2f,0xb7, +0x90,0x0, 0x82,0x12,0x1, 0xd7,0x71,0xed,0x60,0x2, 0x41,0x1, 0xb1,0x46,0x60,0x2, +0x41,0x1, 0x90,0x0, 0x83,0xf1,0x88,0xe5,0x42,0x12,0x1, 0xd7,0x90,0x0, 0x81,0xe5, +0x43,0x12,0x1, 0xd7,0xe4,0xf5,0x3c,0xe5,0x42,0x25,0x43,0xff,0xe4,0x33,0xfe,0xc3, +0xe5,0x3c,0x9f,0xee,0x64,0x80,0xf8,0x74,0x80,0x98,0x40,0x2, 0x61,0xcf,0xe5,0x3c, +0xc3,0x95,0x42,0x50,0x2a,0xe5,0x32,0x24,0x30,0xf9,0xe4,0x35,0x31,0xf1,0x81,0x12, +0x1f,0x5a,0xb1,0x3f,0x12,0x2f,0xb7,0x75,0xf0,0x2, 0xe5,0x3c,0x12,0x15,0x93,0xf1, +0x96,0xe5,0x3c,0x75,0xf0,0x2, 0x12,0x1f,0x5a,0xfa,0x90,0x0, 0x1, 0x80,0x40,0xab, +0x30,0xe5,0x32,0x24,0x58,0xf9,0xe4,0x35,0x31,0xfa,0xc3,0xe5,0x3c,0x95,0x42,0xfd, +0xe4,0x94,0x0, 0xfc,0xed,0xae,0x4, 0x78,0x3, 0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9, +0x29,0xf9,0xea,0x3e,0xb1,0x3f,0xed,0x25,0xe0,0xff,0xec,0x33,0xfe,0xab,0x30,0xe5, +0x32,0x2f,0xf9,0xe5,0x31,0x3e,0xfa,0x90,0x0, 0x87,0xf1,0x96,0x90,0x0, 0x88,0x12, +0x1, 0x65,0xc3,0x13,0xf5,0x40,0x71,0xd7,0xa3,0xe5,0x41,0xf0,0x71,0xd7,0xe5,0x40, +0xf0,0x71,0xf3,0x74,0x1, 0xf0,0x12,0x2e,0x55,0x12,0x2f,0xbe,0xe5,0x41,0x12,0x2f, +0xda,0xe5,0x40,0xb1,0x31,0xff,0x71,0xd7,0xa3,0xa3,0x12,0x2d,0x11,0x5, 0x3c,0x21, +0x47,0xb1,0x46,0x71,0xec,0x2f,0xf5,0x3d,0xe4,0xf5,0x3c,0xb1,0x46,0x71,0xec,0x12, +0x6c,0xd, 0xf8,0x74,0x80,0x98,0x40,0x2, 0x61,0x5d,0xe5,0x3c,0xc3,0x9d,0x50,0x7, +0xf1,0x7b,0x12,0x1f,0x5a,0x80,0x12,0x12,0x2f,0xb7,0x71,0xed,0x12,0x6b,0xff,0xc3, +0x33,0xce,0x33,0xce,0xd8,0xf9,0x12,0x6c,0x29,0xb1,0x3f,0xf1,0xd2,0x71,0xd6,0xa3, +0xe0,0x75,0xf0,0x20,0x71,0xd0,0xe0,0x12,0x15,0x90,0x12,0x2, 0xb7,0xf5,0x3f,0x85, +0xf0,0x3e,0x71,0xf3,0xe0,0x70,0x4, 0x15,0x3d,0x61,0x59,0xe4,0xf5,0x47,0xf5,0x46, +0xf1,0x8f,0x12,0x1, 0x4c,0xff,0xe5,0x46,0xc3,0x9f,0x40,0x2, 0x61,0x11,0x71,0xd7, +0xa3,0xe0,0xff,0x65,0x46,0x70,0x2, 0x61,0xd, 0xf1,0xd2,0xfa,0x75,0xf0,0x20,0xef, +0x71,0xd0,0xe0,0x12,0x15,0x90,0x12,0x2, 0xb7,0xfd,0xac,0xf0,0x71,0xd7,0xa3,0xe0, +0x75,0xf0,0x10,0xa4,0xff,0x71,0xd7,0xe0,0x12,0x6a,0x8e,0x71,0xe5,0xaa,0x34,0xa9, +0x35,0xb1,0x37,0x2d,0xfd,0xec,0x35,0xf0,0xfc,0xc0,0x4, 0xc0,0x5, 0x12,0x2f,0xbe, +0xe5,0x46,0x12,0x5, 0x40,0xc0,0x83,0xc0,0x82,0x71,0xd7,0xe0,0xff,0xd0,0x82,0xd0, +0x83,0x75,0xf0,0x2, 0xb1,0x31,0xfd,0xac,0xf0,0xef,0xfb,0x7a,0x0, 0xe5,0x46,0x75, +0xf0,0x10,0xa4,0x2b,0xff,0xea,0x35,0xf0,0x71,0xe5,0xab,0x33,0xaa,0x34,0xb1,0x37, +0x2d,0xff,0xec,0x35,0xf0,0xfe,0xc3,0xd0,0xe0,0x9f,0xff,0xd0,0xe0,0x9e,0xfe,0x12, +0x2f,0xb7,0x71,0xed,0xfd,0xe5,0x3c,0xc3,0x9d,0x50,0x12,0xd1,0xf3,0x12,0x2, 0x8c, +0xfd,0xd3,0xef,0x9d,0xe5,0xf0,0x12,0x6a,0x39,0x40,0x2, 0x5, 0x47,0x5, 0x46,0x41, +0x60,0xf1,0x8f,0x12,0x1, 0x4c,0xc3,0x13,0xff,0xe5,0x47,0xc3,0x9f,0x40,0x11,0x12, +0x2e,0x55,0x90,0x7, 0x9d,0x12,0x1, 0x65,0x64,0x6, 0x60,0x4, 0x71,0xf3,0xe4,0xf0, +0x71,0xd7,0xa3,0x12,0x56,0x76,0xc3,0xe5,0x3f,0x9f,0xff,0xe5,0x3e,0x9e,0xfe,0x12, +0x0, 0x6, 0x8e,0x3e,0x8f,0x3f,0xf1,0xc6,0xff,0xd3,0xe5,0x3f,0x9f,0x74,0x80,0xf8, +0x65,0x3e,0x98,0x40,0x4, 0x71,0xf3,0xe4,0xf0,0x5, 0x3c,0x41,0xb, 0xe5,0x3d,0x70, +0x8, 0x12,0x2f,0xb7,0x90,0x0, 0x80,0x80,0x63,0x12,0x2f,0xb7,0x90,0x0, 0x83,0x12, +0x1, 0x65,0xc3,0x94,0xc, 0x40,0x40,0xe4,0xf5,0x3c,0xb1,0x46,0x71,0xec,0x12,0x6c, +0xd, 0xf8,0x74,0x80,0x98,0x50,0x48,0xe5,0x3c,0xc3,0x9d,0x50,0x7, 0xf1,0x7b,0x12, +0x1f,0x5a,0x80,0x12,0x12,0x2f,0xb7,0x71,0xed,0x12,0x6b,0xff,0xc3,0x33,0xce,0x33, +0xce,0xd8,0xf9,0x12,0x6c,0x29,0xb1,0x3f,0x71,0xf3,0xe0,0xb4,0x1, 0x5, 0x71,0xf3, +0x74,0x2, 0xf0,0x5, 0x3c,0x80,0xc3,0x12,0x2f,0xb7,0x90,0x0, 0x83,0x74,0x1, 0x2, +0x1, 0x92,0x12,0x2f,0xb7,0x90,0x0, 0x83,0xe4,0xf1,0x88,0xe4,0x12,0x61,0x8, 0x22, +0xa4,0x29,0xf9,0xe5,0xf0,0x3a,0xfa,0x85,0x45,0x82,0x85,0x44,0x83,0xa3,0x22,0xaf, +0x3c,0xef,0x33,0x95,0xe0,0xfe,0xef,0x25,0xe0,0xff,0xee,0x22,0xff,0x90,0x0, 0x80, +0x2, 0x1, 0x65,0xe5,0x45,0x24,0x7, 0xf5,0x82,0xe4,0x35,0x44,0xf5,0x83,0x22,0x12, +0x17,0xdb,0xe4,0xf5,0x24,0xe4,0xf5,0x25,0x12,0x17,0x25,0x12,0x2f,0xbe,0xe5,0x25, +0xb1,0x29,0xc3,0x94,0xc4,0xd1,0xbc,0x40,0x2, 0xa1,0x4, 0xe4,0xf5,0x27,0x85,0x25, +0x26,0xb1,0x1b,0xd1,0xaf,0xf1,0xa7,0x50,0x5, 0x75,0x27,0x1, 0x80,0xb, 0xe5,0x26, +0xd3,0x94,0x0, 0x40,0x4, 0x15,0x26,0x80,0xe8,0xe5,0x27,0x70,0x1d,0xe5,0x25,0x4, +0xf5,0x26,0xe5,0x26,0xc3,0x94,0x12,0x50,0x11,0xb1,0x1b,0xd1,0xaf,0xf1,0xa7,0x50, +0x5, 0x75,0x27,0x1, 0x80,0x4, 0x5, 0x26,0x80,0xe8,0xe5,0x27,0x64,0x1, 0x60,0x2, +0xa1,0x4, 0x12,0x17,0x25,0x12,0x2f,0xbe,0xe5,0x25,0xb1,0x29,0xd1,0xcb,0x71,0xe5, +0x33,0xaa,0x22,0xb1,0x38,0xae,0xf0,0x2d,0xf5,0x29,0xec,0x3e,0xf5,0x28,0xb1,0x21, +0xfd,0xac,0xf0,0xe5,0x26,0xd1,0xd0,0x71,0xe5,0x33,0xaa,0x22,0xb1,0x38,0xae,0xf0, +0x2d,0xf5,0x2b,0xec,0x3e,0xf5,0x2a,0xe5,0x26,0xf1,0xbb,0x35,0xf0,0x71,0xe5,0xb1, +0x37,0xd1,0xcb,0x71,0xe5,0x33,0xaa,0x22,0xb1,0x38,0x12,0x6c,0xa2,0xc0,0x6, 0xc0, +0x7, 0xc3,0xe5,0x29,0x95,0x2b,0xff,0xe5,0x28,0x95,0x2a,0xfe,0x12,0x0, 0x6, 0xd0, +0x5, 0xd0,0x4, 0xd3,0xef,0x9d,0xec,0x12,0x6a,0x39,0x40,0x38,0xab,0x21,0xe5,0x23, +0x24,0x60,0xf9,0xe5,0x22,0x34,0x7, 0xfa,0xe5,0x25,0xf1,0xbb,0x35,0xf0,0xfe,0xef, +0x78,0x3, 0xd1,0xb5,0xd8,0xfc,0x12,0xe, 0xc3,0xff,0xe5,0x25,0xc4,0x54,0xf0,0x25, +0x24,0x54,0x7, 0xfe,0x74,0x1, 0xa8,0x6, 0x8, 0x80,0x2, 0xc3,0x33,0xd8,0xfc,0xf4, +0x5f,0x12,0x1, 0xc5,0x5, 0x25,0xe5,0x25,0xc3,0x94,0x12,0x50,0x2, 0x81,0x8, 0x5, +0x24,0xe5,0x24,0xc3,0x94,0xb, 0x50,0x2, 0x81,0x5, 0x22,0xab,0x21,0xaa,0x22,0xa9, +0x23,0x90,0x3, 0x80,0x75,0xf0,0x20,0xe5,0x26,0x12,0x5, 0x40,0x75,0xf0,0x2, 0xe5, +0x24,0x12,0x5, 0x40,0x2, 0x2, 0xb7,0x33,0x8f,0x82,0xf5,0x83,0x2, 0x2, 0xb7,0xaf, +0x1, 0xf5,0x44,0x8f,0x45,0x22,0xab,0x30,0xaa,0x31,0xa9,0x32,0x90,0x0, 0x81,0x2, +0x1, 0x65,0x12,0x17,0xdb,0xe4,0xf5,0x2b,0xf5,0x2c,0x12,0x15,0x71,0x11,0xe8,0x60, +0x8, 0x90,0x0, 0x2e,0x12,0x1, 0x65,0x60,0x3, 0x7f,0x0, 0x22,0x12,0x1, 0x4c,0xc3, +0x13,0xf5,0x28,0x12,0x17,0xcf,0xc3,0x13,0xf5,0x29,0xe4,0xf5,0x2a,0xf5,0x27,0x12, +0x17,0x25,0x12,0x2f,0xd2,0xe5,0x27,0xb1,0x31,0xd1,0xaf,0xd3,0xef,0x94,0x14,0xee, +0x64,0x80,0x94,0x80,0x40,0x2, 0x5, 0x2a,0xd1,0xc3,0x40,0xe3,0xe5,0x2a,0xd3,0x94, +0x7, 0x40,0x7, 0xd1,0xdd,0xee,0x35,0x2b,0xf5,0x2b,0xe4,0xf5,0x2a,0xe5,0x28,0xd3, +0x94,0x0, 0x40,0x38,0xe4,0xf5,0x27,0x12,0x17,0x25,0x12,0x2f,0xd2,0xe5,0x27,0xb1, +0x31,0xd1,0xaf,0xc0,0x6, 0xc0,0x7, 0xe5,0x28,0x75,0xf0,0x20,0xa4,0x24,0x60,0x12, +0x17,0x1d,0x75,0xf0,0x2, 0xe5,0x27,0xb1,0x31,0xd1,0xaf,0xd0,0x5, 0xd0,0x4, 0xd3, +0x12,0x2f,0xe9,0x98,0x40,0x2, 0x5, 0x2a,0xd1,0xc3,0x40,0xcb,0xe5,0x2a,0xd3,0x94, +0x7, 0x40,0x7, 0xd1,0xdd,0xee,0x35,0x2b,0xf5,0x2b,0xe4,0xf5,0x2a,0xe5,0x28,0xc3, +0x94,0x11,0x50,0x38,0xe4,0xf5,0x27,0x12,0x17,0x25,0x12,0x2f,0xd2,0xe5,0x27,0xb1, +0x31,0xd1,0xaf,0xc0,0x6, 0xc0,0x7, 0xe5,0x28,0x75,0xf0,0x20,0xa4,0x24,0xa0,0x12, +0x17,0x1d,0x75,0xf0,0x2, 0xe5,0x27,0xb1,0x31,0xd1,0xaf,0xd0,0x5, 0xd0,0x4, 0xd3, +0x12,0x2f,0xe9,0x98,0x40,0x2, 0x5, 0x2a,0xd1,0xc3,0x40,0xcb,0xe5,0x2a,0xd3,0x94, +0x7, 0x40,0x7, 0xd1,0xdd,0xee,0x35,0x2b,0xf5,0x2b,0xe5,0x29,0xd3,0x94,0x0, 0x40, +0x24,0xe5,0x28,0x75,0xf0,0x20,0x12,0x1c,0x1c,0xe5,0x29,0x75,0xf0,0x2, 0xa4,0x24, +0x7e,0xff,0xe5,0xf0,0x34,0x3, 0x12,0x4e,0x6c,0x12,0x2, 0x8c,0xc3,0x94,0xce,0xd1, +0xbc,0x50,0x2, 0xf1,0xde,0xe5,0x29,0x24,0x1, 0xff,0xe4,0x33,0xfe,0xc3,0xef,0x94, +0x12,0xee,0x64,0x80,0x94,0x80,0x50,0x24,0xe5,0x28,0x75,0xf0,0x20,0x12,0x1c,0x1c, +0xe5,0x29,0x75,0xf0,0x2, 0xa4,0x24,0x82,0xff,0xe5,0xf0,0x34,0x3, 0x12,0x4e,0x6c, +0x12,0x2, 0x8c,0xc3,0x94,0xce,0xd1,0xbc,0x50,0x2, 0xf1,0xde,0xaf,0x2c,0x22,0xff, +0xae,0xf0,0x2, 0x0, 0x6, 0xce,0xa2,0xe7,0x13,0xce,0x13,0x22,0xe5,0xf0,0x64,0x80, +0x94,0x7f,0x22,0x5, 0x27,0xe5,0x27,0xc3,0x94,0xb, 0x22,0xfd,0xac,0xf0,0xe5,0x25, +0x75,0xf0,0x10,0xa4,0x7a,0x0, 0x25,0x24,0xff,0xea,0x35,0xf0,0x22,0xe5,0x2a,0x24, +0xf9,0xff,0xe4,0x34,0xff,0xfe,0x7c,0x0, 0x7d,0xa, 0x12,0x1, 0xf9,0xef,0x25,0x2c, +0xf5,0x2c,0x22,0xab,0x36,0xaa,0x37,0xa9,0x38,0x22,0x8b,0x36,0x8a,0x37,0x89,0x38, +0x90,0x0, 0x19,0x12,0x1, 0x65,0xfd,0x7f,0x6, 0xf1,0x5d,0xd1,0xf3,0x90,0x0, 0x1a, +0x12,0x1, 0x65,0xfd,0x7f,0xa, 0xf1,0x5d,0xf1,0xc6,0xfd,0x7f,0x8, 0xf1,0x5d,0xd1, +0xf3,0x90,0x0, 0x1c,0x12,0x1, 0x65,0xfd,0x7f,0xc, 0xf1,0x5d,0xd1,0xf3,0x90,0x0, +0x1d,0x12,0x1, 0x65,0xfd,0x7f,0x2a,0xf1,0x5d,0x12,0x2f,0xc6,0xfd,0x7f,0x2e,0xf1, +0x5d,0xe4,0xfd,0x7f,0x1c,0xf1,0x5d,0xd1,0xf3,0x90,0x0, 0x21,0x12,0x1, 0x65,0xfd, +0x7f,0x2, 0xf1,0x5d,0x90,0x0, 0x22,0x12,0x6b,0x10,0xfd,0x7f,0x4, 0x12,0x62,0x3b, +0xef,0x44,0x40,0xf5,0xa1,0xe5,0xdb,0x30,0xe3,0xfb,0x53,0xdb,0xf3,0x8d,0xa1,0xe5, +0xdb,0x30,0xe3,0xfb,0x53,0xdb,0xf3,0x43,0xab,0x4, 0x22,0xe9,0x24,0x30,0xf9,0xe4, +0x3a,0xfa,0xe5,0x3c,0x75,0xf0,0x8, 0x22,0x12,0x1, 0xd7,0x90,0x0, 0x80,0x22,0xab, +0x39,0xaa,0x3a,0xa9,0x3b,0x22,0x12,0x1, 0x65,0xc3,0x13,0xf5,0x41,0x22,0x2f,0xff, +0xe4,0x33,0xfe,0xef,0x78,0x4, 0x22,0xc3,0xef,0x94,0x19,0xee,0x64,0x80,0x94,0x80, +0x22,0xd3,0xef,0x94,0x4, 0xee,0x64,0x80,0x94,0x80,0x22,0x75,0xf0,0x10,0xa4,0x7c, +0x0, 0x25,0x24,0xff,0xec,0x22,0xab,0x36,0xaa,0x37,0xa9,0x38,0x90,0x0, 0x20,0x2, +0x1, 0x65,0xab,0x33,0xe5,0x35,0x24,0x80,0xf9,0xe5,0x34,0x34,0x3, 0x22,0x74,0xa, +0x25,0x2c,0xf5,0x2c,0xe4,0x35,0x2b,0xf5,0x2b,0x22,0x8f,0x33,0x8b,0x34,0x8a,0x35, +0x89,0x36,0x74,0x3d,0x2f,0x12,0x48,0xa3,0xe0,0xff,0x60,0x35,0x12,0x1, 0x4c,0xd1, +0x22,0xd3,0xef,0x94,0xf, 0xee,0x64,0x80,0x94,0x80,0x40,0x17,0x11,0x95,0xe0,0xfe, +0xef,0xd3,0x9e,0x74,0x3d,0x40,0x7, 0x11,0xa1,0xe0,0x4, 0xf0,0x80,0x5, 0x11,0xa1, +0xe0,0x14,0xf0,0x11,0x9f,0xe0,0xab,0x34,0xaa,0x35,0xa9,0x36,0x12,0x1, 0xc5,0x80, +0x4, 0x11,0x95,0xef,0xf0,0xab,0x37,0xaa,0x38,0xa9,0x39,0x12,0x1, 0x4c,0xff,0x60, +0x39,0x11,0x89,0xe0,0xfd,0xc3,0xef,0x9d,0xd1,0x24,0xd3,0xef,0x94,0x20,0xee,0x64, +0x80,0x94,0x80,0x40,0x19,0x11,0x7f,0xe0,0xfe,0xef,0xd3,0x9e,0x74,0x7b,0x40,0x8, +0x11,0x8b,0xe0,0x24,0x10,0xf0,0x80,0x6, 0x11,0x8b,0xe0,0x24,0xf0,0xf0,0x11,0x89, +0xe0,0xab,0x37,0xaa,0x38,0xa9,0x39,0x2, 0x1, 0xc5,0x11,0x7f,0xef,0xf0,0x22,0xab, +0x37,0xaa,0x38,0xa9,0x39,0x12,0x1, 0x4c,0xff,0x74,0x7b,0x25,0x33,0xf5,0x82,0xe4, +0x34,0xc, 0xf5,0x83,0x22,0xab,0x34,0xaa,0x35,0xa9,0x36,0x12,0x1, 0x4c,0xff,0x74, +0x3d,0x25,0x33,0xf5,0x82,0xe4,0x34,0xc, 0xf5,0x83,0x22,0x12,0x17,0xdb,0xe4,0xf5, +0x2c,0xf5,0x2d,0x12,0x5, 0x4c,0xaf,0x1, 0x8a,0x31,0x8f,0x32,0x12,0x17,0x25,0xb1, +0xfe,0x20,0xe0,0x10,0x13,0x13,0x54,0x3f,0x20,0xe0,0x9, 0xb1,0xfe,0xc3,0x13,0x20, +0xe0,0x2, 0x41,0xee,0x20,0x1, 0x8, 0x75,0x2a,0xc, 0x75,0x2b,0x47,0x80,0x6, 0x75, +0x2a,0xc, 0x75,0x2b,0x61,0xe4,0xf5,0x27,0xe5,0x2b,0x25,0x27,0x51,0xfd,0x74,0xff, +0xf0,0x5, 0x27,0xe5,0x27,0xb4,0x1a,0xf0,0x91,0xcf,0x74,0xaa,0xf0,0xa3,0x91,0xce, +0xa3,0xa3,0x74,0x1a,0xf0,0x12,0x17,0x25,0x90,0x0, 0x49,0x91,0xc7,0x24,0x4, 0x51, +0xfd,0xef,0xf0,0xe4,0xf5,0x29,0xf5,0x27,0x12,0x15,0x71,0x12,0x1, 0x4c,0xff,0xe5, +0x27,0xc3,0x9f,0x40,0x2, 0x41,0x7b,0xe5,0x27,0x12,0x1c,0x19,0x12,0x1f,0x1a,0xff, +0x54,0xf0,0xd3,0x94,0x0, 0x40,0x2, 0x41,0x77,0x12,0x2d,0x86,0xe0,0x64,0x3, 0x70, +0x2, 0x41,0x77,0xe5,0x29,0x25,0xe0,0x25,0xe0,0xf5,0x28,0xf1,0x40,0xf5,0x2e,0x90, +0x0, 0x9, 0x12,0x1, 0x65,0xc4,0x54,0xf0,0xf5,0x2f,0x12,0x1f,0x1a,0xf5,0x30,0x12, +0x15,0x71,0x12,0x1, 0x4c,0xff,0xe5,0x30,0xc3,0x9f,0x50,0x5f,0x12,0x17,0x25,0xb1, +0xfe,0x13,0x13,0x13,0x54,0x1f,0x20,0xe0,0x16,0x75,0x37,0x0, 0x75,0x38,0x0, 0x75, +0x39,0x2f,0x7b,0x0, 0x7a,0x0, 0x79,0x2e,0xaf,0x30,0x12,0x47,0xea,0x80,0x12,0x74, +0x3d,0x25,0x30,0x11,0xa3,0xe0,0xf5,0x2e,0x74,0x7b,0x25,0x30,0x11,0x8d,0xe0,0xf5, +0x2f,0xe5,0x32,0x24,0x23,0xf5,0x82,0xe4,0x35,0x31,0xf5,0x83,0xe5,0x82,0x25,0x30, +0x12,0x2d,0x94,0xe0,0xb4,0x1, 0x14,0x74,0x3d,0x25,0x30,0x11,0xa3,0xe4,0xf0,0x74, +0x7b,0x25,0x30,0x11,0x8d,0xe4,0xf0,0xf5,0x2e,0xf5,0x2f,0xa2,0x1, 0xe4,0xfe,0x33, +0xff,0x90,0xc, 0x8d,0x75,0xf0,0xa, 0xd1,0x3d,0x12,0x2d,0x94,0xe5,0x2e,0xf0,0x90, +0xc, 0x29,0x75,0xf0,0xa, 0xef,0xd1,0x3d,0x12,0x2d,0x94,0xe5,0x2f,0xf0,0xe5,0x27, +0x12,0x1c,0x19,0xd1,0x4, 0xd1,0x17,0x24,0x5, 0xb1,0xe7,0x12,0x1c,0x1f,0xd1,0x4, +0xff,0xe5,0x28,0x24,0x6, 0xb1,0xe7,0x12,0x1c,0x1f,0x90,0x0, 0x5, 0x12,0x2, 0xb7, +0xd1,0x17,0x24,0x7, 0xb1,0xe7,0x12,0x1c,0x1f,0x90,0x0, 0x5, 0x12,0x2, 0xb7,0xff, +0xe5,0x28,0x24,0x8, 0xb1,0xe7,0x12,0x1c,0x1f,0x12,0x1f,0x1a,0xc4,0x54,0xf0,0xff, +0xe5,0x28,0x24,0x7, 0xd1,0x2c,0xb1,0xf6,0x12,0x1c,0x1f,0x12,0x1f,0x1a,0xff,0xf4, +0x60,0x1d,0x12,0x2d,0x86,0xe0,0xff,0x64,0x1, 0x60,0x2, 0x5, 0x2c,0x5, 0x2d,0xef, +0xc4,0x33,0x33,0x54,0xc0,0xff,0xe5,0x28,0x24,0x5, 0xd1,0x2c,0xf0,0x80,0x16,0xe5, +0x28,0x24,0x5, 0xff,0xe4,0x33,0xfe,0xe5,0x2b,0x2f,0xf5,0x82,0xe5,0x2a,0x3e,0xf5, +0x83,0xe0,0x24,0xc0,0xf0,0x5, 0x29,0x5, 0x27,0x21,0x18,0x91,0xcf,0xa3,0xa3,0xa3, +0xe5,0x2c,0x91,0xce,0xa3,0xa3,0xa3,0xe0,0xff,0xe5,0x2d,0xc4,0x54,0xf0,0xfe,0xef, +0x4e,0xf0,0xe5,0x2b,0x24,0x19,0x51,0xfd,0xe4,0xf0,0xf5,0x27,0xe5,0x2b,0x24,0x19, +0x51,0xfd,0xc0,0x83,0xc0,0x82,0xe0,0xff,0xe5,0x2b,0x25,0x27,0x51,0xfd,0xe0,0xfe, +0xef,0x6e,0xd0,0x82,0xd0,0x83,0xf0,0x5, 0x27,0xe5,0x27,0xb4,0x19,0xde,0xb2,0x1, +0x7f,0x1, 0x51,0xf0,0x12,0x17,0x25,0xb1,0xfe,0xff,0x13,0x13,0x54,0x3f,0x30,0xe0, +0x8, 0xaa,0x31,0xa9,0x32,0x7b,0x1, 0xf1,0x8e,0xf1,0x71,0xfa,0x12,0x1, 0x4c,0x54, +0xfe,0x12,0x1, 0xc5,0x54,0xfb,0x12,0x1, 0xc5,0x54,0xfd,0x2, 0x1, 0xc5,0xe4,0xff, +0xef,0x70,0x3, 0xd2,0x98,0x22,0xc2,0x98,0x22,0xe5,0x2b,0x24,0x7, 0xf5,0x82,0xe4, +0x35,0x2a,0xf5,0x83,0x22,0x12,0x17,0xdb,0x75,0x2a,0xc, 0x75,0x2b,0xa2,0x90,0xc, +0xe2,0xe0,0x20,0xe0,0x2, 0x81,0xc6,0x54,0xfe,0xf0,0xf1,0x52,0xff,0x91,0xcf,0xe0, +0x6f,0x60,0x15,0xe0,0xff,0x90,0x0, 0x2, 0x12,0x1, 0xd7,0xef,0x75,0xf0,0x4, 0xa4, +0xff,0xe5,0xf0,0x8f,0xf0,0x12,0x3, 0x3c,0x12,0x17,0x25,0xd1,0x4, 0xff,0x91,0xcf, +0xa3,0xe0,0xfd,0x7c,0x0, 0x6f,0x70,0x2, 0xe5,0xf0,0x60,0x6, 0x90,0x0, 0x3, 0x12, +0x1f,0xaf,0x12,0x15,0x25,0x90,0x0, 0x3, 0x91,0xc7,0x24,0x5, 0x51,0xfd,0xe0,0xfe, +0x6f,0x60,0x12,0xee,0xd1,0xa, 0xe5,0x2b,0x24,0x5, 0x51,0xfd,0xe0,0x75,0xf0,0x20, +0x90,0x0, 0x1, 0xf1,0x68,0x12,0x15,0x25,0xd1,0x10,0x24,0x10,0x51,0xfd,0xe0,0xfe, +0x6f,0x60,0x4, 0xee,0x12,0x1, 0xc5,0x12,0x15,0x25,0xf1,0x60,0xe5,0x2b,0x24,0x2e, +0x51,0xfd,0xe0,0xfd,0x7c,0x0, 0x6f,0x70,0x2, 0xe5,0xf0,0x60,0x6, 0x90,0x0, 0x4, +0x12,0x1f,0xaf,0x12,0x15,0x71,0xd1,0x10,0x24,0x25,0x51,0xfd,0xe0,0xfe,0x6f,0x60, +0x4, 0xee,0x12,0x1, 0xc5,0x12,0x15,0x71,0x12,0x17,0xcf,0xff,0xe5,0x2b,0x24,0x6, +0x51,0xfd,0xe0,0xfe,0x6f,0x60,0x7, 0x90,0x0, 0x1, 0xee,0x12,0x1, 0xd7,0x90,0x0, +0x4, 0x91,0xc7,0x24,0x8, 0x51,0xfd,0xe0,0xfe,0x6f,0x60,0x24,0xee,0xf1,0x46,0xe5, +0x2b,0x24,0x8, 0x51,0xfd,0xe0,0xc3,0x94,0xf, 0x40,0x8, 0xe5,0x2b,0x24,0x8, 0x51, +0xfd,0xe4,0xf0,0xe5,0x2b,0x24,0x8, 0x51,0xfd,0xe0,0x90,0xe, 0x54,0x93,0xd1,0xa, +0x12,0x15,0x71,0x90,0x0, 0x6, 0x91,0xc7,0x24,0x9, 0x51,0xfd,0xe0,0xfe,0x6f,0x60, +0x14,0x90,0x0, 0x6, 0xee,0x12,0x1, 0xd7,0xe5,0x2b,0x24,0x9, 0x51,0xfd,0xe0,0x90, +0x0, 0x5, 0x12,0x1, 0xd7,0x12,0x15,0x71,0xf1,0x40,0xff,0x51,0xf9,0xe0,0xfe,0x6f, +0x60,0x7, 0x90,0x0, 0x8, 0xee,0x12,0x1, 0xd7,0x90,0x0, 0x9, 0x91,0xc7,0x24,0x29, +0x51,0xfd,0xe0,0xfe,0x6f,0x60,0x7, 0x90,0x0, 0x9, 0xee,0x12,0x1, 0xd7,0x90,0x0, +0xa, 0x91,0xc7,0x24,0x24,0x51,0xfd,0xe0,0xfe,0x6f,0x60,0x7, 0x90,0x0, 0xa, 0xee, +0x12,0x1, 0xd7,0xe5,0x2b,0x24,0x32,0x51,0xfd,0xe0,0xff,0xd3,0x94,0x32,0x50,0x6, +0x12,0x15,0x25,0xef,0xf1,0x4c,0xe5,0x2b,0x24,0x33,0x51,0xfd,0xe0,0xff,0xd3,0x94, +0xa, 0x50,0xa, 0x12,0x15,0x25,0x90,0x0, 0x7, 0xef,0x12,0x1, 0xd7,0x12,0x17,0x25, +0x90,0x0, 0xb, 0x12,0x2, 0xb7,0xff,0xe5,0x2b,0x24,0x34,0x51,0xfd,0xe0,0xfd,0x7c, +0x0, 0x6f,0x70,0x2, 0xe5,0xf0,0x60,0x6, 0x90,0x0, 0xb, 0x12,0x1f,0xaf,0x12,0x17, +0x25,0x90,0x0, 0xd, 0x91,0xc7,0x24,0x35,0x51,0xfd,0xe0,0xfe,0x6f,0x60,0x7, 0x90, +0x0, 0xd, 0xee,0x12,0x1, 0xd7,0x22,0x12,0x1, 0x65,0xff,0xe5,0x2b,0x22,0xf0,0x85, +0x2b,0x82,0x85,0x2a,0x83,0x22,0x12,0x17,0xdb,0xe4,0xf5,0x29,0xe5,0x29,0xc3,0x94, +0x5, 0x50,0x13,0xe5,0x26,0x24,0x30,0xf9,0xe4,0x35,0x25,0xfa,0xe5,0x29,0x75,0xf0, +0x8, 0x12,0x1f,0x5a,0x80,0x14,0xe5,0x29,0x75,0xf0,0x8, 0xa4,0x24,0x30,0xff,0xe4, +0x35,0xf0,0xfe,0xe5,0x26,0x2f,0xf9,0xe5,0x25,0x3e,0xaf,0x1, 0xf5,0x2a,0x8f,0x2b, +0x51,0xf9,0xe0,0x64,0x2, 0x60,0x2, 0xa1,0xdc,0x51,0xf9,0xe4,0x91,0xce,0xa3,0xa3, +0xe0,0x24,0xfe,0xf5,0x27,0x91,0xcf,0xa3,0xa3,0xe0,0x24,0x2, 0xff,0xe4,0xad,0x27, +0x12,0x2f,0xe1,0x98,0x40,0x2, 0xa1,0xdc,0x91,0xcf,0xa3,0xe0,0x24,0xfe,0xf5,0x28, +0x91,0xcf,0xa3,0xe0,0x24,0x2, 0xff,0xe4,0xad,0x28,0x12,0x2f,0xe1,0x98,0x40,0x2, +0xa1,0xd8,0xc3,0xe5,0x27,0x64,0x80,0x94,0x80,0x40,0x79,0xe5,0x27,0x64,0x80,0x94, +0x9c,0x50,0x71,0xc3,0xe5,0x28,0x64,0x80,0x94,0x80,0x40,0x68,0xe5,0x28,0x64,0x80, +0x94,0x90,0x50,0x60,0xaf,0x27,0xd1,0x4e,0x78,0x5, 0xc3,0x33,0xce,0x33,0xce,0xd8, +0xf9,0xd1,0x61,0x12,0x2, 0x8c,0xfd,0xaf,0x27,0xd1,0x5a,0xf1,0x87,0xf1,0x58,0xab, +0x28,0xeb,0x33,0x95,0xe0,0xfa,0xef,0x2b,0xff,0xee,0x3a,0x12,0x43,0xe5,0x33,0x12, +0x17,0x25,0x8f,0x82,0xf5,0x83,0xe5,0xf0,0x8d,0xf0,0x12,0x2, 0xef,0xe9,0x24,0x80, +0xf9,0xea,0x34,0x3, 0xfa,0xaf,0x27,0xd1,0x5a,0x78,0x5, 0xc3,0x33,0xce,0x33,0xce, +0xd8,0xf9,0x29,0xf9,0xea,0x3e,0xfa,0xaf,0x28,0x12,0x43,0xe1,0xd1,0x6b,0xe4,0xf5, +0xf0,0x12,0x3, 0x3c,0x5, 0x28,0xa1,0x40,0x5, 0x27,0xa1,0x25,0x5, 0x29,0xe5,0x29, +0x64,0xa, 0x60,0x2, 0x81,0xdc,0x22,0xfd,0xe4,0x33,0xfc,0xe5,0x2b,0x2d,0xf5,0x82, +0xe5,0x2a,0x3c,0xf5,0x83,0xef,0xf0,0xe5,0x27,0x75,0xf0,0x7, 0xa4,0x22,0x90,0x0, +0x4f,0x2, 0x1, 0x65,0x90,0x0, 0x3, 0x2, 0x2, 0xb7,0x90,0x0, 0x3, 0x2, 0x1, 0xd7, +0x12,0x1, 0x4c,0xff,0xe5,0x2b,0x22,0xe5,0xf0,0x54,0xf, 0xff,0xe5,0x28,0x22,0xf5, +0x83,0xe0,0xc3,0x9f,0xff,0xe4,0x94,0x0, 0xfe,0x2, 0x0, 0x6, 0xfd,0xe4,0x33,0xfc, +0xe5,0x2b,0x2d,0xf5,0x82,0xe5,0x2a,0x3c,0xf5,0x83,0xe0,0x2f,0x22,0x12,0x5, 0x40, +0xee,0x75,0xf0,0xa, 0xa4,0x25,0x83,0xf5,0x83,0xe5,0x82,0x25,0x29,0x22,0xab,0x21, +0xe5,0x23,0x24,0x80,0xf9,0xe5,0x22,0x34,0x3, 0xfa,0xef,0x33,0x95,0xe0,0xfe,0xef, +0x22,0x29,0xf9,0xea,0x3e,0xfa,0xed,0x25,0xe0,0xff,0xec,0x33,0xfe,0xe9,0x2f,0xf9, +0xea,0x3e,0xfa,0x22,0x12,0xf, 0xde,0xe4,0xf5,0x39,0xf5,0x3a,0xf1,0x31,0x70,0x2, +0x5, 0x39,0x64,0x92,0x45,0x39,0x70,0xf4,0x12,0x46,0xf3,0xe4,0xf5,0x39,0xf5,0x3a, +0xf1,0x31,0x70,0x2, 0x5, 0x39,0x64,0x52,0x45,0x39,0x70,0xf4,0xe4,0xf5,0x39,0xf5, +0x3a,0xab,0x33,0xe5,0x35,0x24,0xa, 0xf9,0xe4,0x35,0x34,0xfa,0xae,0x39,0xaf,0x3a, +0x7c,0x0, 0x7d,0x7, 0x12,0x1, 0xf9,0xd1,0x6d,0xf1,0x1e,0x24,0x3, 0xf1,0x25,0xd1, +0x6d,0xf1,0x1e,0x24,0x26,0xf1,0x25,0xd1,0x6d,0xf1,0x5, 0x5, 0x3a,0xe5,0x3a,0x70, +0x2, 0x5, 0x39,0xc3,0x94,0x5, 0xe5,0x39,0x94,0x0, 0x40,0xc5,0x12,0x46,0xf3,0x90, +0x0, 0x51,0x74,0x1, 0x12,0x1, 0xd7,0xe4,0xf5,0x10,0xf5,0x11,0xf5,0xf, 0x12,0x35, +0x10,0xe4,0xa3,0xf0,0x90,0xa, 0xeb,0xf0,0xa3,0xf0,0xa3,0xf0,0xc2,0x0, 0x90,0xa, +0xe4,0xf0,0xa3,0xf0,0x22,0x74,0xff,0xf5,0xf0,0x12,0x3, 0x3c,0x90,0x0, 0x2, 0x74, +0xff,0xf5,0xf0,0x12,0x3, 0x5b,0x90,0x0, 0x4, 0x74,0xff,0x2, 0x1, 0xd7,0xf1,0x5, +0xab,0x36,0xe5,0x38,0x22,0xf9,0xe4,0x35,0x37,0xfa,0xae,0x39,0xaf,0x3a,0x2, 0x1, +0xf9,0xe4,0x12,0x1, 0xc5,0x4, 0x29,0xf9,0xe4,0x3a,0xfa,0x5, 0x3a,0xe5,0x3a,0x22, +0x90,0x0, 0x8, 0x2, 0x1, 0x65,0x90,0x0, 0x4, 0x2, 0x1, 0xd7,0x90,0x0, 0x6, 0x2, +0x1, 0xd7,0x90,0x0, 0x2, 0x2, 0x1, 0x65,0xff,0xee,0xc4,0x54,0xf0,0x48,0xfe,0x22, +0x90,0x0, 0x4, 0x12,0x2, 0xb7,0xff,0x22,0xa4,0xff,0xe5,0xf0,0x8f,0xf0,0x2, 0x3, +0x5b,0xab,0x21,0xe5,0x23,0x24,0x4f,0xf9,0xe4,0x35,0x22,0x22,0x24,0x1, 0xff,0xe4, +0x3e,0xa2,0xe7,0x13,0xfe,0xef,0x13,0xc4,0xf8,0x54,0xf, 0xc8,0x68,0x22,0x12,0xf, +0xde,0xe4,0xff,0xab,0x33,0xe5,0x35,0x24,0x28,0xf9,0xe4,0x35,0x34,0xfa,0xef,0xfd, +0x12,0x26,0x2a,0x74,0x3, 0x12,0x1, 0xc5,0xab,0x33,0xe5,0x35,0x24,0x23,0xf9,0xe4, +0x35,0x34,0xf1,0xd5,0x90,0x0, 0x2d,0x12,0x17,0xaa,0x90,0x0, 0x37,0x12,0x17,0xaa, +0xf, 0xbf,0x5, 0xcf,0x12,0x2e,0x55,0x90,0x0, 0x41,0xe4,0x12,0x1, 0xd7,0x90,0x0, +0x42,0xe4,0x2, 0x1, 0xd7,0xfa,0xe9,0x2d,0xf9,0xec,0x3a,0xfa,0x74,0x3, 0x2, 0x1, +0xc5,0x8b,0x49,0x8a,0x4a,0x89,0x4b,0x8d,0x4c,0x90,0xa, 0x44,0x12,0x4, 0xfe,0x0, +0x0, 0x0, 0x0, 0x90,0xa, 0x48,0x12,0x4, 0xfe,0x0, 0x0, 0x0, 0x1, 0x75,0x5d,0x1, +0x75,0x5e,0xa, 0x75,0x5f,0x50,0x12,0x6b,0xc2,0x90,0xa, 0xee,0xe0,0xf5,0x4e,0xa3, +0xe0,0xf5,0x4d,0xe5,0x4c,0x70,0x3a,0xf5,0x4f,0xe5,0x4f,0xc3,0x95,0x4e,0x50,0x1e, +0x11,0xc1,0xc0,0x0, 0xc0,0x1, 0xa3,0xd1,0x71,0x74,0xfe,0x25,0x4f,0x12,0x27,0x41, +0xe0,0xf9,0xf8,0x12,0x4, 0xdf,0xd0,0x1, 0xd0,0x0, 0xd1,0xc5,0x80,0xdb,0xe4,0xf5, +0x4f,0xd1,0x59,0x78,0x8, 0x12,0x4, 0xcc,0xd1,0xd1,0xe5,0x4f,0xb4,0x4, 0xf2,0x80, +0x3d,0xe4,0xf5,0x4f,0xe5,0x4f,0xc3,0x95,0x4d,0x50,0x22,0x11,0xc1,0xc0,0x0, 0xc0, +0x1, 0xa3,0xd1,0x71,0x74,0x50,0x25,0x4f,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0xe0, +0xf9,0xf8,0x12,0x4, 0xdf,0xd0,0x1, 0xd0,0x0, 0xd1,0xc5,0x80,0xd7,0xe4,0xf5,0x4f, +0xd1,0x59,0x78,0x8, 0x12,0x4, 0xcc,0xd1,0xd1,0xe5,0x4f,0xb4,0x2, 0xf2,0xe5,0x4c, +0x70,0x17,0xf5,0x4f,0xf1,0x3e,0x24,0x75,0xf1,0x36,0x12,0x26,0x2a,0xef,0x12,0x1, +0xc5,0x5, 0x4f,0xe5,0x4f,0xb4,0x4, 0xec,0x22,0xe4,0xf5,0x4f,0xf1,0x3e,0x24,0x79, +0xf1,0x36,0x12,0x26,0x2a,0xef,0x12,0x1, 0xc5,0x5, 0x4f,0xe5,0x4f,0xb4,0x2, 0xec, +0x22,0x90,0xa, 0x44,0xe0,0xf8,0xa3,0xe0,0xf9,0xa3,0xe0,0xfa,0xa3,0xe0,0xfb,0x22, +0x12,0x17,0xdb,0xe4,0xf5,0x2d,0xf5,0x2e,0x12,0x6b,0xdc,0xf5,0x37,0xf5,0x38,0xf5, +0x3d,0xf5,0x3e,0x12,0x15,0x25,0x90,0x0, 0x13,0x12,0x2, 0xb7,0xf5,0x45,0x85,0xf0, +0x44,0x90,0x0, 0x22,0x12,0x1, 0x65,0xf5,0x48,0xaa,0x22,0xa9,0x23,0xae,0x2, 0xaf, +0x1, 0x8e,0x49,0x8f,0x4a,0x12,0x6b,0xb8,0xf5,0x3f,0x8f,0x40,0xe5,0x23,0x24,0x60, +0xf9,0xea,0x34,0x7, 0xaf,0x1, 0xf5,0x41,0x8f,0x42,0xe4,0xf5,0x2f,0xe5,0x2f,0xd1, +0x92,0xfa,0x12,0x5d,0xd, 0xe4,0x12,0x1, 0xd7,0x5, 0x2f,0xe5,0x2f,0xb4,0x5, 0xed, +0x12,0x40,0xe2,0x70,0x2, 0xc1,0x43,0xe4,0xf5,0x2f,0x12,0x40,0xe2,0xff,0xe5,0x2f, +0xc3,0x9f,0x40,0x2, 0xa1,0x46,0x12,0x12,0x1e,0x12,0x4, 0xfe,0x0, 0x0, 0x0, 0x0, +0xd1,0xa0,0x12,0x4, 0xfe,0x0, 0x0, 0x0, 0x0, 0xd1,0x80,0x12,0x4, 0xfe,0x0, 0x0, +0x0, 0x0, 0xd1,0xf7,0xf5,0x83,0x12,0x4, 0xfe,0x0, 0x0, 0x0, 0x0, 0x12,0x14,0xda, +0xf1,0x57,0xd3,0xef,0x9d,0xe5,0xf0,0x12,0x6a,0x39,0x40,0x1b,0x12,0x17,0xbf,0xc3, +0x13,0xfd,0x12,0x14,0xf1,0xf1,0x57,0xc3,0xef,0x9d,0xff,0xee,0x95,0xf0,0x90,0xa, +0x95,0xf0,0xa3,0xef,0xf0,0x80,0x7, 0xe4,0x90,0xa, 0x95,0xf0,0xa3,0xf0,0x90,0xa, +0x94,0x74,0x2, 0x12,0x17,0xe9,0xf5,0xf0,0xe5,0x2f,0x12,0x15,0x93,0x12,0x1, 0x65, +0xf1,0x94,0x40,0xa, 0x12,0x15,0x71,0x12,0x1, 0x4c,0xf1,0xc7,0x50,0xb, 0x12,0x15, +0x25,0xf1,0x16,0xc3,0x13,0x90,0xa, 0x94,0xf0,0x12,0x17,0xbf,0xf1,0x94,0x40,0xa, +0x12,0x15,0x71,0x12,0x17,0xcf,0xf1,0xc7,0x50,0xb, 0x12,0x15,0x25,0xf1,0x16,0xc3, +0x13,0x90,0xa, 0x94,0xf0,0x12,0x17,0xbf,0xc3,0x13,0xfd,0x7c,0x0, 0xaa,0x2b,0xa9, +0x2c,0x75,0xf0,0x2, 0xe5,0x2f,0x12,0x15,0x93,0x12,0x1, 0x65,0x12,0x6a,0x1b,0x2d, +0xff,0xec,0x35,0xf0,0xfe,0xe4,0xf5,0x43,0x12,0x15,0xf, 0xf1,0x7b,0x40,0x3, 0x75, +0x43,0x1, 0x12,0x17,0xea,0x75,0xf0,0x2, 0xe5,0x2f,0x12,0x15,0x93,0x12,0x1, 0x65, +0xf1,0x1c,0xfe,0xc3,0xef,0x9e,0xf5,0x2d,0x12,0x17,0xea,0x75,0xf0,0x2, 0xe5,0x2f, +0x12,0x15,0x93,0x12,0x1, 0x65,0xf1,0x1c,0x2f,0xff,0xe4,0x33,0xfe,0xad,0x2d,0xf1, +0x61,0x12,0x2f,0xe9,0x98,0x40,0x2, 0xa1,0x42,0xe5,0x2f,0x12,0x5b,0x56,0xea,0x12, +0x17,0xcc,0xf1,0x1c,0xfe,0xc3,0xef,0x9e,0xf5,0x2e,0x12,0x17,0xbf,0xf1,0x1c,0x2f, +0xff,0xe4,0xad,0x2e,0xf1,0x5f,0x12,0x2f,0xe9,0x98,0x40,0x2, 0xa1,0x3e,0xc3,0xe5, +0x2d,0x64,0x80,0x94,0x80,0x50,0x2, 0xa1,0x3a,0x12,0x15,0x71,0x12,0x1, 0x4c,0xff, +0xad,0x2d,0xf1,0x73,0x9f,0x74,0x80,0xf8,0x6c,0x98,0x40,0x2, 0xa1,0x3a,0xc3,0xe5, +0x2e,0x64,0x80,0x94,0x80,0x50,0x2, 0xa1,0x3a,0x12,0x17,0xcf,0xff,0xad,0x2e,0xf1, +0x73,0x9f,0x74,0x80,0xf8,0x6c,0x98,0x40,0x2, 0xa1,0x3a,0xaf,0x2d,0x12,0x4e,0x5a, +0x12,0x4f,0x87,0x12,0x4f,0x58,0xef,0x2d,0xf5,0x3c,0xee,0x3c,0xf5,0x3b,0x12,0x2f, +0x5c,0xf1,0xe4,0x12,0x2d,0xac,0xff,0xc3,0x95,0x48,0xf5,0x47,0xee,0x94,0x0, 0xf5, +0x46,0xd3,0xe5,0x47,0x94,0x0, 0xe5,0x46,0x64,0x80,0x94,0x80,0x50,0x2, 0xa1,0x3a, +0xef,0x95,0x45,0xee,0x95,0x44,0x40,0xd, 0xe5,0x2f,0xd1,0x92,0xfa,0x90,0x0, 0x10, +0x74,0x1, 0x12,0x1, 0x92,0xe5,0x43,0x64,0x1, 0x70,0x4d,0xe5,0x3c,0xae,0x3b,0x78, +0x3, 0xce,0xc3,0x13,0xce,0x13,0xd8,0xf9,0x25,0x42,0xf5,0x82,0xe5,0x41,0x3e,0xf5, +0x83,0xc0,0x83,0xc0,0x82,0xe0,0xff,0x7c,0x0, 0xe5,0x3c,0x12,0x2d,0x78,0xf4,0xfe, +0xef,0x5e,0xd0,0x82,0xd0,0x83,0xf0,0xd3,0x90,0xa, 0x96,0xe0,0x94,0x0, 0x90,0xa, +0x95,0xe0,0x94,0x0, 0x40,0x12,0xe0,0xfc,0xa3,0xe0,0xfd,0x12,0x2f,0x5c,0xe5,0x4a, +0x2f,0xf5,0x82,0xe5,0x49,0x12,0x6c,0xd6,0xe5,0x2d,0x25,0xe0,0xf5,0x3d,0xe5,0x2e, +0x25,0xe0,0xf5,0x3e,0x12,0x17,0xea,0x75,0xf0,0x2, 0xe5,0x2f,0x12,0x15,0x93,0x12, +0x1, 0x65,0xf1,0x24,0x60,0x76,0x12,0x17,0xbf,0xf1,0x2d,0x60,0x6f,0x12,0x12,0x1e, +0xc0,0x83,0xc0,0x82,0x11,0xc4,0xc0,0x0, 0xc0,0x1, 0xc0,0x2, 0xc0,0x3, 0xd1,0xda, +0xd0,0x3, 0xd0,0x2, 0xd0,0x1, 0xd0,0x0, 0xeb,0x2f,0xd1,0x4f,0xfc,0xd0,0x82,0xd0, +0x83,0xd1,0xf4,0xf5,0x83,0xc0,0x83,0xc0,0x82,0x11,0xc4,0xd1,0x44,0xfc,0xd0,0x82, +0xd0,0x83,0x12,0x4, 0xf2,0xd1,0xa0,0xc0,0x83,0xc0,0x82,0x11,0xc4,0xc0,0x0, 0xc0, +0x1, 0xc0,0x2, 0xc0,0x3, 0xf1,0xa3,0xd1,0xea,0xd0,0x3, 0xd0,0x2, 0xd0,0x1, 0xd0, +0x0, 0xeb,0x2f,0xd1,0x4f,0xfc,0xd0,0x82,0xd0,0x83,0x12,0x4, 0xf2,0xe5,0x2f,0x25, +0xe0,0x25,0xe0,0x24,0x6c,0xf5,0x82,0xe4,0x34,0xa, 0xa1,0x21,0xe4,0xf5,0x39,0xf5, +0x3a,0x12,0x40,0xe2,0xff,0xc3,0xe5,0x3a,0x9f,0x74,0x80,0xf8,0x65,0x39,0x98,0x50, +0x4a,0xe5,0x2f,0x65,0x3a,0x70,0x2, 0xe5,0x39,0x60,0x36,0xf1,0x68,0xf1,0x50,0xf1, +0x24,0x60,0xd, 0xf1,0xb4,0x12,0x17,0xce,0xf1,0x2d,0x60,0x4, 0x74,0xff,0x80,0x1b, +0xf1,0x68,0x12,0x17,0xea,0xf1,0x50,0xfd,0x7b,0x4, 0xf1,0x27,0x60,0x13,0xf1,0xb4, +0x12,0x17,0xce,0xfd,0x7b,0x4, 0xf1,0x30,0x60,0x7, 0xe4,0xf5,0x39,0xf5,0x3a,0x80, +0xa, 0x5, 0x3a,0xe5,0x3a,0x70,0x2, 0x5, 0x39,0x80,0xa6,0xe5,0x3a,0x45,0x39,0x70, +0x7c,0xd1,0xa0,0xc0,0x83,0xc0,0x82,0x11,0xc4,0xc0,0x0, 0xc0,0x1, 0xc0,0x2, 0xc0, +0x3, 0xae,0x46,0xaf,0x47,0xf1,0xf, 0xf1,0x86,0xaf,0x2d,0xd1,0xea,0xd0,0x3, 0xd0, +0x2, 0xd0,0x1, 0xd0,0x0, 0xeb,0x2f,0xd1,0x4f,0xfc,0xd0,0x82,0xd0,0x83,0x12,0x12, +0x1b,0xc0,0x83,0xc0,0x82,0x11,0xc4,0xc0,0x0, 0xc0,0x1, 0xc0,0x2, 0xc0,0x3, 0xae, +0x46,0xaf,0x47,0xf1,0xf, 0xf1,0x86,0xd1,0xe8,0xd0,0x3, 0xd0,0x2, 0xd0,0x1, 0xd0, +0x0, 0xeb,0x2f,0xd1,0x4f,0xfc,0xd0,0x82,0xd0,0x83,0xd1,0x7d,0xc0,0x83,0xc0,0x82, +0x11,0xc4,0xf1,0x5, 0xeb,0x2f,0xd1,0x4f,0xfc,0xd0,0x82,0xd0,0x83,0xd1,0xf4,0xf5, +0x83,0xc0,0x83,0xc0,0x82,0x11,0xc4,0xf1,0x5, 0xeb,0x2f,0x80,0x73,0xe5,0x3a,0xf4, +0x70,0x3, 0xe5,0x39,0xf4,0x60,0x73,0xd1,0xa0,0xc0,0x83,0xc0,0x82,0x11,0xc4,0xc0, +0x0, 0xc0,0x1, 0xc0,0x2, 0xc0,0x3, 0xf1,0xa3,0xd1,0xea,0xd0,0x3, 0xd0,0x2, 0xd0, +0x1, 0xd0,0x0, 0xeb,0x2f,0xd1,0x4f,0xfc,0xd0,0x82,0xd0,0x83,0x12,0x12,0x1b,0xc0, +0x83,0xc0,0x82,0x11,0xc4,0xc0,0x0, 0xc0,0x1, 0xc0,0x2, 0xc0,0x3, 0xd1,0xda,0xd0, +0x3, 0xd0,0x2, 0xd0,0x1, 0xd0,0x0, 0xeb,0x2f,0xd1,0x4f,0xfc,0xd0,0x82,0xd0,0x83, +0xd1,0x7d,0xc0,0x83,0xc0,0x82,0x11,0xc4,0xd1,0x44,0xfc,0xd0,0x82,0xd0,0x83,0xd1, +0xf4,0xf5,0x83,0xc0,0x83,0xc0,0x82,0x11,0xc4,0xae,0x46,0xf1,0xf, 0xeb,0x25,0x47, +0xd1,0x4f,0xfc,0xd0,0x82,0xd0,0x83,0x12,0x4, 0xf2,0x5, 0x2e,0x41,0x5a,0x5, 0x2d, +0x41,0x28,0x5, 0x2f,0x21,0x3a,0xe4,0xf5,0x2f,0x12,0x40,0xe2,0xff,0xe5,0x2f,0xc3, +0x9f,0x40,0x2, 0xc1,0x38,0x12,0x14,0xda,0xf1,0x7b,0x50,0x2, 0xc1,0x34,0x12,0x12, +0x1e,0xc0,0x83,0xc0,0x82,0xd1,0x71,0x78,0x6, 0x12,0x4, 0xdf,0xd0,0x82,0xd0,0x83, +0xd1,0xf4,0xf5,0x83,0x11,0xc4,0x12,0x12,0x1e,0xd1,0x71,0x12,0x4, 0x13,0xef,0x24, +0x20,0xf5,0x31,0xe4,0x3e,0xf5,0x30,0xd1,0xa0,0xc0,0x83,0xc0,0x82,0xd1,0x71,0x78, +0x6, 0x12,0x4, 0xdf,0xd0,0x82,0xd0,0x83,0xd1,0x7d,0x11,0xc4,0xd1,0xa0,0xd1,0x71, +0x12,0x4, 0x13,0xef,0x24,0x20,0xf5,0x35,0xe4,0x3e,0xf5,0x34,0xd1,0x90,0xfa,0x90, +0x0, 0xa, 0xe5,0x30,0x85,0x31,0xf0,0x12,0x3, 0x5b,0x90,0x0, 0xc, 0xe5,0x34,0x85, +0x35,0xf0,0x12,0x3, 0x5b,0xd1,0x80,0xc0,0x83,0xc0,0x82,0xe0,0xfc,0xa3,0xe0,0xfd, +0xa3,0x12,0x15,0x20,0x90,0x0, 0x12,0x12,0x1, 0x65,0xf9,0xf8,0x12,0x4, 0xcc,0xd0, +0x82,0xd0,0x83,0xd1,0x7d,0xd1,0x71,0xe4,0x7b,0x7f,0xfa,0xf9,0xf8,0xc3,0x12,0x4, +0xbb,0x50,0x9, 0xd1,0x80,0x12,0x4, 0xfe,0x0, 0x0, 0x0, 0x7f,0xd1,0x80,0xa3,0xa3, +0xa3,0xe0,0xfd,0xd1,0x90,0xfa,0x90,0x0, 0xf, 0xed,0x12,0x1, 0xd7,0xe5,0x2f,0xd1, +0x92,0xfa,0xf1,0x16,0xfd,0xe5,0x38,0x75,0xf0,0x7, 0xa4,0xd1,0x98,0xfa,0xf1,0xdd, +0xf1,0x16,0xd3,0x94,0xf, 0x40,0xb, 0xd1,0x90,0xfa,0x90,0x0, 0x10,0x74,0xf, 0x12, +0x1, 0xd7,0x5, 0x38,0x5, 0x2f,0xa1,0x49,0x12,0x17,0xea,0x90,0x0, 0x2d,0xe5,0x38, +0x12,0x1, 0xd7,0x22,0xae,0x46,0xee,0x33,0x95,0xe0,0xfd,0xfc,0xeb,0x25,0x47,0xff, +0xea,0x3e,0xfe,0xe9,0x3d,0xfd,0xe8,0x3c,0x22,0x90,0xa, 0x44,0xa3,0xa3,0xa3,0xe0, +0xff,0x74,0x4c,0x25,0x4f,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0xef,0xf0,0x90,0xa, +0x44,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x22,0x12,0x4, 0xf2, +0xe5,0x2f,0x25,0xe0,0x25,0xe0,0x24,0x6c,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0x22, +0xe5,0x38,0x75,0xf0,0x7, 0xa4,0xab,0x2a,0x25,0x2c,0xf9,0xe5,0x2b,0x35,0xf0,0x22, +0xe5,0x2f,0x25,0xe0,0x25,0xe0,0x24,0x58,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0x22, +0x7e,0x0, 0x7c,0x0, 0x12,0x1f,0x67,0xeb,0xfd,0xd3,0xef,0x9d,0xee,0x9c,0x7f,0x0, +0x50,0x2, 0x7f,0x1, 0x22,0xeb,0x4f,0xff,0xea,0x4e,0xfe,0xe9,0x4d,0xfd,0xe8,0x4c, +0xfc,0x90,0xa, 0x44,0x12,0x4, 0xf2,0x5, 0x4f,0x22,0xae,0x46,0xaf,0x47,0xab,0x7, +0xaa,0x6, 0xea,0x33,0x95,0xe0,0xf9,0xf8,0xaf,0x2e,0xef,0x33,0x95,0xe0,0xfe,0xfd, +0xfc,0x2, 0x3, 0x88,0x12,0x4, 0xf2,0xe5,0x2f,0x25,0xe0,0x25,0xe0,0x24,0x80,0xf5, +0x82,0xe4,0x34,0xa, 0x22,0xe5,0x46,0xa2,0xe7,0x13,0xfe,0xe5,0x47,0x13,0xff,0xee, +0x33,0x95,0xe0,0xfd,0xfc,0x22,0x90,0x0, 0x10,0x2, 0x1, 0x65,0xc3,0x13,0xff,0x90, +0xa, 0x94,0xe0,0x22,0xfd,0x7b,0x2, 0xaf,0x3d,0xd1,0xb0,0xef,0x22,0xfd,0x7b,0x2, +0xaf,0x3e,0xd1,0xb0,0xef,0x22,0xf9,0xe4,0x35,0x4a,0xfa,0xe5,0x4f,0x22,0x74,0x4c, +0x25,0x4f,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0xe0,0xff,0xab,0x49,0xe5,0x4b,0x22, +0x8f,0x82,0xf5,0x83,0x2, 0x1, 0x65,0x90,0x0, 0x9, 0x12,0x2, 0xb7,0xfd,0x22,0x33, +0xfe,0xed,0x33,0x95,0xe0,0xfc,0xd3,0x22,0xe5,0x3a,0x25,0xe0,0xff,0xe5,0x39,0x33, +0x22,0xad,0x3c,0xed,0x33,0x95,0xe0,0xfc,0xc3,0xed,0x22,0x12,0x2, 0x8c,0xfd,0xc3, +0xef,0x9d,0xee,0x95,0xf0,0x22,0x78,0x1, 0x12,0x4, 0xcc,0xa8,0x4, 0xa9,0x5, 0xaa, +0x6, 0xab,0x7, 0x22,0xc3,0x13,0x75,0x3b,0x0, 0xf5,0x3c,0xd3,0x94,0x0, 0xe5,0x3b, +0x94,0x0, 0x22,0xae,0x46,0xaf,0x47,0xab,0x7, 0xaa,0x6, 0xea,0x33,0x95,0xe0,0xf9, +0xf8,0xaf,0x2d,0x22,0xe5,0x3a,0x25,0xe0,0xff,0xe5,0x39,0x33,0xfe,0xab,0x2a,0xe5, +0x2c,0x2f,0xf9,0xe5,0x2b,0x3e,0x22,0x24,0xff,0xff,0xe4,0x34,0xff,0xcf,0xc3,0x95, +0x3c,0xcf,0x95,0x3b,0xfe,0xd3,0xef,0x94,0x0, 0xee,0x94,0x0, 0x22,0x90,0x0, 0x10, +0xed,0x2, 0x1, 0xd7,0xe5,0x40,0x2f,0xf5,0x82,0xe5,0x3f,0x22,0xef,0x24,0x9d,0x12, +0x58,0xe, 0xef,0x24,0x9f,0x12,0x58,0xe, 0xef,0x24,0x9e,0x12,0x58,0xe, 0xef,0x24, +0x9d,0xf5,0x82,0xee,0x34,0x7, 0xf5,0x83,0x74,0x1, 0xf0,0xef,0x24,0xa4,0xf5,0x82, +0xee,0x34,0x7, 0xf5,0x83,0xe4,0xf0,0x22,0x12,0x17,0xdb,0xe4,0x12,0x1, 0xc5,0x12, +0x17,0x25,0x90,0x0, 0x15,0x12,0x1, 0xd7,0x12,0x27,0xe5,0x54,0xfe,0x12,0x1, 0xc5, +0x54,0xfd,0x2, 0x1, 0xc5,0x12,0x17,0xdb,0x75,0x2d,0xff,0x12,0x15,0x25,0x12,0x40, +0xe8,0x70,0x2, 0x21,0x4, 0x12,0x17,0x25,0x12,0x27,0xe5,0x44,0x2, 0x12,0x1, 0xc5, +0x51,0x14,0x12,0x15,0x25,0x12,0x40,0xe8,0xff,0xe5,0x2e,0xc3,0x9f,0x50,0x4e,0xab, +0x24,0x51,0x2a,0xfa,0xc0,0x3, 0xc0,0x2, 0xc0,0x1, 0x12,0x15,0x25,0x75,0xf0,0x2, +0xe5,0x2e,0x12,0x15,0x93,0x12,0x1, 0x65,0xc3,0x13,0x75,0xf0,0x20,0xa4,0xd0,0x1, +0xd0,0x2, 0xd0,0x3, 0x29,0xf9,0xe5,0xf0,0x3a,0xfa,0xc0,0x3, 0xc0,0x2, 0xc0,0x1, +0xe5,0x2e,0x75,0xf0,0x2, 0x12,0x15,0x46,0x12,0x17,0xcf,0xc3,0x13,0x12,0x15,0x90, +0xd0,0x1, 0xd0,0x2, 0xd0,0x3, 0x12,0x2, 0xb7,0x51,0x1c,0x80,0xa5,0xae,0x2f,0xaf, +0x30,0x12,0x15,0x25,0x12,0x40,0xe8,0xfd,0x7c,0x0, 0x51,0xc, 0xab,0x21,0xe5,0x23, +0x24,0x1, 0xf9,0xe4,0x35,0x22,0xfa,0xc0,0x2, 0xc0,0x1, 0xaa,0x22,0xa9,0x23,0x90, +0x0, 0x15,0x12,0x15,0x8d,0xd0,0x1, 0xd0,0x2, 0xe5,0x2f,0x85,0x30,0xf0,0x12,0x3, +0x5b,0x12,0x17,0x25,0x90,0x0, 0x15,0x74,0x1, 0x12,0x1, 0x92,0x90,0x0, 0x15,0x12, +0x1, 0x65,0xc3,0x94,0xa, 0x40,0x5a,0x12,0x17,0x25,0x90,0x0, 0x15,0x12,0x27,0xe8, +0x44,0x1, 0x80,0x4a,0x12,0x17,0x25,0x90,0x0, 0x17,0x12,0x1, 0x65,0xc3,0x13,0x30, +0xe0,0x2e,0x90,0x0, 0x16,0x74,0x1, 0x12,0x1, 0x92,0x90,0x0, 0x16,0x12,0x1, 0x65, +0xc3,0x94,0x3c,0x40,0x2c,0x12,0x17,0x25,0x12,0x27,0xe5,0x54,0xfd,0x12,0x1, 0xc5, +0xe4,0xf5,0x2d,0x12,0x17,0x25,0x90,0x0, 0x15,0x12,0x27,0xe9,0x54,0xfe,0x80,0xe, +0xe4,0xf5,0x2d,0x12,0x17,0x25,0x90,0x0, 0x15,0x12,0x27,0xe9,0x54,0xfe,0x12,0x1, +0xc5,0xe5,0x2d,0xf4,0x70,0x69,0xf5,0x2d,0x12,0x17,0x25,0x90,0x0, 0x17,0x12,0x1, +0x65,0x30,0xe0,0x5b,0x51,0x14,0x12,0x17,0x25,0x90,0x0, 0x1, 0x75,0xf0,0x2, 0xe5, +0x2e,0x12,0x45,0x31,0x51,0x1c,0xe5,0x2e,0xb4,0xa, 0xeb,0xae,0x2f,0xaf,0x30,0x7c, +0x0, 0x7d,0xa, 0x51,0xc, 0xe4,0xf5,0x2e,0xe5,0x2e,0x75,0xf0,0x3, 0xa4,0x24,0x65, +0xf5,0x82,0xe4,0x34,0x7, 0xf5,0x83,0xd3,0x74,0x1, 0x93,0x95,0x30,0xe4,0x93,0x95, +0x2f,0x50,0x15,0xe5,0x2e,0x75,0xf0,0x3, 0xa4,0x24,0x67,0xf5,0x82,0xe4,0x34,0x7, +0xf5,0x83,0xe4,0x93,0xf5,0x2d,0x80,0x7, 0x5, 0x2e,0xe5,0x2e,0xb4,0x3, 0xc9,0xe4, +0x12,0x15,0x24,0x12,0x40,0xe8,0xb4,0x2, 0x19,0x12,0x4f,0x52,0xfe,0x12,0x1, 0x4c, +0x6e,0x60,0xd, 0x90,0x0, 0x3, 0x12,0x1, 0x65,0xfe,0x12,0x17,0xcf,0xb5,0x6, 0x2, +0x7f,0x1, 0xe5,0x2d,0x25,0xe0,0x24,0x6e,0xf5,0x82,0xe4,0x34,0x7, 0x12,0x2d,0x8f, +0xe4,0x93,0x12,0x17,0x25,0x12,0x1, 0xc5,0x12,0x17,0x25,0x12,0x1, 0x4c,0x90,0x7, +0x76,0x93,0xff,0x12,0x17,0xea,0xe4,0x8f,0xf0,0x2, 0x3, 0x3c,0x12,0x2, 0xb, 0x8e, +0x2f,0x8f,0x30,0x22,0xe4,0xf5,0x2f,0xf5,0x30,0xf5,0x2e,0x22,0xae,0xf0,0x25,0x30, +0xf5,0x30,0xee,0x35,0x2f,0xf5,0x2f,0x5, 0x2e,0x22,0xe5,0x26,0x24,0x80,0xf9,0xe5, +0x25,0x34,0x3, 0x22,0x12,0x17,0xdb,0x7a,0x7, 0x79,0x7a,0x7f,0x5, 0x71,0x65,0xf5, +0x27,0x12,0x15,0x71,0x12,0x40,0xe8,0xff,0xe5,0x27,0xc3,0x9f,0x40,0x2, 0x41,0xf9, +0xe4,0xf5,0x2a,0x75,0xf0,0x2, 0xe5,0x27,0x12,0x15,0x93,0x12,0x1, 0x65,0xc3,0x13, +0xf5,0x28,0x71,0x54,0xea,0x12,0x17,0xcc,0xc3,0x13,0xf5,0x29,0xe5,0x28,0x24,0xfe, +0xf5,0x2b,0xe5,0x28,0x24,0x2, 0xff,0xe4,0xad,0x2b,0x12,0x57,0x5f,0x12,0x2f,0xe9, +0x98,0x50,0x64,0xe5,0x29,0x24,0xfe,0xf5,0x2c,0xe5,0x29,0x24,0x2, 0xff,0xe4,0x33, +0xfe,0xad,0x2c,0x12,0x57,0x61,0x12,0x2f,0xe9,0x98,0x50,0x47,0xc3,0xe5,0x2b,0x64, +0x80,0x94,0x80,0x40,0x3a,0xe5,0x2b,0x64,0x80,0x94,0x92,0x50,0x32,0xc3,0xe5,0x2c, +0x64,0x80,0x94,0x80,0x40,0x29,0xe5,0x2c,0x64,0x80,0x94,0x8b,0x50,0x21,0xaf,0x2b, +0x12,0x4e,0x4e,0x78,0x5, 0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0x12,0x4e,0x61,0x12, +0x2, 0x8c,0xd3,0x94,0x49,0xe5,0xf0,0x64,0x80,0x94,0x80,0x40,0x2, 0x5, 0x2a,0x5, +0x2c,0x80,0xa6,0x5, 0x2b,0x80,0x8b,0xe5,0x2a,0xc3,0x94,0x3, 0x50,0x7, 0x74,0x2d, +0x25,0x27,0xf8,0xe4,0xf6,0x5, 0x27,0x41,0x41,0xe4,0xf5,0x2a,0xf5,0x27,0x12,0x15, +0x71,0x12,0x40,0xe8,0xff,0xe5,0x27,0xc3,0x9f,0x50,0x3e,0x74,0x2d,0x25,0x27,0xf8, +0xe6,0x60,0x32,0x75,0xf0,0x2, 0xe5,0x27,0x12,0x15,0x93,0x12,0x1, 0x65,0xff,0x75, +0xf0,0x2, 0xe5,0x2a,0x12,0x15,0x93,0xef,0x12,0x1, 0xd7,0x71,0x54,0xea,0x12,0x17, +0xcc,0xfd,0xe5,0x2a,0x75,0xf0,0x2, 0xa4,0xab,0x24,0x25,0x26,0xf9,0xe5,0x25,0x35, +0xf0,0x71,0x5d,0x5, 0x2a,0x5, 0x27,0x80,0xb5,0x12,0x15,0x71,0x90,0x0, 0x2d,0xe5, +0x2a,0x2, 0x1, 0xd7,0xe5,0x27,0x75,0xf0,0x2, 0xa4,0x29,0xf9,0x22,0xfa,0x90,0x0, +0x1, 0xed,0x2, 0x1, 0xd7,0x78,0x2d,0x7c,0x0, 0x7d,0x0, 0x7b,0xff,0x7e,0x0, 0x12, +0x1, 0x26,0xe4,0x22,0x12,0x17,0xdb,0x90,0xc, 0xa2,0x74,0x28,0xf0,0xa3,0x74,0x3c, +0xf0,0x90,0xc, 0xa7,0x74,0xa0,0xf0,0xa3,0x74,0x1, 0xf0,0xa3,0x74,0xc8,0xf0,0xa3, +0x74,0x7, 0xf0,0xa3,0x74,0x28,0xf0,0x90,0xc, 0xb2,0x74,0x2, 0xf0,0x90,0xc, 0xc2, +0x74,0xff,0xf0,0x90,0xc, 0xc5,0x74,0x55,0xf0,0xa3,0x74,0x1, 0xf0,0xe4,0xa3,0xf0, +0xa3,0x74,0x11,0xf0,0xa3,0x74,0x1, 0xf0,0x74,0x57,0x91,0xf6,0xf0,0x90,0xc, 0xd1, +0x4, 0xf0,0x90,0xc, 0xd0,0x74,0xc8,0xf0,0x90,0xc, 0xd4,0x74,0x5, 0xf0,0xa3,0x74, +0x2, 0xf0,0xa3,0x74,0x4b,0xf0,0xa3,0x74,0x28,0xf0,0x12,0x15,0x71,0xe4,0x12,0x1, +0xc5,0x12,0x15,0x71,0x90,0x0, 0x1, 0x4, 0x12,0x1, 0xd7,0x90,0x0, 0x9, 0xe4,0x12, +0x1, 0xd7,0x74,0xd, 0x12,0x4e,0xa, 0x74,0x7, 0x12,0x4f,0x46,0x90,0x0, 0x5, 0x74, +0x28,0x12,0x1, 0xd7,0x74,0x28,0x12,0x4f,0x4c,0x74,0xc8,0x91,0xf0,0x90,0x0, 0xa, +0x74,0x1, 0x12,0x1, 0xd7,0x91,0xfd,0x12,0x17,0x25,0xe4,0x75,0xf0,0xa0,0x12,0x3, +0x3c,0x12,0x17,0x25,0x90,0x0, 0x2, 0x74,0x28,0x12,0x1, 0xd7,0x90,0x0, 0x3, 0xe4, +0x75,0xf0,0x3c,0x12,0x3, 0x5b,0x90,0x0, 0x22,0x74,0x10,0x12,0x1, 0xd7,0x90,0x0, +0x15,0x74,0x3, 0x12,0x1, 0xd7,0x90,0x0, 0x16,0x74,0x3, 0x12,0x1, 0xd7,0x90,0x0, +0x1a,0xe4,0x12,0x1, 0xd7,0x90,0x0, 0x1b,0x74,0x11,0x12,0x1, 0xd7,0x90,0x0, 0x17, +0xe4,0x12,0x1, 0xd7,0x90,0x0, 0x1c,0xe4,0x75,0xf0,0xfa,0x12,0x3, 0x5b,0x90,0x0, +0x1e,0xb1,0x4, 0x74,0x5, 0x12,0x1, 0xd7,0x90,0x0, 0x20,0x74,0x23,0x12,0x1, 0xd7, +0x90,0x0, 0x9, 0x12,0x17,0xb7,0xb1,0xd, 0x74,0x3, 0x12,0x1, 0xd7,0x90,0x0, 0x11, +0xe4,0x12,0x1, 0xd7,0x90,0x0, 0x12,0x74,0x4, 0x12,0x1, 0xd7,0x90,0x0, 0x13,0xe4, +0x75,0xf0,0x64,0x12,0x3, 0x5b,0x90,0x0, 0xb, 0xe4,0x75,0xf0,0x4b,0x12,0x3, 0x5b, +0x90,0x0, 0xd, 0x74,0x28,0x12,0x1, 0xd7,0x12,0x15,0x25,0x74,0x2, 0x12,0x1, 0xc5, +0x12,0x15,0x25,0x90,0x0, 0x1, 0x74,0xa, 0x75,0xf0,0x0, 0x12,0x3, 0x5b,0x90,0x0, +0x3, 0x74,0xa0,0x12,0x1, 0xd7,0x90,0x0, 0x4, 0xe4,0x75,0xf0,0xc8,0x12,0x3, 0x5b, +0x90,0x0, 0x6, 0x74,0x5, 0x12,0x1, 0xd7,0x90,0x0, 0x7, 0x74,0x2, 0x2, 0x1, 0xd7, +0x90,0x0, 0x8, 0x2, 0x1, 0xd7,0xa3,0xf0,0xe4,0xa3,0xf0,0xa3,0x22,0x90,0x0, 0x7, +0xe4,0x2, 0x1, 0xd7,0x74,0xa, 0x12,0x1, 0xd7,0x90,0x0, 0x1f,0x22,0x90,0x0, 0xf, +0xe4,0x12,0x1, 0xd7,0x90,0x0, 0x10,0x22,0xc0,0xe0,0xc0,0x83,0xc0,0x82,0xc2,0x93, +0x90,0xc, 0x85,0xe4,0xf0,0x90,0xc, 0x87,0xf0,0xd0,0x82,0xd0,0x83,0xd0,0xe0,0x32, +0xb1,0x3c,0xc2,0x8e,0x43,0xa2,0x10,0xb1,0x5f,0xd2,0xab,0x22,0xb1,0x53,0x7f,0x1, +0xb1,0x6e,0xb1,0x81,0xb1,0x9d,0xb1,0x57,0x7f,0x1, 0xef,0x70,0x3, 0xc2,0xaf,0x22, +0xd2,0xaf,0x22,0x53,0xdb,0xbf,0x22,0x75,0x92,0xe8,0xd2,0xae,0xd2,0xbe,0x22,0x75, +0xa6,0xf0,0x75,0xa5,0x5f,0xd2,0x8e,0x22,0xc2,0x8e,0x80,0xf3,0x80,0xfa,0x53,0xc9, +0xf8,0xef,0x70,0x5, 0x43,0xc9,0x3, 0x80,0x3, 0x43,0xc9,0x2, 0xc2,0xce,0xc2,0xca, +0x22,0xaf,0xe6,0x75,0x99,0x1, 0xd2,0x98,0xbf,0xff,0x2, 0x7f,0x6a,0xef,0x64,0x6a, +0x60,0x3, 0xbf,0x6b,0x4, 0x53,0xea,0x7f,0x22,0x43,0xea,0x80,0x22,0xe4,0xff,0xa2, +0xaf,0x33,0xfe,0xc2,0x88,0xd2,0xa8,0xc2,0xaf,0x30,0x89,0x6, 0xc2,0x89,0xe4,0xff, +0x80,0x1, 0xf, 0xef,0xd3,0x94,0xfa,0x40,0xf0,0xee,0x24,0xff,0x92,0xaf,0x75,0xf7, +0xff,0x22,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x0, 0xc0, +0x0, 0xc0,0x1, 0xc0,0x2, 0xc0,0x3, 0xc0,0x4, 0xc0,0x5, 0xc0,0x6, 0xc0,0x7, 0xb1, +0x6c,0x90,0xc, 0x28,0xe0,0x60,0x2, 0x14,0xf0,0x90,0xa, 0xe8,0xe0,0x4, 0xf0,0x70, +0x6, 0x90,0xa, 0xe7,0xe0,0x4, 0xf0,0x90,0xa, 0xe1,0xe0,0xfe,0xa3,0xe0,0xff,0xc3, +0x90,0xa, 0xe8,0xe0,0x9f,0x90,0xa, 0xe7,0xe0,0x9e,0x50,0x3, 0x12,0x0, 0x1e,0x90, +0xa, 0xec,0xe0,0xfe,0xa3,0xe0,0xff,0x4e,0x60,0x16,0xef,0x64,0x1, 0x4e,0x70,0x2, +0xd2,0x0, 0x90,0xa, 0xed,0xe0,0x24,0xff,0xf0,0x90,0xa, 0xec,0xe0,0x34,0xff,0xf0, +0xd1,0xad,0x40,0xe, 0x90,0xa, 0xe5,0xe0,0x4, 0xf0,0x70,0x6, 0x90,0xa, 0xe4,0xe0, +0x4, 0xf0,0x90,0xc, 0xc9,0xe0,0xb4,0xaa,0xf, 0x90,0xa, 0xe3,0xe0,0xff,0x4, 0xf0, +0xef,0xd3,0x94,0x64,0x40,0x2, 0xd1,0xa6,0xe5,0x10,0xc3,0x95,0x11,0x50,0x12,0x5, +0x10,0xe5,0xc9,0x54,0x3, 0xff,0xbf,0x1, 0xb, 0x74,0x3, 0x25,0x10,0xf5,0x10,0x80, +0x3, 0x75,0xf, 0x1, 0x90,0xc, 0x86,0xe0,0xff,0x60,0x10,0xc3,0x94,0x28,0x50,0x5, +0xe0,0x4, 0xf0,0x80,0x6, 0x12,0x3c,0xb5,0x12,0x37,0x3e,0xd0,0x7, 0xd0,0x6, 0xd0, +0x5, 0xd0,0x4, 0xd0,0x3, 0xd0,0x2, 0xd0,0x1, 0xd0,0x0, 0xd0,0xd0,0xd0,0x82,0xd0, +0x83,0xd0,0xf0,0xd0,0xe0,0x32,0x90,0xc, 0xc9,0x74,0x1, 0xf0,0x22,0x90,0xa, 0xe4, +0xe0,0xfe,0xa3,0xe0,0xff,0xe4,0xfc,0xfd,0x7b,0x40,0x7a,0x9c,0xf9,0xf8,0xd3,0x2, +0x4, 0xa5,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x0, 0xc0, +0x0, 0xc0,0x1, 0xc0,0x2, 0xc0,0x3, 0xc0,0x4, 0xc0,0x5, 0xc0,0x6, 0xc0,0x7, 0x12, +0x17,0x3, 0x90,0xc, 0x8a,0xe0,0x54,0xfd,0xf0,0xd0,0x7, 0xd0,0x6, 0xd0,0x5, 0xd0, +0x4, 0xd0,0x3, 0xd0,0x2, 0xd0,0x1, 0xd0,0x0, 0xd0,0xd0,0xd0,0x82,0xd0,0x83,0xd0, +0xf0,0xd0,0xe0,0x32,0xef,0x70,0x3, 0x43,0x87,0x1, 0xbf,0x1, 0x3, 0x43,0x87,0x2, +0xbf,0x2, 0x3, 0x43,0x87,0x2, 0x22,0xef,0x70,0x3, 0xd2,0x84,0x22,0xc2,0x84,0x22, +0x2, 0x0, 0x21,0x7d,0x66,0x7f,0xf8,0x7e,0x6f,0x12,0x34,0x6c,0x7d,0xbb,0x7f,0xf9, +0x7e,0x6f,0x2, 0x34,0x6c,0x12,0x6c,0xdf,0x75,0x3f,0x1, 0xaa,0x34,0xa9,0x35,0xae, +0x2, 0xaf,0x1, 0x8e,0x40,0x8f,0x41,0x12,0x6b,0xb8,0xf5,0x42,0x8f,0x43,0xe4,0xf5, +0x39,0x12,0x2f,0xb7,0x12,0x17,0xcf,0xff,0xe5,0x39,0xc3,0x9f,0x40,0x3, 0x2, 0x60, +0x9, 0xe4,0xf5,0x3b,0xf5,0x3c,0x75,0x3d,0x7f,0x75,0x3e,0xff,0x90,0x0, 0x1a,0x12, +0x6b,0x10,0xfd,0x75,0xf0,0x10,0xa4,0xff,0xae,0xf0,0xe5,0x39,0x7a,0x0, 0x2f,0xf5, +0x45,0xea,0x3e,0xf5,0x44,0x8d,0x3a,0x12,0x46,0xf3,0x90,0x0, 0x1b,0x12,0x1, 0x65, +0xff,0xe5,0x3a,0xd3,0x9f,0x50,0x4b,0xe5,0x45,0x25,0xe0,0xff,0xe5,0x44,0x33,0xfe, +0xe5,0x41,0x2f,0xf5,0x82,0xe5,0x40,0x12,0x29,0x7b,0xe5,0x43,0x2f,0xf5,0x82,0xe5, +0x42,0x12,0x2d,0xac,0x2d,0xff,0xee,0x3c,0xfe,0xd3,0xef,0x95,0x3c,0xee,0x95,0x3b, +0x40,0x4, 0x8e,0x3b,0x8f,0x3c,0xc3,0xef,0x95,0x3e,0xee,0x95,0x3d,0x50,0x4, 0x8e, +0x3d,0x8f,0x3e,0x74,0x10,0x25,0x45,0xf5,0x45,0xe4,0x35,0x44,0xf5,0x44,0x5, 0x3a, +0x80,0xa5,0x12,0x46,0xf3,0x90,0x0, 0x1c,0x12,0x2, 0xb7,0xff,0xc3,0xe5,0x3c,0x95, +0x3e,0xfd,0xe5,0x3b,0x95,0x3d,0xfc,0xd3,0xed,0x9f,0xec,0x95,0xf0,0x40,0x5, 0x75, +0x3f,0x2, 0x80,0x5, 0x5, 0x39,0x2, 0x5f,0x51,0xaf,0x3f,0x22,0x12,0x17,0xdb,0x75, +0x2f,0x1, 0x12,0x15,0x5f,0x12,0x5f,0x35,0x8f,0x2d,0x12,0x15,0x5f,0x12,0x2e,0x5c, +0x8f,0x2e,0x12,0x15,0x25,0x90,0x7, 0xa4,0x12,0x1, 0x65,0xff,0x70,0x34,0x90,0x7, +0x9d,0x4, 0x12,0x1, 0xd7,0xe5,0x2d,0xb4,0x2, 0xa, 0x90,0x7, 0x9d,0x74,0x6, 0x12, +0x1, 0xd7,0x80,0x71,0x12,0x17,0x25,0x12,0x40,0xe8,0x70,0xc, 0x31,0x2, 0x70,0x8, +0x12,0x15,0x25,0x90,0x7, 0xa4,0x80,0x40,0x12,0x15,0x25,0x90,0x7, 0x9d,0x74,0x4, +0x1, 0xe2,0xef,0x64,0x1, 0x70,0x53,0x12,0x15,0x25,0x90,0x7, 0x9d,0x12,0x1, 0xd7, +0xe5,0x2e,0x60,0x7, 0x90,0x7, 0xa4,0x74,0x3, 0x80,0x67,0xe5,0x2d,0xb4,0x2, 0x6, +0x90,0x7, 0x9d,0xe4,0x80,0x5c,0x12,0x17,0x25,0x12,0x40,0xe8,0x70,0xd, 0x31,0x2, +0x70,0x9, 0x12,0x15,0x25,0x90,0x7, 0x9d,0x4, 0x80,0x47,0x85,0x27,0x33,0x85,0x28, +0x34,0x85,0x29,0x35,0x31,0x12,0x85,0x24,0x39,0x85,0x25,0x3a,0x85,0x26,0x3b,0x12, +0x17,0x25,0x12,0x40,0xee,0xe4,0xf5,0x2f,0x80,0x2b,0x12,0x15,0x25,0x90,0x7, 0xa4, +0x12,0x1, 0x65,0xb4,0x3, 0x1f,0xe5,0x2e,0x24,0xfe,0x60,0xa, 0x4, 0x70,0xe, 0x90, +0x7, 0x9d,0x74,0x3, 0x80,0xc, 0x90,0x7, 0x9d,0x74,0x2, 0x80,0x5, 0x90,0x7, 0xa4, +0x74,0x1, 0x12,0x1, 0xd7,0xe5,0x2f,0xb4,0x1, 0x17,0x12,0x17,0x25,0x90,0x0, 0x80, +0xe4,0x31,0x8, 0x90,0x0, 0x82,0xe4,0x12,0x1, 0xd7,0x90,0x0, 0x84,0xe4,0x12,0x1, +0xd7,0x22,0x90,0x0, 0x86,0x2, 0x1, 0x65,0x12,0x1, 0xd7,0x90,0x0, 0x81,0xe4,0x2, +0x1, 0xd7,0x85,0x2a,0x36,0x85,0x2b,0x37,0x85,0x2c,0x38,0x22,0xbf,0x1, 0x5, 0x43, +0xdb,0x80,0x80,0x6, 0xef,0x70,0x3, 0x53,0xdb,0x7f,0xc2,0xea,0x43,0xdb,0x10,0xd2, +0xd9,0xc2,0xdd,0xc2,0xdc,0xc2,0xdb,0xc2,0xda,0xd2,0xd8,0x75,0xab,0x6, 0xe4,0xf5, +0x9a,0x53,0xdb,0xfd,0xd2,0xed,0xd2,0xba,0xc2,0xc2,0x43,0xa9,0x4, 0x43,0xb9,0x4, +0x22,0xef,0x51,0x2c,0xed,0x2b,0xfb,0xe4,0x3a,0xfe,0xaf,0x3, 0x22,0x8b,0x36,0x8a, +0x37,0x89,0x38,0xe4,0xf5,0x3c,0x12,0x46,0xf3,0x51,0x1b,0xfd,0xe4,0xff,0x31,0x51, +0x8e,0x3d,0x8f,0x3e,0xe5,0x3c,0x70,0x3, 0x43,0x3d,0x20,0x51,0xf, 0xc3,0x94,0x10, +0x40,0xe4,0x75,0x3c,0x10,0xe4,0xfd,0x7f,0xc0,0x51,0x14,0xc3,0x94,0x20,0x40,0xf5, +0xe4,0xf5,0x3c,0x12,0x47,0x8f,0x51,0x1b,0xfe,0x54,0xf, 0xff,0xee,0xc4,0x54,0xf, +0xfd,0x51,0x24,0x8e,0x3d,0x8f,0x3e,0x51,0xf, 0xc3,0x94,0x8, 0x40,0xe5,0x75,0x3c, +0x8, 0xe4,0xfd,0x7f,0xc0,0x51,0x14,0xc3,0x94,0x20,0x40,0xf5,0xe4,0xf5,0x3c,0x75, +0xf0,0x2, 0xe5,0x3c,0xa4,0x24,0x54,0xf5,0x82,0xe5,0xf0,0x34,0xc, 0xf5,0x83,0xe4, +0x93,0xf5,0x3d,0x74,0x1, 0x93,0xf5,0x3e,0x51,0xf, 0xc3,0x94,0xff,0x40,0xe0,0x90, +0xe, 0x52,0xe4,0x93,0xfc,0x74,0x1, 0x93,0xfd,0xec,0xff,0x51,0x3b,0x8f,0xa1,0xe5, +0xdb,0x30,0xe3,0xfb,0x85,0xa1,0x14,0x53,0xdb,0xf3,0x8d,0xa1,0xe5,0xdb,0x30,0xe3, +0xfb,0x85,0xa1,0x15,0x53,0xdb,0xf3,0x43,0xab,0x4, 0xae,0x14,0xaf,0x15,0x22,0xe5, +0x3d,0xff,0xad,0x3e,0x31,0xeb,0x5, 0x3c,0xe5,0x3c,0x22,0x85,0x3c,0x82,0x75,0x83, +0x0, 0x2, 0x1, 0x65,0xac,0x7, 0xed,0x51,0x2c,0xec,0x21,0x55,0x7b,0x0, 0x7a,0xc0, +0x75,0xf0,0x80,0xa4,0x2b,0xfb,0xe5,0xf0,0x3a,0xfa,0x22,0x53,0xab,0x3, 0x53,0xdb, +0xf3,0x22,0x51,0x3b,0xef,0x44,0x80,0xf5,0xa1,0xe5,0xdb,0x30,0xe3,0xfb,0x53,0xdb, +0xf3,0xe4,0xf5,0xa1,0xe5,0xdb,0x30,0xe3,0xfb,0xaf,0xa1,0x43,0xab,0x4, 0x22,0xae, +0x5, 0xac,0x7, 0x12,0x47,0x5d,0x51,0x42,0xef,0x7f,0x0, 0xb5,0x6, 0x2, 0x7f,0x1, +0x22,0xe4,0xfd,0x51,0x7a,0x60,0x2, 0x7f,0x1, 0x22,0xff,0x51,0x5f,0xef,0x7f,0x0, +0x22,0x7d,0x3, 0xe4,0x51,0x7a,0x60,0x2, 0x7f,0x1, 0x22,0x53,0xc9,0x7, 0x43,0xc9, +0x30,0x75,0xeb,0x80,0xef,0x25,0xe0,0x4, 0x25,0xeb,0xf5,0xeb,0x22,0xe5,0xdb,0x20, +0xe1,0x3, 0x7f,0x0, 0x22,0x53,0xdb,0xfd,0x7f,0x1, 0x22,0xc2,0xc2,0x53,0xdb,0xbf, +0x32,0xef,0x70,0x4, 0x53,0xdb,0xbf,0x22,0x43,0xdb,0x40,0x22,0xef,0x24,0xfe,0x60, +0xb, 0x14,0x60,0xc, 0x24,0x2, 0x70,0xc, 0x7d,0x9, 0x80,0xa, 0x7d,0x6, 0x80,0x6, +0x7d,0x3, 0x80,0x2, 0xe4,0xfd,0xe5,0xdc,0x54,0xf0,0x2d,0xf5,0xdc,0x22,0x12,0x17, +0xdb,0xe4,0xf5,0x2d,0xf5,0x2e,0xf5,0x2f,0x12,0x6b,0xdc,0xf5,0x3b,0x75,0x3c,0xff, +0xf5,0x41,0xf5,0x42,0x12,0x15,0x25,0x90,0x0, 0xb, 0x12,0x2, 0xb7,0xf5,0x46,0x85, +0xf0,0x45,0xe4,0xf5,0x47,0xf5,0x48,0xf5,0x49,0x12,0x4e,0x4, 0xf5,0x4b,0x85,0xf0, +0x4a,0xe5,0x23,0x24,0x80,0xf9,0xe5,0x22,0x34,0x3, 0xaf,0x1, 0xf5,0x43,0x8f,0x44, +0xe4,0xf5,0x2d,0x12,0x15,0x71,0x12,0x6c,0xf7,0x40,0x2, 0xe1,0xa1,0xe5,0x2d,0x75, +0xf0,0x10,0xa4,0x85,0xf0,0x3f,0xf5,0x40,0xe4,0xf5,0x2e,0x12,0x15,0x71,0x12,0x17, +0xcf,0xff,0xe5,0x2e,0xc3,0x9f,0x40,0x2, 0xe1,0x9d,0x12,0x69,0xed,0x12,0x6c,0xcc, +0x95,0x46,0xee,0x95,0x45,0x40,0x8, 0x5, 0x48,0xe5,0x48,0x70,0x2, 0x5, 0x47,0x12, +0x69,0xed,0x12,0x6c,0xcc,0x95,0x4b,0xe5,0x4a,0x12,0x6a,0x39,0x50,0x2, 0xe1,0x91, +0xe5,0x2d,0x70,0x6, 0xf5,0x2f,0xf5,0x30,0x80,0x15,0xe5,0x40,0x24,0xf0,0xff,0xe5, +0x3f,0x34,0xff,0x12,0x43,0xe5,0x12,0x69,0xf4,0xf5,0x2f,0xa3,0xe0,0xf5,0x30,0x12, +0x15,0x71,0x12,0x1, 0x4c,0x14,0xb5,0x2d,0x7, 0xe4,0xf5,0x31,0xf5,0x32,0x80,0x14, +0xe5,0x40,0x24,0x10,0xff,0xe4,0x35,0x3f,0x12,0x43,0xe5,0x12,0x69,0xf4,0xf5,0x31, +0xa3,0xe0,0xf5,0x32,0xe5,0x2e,0x70,0x6, 0xf5,0x35,0xf5,0x36,0x80,0x15,0xe5,0x40, +0x24,0xff,0xff,0xe5,0x3f,0x34,0xff,0x12,0x43,0xe5,0x12,0x69,0xf4,0xf5,0x35,0xa3, +0xe0,0xf5,0x36,0x12,0x17,0xcf,0x14,0xb5,0x2e,0x7, 0xe4,0xf5,0x33,0xf5,0x34,0x80, +0x14,0xe5,0x40,0x24,0x1, 0xff,0xe4,0x35,0x3f,0x12,0x43,0xe5,0x12,0x69,0xf4,0xf5, +0x33,0xa3,0xe0,0xf5,0x34,0x12,0x69,0xed,0xfe,0xc3,0xee,0x64,0x80,0x94,0x80,0x50, +0x2b,0xe5,0x30,0x95,0x32,0xe5,0x31,0x12,0x6b,0x3c,0x40,0x6, 0x85,0x31,0x2f,0x85, +0x32,0x30,0xd3,0xe5,0x30,0x95,0x34,0xe5,0x33,0x12,0x6b,0x3c,0x40,0x6, 0x85,0x33, +0x2f,0x85,0x34,0x30,0xd3,0x12,0x6b,0x36,0x40,0x32,0x80,0x2a,0xc3,0xe5,0x30,0x95, +0x32,0xe5,0x31,0x12,0x6b,0x3c,0x50,0x6, 0x85,0x31,0x2f,0x85,0x32,0x30,0xc3,0xe5, +0x30,0x95,0x34,0xe5,0x33,0x12,0x6b,0x3c,0x50,0x6, 0x85,0x33,0x2f,0x85,0x34,0x30, +0xc3,0x12,0x6b,0x36,0x50,0x6, 0x85,0x35,0x2f,0x85,0x36,0x30,0xe5,0x2d,0x25,0xe0, +0xf5,0x41,0xe5,0x2e,0x25,0xe0,0xf5,0x42,0xc3,0xee,0x64,0x80,0x94,0x80,0x40,0x2, +0xa1,0x33,0x12,0x69,0xed,0x12,0x6a,0x30,0x40,0x2, 0xa1,0x29,0xc3,0xe4,0x95,0x4b, +0xfd,0xe4,0x95,0x4a,0xfc,0xd3,0xef,0x9d,0xec,0x12,0x6a,0x39,0x40,0x2, 0xa1,0x29, +0xe5,0x49,0x70,0x9, 0x90,0xa, 0x94,0xe5,0x41,0xf0,0xa3,0xa1,0x24,0xe5,0x49,0xc3, +0x94,0x5, 0x40,0x5, 0x75,0x49,0x5, 0xa1,0x29,0xe4,0xf5,0x3c,0x12,0x57,0x71,0x95, +0x49,0x74,0x80,0xf8,0x6c,0x98,0x50,0x5c,0xed,0x25,0xe0,0xff,0xec,0x12,0x6c,0x57, +0x12,0x6b,0xad,0x60,0x4b,0x12,0x43,0xdf,0x33,0xfe,0x12,0x6c,0xac,0x12,0x6b,0xf6, +0x60,0x3e,0xaf,0x3c,0x12,0x4e,0x5a,0x25,0xe0,0xfd,0xee,0x33,0xfc,0x74,0x94,0x2d, +0xf5,0x82,0x74,0xa, 0x12,0x6a,0x17,0xff,0x74,0x95,0x2d,0xf5,0x82,0x74,0xa, 0x12, +0x69,0xc9,0xfe,0xa3,0xe0,0xff,0x12,0x2f,0xe8,0x98,0x50,0xf, 0x12,0x43,0xdf,0x12, +0x6c,0x57,0xe5,0x41,0xf0,0x12,0x6c,0xac,0xe5,0x42,0xf0,0x75,0x3c,0xff,0x80,0x4, +0x5, 0x3c,0x80,0x98,0xe5,0x49,0xb5,0x3c,0x10,0x12,0x6a,0x82,0xe5,0x41,0xf0,0xe5, +0x49,0x12,0x6a,0x76,0xe5,0x42,0xf0,0x5, 0x49,0x5, 0x40,0xe5,0x40,0x70,0x2, 0x5, +0x3f,0xe1,0x99,0x12,0x69,0xed,0xfe,0xa3,0xe0,0xff,0xc3,0x12,0x6a,0x35,0x50,0x2, +0xe1,0x91,0xef,0x95,0x4b,0xe5,0x4a,0x12,0x6a,0x39,0x50,0x2, 0xe1,0x91,0xe5,0x3b, +0x70,0x9, 0x90,0xa, 0x44,0xe5,0x41,0xf0,0xa3,0xe1,0x8c,0xe5,0x3b,0xc3,0x94,0x14, +0x40,0x5, 0x75,0x3b,0x14,0xe1,0x91,0xe4,0xf5,0x3c,0x12,0x57,0x71,0x95,0x3b,0x74, +0x80,0xf8,0x6c,0x98,0x40,0x2, 0xe1,0x7c,0xed,0x25,0xe0,0xff,0xec,0x12,0x6b,0x3, +0x12,0x6b,0xad,0x60,0x31,0x12,0x43,0xdf,0x12,0x6b,0x19,0x12,0x6b,0xf6,0x60,0x26, +0x12,0x6a,0x2, 0x12,0x6d,0x9, 0x12,0x69,0xc9,0xfe,0xa3,0xe0,0xff,0x12,0x2f,0xe8, +0x98,0x40,0x2, 0xe1,0x73,0x12,0x43,0xdf,0x12,0x6b,0x3, 0xe5,0x41,0xf0,0x12,0x6b, +0x1b,0xe5,0x42,0xf0,0xe1,0x73,0x12,0x43,0xdf,0x12,0x6b,0x3, 0xe0,0xfd,0x7b,0x6, +0x12,0x6b,0xb1,0x70,0x2, 0xe1,0x78,0x12,0x43,0xdf,0x12,0x6b,0x19,0x12,0x6b,0xf6, +0x70,0x2, 0xe1,0x78,0x12,0x43,0xdf,0x12,0x6b,0x3, 0xe0,0xfd,0xc3,0x13,0x25,0x2d, +0xf5,0x3d,0x12,0x6b,0x1b,0xe0,0xc3,0x13,0x25,0x2e,0xf5,0x3e,0xe4,0xf5,0x2f,0xf5, +0x30,0xc3,0xe5,0x30,0x95,0x3b,0x74,0x80,0xf8,0x65,0x2f,0x98,0x50,0x36,0xaf,0x3c, +0x12,0x4e,0x5a,0x65,0x30,0x70,0x3, 0xee,0x65,0x2f,0x60,0x1e,0x12,0x6d,0x4d,0x12, +0x6b,0x3, 0xe0,0x12,0x57,0x24,0x60,0x12,0x12,0x6d,0x4d,0x12,0x6b,0x19,0xe0,0xfd, +0x12,0x57,0x30,0x60,0x5, 0x75,0x3d,0xff,0x80,0xa, 0x5, 0x30,0xe5,0x30,0x70,0x2, +0x5, 0x2f,0x80,0xbd,0xe5,0x3d,0xf4,0x70,0x2, 0xe1,0x78,0x12,0x6a,0x2, 0x12,0x6d, +0x9, 0x3c,0xf5,0x83,0xe0,0xc3,0x13,0xf9,0x12,0x69,0xcf,0xfe,0xa3,0xe0,0xff,0xd3, +0x12,0x2f,0xe9,0x98,0x40,0x13,0x12,0x43,0xdf,0x12,0x6b,0x3, 0x12,0x6a,0x1a,0xff, +0xe9,0x12,0x6a,0x6e,0x12,0x43,0xe5,0x80,0x7, 0xe5,0x40,0x25,0xe0,0xff,0xe5,0x3f, +0x12,0x69,0xf4,0xf5,0x31,0xa3,0xe0,0xf5,0x32,0xe5,0x32,0xae,0x31,0x78,0x2, 0x12, +0x46,0xb5,0xd8,0xfb,0xfd,0xac,0x6, 0xe5,0x31,0xa2,0xe7,0x13,0xfe,0xe5,0x32,0x13, +0x2d,0xf5,0x32,0xee,0x3c,0xf5,0x31,0x12,0x15,0x25,0x12,0x2, 0x8c,0xff,0xae,0xf0, +0xc3,0xe5,0x32,0x9f,0xe5,0x31,0x9e,0x50,0x4, 0x8e,0x31,0x8f,0x32,0xaf,0x3d,0x12, +0x4e,0x5a,0x12,0x4f,0x7c,0x12,0x4f,0x58,0xe5,0x3e,0xc3,0x13,0xfd,0x7c,0x0, 0x2f, +0xff,0xec,0x3e,0x12,0x43,0xe5,0x12,0x69,0xf4,0xfa,0xa3,0xe0,0xfb,0xe5,0x3d,0xa2, +0xe7,0x13,0xf9,0xff,0x33,0x95,0xe0,0xfe,0xef,0x12,0x4f,0x87,0x12,0x4f,0x58,0xef, +0x2d,0xff,0xec,0x3e,0x12,0x43,0xe5,0x12,0x69,0xf4,0xfe,0xa3,0xe0,0x2b,0xf5,0x34, +0xee,0x3a,0xf5,0x33,0xa2,0xe7,0x13,0xf5,0x33,0xe5,0x34,0x13,0xf5,0x34,0xaf,0x3d, +0x12,0x4e,0x5a,0x12,0x4f,0x7c,0xfd,0xee,0xc4,0x54,0xf0,0x48,0xfc,0x12,0x6b,0x9f, +0x2d,0xff,0xee,0x3c,0x12,0x43,0xe5,0x12,0x69,0xf4,0xfc,0xa3,0xe0,0xfd,0xe9,0xff, +0x33,0x95,0xe0,0xfe,0xef,0x12,0x4f,0x87,0xfb,0xee,0xc4,0x54,0xf0,0x48,0xfa,0x12, +0x6b,0x9f,0x2b,0xff,0xee,0x3a,0x12,0x43,0xe5,0x12,0x69,0xf4,0xfe,0xa3,0xe0,0x2d, +0xf5,0x36,0xee,0x3c,0xf5,0x35,0xa2,0xe7,0x13,0xf5,0x35,0xe5,0x36,0x13,0xf5,0x36, +0x25,0x34,0xff,0xe5,0x33,0x35,0x35,0x12,0x6b,0xa6,0xc3,0x95,0x32,0xe5,0x31,0x12, +0x6a,0x39,0x40,0x14,0x12,0x43,0xdf,0x12,0x6b,0x3, 0xe5,0x3d,0xf0,0x12,0x6b,0x1b, +0xe5,0x3e,0xf0,0x75,0x3c,0xff,0x80,0x4, 0x5, 0x3c,0xa1,0x6a,0xe5,0x3b,0xb5,0x3c, +0x10,0x12,0x12,0x22,0xe5,0x41,0xf0,0xe5,0x3b,0x12,0x69,0xbd,0xe5,0x42,0xf0,0x5, +0x3b,0x5, 0x40,0xe5,0x40,0x70,0x2, 0x5, 0x3f,0x5, 0x2e,0x61,0x3b,0x5, 0x2d,0x61, +0x23,0xe5,0x3b,0xd3,0x94,0x5, 0x50,0x3, 0x2, 0x68,0xeb,0xe4,0xf5,0x3d,0xf5,0x2d, +0x12,0x40,0xe2,0xff,0xe5,0x2d,0xc3,0x9f,0x40,0x3, 0x2, 0x68,0x61,0x75,0x37,0x3, +0x75,0x38,0xff,0xe4,0xf5,0x42,0xf5,0x2e,0xe5,0x2e,0xc3,0x95,0x3b,0x50,0x3c,0xe5, +0x2e,0x12,0x69,0xbd,0x12,0x6a,0x51,0x12,0x4e,0x1f,0xc0,0x6, 0xc0,0x7, 0xe5,0x2e, +0x12,0x12,0x22,0x12,0x6a,0x22,0x12,0x4e,0x1f,0xd0,0xe0,0x2f,0xf5,0x3a,0xd0,0xe0, +0x3e,0xf5,0x39,0xc3,0xe5,0x3a,0x95,0x38,0xe5,0x39,0x95,0x37,0x50,0x9, 0x85,0x39, +0x37,0x85,0x3a,0x38,0x85,0x2e,0x42,0x5, 0x2e,0x80,0xbd,0xe5,0x42,0x12,0x12,0x22, +0x51,0x1a,0xff,0xe5,0x42,0x31,0xbd,0xe0,0xc3,0x13,0x51,0x6e,0x12,0x43,0xe5,0x33, +0xfe,0xe5,0x44,0x2f,0xf5,0x82,0xe5,0x43,0x12,0x15,0x1d,0x12,0x57,0x7b,0x40,0x2c, +0xe5,0x42,0x12,0x12,0x22,0xe0,0xfd,0xaf,0x3d,0x12,0x43,0xe1,0x33,0xfe,0x74,0x6c, +0x2f,0xf5,0x82,0x74,0xa, 0x51,0x49,0x31,0xbd,0xe0,0xfd,0x74,0x6d,0x2f,0xf5,0x82, +0x74,0xa, 0x51,0x49,0x12,0x12,0x22,0x74,0xff,0xf0,0x5, 0x3d,0x5, 0x2d,0x2, 0x67, +0xb0,0x85,0x3d,0x2d,0xe5,0x2d,0xc3,0x94,0x5, 0x50,0x5e,0xe4,0xf5,0x2f,0xf5,0x30, +0xf5,0x3e,0xf5,0x2e,0xe5,0x2e,0xc3,0x95,0x3b,0x50,0x36,0xe5,0x2e,0x12,0x12,0x22, +0xe0,0xff,0xf4,0x60,0x28,0xef,0x51,0x1b,0xff,0xe5,0x2e,0x31,0xbd,0xe0,0xfd,0xc3, +0x13,0x51,0x8e,0x12,0x43,0xe5,0x31,0xf4,0x51,0x30,0x40,0x11,0xe5,0x2e,0x12,0x12, +0x22,0xe0,0xf5,0x41,0x8d,0x42,0x8e,0x2f,0x8f,0x30,0x85,0x2e,0x3e,0x5, 0x2e,0x80, +0xc3,0xe5,0x2d,0x12,0x56,0x84,0xe5,0x41,0x51,0x5f,0xe5,0x42,0xf0,0xe5,0x3e,0x12, +0x12,0x22,0x74,0xff,0xf0,0x5, 0x2d,0x80,0x9b,0xe4,0xf5,0x2d,0xe5,0x2d,0x12,0x56, +0x84,0xe0,0xff,0xe5,0x2d,0x12,0x12,0x22,0xef,0x51,0x5f,0xe0,0xff,0x31,0xbb,0xef, +0xf0,0x5, 0x2d,0xe5,0x2d,0xb4,0x5, 0xe4,0x75,0x3b,0x5, 0xe4,0xf5,0x2d,0x51,0x24, +0xf5,0x83,0x74,0xff,0xf0,0x51,0x53,0x51,0x96,0xb4,0x5, 0xf2,0xe5,0x3b,0xd3,0x94, +0x0, 0x40,0x41,0xe4,0xf5,0x2d,0xe5,0x2d,0xc3,0x95,0x3b,0x50,0x37,0xe5,0x2d,0x12, +0x12,0x22,0xe0,0xff,0x12,0x17,0xea,0x75,0xf0,0x2, 0xe5,0x2d,0x12,0x15,0x93,0xef, +0x12,0x1, 0xd7,0x31,0xbb,0x51,0x41,0x12,0x1f,0x5a,0x12,0x5b,0x5d,0xe5,0x2d,0x12, +0x12,0x22,0x51,0x22,0xf5,0x83,0xef,0xf0,0x31,0xbb,0x51,0x51,0xf5,0x83,0xef,0xf0, +0x5, 0x2d,0x80,0xc2,0xe5,0x49,0xd3,0x94,0x0, 0x40,0x2a,0xe4,0xf5,0x2d,0xe5,0x2d, +0xc3,0x95,0x49,0x50,0x20,0xe5,0x2d,0x51,0x82,0x51,0x41,0x12,0x56,0x95,0xfa,0x90, +0x0, 0x87,0xed,0x12,0x1, 0xd7,0xe5,0x2d,0x51,0x76,0xe0,0x90,0x0, 0x88,0x12,0x1, +0xd7,0x5, 0x2d,0x80,0xd9,0x12,0x17,0xea,0x90,0x0, 0x86,0xe5,0x49,0x12,0x1, 0xd7, +0x90,0x0, 0x2d,0xe5,0x3b,0x12,0x1, 0xd7,0xe9,0x24,0x2f,0x12,0x27,0xef,0x54,0xfe, +0x12,0x1, 0xc5,0x12,0x15,0x25,0x90,0x0, 0xd, 0x12,0x1, 0x65,0xff,0xd3,0xe5,0x48, +0x9f,0xe5,0x47,0x94,0x0, 0x40,0x13,0xab,0x2a,0xe5,0x2c,0x24,0x2f,0xf9,0xe4,0x35, +0x2b,0xfa,0x12,0x1, 0x4c,0x44,0x1, 0x12,0x1, 0xc5,0x22,0xe5,0x2d,0x25,0xe0,0x24, +0x45,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0x22,0x3c,0xf5,0x83,0xe0,0xc3,0x13,0x7c, +0x0, 0x2f,0xff,0xec,0x35,0xf0,0xfe,0xef,0x25,0xe0,0xff,0xee,0x33,0xfe,0xe5,0x44, +0x2f,0xf5,0x82,0xe5,0x43,0x3e,0xf5,0x83,0xe0,0xfc,0xa3,0xe0,0xfd,0xe5,0x40,0x25, +0xe0,0xff,0xe5,0x3f,0x33,0xfe,0xe5,0x44,0x2f,0xf5,0x82,0xe5,0x43,0x3e,0xf5,0x83, +0xe0,0x22,0xaf,0x3c,0xef,0x33,0x95,0xe0,0xfe,0xef,0x25,0xe0,0xfd,0xee,0x33,0xfc, +0x74,0x44,0x2d,0xf5,0x82,0x74,0xa, 0x3c,0xf5,0x83,0xe0,0xc3,0x13,0x75,0xf0,0x10, +0xa4,0x22,0xe0,0xff,0xe5,0x2d,0x25,0xe0,0x24,0x2a,0xf5,0x82,0xe4,0x34,0xd, 0x22, +0xfe,0xa3,0xe0,0xff,0xd3,0x95,0x30,0xe5,0x2f,0x64,0x80,0xf8,0xee,0x64,0x80,0x98, +0x22,0xe0,0xfd,0xe5,0x2d,0x75,0xf0,0x2, 0x22,0x3e,0xf5,0x83,0xed,0xf0,0xe5,0x42, +0x22,0xe0,0xff,0xe5,0x2d,0x25,0xe0,0x24,0x2b,0xf5,0x82,0xe4,0x34,0xd, 0x22,0xf0, +0xe5,0x2d,0x25,0xe0,0x24,0x6d,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0x22,0x7c,0x0, +0x2f,0xff,0xec,0x35,0xf0,0x22,0x25,0xe0,0x24,0x95,0xf5,0x82,0xe4,0x34,0xa, 0xf5, +0x83,0x22,0x25,0xe0,0x24,0x94,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0x22,0x7a,0x0, +0x2f,0xff,0xea,0x35,0xf0,0x22,0xf5,0x83,0x74,0xff,0xf0,0x5, 0x2d,0xe5,0x2d,0x22, +0xab,0x21,0xaa,0x22,0xa9,0x23,0x2, 0x1, 0x65,0xab,0x33,0xaa,0x34,0xa9,0x35,0xe4, +0x12,0x1, 0xd7,0xab,0x36,0xaa,0x37,0xa9,0x38,0x90,0x0, 0x1f,0x2, 0x1, 0x65,0xf9, +0xe4,0x35,0x22,0xfa,0x7e,0x0, 0xe9,0x25,0x2d,0xf9,0xee,0x3a,0xfa,0x12,0x1, 0x4c, +0x54,0xf, 0xfd,0xe5,0x2d,0x25,0xe0,0xff,0xee,0x33,0xfe,0x74,0x7c,0x2f,0xf5,0x82, +0x74,0xa, 0x3e,0xf5,0x83,0xed,0xf0,0x12,0x1, 0x4c,0x54,0xf0,0xc4,0x54,0xf, 0xfd, +0xe5,0x2d,0x25,0xe0,0xff,0xe4,0x33,0xfe,0x74,0x7d,0x2f,0xf5,0x82,0x74,0xa, 0x3e, +0xf5,0x83,0x22,0x33,0xfe,0x74,0x44,0x2f,0xf5,0x82,0x74,0xa, 0x3e,0xf5,0x83,0x22, +0xab,0x36,0xaa,0x37,0xa9,0x38,0x2, 0x1, 0x65,0x33,0xfe,0x74,0x45,0x2f,0xf5,0x82, +0x74,0xa, 0x3e,0xf5,0x83,0x22,0xa8,0x1, 0xfc,0xad,0x27,0x7b,0x1, 0x7a,0xa, 0x79, +0x44,0x7e,0x0, 0x2, 0x1, 0x26,0xe5,0x30,0x95,0x36,0xe5,0x35,0x64,0x80,0xf8,0xe5, +0x2f,0x64,0x80,0x98,0x22,0xab,0x27,0xe5,0x29,0x24,0x4f,0xf9,0xe4,0x35,0x28,0xfa, +0x2, 0x1, 0x4c,0x90,0x0, 0x4, 0xe5,0x2a,0x2, 0x1, 0xd7,0x25,0x13,0xf5,0x82,0xe5, +0x12,0x3e,0xf5,0x83,0x75,0xf0,0x2, 0xe5,0x43,0x12,0x5, 0x40,0xe0,0xfe,0xa3,0xe0, +0x22,0xf5,0x83,0xef,0xf0,0x5, 0x29,0xe5,0x29,0x22,0x90,0x8, 0x1d,0x74,0x1, 0xf0, +0xa3,0x74,0xb, 0xf0,0x22,0x90,0x0, 0x7, 0x74,0xff,0x2, 0x1, 0xd7,0xf9,0xe4,0x3a, +0xfa,0x12,0x2, 0x8c,0xc3,0x95,0x2b,0xff,0xe5,0xf0,0x95,0x2a,0x8f,0xf0,0x22,0xe5, +0x3e,0x24,0x1, 0xff,0xe4,0x33,0xa2,0xe7,0x13,0xfe,0xef,0x13,0x22,0xe0,0xfd,0x7b, +0x2, 0xaf,0x41,0x12,0x56,0xb0,0xef,0x22,0xe9,0x24,0x80,0xf9,0xea,0x34,0x3, 0xaf, +0x1, 0x22,0x75,0x60,0xb, 0x75,0x61,0x78,0x7b,0xff,0x7a,0x6, 0x79,0xfc,0x2, 0xa, +0x57,0xe5,0x2c,0x12,0x5, 0x40,0xee,0x8f,0xf0,0x2, 0x3, 0x5b,0xf5,0x30,0xf5,0x31, +0xf5,0x32,0xf5,0x33,0xf5,0x34,0xf5,0x35,0xf5,0x36,0x22,0x74,0x98,0x2d,0xf5,0x82, +0xe4,0x34,0xa, 0xf5,0x83,0x22,0xe0,0xfd,0xaf,0x42,0x12,0x56,0xb0,0xef,0x22,0xff, +0xc3,0xe5,0x3c,0x9f,0xff,0xe4,0x94,0x0, 0xfe,0xef,0x78,0x3, 0x22,0xfd,0x2f,0xff, +0xe4,0x33,0xfe,0xe5,0x3c,0xc3,0x9f,0xee,0x64,0x80,0x22,0x12,0x2, 0xb7,0xd3,0x9d, +0xe5,0xf0,0x9c,0xe5,0x2d,0x75,0xf0,0x7, 0x22,0xff,0xe9,0x24,0x58,0xf9,0xe4,0x3a, +0xfa,0xe9,0x2f,0xf9,0xea,0x3e,0x22,0x90,0x0, 0x52,0xe4,0x12,0x1, 0xd7,0x90,0x0, +0x53,0x22,0xe4,0x12,0x1, 0xc5,0x90,0xc, 0xc7,0xf0,0x22,0xff,0xe5,0xf0,0xc4,0x54, +0xf0,0x48,0x8f,0xf0,0x2, 0x3, 0x3c,0x33,0xfe,0x74,0x94,0x2f,0xf5,0x82,0x74,0xa, +0x3e,0xf5,0x83,0x22,0x90,0xb, 0x60,0x74,0x3, 0xf0,0xa3,0x74,0xe8,0x22,0x12,0x1f, +0x67,0x8e,0x2a,0x8f,0x2b,0xe5,0x2b,0xa8,0x2c,0x8, 0x22,0x74,0x7f,0xf0,0xa3,0x74, +0xff,0xf0,0x22,0x7e,0x0, 0x7f,0x23,0x2, 0x1, 0x26,0x74,0x1a,0x25,0x2c,0xf5,0x82, +0xe4,0x34,0xb, 0xf5,0x83,0x22,0xab,0x21,0xe5,0x23,0x24,0xa, 0xf9,0xe4,0x35,0x22, +0xfa,0x22,0xc3,0x9d,0xff,0xe5,0xf0,0x9c,0xfe,0x2, 0x0, 0x6, 0x74,0x95,0x2f,0xf5, +0x82,0x74,0xa, 0x3e,0xf5,0x83,0x22,0x12,0x2, 0xb7,0xc3,0x9f,0xff,0xe5,0xf0,0x9e, +0xfe,0x22,0x24,0x46,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0x22,0xfe,0xa3,0xe0,0xff, +0x12,0x0, 0x6, 0xd3,0xef,0x22,0x3e,0xf5,0x83,0xec,0x8d,0xf0,0x2, 0x2, 0x60,0x8b, +0x30,0x8a,0x31,0x89,0x32,0x22,0x8b,0x27,0x8a,0x28,0x89,0x29,0x22,0xf5,0x82,0xe4, +0x34,0xb, 0xf5,0x83,0xe4,0xf0,0x22,0x12,0x1, 0x4c,0xff,0xe5,0x2d,0xc3,0x9f,0x22, +0xe5,0x35,0x24,0x10,0xf9,0xe4,0x35,0x34,0x22,0xff,0x74,0x45,0x2d,0xf5,0x82,0x74, +0xa, 0x22,0x12,0x1, 0x4c,0xff,0xe5,0x2a,0xc3,0x9f,0x22,0xe5,0x26,0x24,0xa, 0xf9, +0xe4,0x35,0x25,0x22,0x12,0x1, 0x4c,0xff,0xe5,0x2c,0xc3,0x9f,0x22,0xe5,0x29,0x24, +0x26,0xf9,0xe4,0x35,0x28,0x22,0xfd,0xe5,0x29,0x24,0x28,0xf9,0xe4,0x22,0xf9,0xe4, +0x3a,0xfa,0x2, 0x2, 0x8c,0xe0,0xfc,0xa3,0xe0,0xd3,0x9f,0xec,0x22,0xe5,0x30,0x25, +0xe0,0xff,0xe5,0x2f,0x22,0xe4,0x2f,0xff,0xee,0x34,0x7c,0xfe,0x22,0x90,0x0, 0x4b, +0x12,0x1, 0x65,0xd3,0x22,0x5, 0x2e,0xe5,0x2e,0xc3,0x94,0x5, 0x22,0x74,0x21,0xf0, +0xa3,0x74,0x34,0xf0,0x22,0x74,0x32,0x25,0x2a,0xf8,0x76,0x1, 0x22,0xf9,0xe4,0x35, +0x22,0xfa,0xe5,0x2b,0x22,0x90,0x0, 0x1, 0x12,0x2, 0xb7,0xfd,0x22,0x6d,0x8d,0x92, +0x72,0x94,0x6b,0x11,0xee, \ No newline at end of file diff --git a/drivers/input/touchscreen/Ver17_20110721_028_P728T_app.i b/drivers/input/touchscreen/Ver17_20110721_028_P728T_app.i new file mode 100644 index 00000000..dd721ca0 --- /dev/null +++ b/drivers/input/touchscreen/Ver17_20110721_028_P728T_app.i @@ -0,0 +1,1742 @@ +0x2, 0x5, 0xf0,0x2, 0x57,0xae,0xee,0x30,0xe7,0x7, 0xc3,0xe4,0x9f,0xff,0xe4,0x9e, +0xfe,0x22,0x1, 0x2, 0x4, 0x8, 0x10,0x20,0x40,0x80,0x22,0x2, 0x56,0x2f,0x8f,0xd9, +0x8d,0xda,0x22,0x2, 0x55,0xbe,0xbd,0x77,0xb, 0xef,0xc3,0x94,0x13,0x40,0x19,0x74, +0xf3,0x2f,0xff,0x22,0xbd,0x78,0xb, 0xef,0xc3,0x94,0x13,0x40,0xb, 0x74,0xf8,0x2f, +0xff,0x22,0xbd,0x79,0x1, 0x22,0x7f,0xff,0x22,0x22,0xff,0x2, 0x56,0x17,0x2, 0x17, +0x1f,0xff,0xff,0x2, 0x5a,0xc, 0xe7,0x9, 0xf6,0x8, 0xdf,0xfa,0x80,0x46,0xe7,0x9, +0xf2,0x8, 0xdf,0xfa,0x80,0x3e,0x88,0x82,0x8c,0x83,0xe7,0x9, 0xf0,0xa3,0xdf,0xfa, +0x80,0x32,0xe3,0x9, 0xf6,0x8, 0xdf,0xfa,0x80,0x78,0xe3,0x9, 0xf2,0x8, 0xdf,0xfa, +0x80,0x70,0x88,0x82,0x8c,0x83,0xe3,0x9, 0xf0,0xa3,0xdf,0xfa,0x80,0x64,0x89,0x82, +0x8a,0x83,0xe0,0xa3,0xf6,0x8, 0xdf,0xfa,0x80,0x58,0x89,0x82,0x8a,0x83,0xe0,0xa3, +0xf2,0x8, 0xdf,0xfa,0x80,0x4c,0x80,0xd2,0x80,0xfa,0x80,0xc6,0x80,0xd4,0x80,0x69, +0x80,0xf2,0x80,0x33,0x80,0x10,0x80,0xa6,0x80,0xea,0x80,0x9a,0x80,0xa8,0x80,0xda, +0x80,0xe2,0x80,0xca,0x80,0x33,0x89,0x82,0x8a,0x83,0xec,0xfa,0xe4,0x93,0xa3,0xc8, +0xc5,0x82,0xc8,0xcc,0xc5,0x83,0xcc,0xf0,0xa3,0xc8,0xc5,0x82,0xc8,0xcc,0xc5,0x83, +0xcc,0xdf,0xe9,0xde,0xe7,0x80,0xd, 0x89,0x82,0x8a,0x83,0xe4,0x93,0xa3,0xf6,0x8, +0xdf,0xf9,0xec,0xfa,0xa9,0xf0,0xed,0xfb,0x22,0x89,0x82,0x8a,0x83,0xec,0xfa,0xe0, +0xa3,0xc8,0xc5,0x82,0xc8,0xcc,0xc5,0x83,0xcc,0xf0,0xa3,0xc8,0xc5,0x82,0xc8,0xcc, +0xc5,0x83,0xcc,0xdf,0xea,0xde,0xe8,0x80,0xdb,0x89,0x82,0x8a,0x83,0xe4,0x93,0xa3, +0xf2,0x8, 0xdf,0xf9,0x80,0xcc,0x88,0xf0,0xef,0x60,0x1, 0xe, 0x4e,0x60,0xc3,0x88, +0xf0,0xed,0x24,0x2, 0xb4,0x4, 0x0, 0x50,0xb9,0xf5,0x82,0xeb,0x24,0x2, 0xb4,0x4, +0x0, 0x50,0xaf,0x23,0x23,0x45,0x82,0x23,0x90,0x0, 0xa6,0x73,0xbb,0x1, 0x6, 0x89, +0x82,0x8a,0x83,0xe0,0x22,0x50,0x2, 0xe7,0x22,0xbb,0xfe,0x2, 0xe3,0x22,0x89,0x82, +0x8a,0x83,0xe4,0x93,0x22,0xbb,0x1, 0xc, 0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a, +0xf5,0x83,0xe0,0x22,0x50,0x6, 0xe9,0x25,0x82,0xf8,0xe6,0x22,0xbb,0xfe,0x6, 0xe9, +0x25,0x82,0xf8,0xe2,0x22,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe4, +0x93,0x22,0xbb,0x1, 0xf, 0xf8,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83, +0xe0,0x28,0xf0,0x22,0x50,0x9, 0xc5,0x82,0x29,0xf8,0xe5,0x82,0x26,0xf6,0x22,0xbb, +0xfe,0x9, 0xc5,0x82,0x29,0xf8,0xe2,0x25,0x82,0xf2,0x22,0xf8,0xea,0x25,0x83,0xf5, +0x83,0xe9,0x93,0x28,0x22,0xbb,0x1, 0x6, 0x89,0x82,0x8a,0x83,0xf0,0x22,0x50,0x2, +0xf7,0x22,0xbb,0xfe,0x1, 0xf3,0x22,0xf8,0xbb,0x1, 0xd, 0xe5,0x82,0x29,0xf5,0x82, +0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0x22,0x50,0x6, 0xe9,0x25,0x82,0xc8,0xf6,0x22, +0xbb,0xfe,0x5, 0xe9,0x25,0x82,0xc8,0xf2,0x22,0xef,0x8d,0xf0,0xa4,0xa8,0xf0,0xcf, +0x8c,0xf0,0xa4,0x28,0xce,0x8d,0xf0,0xa4,0x2e,0xfe,0x22,0xbc,0x0, 0xb, 0xbe,0x0, +0x29,0xef,0x8d,0xf0,0x84,0xff,0xad,0xf0,0x22,0xe4,0xcc,0xf8,0x75,0xf0,0x8, 0xef, +0x2f,0xff,0xee,0x33,0xfe,0xec,0x33,0xfc,0xee,0x9d,0xec,0x98,0x40,0x5, 0xfc,0xee, +0x9d,0xfe,0xf, 0xd5,0xf0,0xe9,0xe4,0xce,0xfd,0x22,0xed,0xf8,0xf5,0xf0,0xee,0x84, +0x20,0xd2,0x1c,0xfe,0xad,0xf0,0x75,0xf0,0x8, 0xef,0x2f,0xff,0xed,0x33,0xfd,0x40, +0x7, 0x98,0x50,0x6, 0xd5,0xf0,0xf2,0x22,0xc3,0x98,0xfd,0xf, 0xd5,0xf0,0xea,0x22, +0xc5,0xf0,0xf8,0xa3,0xe0,0x28,0xf0,0xc5,0xf0,0xf8,0xe5,0x82,0x15,0x82,0x70,0x2, +0x15,0x83,0xe0,0x38,0xf0,0x22,0xa3,0xf8,0xe0,0xc5,0xf0,0x25,0xf0,0xf0,0xe5,0x82, +0x15,0x82,0x70,0x2, 0x15,0x83,0xe0,0xc8,0x38,0xf0,0xe8,0x22,0xbb,0x1, 0xa, 0x89, +0x82,0x8a,0x83,0xe0,0xf5,0xf0,0xa3,0xe0,0x22,0x50,0x6, 0x87,0xf0,0x9, 0xe7,0x19, +0x22,0xbb,0xfe,0x7, 0xe3,0xf5,0xf0,0x9, 0xe3,0x19,0x22,0x89,0x82,0x8a,0x83,0xe4, +0x93,0xf5,0xf0,0x74,0x1, 0x93,0x22,0xbb,0x1, 0x10,0xe5,0x82,0x29,0xf5,0x82,0xe5, +0x83,0x3a,0xf5,0x83,0xe0,0xf5,0xf0,0xa3,0xe0,0x22,0x50,0x9, 0xe9,0x25,0x82,0xf8, +0x86,0xf0,0x8, 0xe6,0x22,0xbb,0xfe,0xa, 0xe9,0x25,0x82,0xf8,0xe2,0xf5,0xf0,0x8, +0xe2,0x22,0xe5,0x83,0x2a,0xf5,0x83,0xe9,0x93,0xf5,0xf0,0xa3,0xe9,0x93,0x22,0xbb, +0x1, 0xd, 0xc5,0x82,0x29,0xc5,0x82,0xc5,0x83,0x3a,0xc5,0x83,0x2, 0x2, 0x60,0x50, +0x11,0xc5,0x82,0x29,0xf8,0x8, 0xe5,0xf0,0x26,0xf6,0x18,0xf5,0xf0,0xe5,0x82,0x36, +0xf6,0x22,0xbb,0xfe,0x11,0xc5,0x82,0x29,0xf8,0x8, 0xe2,0x25,0xf0,0xf5,0xf0,0xf2, +0x18,0xe2,0x35,0x82,0xf2,0x22,0xf8,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x2a,0xf5, +0x83,0x74,0x1, 0x93,0x25,0xf0,0xf5,0xf0,0xe4,0x93,0x38,0x22,0xbb,0x1, 0xa, 0x89, +0x82,0x8a,0x83,0xf0,0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x6, 0xf7,0x9, 0xa7,0xf0,0x19, +0x22,0xbb,0xfe,0x6, 0xf3,0xe5,0xf0,0x9, 0xf3,0x19,0x22,0xf8,0xbb,0x1, 0x11,0xe5, +0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0xe5,0xf0,0xa3,0xf0,0x22, +0x50,0x9, 0xe9,0x25,0x82,0xc8,0xf6,0x8, 0xa6,0xf0,0x22,0xbb,0xfe,0x9, 0xe9,0x25, +0x82,0xc8,0xf2,0xe5,0xf0,0x8, 0xf2,0x22,0xe8,0x8f,0xf0,0xa4,0xcc,0x8b,0xf0,0xa4, +0x2c,0xfc,0xe9,0x8e,0xf0,0xa4,0x2c,0xfc,0x8a,0xf0,0xed,0xa4,0x2c,0xfc,0xea,0x8e, +0xf0,0xa4,0xcd,0xa8,0xf0,0x8b,0xf0,0xa4,0x2d,0xcc,0x38,0x25,0xf0,0xfd,0xe9,0x8f, +0xf0,0xa4,0x2c,0xcd,0x35,0xf0,0xfc,0xeb,0x8e,0xf0,0xa4,0xfe,0xa9,0xf0,0xeb,0x8f, +0xf0,0xa4,0xcf,0xc5,0xf0,0x2e,0xcd,0x39,0xfe,0xe4,0x3c,0xfc,0xea,0xa4,0x2d,0xce, +0x35,0xf0,0xfd,0xe4,0x3c,0xfc,0x22,0x75,0xf0,0x8, 0x75,0x82,0x0, 0xef,0x2f,0xff, +0xee,0x33,0xfe,0xcd,0x33,0xcd,0xcc,0x33,0xcc,0xc5,0x82,0x33,0xc5,0x82,0x9b,0xed, +0x9a,0xec,0x99,0xe5,0x82,0x98,0x40,0xc, 0xf5,0x82,0xee,0x9b,0xfe,0xed,0x9a,0xfd, +0xec,0x99,0xfc,0xf, 0xd5,0xf0,0xd6,0xe4,0xce,0xfb,0xe4,0xcd,0xfa,0xe4,0xcc,0xf9, +0xa8,0x82,0x22,0xb8,0x0, 0xc1,0xb9,0x0, 0x59,0xba,0x0, 0x2d,0xec,0x8b,0xf0,0x84, +0xcf,0xce,0xcd,0xfc,0xe5,0xf0,0xcb,0xf9,0x78,0x18,0xef,0x2f,0xff,0xee,0x33,0xfe, +0xed,0x33,0xfd,0xec,0x33,0xfc,0xeb,0x33,0xfb,0x10,0xd7,0x3, 0x99,0x40,0x4, 0xeb, +0x99,0xfb,0xf, 0xd8,0xe5,0xe4,0xf9,0xfa,0x22,0x78,0x18,0xef,0x2f,0xff,0xee,0x33, +0xfe,0xed,0x33,0xfd,0xec,0x33,0xfc,0xc9,0x33,0xc9,0x10,0xd7,0x5, 0x9b,0xe9,0x9a, +0x40,0x7, 0xec,0x9b,0xfc,0xe9,0x9a,0xf9,0xf, 0xd8,0xe0,0xe4,0xc9,0xfa,0xe4,0xcc, +0xfb,0x22,0x75,0xf0,0x10,0xef,0x2f,0xff,0xee,0x33,0xfe,0xed,0x33,0xfd,0xcc,0x33, +0xcc,0xc8,0x33,0xc8,0x10,0xd7,0x7, 0x9b,0xec,0x9a,0xe8,0x99,0x40,0xa, 0xed,0x9b, +0xfd,0xec,0x9a,0xfc,0xe8,0x99,0xf8,0xf, 0xd5,0xf0,0xda,0xe4,0xcd,0xfb,0xe4,0xcc, +0xfa,0xe4,0xc8,0xf9,0x22,0xeb,0x9f,0xf5,0xf0,0xea,0x9e,0x42,0xf0,0xe9,0x9d,0x42, +0xf0,0xec,0x64,0x80,0xc8,0x64,0x80,0x98,0x45,0xf0,0x22,0xeb,0x9f,0xf5,0xf0,0xea, +0x9e,0x42,0xf0,0xe9,0x9d,0x42,0xf0,0xe8,0x9c,0x45,0xf0,0x22,0xe8,0x60,0xf, 0xec, +0xc3,0x13,0xfc,0xed,0x13,0xfd,0xee,0x13,0xfe,0xef,0x13,0xff,0xd8,0xf1,0x22,0xe8, +0x60,0xf, 0xef,0xc3,0x33,0xff,0xee,0x33,0xfe,0xed,0x33,0xfd,0xec,0x33,0xfc,0xd8, +0xf1,0x22,0xec,0xf0,0xa3,0xed,0xf0,0xa3,0xee,0xf0,0xa3,0xef,0xf0,0x22,0xa8,0x82, +0x85,0x83,0xf0,0xd0,0x83,0xd0,0x82,0x12,0x5, 0x15,0x12,0x5, 0x15,0x12,0x5, 0x15, +0x12,0x5, 0x15,0xe4,0x73,0xe4,0x93,0xa3,0xc5,0x83,0xc5,0xf0,0xc5,0x83,0xc8,0xc5, +0x82,0xc8,0xf0,0xa3,0xc5,0x83,0xc5,0xf0,0xc5,0x83,0xc8,0xc5,0x82,0xc8,0x22,0xf5, +0xf0,0xc5,0x82,0xa4,0xc5,0x82,0xc5,0xf0,0xc5,0x83,0xa4,0x25,0x83,0xf5,0x83,0x22, +0xa4,0x25,0x82,0xf5,0x82,0xe5,0xf0,0x35,0x83,0xf5,0x83,0x22,0xbb,0x1, 0x7, 0x89, +0x82,0x8a,0x83,0x2, 0x5, 0xd2,0x50,0x5, 0xe9,0xf8,0x2, 0x5, 0xc9,0xbb,0xfe,0x5, +0xe9,0xf8,0x2, 0x5, 0xdb,0x89,0x82,0x8a,0x83,0x2, 0x5, 0xe4,0xbb,0x1, 0xd, 0xe5, +0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0x2, 0x5, 0xd2,0x50,0x7, 0xe9,0x25, +0x82,0xf8,0x2, 0x5, 0xc9,0xbb,0xfe,0x7, 0xe9,0x25,0x82,0xf8,0x2, 0x5, 0xdb,0xe5, +0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0x2, 0x5, 0xe4,0xec,0x8e,0xf0,0xa4, +0xcc,0xc5,0xf0,0xcc,0xcd,0xf8,0xef,0xa4,0xce,0xc5,0xf0,0x2d,0xfd,0xe4,0x3c,0xfc, +0xe8,0xa4,0x2e,0xc8,0xc5,0xf0,0x3d,0xfd,0xe4,0x3c,0xfc,0xef,0xa4,0xff,0xe5,0xf0, +0x28,0xfe,0xe4,0x3d,0xfd,0xe4,0x3c,0xfc,0x22,0xe6,0xfb,0x8, 0xe6,0xfa,0x8, 0xe6, +0xf9,0x22,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x22,0xe2,0xfb,0x8, 0xe2,0xfa, +0x8, 0xe2,0xf9,0x22,0xe4,0x93,0xfb,0x74,0x1, 0x93,0xfa,0x74,0x2, 0x93,0xf9,0x22, +0x78,0xff,0xe4,0xf6,0xd8,0xfd,0x75,0x81,0x92,0x2, 0x6, 0x37,0x2, 0x44,0xf3,0xe4, +0x93,0xa3,0xf8,0xe4,0x93,0xa3,0x40,0x3, 0xf6,0x80,0x1, 0xf2,0x8, 0xdf,0xf4,0x80, +0x29,0xe4,0x93,0xa3,0xf8,0x54,0x7, 0x24,0xc, 0xc8,0xc3,0x33,0xc4,0x54,0xf, 0x44, +0x20,0xc8,0x83,0x40,0x4, 0xf4,0x56,0x80,0x1, 0x46,0xf6,0xdf,0xe4,0x80,0xb, 0x1, +0x2, 0x4, 0x8, 0x10,0x20,0x40,0x80,0x90,0x6, 0xcb,0xe4,0x7e,0x1, 0x93,0x60,0xbc, +0xa3,0xff,0x54,0x3f,0x30,0xe5,0x9, 0x54,0x1f,0xfe,0xe4,0x93,0xa3,0x60,0x1, 0xe, +0xcf,0x54,0xc0,0x25,0xe0,0x60,0xa8,0x40,0xb8,0xe4,0x93,0xa3,0xfa,0xe4,0x93,0xa3, +0xf8,0xe4,0x93,0xa3,0xc8,0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,0xf0,0xa3,0xc8,0xc5, +0x82,0xc8,0xca,0xc5,0x83,0xca,0xdf,0xe9,0xde,0xe7,0x80,0xbe,0xab,0x3e,0xaa,0x3f, +0xa9,0x40,0x85,0x43,0x82,0x75,0x83,0x0, 0x22,0xab,0x54,0xaa,0x55,0xa9,0x56,0x85, +0x59,0x82,0x75,0x83,0x0, 0x22,0xe5,0x42,0xab,0x3e,0xaa,0x3f,0xa9,0x40,0x22,0xe5, +0x58,0xab,0x54,0xaa,0x55,0xa9,0x56,0x22,0xbd,0x77,0xb, 0xef,0xc3,0x94,0x6, 0x40, +0x19,0x74,0xd, 0x2f,0xff,0x22,0xbd,0x78,0xb, 0xef,0xc3,0x94,0xb, 0x40,0xb, 0x74, +0x8, 0x2f,0xff,0x22,0xbd,0x79,0x1, 0x22,0x7f,0xff,0x22,0x1, 0xc, 0x0, 0x41,0xa, +0xe6,0x0, 0x41,0xc, 0x3b,0x0, 0x41,0xc, 0x34,0x0, 0x41,0xc, 0x36,0x0, 0x41,0xc, +0x50,0x0, 0x41,0xc, 0x37,0x0, 0x1, 0x16,0x0, 0x0, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, +0x0, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, +0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x52,0x52,0x52,0x52, +0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x0, 0x0, 0x0, 0x33,0x33,0x33,0x33, +0x33,0x33,0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x66,0x45,0x65,0x46,0x7, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7c, +0x3, 0x0, 0xf0,0x2, 0x0, 0x0, 0x1, 0x0, 0x1, 0x2, 0x3, 0x1, 0x2, 0x0, 0x0, 0xb4, +0x64,0x64,0x64,0x10,0x10,0x10,0x1c,0x19,0x14,0x10,0xe, 0xc, 0xb, 0xa, 0x9, 0x8, +0x7, 0x6, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x8b,0x3b,0x8a,0x3c,0x89,0x3d,0xe4,0xf5,0x43,0xe5,0x43,0xc3,0x95,0x41,0x40,0x3, +0x2, 0xa, 0x56,0xab,0x3b,0xaa,0x3c,0xa9,0x3d,0x12,0x6, 0x82,0x12,0x1, 0x65,0xb4, +0x1c,0x0, 0x40,0x3, 0x2, 0xa, 0x51,0x90,0x8, 0x2e,0xf8,0x28,0x28,0x73,0x2, 0x8, +0x82,0x2, 0x8, 0x89,0x2, 0x8, 0x91,0x2, 0x8, 0x99,0x2, 0x8, 0xa1,0x2, 0x8, 0xa9, +0x2, 0x8, 0xb1,0x2, 0x8, 0xc7,0x2, 0x8, 0xdd,0x2, 0x8, 0xf3,0x2, 0x9, 0x9, 0x2, +0x9, 0x1f,0x2, 0x9, 0x42,0x2, 0x9, 0x65,0x2, 0x9, 0x88,0x2, 0x9, 0xab,0x2, 0x9, +0xc1,0x2, 0x9, 0xd7,0x2, 0x9, 0xed,0x2, 0xa, 0x3, 0x2, 0xa, 0x18,0x2, 0xa, 0x1f, +0x2, 0xa, 0x26,0x2, 0xa, 0x2d,0x2, 0xa, 0x34,0x2, 0xa, 0x3b,0x2, 0xa, 0x42,0x2, +0xa, 0x49,0x12,0x6, 0x7c,0xe4,0x2, 0xa, 0x4e,0x12,0x6, 0x7c,0x74,0x1, 0x2, 0xa, +0x4e,0x12,0x6, 0x7c,0x74,0x2, 0x2, 0xa, 0x4e,0x12,0x6, 0x7c,0x74,0x3, 0x2, 0xa, +0x4e,0x12,0x6, 0x7c,0x74,0x4, 0x2, 0xa, 0x4e,0x12,0x6, 0x7c,0x74,0x5, 0x2, 0xa, +0x4e,0x12,0x6, 0x96,0xb4,0x77,0x8, 0x12,0x6, 0x82,0x74,0x13,0x2, 0xa, 0x4e,0x12, +0x6, 0x82,0x74,0x6, 0x2, 0xa, 0x4e,0x12,0x6, 0x96,0xb4,0x77,0x8, 0x12,0x6, 0x82, +0x74,0x14,0x2, 0xa, 0x4e,0x12,0x6, 0x82,0x74,0x7, 0x2, 0xa, 0x4e,0x12,0x6, 0x96, +0xb4,0x77,0x8, 0x12,0x6, 0x82,0x74,0x15,0x2, 0xa, 0x4e,0x12,0x6, 0x82,0x74,0x8, +0x2, 0xa, 0x4e,0x12,0x6, 0x96,0xb4,0x77,0x8, 0x12,0x6, 0x82,0x74,0x16,0x2, 0xa, +0x4e,0x12,0x6, 0x82,0x74,0x9, 0x2, 0xa, 0x4e,0x12,0x6, 0x96,0xb4,0x77,0x8, 0x12, +0x6, 0x82,0x74,0x17,0x2, 0xa, 0x4e,0x12,0x6, 0x82,0x74,0xa, 0x2, 0xa, 0x4e,0xe5, +0x42,0xb4,0x77,0x8, 0x12,0x6, 0x7c,0x74,0x18,0x2, 0xa, 0x4e,0x12,0x6, 0x96,0xb4, +0x78,0x8, 0x12,0x6, 0x82,0x74,0x13,0x2, 0xa, 0x4e,0x12,0x6, 0x82,0x74,0xb, 0x2, +0xa, 0x4e,0xe5,0x42,0xb4,0x77,0x8, 0x12,0x6, 0x7c,0x74,0x19,0x2, 0xa, 0x4e,0x12, +0x6, 0x96,0xb4,0x78,0x8, 0x12,0x6, 0x82,0x74,0x14,0x2, 0xa, 0x4e,0x12,0x6, 0x82, +0x74,0xc, 0x2, 0xa, 0x4e,0xe5,0x42,0xb4,0x77,0x8, 0x12,0x6, 0x7c,0x74,0x1a,0x2, +0xa, 0x4e,0x12,0x6, 0x96,0xb4,0x78,0x8, 0x12,0x6, 0x82,0x74,0x15,0x2, 0xa, 0x4e, +0x12,0x6, 0x82,0x74,0xd, 0x2, 0xa, 0x4e,0xe5,0x42,0xb4,0x77,0x8, 0x12,0x6, 0x7c, +0x74,0x1b,0x2, 0xa, 0x4e,0x12,0x6, 0x96,0xb4,0x78,0x8, 0x12,0x6, 0x82,0x74,0x16, +0x2, 0xa, 0x4e,0x12,0x6, 0x82,0x74,0xe, 0x2, 0xa, 0x4e,0x12,0x6, 0x96,0xb4,0x78, +0x8, 0x12,0x6, 0x82,0x74,0x17,0x2, 0xa, 0x4e,0x12,0x6, 0x82,0x74,0xf, 0x2, 0xa, +0x4e,0x12,0x6, 0x96,0xb4,0x78,0x8, 0x12,0x6, 0x82,0x74,0x18,0x2, 0xa, 0x4e,0x12, +0x6, 0x82,0x74,0x10,0x2, 0xa, 0x4e,0x12,0x6, 0x96,0xb4,0x78,0x8, 0x12,0x6, 0x82, +0x74,0x19,0x2, 0xa, 0x4e,0x12,0x6, 0x82,0x74,0x11,0x2, 0xa, 0x4e,0x12,0x6, 0x96, +0xb4,0x78,0x8, 0x12,0x6, 0x82,0x74,0x1a,0x2, 0xa, 0x4e,0x12,0x6, 0x82,0x74,0x12, +0x2, 0xa, 0x4e,0x12,0x6, 0x96,0xb4,0x78,0x8, 0x12,0x6, 0x82,0x74,0x1b,0x2, 0xa, +0x4e,0x12,0x6, 0x82,0x74,0x13,0x80,0x36,0x12,0x6, 0x7c,0x74,0x14,0x80,0x2f,0x12, +0x6, 0x7c,0x74,0x15,0x80,0x28,0x12,0x6, 0x7c,0x74,0x16,0x80,0x21,0x12,0x6, 0x7c, +0x74,0x17,0x80,0x1a,0x12,0x6, 0x7c,0x74,0x18,0x80,0x13,0x12,0x6, 0x7c,0x74,0x19, +0x80,0xc, 0x12,0x6, 0x7c,0x74,0x1a,0x80,0x5, 0x12,0x6, 0x7c,0x74,0x1b,0x12,0x1, +0xd7,0x5, 0x43,0x2, 0x8, 0x9, 0x22,0x8b,0x51,0x8a,0x52,0x89,0x53,0xe4,0xf5,0x59, +0xe5,0x59,0xc3,0x95,0x57,0x40,0x3, 0x2, 0xc, 0x53,0xab,0x51,0xaa,0x52,0xa9,0x53, +0x12,0x6, 0x8f,0x12,0x1, 0x65,0xb4,0x10,0x0, 0x40,0x3, 0x2, 0xc, 0x4e,0x90,0xa, +0x85,0xf8,0x28,0x28,0x73,0x2, 0xa, 0xb5,0x2, 0xa, 0xcf,0x2, 0xa, 0xf2,0x2, 0xb, +0x15,0x2, 0xb, 0x38,0x2, 0xb, 0x5b,0x2, 0xb, 0x7e,0x2, 0xb, 0xa1,0x2, 0xb, 0xc4, +0x2, 0xb, 0xe7,0x2, 0xc, 0x9, 0x2, 0xc, 0x1d,0x2, 0xc, 0x31,0x2, 0xc, 0x38,0x2, +0xc, 0x3f,0x2, 0xc, 0x46,0xe5,0x58,0xb4,0x77,0x5, 0x12,0x6, 0xa1,0x80,0x23,0x12, +0x6, 0x9f,0xb4,0x78,0x3, 0x2, 0xb, 0x30,0x12,0x6, 0x8f,0xe4,0x2, 0xc, 0x4b,0xe5, +0x58,0xb4,0x77,0x8, 0x12,0x6, 0x89,0x74,0x5, 0x2, 0xc, 0x4b,0x12,0x6, 0x9f,0xb4, +0x78,0x8, 0x12,0x6, 0x8f,0x74,0x4, 0x2, 0xc, 0x4b,0x12,0x6, 0x8f,0x74,0x1, 0x2, +0xc, 0x4b,0xe5,0x58,0xb4,0x77,0x8, 0x12,0x6, 0x89,0x74,0x6, 0x2, 0xc, 0x4b,0x12, +0x6, 0x9f,0xb4,0x78,0x8, 0x12,0x6, 0x8f,0x74,0x5, 0x2, 0xc, 0x4b,0x12,0x6, 0x8f, +0x74,0x2, 0x2, 0xc, 0x4b,0xe5,0x58,0xb4,0x77,0x8, 0x12,0x6, 0x89,0x74,0x7, 0x2, +0xc, 0x4b,0x12,0x6, 0x9f,0xb4,0x78,0x8, 0x12,0x6, 0x8f,0x74,0x6, 0x2, 0xc, 0x4b, +0x12,0x6, 0x8f,0x74,0x3, 0x2, 0xc, 0x4b,0xe5,0x58,0xb4,0x77,0x8, 0x12,0x6, 0x89, +0x74,0x8, 0x2, 0xc, 0x4b,0x12,0x6, 0x9f,0xb4,0x78,0x8, 0x12,0x6, 0x8f,0x74,0x7, +0x2, 0xc, 0x4b,0x12,0x6, 0x8f,0x74,0x4, 0x2, 0xc, 0x4b,0xe5,0x58,0xb4,0x77,0x8, +0x12,0x6, 0x89,0x74,0x9, 0x2, 0xc, 0x4b,0x12,0x6, 0x9f,0xb4,0x78,0x8, 0x12,0x6, +0x8f,0x74,0x8, 0x2, 0xc, 0x4b,0x12,0x6, 0x8f,0x74,0x5, 0x2, 0xc, 0x4b,0xe5,0x58, +0xb4,0x77,0x8, 0x12,0x6, 0x89,0x74,0xa, 0x2, 0xc, 0x4b,0x12,0x6, 0x9f,0xb4,0x78, +0x8, 0x12,0x6, 0x8f,0x74,0x9, 0x2, 0xc, 0x4b,0x12,0x6, 0x8f,0x74,0x6, 0x2, 0xc, +0x4b,0xe5,0x58,0xb4,0x77,0x8, 0x12,0x6, 0x89,0x74,0xb, 0x2, 0xc, 0x4b,0x12,0x6, +0x9f,0xb4,0x78,0x8, 0x12,0x6, 0x8f,0x74,0xa, 0x2, 0xc, 0x4b,0x12,0x6, 0x8f,0x74, +0x7, 0x2, 0xc, 0x4b,0xe5,0x58,0xb4,0x77,0x8, 0x12,0x6, 0x89,0x74,0xc, 0x2, 0xc, +0x4b,0x12,0x6, 0x9f,0xb4,0x78,0x8, 0x12,0x6, 0x8f,0x74,0xb, 0x2, 0xc, 0x4b,0x12, +0x6, 0x8f,0x74,0x8, 0x2, 0xc, 0x4b,0xe5,0x58,0xb4,0x77,0x8, 0x12,0x6, 0x89,0x74, +0xd, 0x2, 0xc, 0x4b,0x12,0x6, 0x9f,0xb4,0x78,0x8, 0x12,0x6, 0x8f,0x74,0xc, 0x2, +0xc, 0x4b,0x12,0x6, 0x8f,0x74,0x9, 0x80,0x42,0x12,0x6, 0x9f,0xb4,0x78,0x7, 0x12, +0x6, 0x8f,0x74,0xd, 0x80,0x35,0x12,0x6, 0x8f,0x74,0xa, 0x80,0x2e,0x12,0x6, 0x9f, +0xb4,0x78,0x7, 0x12,0x6, 0x8f,0x74,0xe, 0x80,0x21,0x12,0x6, 0x8f,0x74,0xb, 0x80, +0x1a,0x12,0x6, 0x89,0x74,0xc, 0x80,0x13,0x12,0x6, 0x89,0x74,0xd, 0x80,0xc, 0x12, +0x6, 0x89,0x74,0xe, 0x80,0x5, 0x12,0x6, 0x89,0x74,0xf, 0x12,0x1, 0xd7,0x5, 0x59, +0x2, 0xa, 0x60,0x22,0xc0,0x0, 0xc0,0x3f,0xdf,0xbf,0xdf,0xbf,0xc0,0x1, 0xc0,0x82, +0xc1,0x2, 0xc1,0x1, 0xc0,0x3f,0xdf,0x3d,0xde,0x3c,0xde,0xbe,0xc0,0x2, 0xc1,0x85, +0xc2,0x85,0xc2,0x2, 0xc0,0x3e,0xde,0x3a,0xdd,0x3a,0xdd,0xbd,0xc0,0x3, 0xc2,0x87, +0xc4,0x7, 0xc3,0x3, 0xc0,0x3d,0xdd,0x38,0xdb,0xb7,0xdc,0xbc,0xc0,0x4, 0xc3,0x8a, +0xc5,0x8a,0xc4,0x4, 0xc0,0x3c,0xdc,0x35,0xda,0x35,0xdb,0xbb,0xc0,0x5, 0xc4,0x8c, +0xc6,0x8d,0xc5,0x5, 0xc0,0x3b,0xdb,0x32,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8d,0xc5,0x5, 0xc0,0x3b,0xdb,0x34,0xd9,0xb4,0xdb,0xbb,0xc0,0x5, 0xc4,0x8b, +0xc6,0xb, 0xc4,0x4, 0xc0,0x3c,0xdc,0x36,0xdb,0x36,0xdc,0xbc,0xc0,0x4, 0xc3,0x89, +0xc4,0x88,0xc3,0x3, 0xc0,0x3d,0xdd,0x39,0xdc,0x39,0xdd,0xbd,0xc0,0x3, 0xc2,0x86, +0xc3,0x6, 0xc2,0x2, 0xc0,0x3e,0xde,0x3b,0xdd,0xbc,0xde,0xbe,0xc0,0x2, 0xc1,0x83, +0xc1,0x83,0xc1,0x1, 0xc0,0x3f,0xdf,0x3e,0xdf,0x3e,0xdf,0xbf,0xc0,0x0, 0xc0,0x81, +0xc0,0x80,0xc0,0x0, 0x12,0x3f,0xe1,0xe5,0x37,0xd3,0x94,0x9, 0x50,0x37,0xed,0x94, +0xf, 0x50,0x32,0xe5,0x37,0xc3,0x94,0x9, 0x50,0x2b,0xe5,0x37,0x90,0x6, 0xf7,0x93, +0xff,0x24,0x4, 0xab,0x33,0x20,0xe0,0xe, 0x12,0x6b,0xf9,0xfa,0xef,0xd1,0xaa,0x54, +0xf0,0xd1,0x96,0x4d,0x80,0xc, 0xd1,0x9b,0x54,0xf, 0xd1,0x96,0xff,0xed,0xc4,0x54, +0xf0,0x4f,0x12,0x1, 0xc5,0x22,0x12,0x1, 0xc5,0xab,0x33,0xe5,0x35,0x24,0x10,0xf9, +0xe4,0x35,0x34,0xfa,0xe5,0x37,0x90,0x6, 0xf7,0x93,0x24,0x4, 0xff,0xe4,0x33,0xa2, +0xe7,0x13,0xfe,0xef,0x13,0x29,0xf9,0xea,0x3e,0xfa,0x2, 0x1, 0x4c,0x12,0x4b,0xde, +0xe4,0xf5,0x2d,0xe5,0x2d,0x20,0xe0,0x13,0xab,0x29,0xf1,0xb3,0xe5,0x2d,0xc3,0x13, +0x7e,0x0, 0x29,0xf9,0xee,0x3a,0xfa,0xe4,0x12,0x1, 0xc5,0xe5,0x2d,0xc3,0x94,0x9, +0x50,0x1d,0x74,0x36,0x25,0x2d,0x12,0x6c,0xa7,0xe0,0xff,0xe5,0x2d,0x90,0x6, 0xf7, +0x93,0x24,0x4, 0xf5,0x82,0xe4,0x33,0xf5,0x83,0xf1,0xc1,0xef,0x12,0x1, 0xd7,0x5, +0x2d,0xe5,0x2d,0xb4,0x10,0xbd,0xe4,0xf5,0x2d,0xe5,0x2d,0x20,0xe0,0x5, 0xf1,0xc8, +0xe0,0x80,0x9, 0xe5,0x2d,0xf1,0xc8,0xe0,0x54,0xf0,0xff,0xc4,0x54,0xf, 0xf5,0x2c, +0xe5,0x2d,0xc3,0x94,0x9, 0x50,0x2a,0xe5,0x2d,0x90,0x6, 0xf7,0x93,0xff,0x24,0x4, +0xab,0x29,0x20,0xe0,0x9, 0xf1,0xb3,0xef,0xd1,0xaa,0x45,0x2c,0x80,0x10,0xf1,0xb3, +0xe5,0x2d,0x90,0x6, 0xf7,0xd1,0xa9,0xff,0xe5,0x2c,0xc4,0x54,0xf0,0x4f,0x12,0x1, +0xc5,0x5, 0x2d,0xe5,0x2d,0x64,0x10,0x70,0xb0,0x90,0xa, 0xf0,0xe0,0xf1,0xc1,0x90, +0x0, 0x18,0x12,0x1, 0xd7,0x90,0xb, 0x1a,0xe0,0x90,0x0, 0x19,0x12,0x4b,0xfd,0x90, +0x0, 0x1a,0x12,0x1, 0xd7,0x90,0x0, 0x1b,0xe4,0x12,0x4b,0xf5,0x90,0x0, 0x1c,0x12, +0x1, 0xd7,0x90,0x0, 0x1e,0x74,0x13,0x12,0x1, 0xd7,0x90,0x0, 0x20,0x74,0x3, 0x12, +0x1, 0xd7,0x90,0x0, 0x21,0x74,0x3f,0x12,0x1, 0xd7,0x90,0x0, 0x22,0x74,0x3f,0x12, +0x1, 0xd7,0x90,0x0, 0x1d,0x12,0x52,0x3f,0x74,0x1, 0x12,0x1, 0xd7,0x12,0x2e,0x6b, +0x8f,0x2c,0x22,0xe5,0x2b,0x24,0x10,0xf9,0xe4,0x35,0x2a,0xfa,0x22,0xfd,0x12,0x0, +0x1e,0xab,0x29,0xaa,0x2a,0xa9,0x2b,0x22,0xc3,0x13,0x24,0x54,0xf5,0x82,0xe4,0x34, +0xb, 0xf5,0x83,0x22,0x7a,0xa, 0x79,0xee,0x12,0x15,0x9d,0x90,0x0, 0x52,0x12,0x1, +0x65,0xf5,0x30,0x90,0x0, 0x53,0x12,0x1, 0x65,0xf5,0x31,0x12,0x4b,0xb8,0xe4,0x12, +0x1, 0xd7,0xe4,0xf5,0x2d,0xab,0x21,0xe5,0x23,0x24,0x58,0x12,0x68,0x54,0xed,0xf0, +0x5, 0x2d,0xe5,0x2d,0xb4,0xe, 0xee,0xe4,0xf5,0x2f,0xf5,0x2d,0xb1,0xaa,0xf5,0x83, +0xe0,0xff,0xc3,0x95,0x2f,0x40,0x2, 0x8f,0x2f,0x5, 0x2d,0xe5,0x2d,0xb4,0xd, 0xec, +0xe5,0x2f,0xc3,0x94,0xf, 0x50,0x9, 0xc3,0x74,0xf, 0x95,0x2f,0xf5,0x2f,0x80,0x3, +0xe4,0xf5,0x2f,0xe4,0xf5,0x2d,0xab,0x21,0xe5,0x23,0x24,0x66,0x12,0x68,0x54,0xed, +0xf0,0x5, 0x2d,0xe5,0x2d,0xb4,0x8, 0xee,0x85,0x2f,0x2e,0xaf,0x2e,0x15,0x2e,0xef, +0x70,0x2, 0x21,0xc1,0x12,0x0, 0x4e,0x12,0x25,0xce,0x53,0xdb,0xf0,0xf1,0xd1,0x12, +0x2e,0x6b,0x12,0x27,0x3, 0x85,0x27,0x47,0x85,0x28,0x48,0x85,0x29,0x49,0xb1,0xa3, +0x12,0x53,0xeb,0x60,0xf0,0xe4,0xf5,0x2d,0xb1,0xa3,0x12,0x6b,0xde,0x50,0x5e,0xe4, +0xfd,0xb1,0xa3,0xf1,0xc4,0xff,0xed,0xc3,0x9f,0x50,0x4e,0xe5,0x2d,0x70,0xb, 0xf1, +0xe9,0xe4,0xf0,0xed,0x51,0xf, 0xe4,0xf0,0xa3,0xf0,0xb1,0x30,0x12,0x2f,0x79,0xe5, +0x2d,0x12,0x2e,0x64,0xed,0xf1,0x15,0xd3,0x94,0xf8,0xee,0x64,0x80,0x94,0xaa,0x50, +0x25,0xc3,0xef,0x94,0x70,0xee,0x64,0x80,0x94,0x97,0x40,0x1a,0xef,0x78,0x5, 0xce, +0xa2,0xe7,0x13,0xce,0x13,0xd8,0xf8,0xff,0xed,0x51,0xf, 0xee,0x8f,0xf0,0x12,0x2, +0x60,0xf1,0xe9,0xe0,0x4, 0xf0,0xd, 0x80,0xa8,0x5, 0x2d,0x80,0x9b,0xe4,0xf5,0x32, +0xf5,0x2d,0xb1,0xa3,0xf1,0xc4,0xff,0xe5,0x2d,0xc3,0x9f,0x40,0x2, 0x21,0xb7,0x74, +0x98,0x25,0x2d,0xf1,0xec,0xe0,0xfd,0x70,0x9, 0xe5,0x2d,0x51,0xf, 0x12,0x6c,0xaf, +0x80,0x3a,0xe5,0x2d,0x51,0xf, 0xc0,0x83,0xc0,0x82,0xe0,0xfe,0xa3,0xe0,0xff,0x7c, +0x0, 0x12,0x2, 0xb, 0xd0,0x82,0xd0,0x83,0xee,0xf0,0xa3,0xef,0xf0,0xe5,0x2d,0x51, +0xf, 0xc0,0x83,0xc0,0x82,0xe0,0xfe,0xa3,0xe0,0x78,0x5, 0xc3,0x33,0xce,0x33,0xce, +0xd8,0xf9,0xff,0xd0,0x82,0xd0,0x83,0xee,0xf0,0xa3,0xef,0xf0,0xf1,0x30,0x90,0x0, +0x72,0xf1,0x18,0x90,0x0, 0xe, 0xf1,0xfa,0xe5,0x2d,0x51,0xf, 0xe0,0xfc,0xa3,0xe0, +0xc3,0x9f,0xec,0x9e,0x50,0x16,0xb1,0xaa,0xf5,0x83,0xe0,0xc3,0x95,0x2f,0x50,0x8, +0xb1,0xaa,0xf5,0x83,0xe0,0x4, 0x80,0x35,0x5, 0x32,0x80,0x47,0xf1,0x30,0x90,0x0, +0x72,0xf1,0x18,0x90,0x0, 0xe, 0x12,0x2, 0xb7,0x2f,0xff,0xe5,0xf0,0x3e,0xfe,0xe5, +0x2d,0x51,0xf, 0xe0,0xfc,0xa3,0xe0,0xd3,0x9f,0xec,0x9e,0x40,0x24,0xb1,0xaa,0xf5, +0x83,0xe0,0xd3,0x94,0x0, 0x40,0x16,0xb1,0xaa,0xf5,0x83,0xe0,0x14,0xf1,0xd0,0xb1, +0xaa,0xf5,0x83,0xe0,0xfd,0x85,0x2d,0x37,0x12,0xe, 0x54,0x80,0x6, 0x5, 0x32,0x80, +0x2, 0x5, 0x32,0x5, 0x2d,0x1, 0xe2,0xb1,0xa3,0xf1,0xc4,0x65,0x32,0x60,0x2, 0x1, +0x4b,0xe4,0xf5,0x2d,0x12,0x68,0x85,0xe0,0xc4,0x54,0xf0,0xfd,0x74,0x7c,0x2f,0xf5, +0x82,0x74,0xa, 0x3e,0xf5,0x83,0xe0,0x54,0xf, 0x4d,0xff,0xab,0x21,0xe5,0x23,0x24, +0x66,0xf9,0xe4,0x35,0x22,0xfa,0xe5,0x2d,0x12,0x26,0xef,0xef,0x12,0x1, 0xc5,0x5, +0x2d,0xe5,0x2d,0xb4,0x8, 0xce,0xb1,0xa3,0x90,0x0, 0x52,0xe5,0x30,0x12,0x4b,0xbc, +0xe5,0x31,0x12,0x1, 0xd7,0x7f,0x1, 0x22,0x12,0x4, 0xf2,0xe5,0x2f,0x25,0xe0,0x25, +0xe0,0x24,0x44,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0x22,0x12,0x6c,0x97,0x90,0xa, +0x58,0xf0,0xf5,0x2a,0xb1,0x4c,0x74,0xff,0xf1,0xf4,0xb1,0x5d,0x74,0xff,0xf0,0xe5, +0x2a,0x51,0xf, 0x74,0xff,0xf0,0xa3,0xf0,0xb1,0x91,0xe4,0xf0,0x5, 0x2a,0xe5,0x2a, +0xb4,0x5, 0xe1,0xb1,0x30,0xb1,0x8b,0x70,0x23,0x90,0x0, 0x42,0x12,0x1, 0x65,0x70, +0x2, 0x81,0x46,0xe4,0xf5,0x2a,0xb1,0x30,0xf1,0xe0,0xf1,0xa9,0xb1,0x30,0x12,0x6c, +0xb, 0xf1,0xa9,0x5, 0x2a,0xe5,0x2a,0xb4,0x5, 0xec,0x81,0x46,0xb1,0x30,0x90,0x0, +0x42,0x12,0x1, 0x65,0x70,0x35,0xf5,0x2a,0xb1,0x30,0xb1,0x8b,0xff,0xe5,0x2a,0xc3, +0x9f,0x40,0x2, 0x81,0x46,0x75,0xf0,0x7, 0xe5,0x2a,0xb1,0x84,0xf1,0x18,0xf1,0xe0, +0xb1,0x43,0x90,0x0, 0x2, 0x12,0x2, 0xb7,0xff,0xe5,0x2a,0xb1,0x37,0xe5,0x2a,0x12, +0x4e,0x26,0xb1,0x91,0x74,0x1, 0xf0,0x5, 0x2a,0x80,0xcd,0xe4,0xf5,0x2a,0xb1,0x30, +0xb1,0x8b,0xff,0xe5,0x2a,0xc3,0x9f,0x50,0x65,0xe4,0xf5,0x2b,0xb1,0x30,0x90,0x0, +0x37,0x75,0xf0,0x2, 0xe5,0x2b,0x12,0x1f,0x48,0x12,0x1f,0xb5,0xfa,0x90,0x0, 0x2, +0x12,0x2, 0xb7,0x12,0x6b,0xa0,0xc0,0x6, 0xc0,0x7, 0xb1,0x30,0x12,0x6b,0xf0,0xf1, +0x15,0x75,0xf0,0x7, 0xe5,0x2a,0xb1,0x84,0xf1,0xfa,0x12,0x0, 0x6, 0xd0,0xe0,0x2f, +0xff,0xd0,0xe0,0x3e,0xfe,0xe5,0x2a,0x51,0xf, 0xe0,0xfc,0xa3,0xe0,0xd3,0x9f,0xec, +0x9e,0x40,0xe, 0xb1,0x5d,0xe5,0x2b,0xf0,0xe5,0x2a,0x51,0xf, 0xee,0xf0,0xa3,0xef, +0xf0,0x5, 0x2b,0xe5,0x2b,0xc3,0x94,0x5, 0x40,0xa2,0x5, 0x2a,0x80,0x90,0xe4,0xf5, +0x2a,0xb1,0x30,0xb1,0x8b,0xff,0xe5,0x2a,0xc3,0x9f,0x40,0x2, 0x61,0xcd,0x90,0xa, +0x58,0x74,0x1, 0xf0,0xe4,0xf5,0x2b,0xb1,0x30,0xb1,0x8b,0xff,0xe5,0x2b,0xc3,0x9f, +0x50,0x36,0xe5,0x2a,0x65,0x2b,0x60,0x2c,0x74,0x4e,0x25,0x2b,0xb1,0x61,0xe0,0xff, +0xb1,0x5d,0xe0,0xb5,0x7, 0x1e,0xe5,0x2b,0x51,0xf, 0xe0,0xfe,0xa3,0xe0,0xff,0xe5, +0x2a,0x51,0xf, 0xe0,0xfc,0xa3,0xe0,0xc3,0x9f,0xec,0x9e,0x40,0x7, 0xe4,0x90,0xa, +0x58,0xf0,0x80,0x4, 0x5, 0x2b,0x80,0xbf,0x90,0xa, 0x58,0xe0,0x64,0x1, 0x70,0x49, +0xb1,0x5d,0xe0,0x24,0x53,0xb1,0x95,0x74,0x1, 0xf0,0xb1,0x5d,0xe0,0xfd,0xb1,0x4c, +0x90,0x0, 0x4, 0xed,0x12,0x1, 0xd7,0xb1,0x30,0x75,0xf0,0x7, 0xe5,0x2a,0xb1,0x84, +0xf1,0x18,0xe9,0x24,0x2d,0xf9,0xe4,0x3a,0xfa,0xb1,0x5d,0xe0,0xb1,0x81,0xb1,0x46, +0x90,0x0, 0x2, 0xf1,0x18,0xe5,0x29,0x24,0x37,0xf9,0xe4,0x35,0x28,0xfa,0xb1,0x5d, +0xe0,0xb1,0x81,0xee,0x8f,0xf0,0x12,0x3, 0x5b,0x5, 0x2a,0x61,0x21,0xe4,0xf5,0x2a, +0xb1,0x30,0xb1,0x8b,0xff,0xe5,0x2a,0xc3,0x9f,0x50,0x4f,0x12,0x1f,0xb5,0xfa,0x12, +0x3b,0x6a,0xf4,0x70,0x41,0xf5,0x2b,0x74,0x53,0x25,0x2b,0xb1,0x95,0xe0,0x70,0x2e, +0x74,0x53,0x25,0x2b,0xb1,0x95,0x74,0x1, 0xf0,0xb1,0x30,0x75,0xf0,0x7, 0xe5,0x2a, +0xb1,0x84,0xf1,0x18,0x12,0x6b,0xf0,0xb1,0x43,0x90,0x0, 0x2, 0x12,0x2, 0xb7,0xff, +0xe5,0x2b,0xb1,0x37,0x90,0x0, 0x4, 0xe5,0x2b,0x12,0x1, 0xd7,0x80,0x8, 0x5, 0x2b, +0xe5,0x2b,0x64,0x5, 0x70,0xc1,0x5, 0x2a,0x80,0xa6,0xe4,0xf5,0x2a,0xb1,0x91,0xe0, +0x70,0xd, 0xb1,0x30,0xf1,0xe0,0xf1,0xa9,0xb1,0x30,0x12,0x6c,0xb, 0xf1,0xa9,0x5, +0x2a,0xe5,0x2a,0xb4,0x5, 0xe7,0xb1,0x30,0xb1,0x8b,0xf5,0x2b,0xe4,0xf5,0x2a,0xb1, +0x91,0xe0,0x64,0x1, 0x70,0x33,0xab,0x27,0xe5,0x29,0x24,0x28,0xf1,0x91,0xfa,0x12, +0x1, 0x4c,0xb4,0x1, 0x5, 0x74,0x3, 0x12,0x1, 0xc5,0x12,0x1, 0x4c,0xff,0xb4,0x3, +0xe, 0xab,0x27,0x12,0x3d,0x8, 0xfa,0xe5,0x2a,0x12,0x26,0xef,0xe4,0x80,0x3c,0xef, +0x70,0x3c,0xf1,0x8b,0xfa,0x74,0x2, 0x80,0x32,0xab,0x27,0xe5,0x29,0x24,0x28,0xf1, +0x91,0xfa,0x12,0x1, 0x4c,0xff,0x64,0x2, 0x60,0x3, 0xef,0x70,0x19,0xf1,0x8b,0xfa, +0x74,0x1, 0x12,0x1, 0xc5,0xaf,0x2b,0x5, 0x2b,0xef,0xb1,0x4e,0x90,0x0, 0x4, 0xe5, +0x2a,0x12,0x1, 0xd7,0x80,0x8, 0xf1,0x8b,0xfa,0x74,0x3, 0x12,0x1, 0xc5,0xab,0x27, +0x12,0x3d,0x8, 0xfa,0xaf,0x2a,0x7e,0x0, 0x12,0x1f,0xe6,0x12,0x1, 0x4c,0x12,0x6c, +0x40,0x35,0x28,0x12,0x1f,0xe5,0xed,0x12,0x1, 0xc5,0x5, 0x2a,0xe5,0x2a,0x64,0x5, +0x60,0x2, 0x81,0x4f,0x22,0xe5,0x2f,0x75,0xf0,0x2, 0xa4,0x29,0xf9,0xea,0x35,0xf0, +0xfa,0x90,0x0, 0x1, 0x12,0x1, 0x65,0xc3,0x13,0xfd,0x7c,0x0, 0xaa,0x2b,0xa9,0x2c, +0x75,0xf0,0x2, 0xe5,0x2f,0xa4,0xf5,0x82,0x85,0xf0,0x83,0x12,0x1, 0x65,0xc3,0x13, +0x75,0xf0,0x10,0xa4,0x2d,0xff,0xec,0x35,0xf0,0xfe,0xef,0x25,0xe0,0xff,0xee,0x33, +0xfe,0xe5,0x40,0x2f,0xf5,0x82,0xe5,0x3f,0x3e,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0xff, +0xab,0x27,0xaa,0x28,0xa9,0x29,0x22,0xae,0xf0,0xaa,0x28,0xa9,0x29,0x90,0x0, 0x37, +0x75,0xf0,0x2, 0x12,0x5, 0x40,0xee,0x8f,0xf0,0x12,0x3, 0x5b,0xe5,0x2a,0x75,0xf0, +0x7, 0xa4,0xab,0x27,0x25,0x29,0xf9,0xe5,0x28,0x35,0xf0,0xfa,0x22,0x74,0x4e,0x25, +0x2a,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0x22,0xe5,0x2a,0x75,0xf0,0x7, 0xa4,0xff, +0xae,0xf0,0xab,0x21,0x25,0x23,0xf9,0xe5,0x22,0x3e,0xfa,0x90,0x0, 0x7, 0x12,0x1, +0x65,0x75,0xf0,0x2, 0xa4,0xf5,0x82,0x85,0xf0,0x83,0x22,0x90,0x0, 0x41,0x2, 0x1, +0x65,0x74,0x53,0x25,0x2a,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0x22,0x8b,0x21,0x8a, +0x22,0x89,0x23,0xab,0x24,0xaa,0x25,0xa9,0x26,0x22,0x74,0x7c,0x25,0x2d,0xf5,0x82, +0xe4,0x34,0xa, 0x22,0x12,0x1f,0xf4,0x85,0xc9,0x30,0xb1,0xa3,0x12,0x1, 0x4c,0xff, +0x70,0x3b,0xf1,0x30,0xf1,0xca,0xd3,0x94,0x0, 0x40,0x7, 0xb1,0xa3,0x12,0x52,0x38, +0xc1,0xae,0xb1,0xa3,0xf1,0xc4,0x20,0xe0,0x2, 0xc1,0xae,0x90,0x0, 0x8, 0x12,0x1, +0x65,0xfe,0x90,0x0, 0x7, 0x74,0x1, 0x12,0x1, 0x92,0x6e,0x60,0x2, 0xc1,0xae,0xb1, +0xa3,0x90,0x0, 0x7, 0x12,0x1, 0xd7,0x74,0x1, 0xf1,0xd8,0xc1,0xae,0xef,0xb4,0x1, +0x12,0xf1,0x30,0xf1,0xca,0x70,0x2, 0xc1,0xae,0xb1,0xa3,0xe4,0xf1,0xd8,0x75,0x10, +0x21,0xc1,0xae,0xb1,0xa3,0x12,0x1, 0x4c,0x64,0x3, 0x60,0x2, 0xc1,0xae,0xff,0x12, +0x58,0x3, 0x12,0x3f,0x1c,0x12,0x0, 0x4e,0xe5,0xdb,0x30,0xe1,0xfb,0xe4,0xf5,0x99, +0xd2,0x98,0x75,0xf7,0xfe,0xc2,0x89,0xd2,0xa8,0x20,0x96,0xfd,0x43,0x87,0x2, 0xc2, +0xaf,0xe4,0xf5,0x32,0x30,0x89,0x7, 0xc2,0x89,0xe4,0xf5,0x32,0x80,0x2, 0x5, 0x32, +0xe5,0x32,0xd3,0x94,0xfa,0x50,0x8, 0x12,0x3f,0x1c,0x12,0x0, 0x4e,0x80,0xe5,0x75, +0xf7,0xff,0x75,0x99,0x1, 0xd2,0x98,0xd2,0xaf,0xc2,0xa8,0x12,0x3f,0x1c,0x12,0x0, +0x4e,0x53,0xdb,0xf0,0x12,0x27,0x3, 0x85,0x21,0x36,0x85,0x22,0x37,0x85,0x23,0x38, +0xab,0x2d,0xaa,0x2e,0xa9,0x2f,0x12,0x3e,0x5d,0xb1,0xa3,0xe4,0xf1,0xd8,0xae,0x2b, +0xaf,0x2c,0x12,0x4e,0x97,0xf1,0xd1,0x12,0x3f,0x5b,0x90,0xb, 0xd7,0x74,0xa, 0xf0, +0x90,0xb, 0xd7,0xe0,0x70,0xfa,0x12,0x34,0x4, 0xb1,0x30,0x12,0x27,0xc4,0xe4,0xf5, +0x31,0xe5,0xf, 0x70,0x22,0xff,0x12,0x57,0xf0,0xe5,0xdb,0x30,0xe1,0xf3,0xc2,0xcd, +0xb1,0xa3,0x12,0x1, 0x4c,0xb4,0x1, 0xe9,0xe5,0x31,0x70,0xe5,0x75,0x31,0x1, 0x53, +0xc9,0xfc,0x43,0xc9,0x1, 0x80,0xda,0xe4,0xf5,0x10,0xf5,0xf, 0x85,0x30,0xc9,0xd2, +0xcd,0x12,0x69,0x53,0x54,0xef,0x12,0x1, 0xc5,0xf1,0x30,0xf1,0xca,0x90,0x0, 0x4c, +0x12,0x1, 0xd7,0xe5,0xe8,0x54,0xc0,0x64,0xc0,0x60,0x3, 0x12,0x44,0xcf,0x22,0xab, +0x21,0xaa,0x22,0xa9,0x23,0x90,0x3, 0x80,0x75,0xf0,0x20,0xe5,0x28,0x12,0x5, 0x40, +0x75,0xf0,0x2, 0xe5,0x27,0x12,0x5, 0x40,0x12,0x2, 0xb7,0xff,0xae,0xf0,0x22,0xe5, +0x92,0x60,0x4, 0xd2,0xae,0xd2,0xbe,0x22,0xf5,0x82,0x74,0x3, 0x35,0xf0,0xf5,0x83, +0xab,0x21,0xaa,0x22,0xa9,0x23,0x22,0xb1,0x9d,0x12,0x32,0x17,0xf1,0x30,0x90,0x0, +0x41,0x12,0x1, 0xd7,0xab,0x24,0x12,0x6c,0x26,0xfa,0xa8,0x23,0xac,0x22,0xad,0x21, +0x12,0x6b,0x4a,0xf1,0x30,0x51,0x1b,0xf1,0x30,0x90,0x0, 0x43,0x12,0x5, 0x6c,0x8b, +0x2a,0x8a,0x2b,0x89,0x2c,0xf1,0x30,0x12,0x39,0x85,0x12,0x6c,0x26,0xa8,0x1, 0xfc, +0xad,0x24,0xf1,0x30,0x12,0x6b,0x4a,0xf1,0x30,0xb1,0x8b,0x90,0x0, 0x42,0x12,0x1, +0xd7,0xb1,0x8b,0xb1,0xa3,0x90,0x0, 0x2d,0x2, 0x1, 0xd7,0xab,0x27,0xe5,0x29,0x24, +0x23,0xf9,0xe4,0x35,0x28,0xfa,0x7e,0x0, 0xe9,0x25,0x2a,0xf9,0xee,0x3a,0x22,0xab, +0x33,0xaa,0x34,0xa9,0x35,0x75,0xf0,0x2, 0xef,0x12,0x5, 0x40,0x74,0x7f,0x75,0xf0, +0xff,0x2, 0x3, 0x5b,0xe5,0x2f,0x75,0xf0,0x2, 0xa4,0xab,0x2a,0x25,0x2c,0xf9,0xe5, +0x2b,0x35,0xf0,0xfa,0x90,0x0, 0x1, 0x2, 0x1, 0x65,0x90,0x0, 0x4b,0x2, 0x1, 0x65, +0xf0,0xab,0x2a,0xaa,0x2b,0xa9,0x2c,0x22,0x12,0x1, 0xc5,0x90,0xc, 0x76,0xf0,0x22, +0x90,0x0, 0x2d,0x75,0xf0,0x2, 0xe5,0x2a,0x22,0x74,0x98,0x2d,0xf5,0x82,0xe4,0x34, +0xa, 0xf5,0x83,0x22,0x90,0x0, 0x4, 0x2, 0x1, 0xd7,0x12,0x2, 0xb7,0xc3,0x9f,0xff, +0xe5,0xf0,0x9e,0xfe,0x22,0xc3,0xee,0x94,0x0, 0x40,0x2, 0x80,0x3, 0xe4,0xfe,0xff, +0x7d,0x6a,0x12,0x20,0x39,0xe4,0x7f,0xf0,0xfe,0x12,0x20,0x2b,0x40,0xa, 0xe4,0x75, +0x34,0xef,0xf5,0x33,0xf5,0x32,0xf5,0x31,0xae,0x33,0xaf,0x34,0x22,0xf1,0xf4,0x12, +0x15,0x30,0x12,0x17,0xca,0xf5,0x2f,0x12,0x37,0x96,0xf5,0x30,0xe4,0xf5,0x2c,0xf1, +0x33,0x12,0x6a,0xbe,0x74,0xff,0xf0,0xf1,0x33,0x12,0x12,0x11,0x12,0x6b,0x42,0xf1, +0x33,0x12,0x6c,0x38,0xf5,0x83,0x12,0x6b,0x42,0x5, 0x2c,0xe5,0x2c,0xb4,0x5, 0xdf, +0xe5,0x2f,0x70,0x32,0xe5,0x30,0xd3,0x94,0x0, 0x50,0x2, 0x81,0x31,0xe4,0xf5,0x2d, +0xe5,0x2d,0x12,0x15,0x4e,0x90,0x0, 0x2a,0x74,0xff,0x12,0x1, 0xd7,0x5, 0x2d,0xe5, +0x2d,0xb4,0x5, 0xec,0x12,0x69,0xf0,0x44,0x4, 0x12,0x1, 0xc5,0x54,0xf7,0x12,0x1, +0xc5,0x54,0xdf,0x2, 0x1, 0xc5,0xe4,0xf5,0x2d,0xe5,0x2d,0xc3,0x95,0x2f,0x50,0x27, +0xe5,0x2d,0x75,0xf0,0x7, 0xa4,0xfd,0xac,0xf0,0xf1,0xfb,0x3c,0xfa,0xe9,0x24,0xa, +0x12,0x69,0xfe,0xab,0x21,0xe5,0x23,0x2d,0xf9,0xe5,0x22,0x3c,0xfa,0xe9,0x24,0xc, +0x12,0x69,0xfe,0x5, 0x2d,0x80,0xd2,0xe5,0x30,0x70,0x24,0x12,0x69,0xf0,0x44,0x10, +0x12,0x1, 0xc5,0xe4,0xf5,0x2d,0x74,0xec,0x25,0x2d,0x12,0x34,0xf1,0xe4,0xf0,0x74, +0x2a,0x25,0x2d,0x12,0x34,0xdb,0xe4,0xf0,0x5, 0x2d,0xe5,0x2d,0xb4,0x5, 0xe7,0xe4, +0xf5,0x2c,0xf5,0x2d,0xe4,0xf5,0x2e,0x91,0x48,0xf1,0xc1,0xfd,0xe5,0x2d,0x12,0x15, +0x4e,0x90,0x0, 0x2a,0x12,0x1, 0x65,0xff,0x6d,0x70,0x5f,0xef,0xf4,0x60,0x5b,0xe5, +0x2d,0x75,0xf0,0x7, 0xa4,0x12,0x15,0x54,0x90,0x0, 0x2a,0xf1,0x2f,0x12,0x6a,0xbe, +0xef,0xf0,0x90,0x0, 0x26,0x12,0x17,0x18,0xf1,0x33,0x12,0x12,0x11,0xee,0xf0,0xa3, +0xef,0xf0,0x90,0x0, 0x28,0x12,0x17,0x18,0xf1,0x33,0x12,0x6c,0x38,0xf5,0x83,0xee, +0xf0,0xa3,0xef,0xf0,0x91,0x48,0x90,0x0, 0xf, 0xf1,0x2f,0x24,0x49,0xf5,0x82,0xe4, +0x34,0xa, 0xf5,0x83,0xef,0xf0,0x90,0x0, 0x10,0xf1,0x2f,0x24,0x4a,0xf5,0x82,0xe4, +0x34,0xa, 0xf5,0x83,0xef,0xf0,0x5, 0x2c,0x80,0x8, 0x5, 0x2e,0xe5,0x2e,0x64,0x5, +0x70,0x85,0x5, 0x2d,0xe5,0x2d,0x64,0x5, 0x60,0x2, 0x1, 0xf4,0xe4,0xf5,0x2e,0xe4, +0xf5,0x2d,0xe5,0x2d,0xc3,0x95,0x2c,0x50,0x16,0x91,0x48,0xf1,0xc1,0xff,0xe5,0x2d, +0x75,0xf0,0x7, 0xa4,0x12,0x6a,0xbe,0xe0,0x6f,0x60,0x4, 0x5, 0x2d,0x80,0xe3,0xe5, +0x2d,0x65,0x2c,0x70,0x1e,0x12,0x6b,0x89,0xe5,0x2e,0xf1,0xb7,0xfa,0xc0,0x1, 0xf1, +0x33,0x24,0x44,0xf9,0x74,0xa, 0x35,0xf0,0xa8,0x1, 0xfc,0x7d,0x1, 0xd0,0x1, 0xf1, +0xed,0x5, 0x2c,0x5, 0x2e,0xe5,0x2e,0x64,0x5, 0x70,0xb4,0x12,0x6c,0x2f,0x7f,0x23, +0x12,0x69,0x9d,0xe5,0x30,0x70,0x18,0x12,0x6b,0x89,0xc0,0x2, 0xc0,0x1, 0x12,0x6c, +0x2f,0xa8,0x1, 0xfc,0xad,0x27,0xd0,0x1, 0xd0,0x2, 0x12,0x6b,0x4a,0x61,0x71,0x12, +0x15,0x30,0x12,0x37,0x87,0x13,0x13,0x13,0x54,0x1f,0x30,0xe0,0x2, 0x61,0x71,0xe4, +0xf5,0x2e,0xe5,0x2e,0xc3,0x95,0x2f,0x40,0x2, 0x61,0x71,0xe4,0xf5,0x2d,0x91,0x48, +0xf1,0xc1,0xfd,0xe5,0x2d,0x12,0x15,0x4e,0x90,0x0, 0x2a,0x12,0x1, 0x65,0x6d,0x60, +0x7, 0x5, 0x2d,0xe5,0x2d,0xb4,0x5, 0xe6,0x91,0x48,0x90,0x0, 0xc, 0x12,0x17,0x18, +0xc0,0x6, 0xc0,0x7, 0xe5,0x2d,0x12,0x15,0x4e,0x90,0x0, 0x28,0xf1,0x4b,0xd0,0x7, +0xd0,0x6, 0xf1,0xc7,0xc0,0x6, 0xc0,0x7, 0x91,0x48,0x90,0x0, 0xa, 0x12,0x17,0x18, +0xc0,0x6, 0xc0,0x7, 0xe5,0x2d,0x12,0x15,0x4e,0x90,0x0, 0x26,0xf1,0x4b,0xd0,0x7, +0xd0,0x6, 0xf1,0xc7,0xd0,0xe0,0x2f,0xf5,0x2b,0xd0,0xe0,0x3e,0xf5,0x2a,0x12,0x15, +0xa3,0x90,0x0, 0x1, 0xf1,0x4b,0xae,0x4, 0x78,0x3, 0xce,0xc3,0x13,0xce,0x13,0xd8, +0xf9,0x12,0x6b,0x2c,0x50,0x5, 0x75,0x2c,0x4, 0x80,0x3c,0xed,0xae,0x4, 0x78,0x2, +0xce,0xc3,0x13,0xce,0x13,0xd8,0xf9,0x12,0x6b,0x2c,0x50,0x5, 0x75,0x2c,0x3, 0x80, +0x26,0x90,0x0, 0x1, 0xf1,0x4b,0xec,0xc3,0x13,0xfe,0xed,0x13,0x12,0x6b,0x2c,0x50, +0x5, 0x75,0x2c,0x2, 0x80,0x11,0xc3,0xe5,0x2b,0x9d,0xe5,0x2a,0x9c,0x50,0x5, 0x75, +0x2c,0x1, 0x80,0x3, 0xe4,0xf5,0x2c,0x91,0x48,0x90,0x0, 0xa, 0x12,0x17,0x18,0xc0, +0x6, 0xc0,0x7, 0xe5,0x2d,0x12,0x15,0x4e,0x90,0x0, 0x26,0xf1,0x4b,0xd0,0x7, 0xd0, +0x6, 0x12,0x6b,0x35,0x80,0x5, 0xce,0xc3,0x13,0xce,0x13,0xd8,0xf9,0xf5,0x2b,0x8e, +0x2a,0x90,0x0, 0x26,0x91,0x32,0x90,0x0, 0xa, 0x12,0x6b,0xaa,0x75,0xf0,0x7, 0x40, +0x10,0x12,0x15,0x51,0x90,0x0, 0x26,0xe5,0x2a,0x85,0x2b,0xf0,0x12,0x2, 0xef,0x80, +0x9, 0x12,0x15,0x51,0xe9,0x24,0x26,0x12,0x6a,0x62,0x91,0x48,0x90,0x0, 0xc, 0x12, +0x17,0x18,0xc0,0x6, 0xc0,0x7, 0xe5,0x2d,0x12,0x15,0x4e,0x90,0x0, 0x28,0xf1,0x4b, +0xd0,0x7, 0xd0,0x6, 0x12,0x6b,0x35,0x80,0x5, 0xce,0xc3,0x13,0xce,0x13,0xd8,0xf9, +0xf5,0x2b,0x8e,0x2a,0x90,0x0, 0x28,0x91,0x32,0x90,0x0, 0xc, 0x12,0x6b,0xaa,0x75, +0xf0,0x7, 0x40,0x10,0x12,0x15,0x51,0x90,0x0, 0x28,0xe5,0x2a,0x85,0x2b,0xf0,0x12, +0x2, 0xef,0x80,0x9, 0x12,0x15,0x51,0xe9,0x24,0x28,0x12,0x6a,0x62,0x5, 0x2e,0x41, +0x2, 0xe4,0xf5,0x2e,0xe5,0x2e,0x12,0x15,0x4e,0x90,0x0, 0x26,0x12,0x2, 0xb7,0x90, +0x0, 0xa, 0x12,0x4d,0xfe,0xf1,0x8d,0x90,0x0, 0x28,0x12,0x2, 0xb7,0x90,0x0, 0xc, +0x12,0x4d,0xfe,0xf1,0x8d,0x90,0x0, 0x2a,0x12,0x1, 0x65,0xfd,0xf1,0x6e,0xfa,0x90, +0x0, 0xe, 0xed,0x12,0x1, 0xd7,0xf1,0x8d,0x90,0x0, 0x2b,0x12,0x1, 0x65,0xfd,0xf1, +0x6e,0xfa,0x12,0x60,0xd2,0xf1,0x8d,0x90,0x0, 0x2c,0x12,0x1, 0x65,0xfd,0xf1,0x6e, +0xfa,0x12,0x60,0xcb,0x5, 0x2e,0xe5,0x2e,0x64,0x5, 0x70,0xa8,0x12,0x69,0xf0,0x44, +0x1, 0x12,0x1, 0xc5,0xe5,0x2f,0xd3,0x94,0x0, 0x40,0x56,0xe4,0xf5,0x2e,0x91,0x48, +0x90,0x0, 0xa, 0x12,0x17,0x18,0x11,0x5, 0x90,0x0, 0x3, 0xf1,0x52,0xfa,0x90,0x0, +0xc, 0x12,0x17,0x18,0x12,0x20,0x3, 0x90,0x0, 0x5, 0xf1,0x52,0xfa,0xf1,0xc1,0xfd, +0xf1,0x8d,0x90,0x0, 0x7, 0xed,0x12,0x1, 0xd7,0xf1,0x6e,0xfa,0x90,0x0, 0xf, 0x12, +0x1, 0x65,0xfd,0xf1,0x8d,0x90,0x0, 0x8, 0xed,0x12,0x1, 0xd7,0xf1,0x6e,0xfa,0x12, +0x60,0xba,0xfd,0xf1,0x8d,0x90,0x0, 0x9, 0xed,0x12,0x1, 0xd7,0x12,0x6c,0x9f,0x40, +0xad,0x22,0xe5,0x2d,0x75,0xf0,0x7, 0xa4,0xab,0x27,0x25,0x29,0xf9,0xe5,0x28,0x35, +0xf0,0xfa,0x12,0x2, 0xb7,0xfd,0xac,0xf0,0xe5,0x2e,0x75,0xf0,0x7, 0xa4,0xab,0x21, +0x25,0x23,0xf9,0xe5,0x22,0x35,0xf0,0xfa,0x22,0xf1,0xf4,0x12,0x15,0x30,0x12,0x1, +0x4c,0x64,0x5, 0x70,0x2, 0xe1,0x2e,0xe4,0xf5,0x2a,0x74,0x2d,0x25,0x2a,0xf8,0xe4, +0xf6,0x74,0x32,0x25,0x2a,0xf8,0xe4,0xf6,0x5, 0x2a,0xe5,0x2a,0xb4,0x5, 0xeb,0xe4, +0xf5,0x2b,0x12,0x15,0x30,0x12,0x1, 0x4c,0xff,0xe5,0x2b,0xc3,0x9f,0x50,0x1d,0xe5, +0x2b,0x91,0x4a,0xf1,0x79,0x12,0x15,0x2f,0x12,0x1, 0x4c,0xfe,0xef,0xc3,0x9e,0x50, +0x7, 0x74,0x32,0x25,0x2b,0xf8,0x76,0x1, 0x5, 0x2b,0x80,0xd6,0xe4,0xf5,0x2a,0xe5, +0x2a,0x91,0x4a,0xf1,0x79,0x12,0x15,0x2f,0x12,0x1, 0x4c,0xfe,0xef,0xc3,0x9e,0x50, +0x6, 0x74,0x2d,0x2f,0xf8,0x76,0x1, 0x5, 0x2a,0xe5,0x2a,0xb4,0x5, 0xe1,0xe4,0xf5, +0x2a,0x12,0x15,0x30,0x12,0x6c,0x1d,0x40,0x2, 0xc1,0xf7,0x74,0x32,0x25,0x2a,0xf8, +0xe6,0x60,0x2, 0xc1,0xf3,0xe5,0x2a,0x91,0x4a,0xf1,0x79,0xf4,0x70,0x2, 0xc1,0xf3, +0x12,0x15,0x30,0x12,0x1, 0x4c,0xf5,0x2b,0xe5,0x2b,0xc3,0x94,0x5, 0x40,0x2, 0xc1, +0x11,0xe5,0x2b,0x91,0x4a,0xf1,0x79,0x12,0x15,0x2f,0x12,0x1, 0x4c,0xfe,0xef,0xc3, +0x9e,0x40,0x2, 0xc1,0xd, 0xf1,0xd9,0x12,0x1, 0x4c,0x64,0x1, 0x60,0x2, 0xa1,0xdc, +0xf1,0xa6,0xc0,0x3, 0xc0,0x2, 0xc0,0x1, 0xe5,0x2a,0x91,0x4a,0x12,0x15,0x7b,0xd0, +0x1, 0xd0,0x2, 0xd0,0x3, 0xf1,0x4b,0xf1,0xa4,0xc0,0x3, 0xc0,0x2, 0xc0,0x1, 0xe5, +0x2b,0x91,0x4a,0x12,0x15,0x7b,0xd0,0x1, 0xd0,0x2, 0xd0,0x3, 0x12,0x4e,0x20,0xf1, +0x98,0xc0,0x3, 0xc0,0x2, 0xc0,0x1, 0xe5,0x2a,0x91,0x4a,0x12,0x15,0x7b,0xd0,0x1, +0xd0,0x2, 0xd0,0x3, 0xf1,0x4b,0xf1,0x98,0xc0,0x3, 0xc0,0x2, 0xc0,0x1, 0xe5,0x2b, +0x91,0x4a,0x12,0x15,0x7b,0xd0,0x1, 0xd0,0x2, 0xd0,0x3, 0x12,0x4e,0x20,0xf1,0xa4, +0xc0,0x3, 0xc0,0x2, 0xc0,0x1, 0x12,0x15,0x69,0xd0,0x1, 0xd0,0x2, 0xd0,0x3, 0x12, +0x17,0xac,0xf1,0x98,0xc0,0x3, 0xc0,0x2, 0xc0,0x1, 0xab,0x21,0xe5,0x23,0x2f,0x12, +0x15,0x76,0xd0,0x1, 0xd0,0x2, 0xd0,0x3, 0x12,0x17,0xac,0xab,0x21,0xe5,0x23,0x24, +0x26,0xf1,0xb0,0xfa,0xc0,0x3, 0xc0,0x2, 0xc0,0x1, 0xe5,0x23,0x24,0x26,0x12,0x6c, +0xbf,0xf1,0xb7,0xa8,0x1, 0xfc,0xad,0x3, 0xd0,0x1, 0xd0,0x2, 0xd0,0x3, 0xf1,0xed, +0xe5,0x2b,0x91,0x4a,0xf1,0x79,0x90,0x0, 0x2a,0x12,0x1, 0xd7,0xab,0x21,0xe5,0x23, +0x24,0x3, 0x12,0x6c,0xbf,0xf1,0xb7,0xfa,0xc0,0x3, 0xc0,0x2, 0xc0,0x1, 0xe5,0x23, +0x24,0x3, 0xf1,0xb0,0xa8,0x1, 0xfc,0xad,0x3, 0xd0,0x1, 0xd0,0x2, 0xd0,0x3, 0xf1, +0xed,0xe5,0x2b,0x91,0x4a,0x12,0x6a,0x88,0x12,0x6c,0xb7,0x80,0x4, 0x5, 0x2b,0x81, +0xf8,0xe5,0x2b,0x64,0x5, 0x60,0x2, 0xc1,0xf3,0xf5,0x2c,0x12,0x15,0x30,0x12,0x4e, +0x42,0x40,0x2, 0xc1,0xf3,0x74,0x2d,0x25,0x2c,0xf8,0xe6,0x60,0x2, 0xc1,0xef,0xe5, +0x2a,0x91,0x4a,0xf1,0x79,0xff,0xf1,0xd9,0x12,0x1, 0x4c,0x64,0x1, 0x70,0x2, 0xc1, +0xef,0x74,0x2d,0x25,0x2c,0xf8,0x76,0x1, 0x12,0x6c,0xb7,0xf1,0xa4,0xc0,0x3, 0xc0, +0x2, 0xc0,0x1, 0xe5,0x2a,0x91,0x4a,0x12,0x15,0x7b,0xd0,0x1, 0xd0,0x2, 0xd0,0x3, +0x12,0x17,0x18,0x12,0x15,0xa3,0x90,0x0, 0x2d,0x12,0x6a,0x17,0xee,0x8f,0xf0,0x12, +0x3, 0x5b,0xf1,0x98,0xc0,0x3, 0xc0,0x2, 0xc0,0x1, 0xe5,0x2a,0x91,0x4a,0x12,0x15, +0x7b,0xd0,0x1, 0xd0,0x2, 0xd0,0x3, 0x12,0x17,0x18,0x12,0x15,0xa3,0x90,0x0, 0x37, +0x12,0x6a,0x17,0xee,0x8f,0xf0,0x12,0x3, 0x5b,0xf1,0xa4,0xc0,0x3, 0xc0,0x2, 0xc0, +0x1, 0x12,0x15,0x69,0xd0,0x1, 0xd0,0x2, 0xd0,0x3, 0x12,0x17,0xac,0xf1,0x98,0xc0, +0x3, 0xc0,0x2, 0xc0,0x1, 0xab,0x21,0xe5,0x23,0x2f,0x12,0x15,0x76,0xd0,0x1, 0xd0, +0x2, 0xd0,0x3, 0x12,0x17,0xac,0xe5,0x2a,0x91,0x4a,0x90,0x0, 0x7, 0xe5,0x2c,0x12, +0x1, 0xd7,0xab,0x24,0xe5,0x26,0x24,0x28,0xf9,0xe4,0x35,0x25,0xfa,0xaf,0x2c,0x7e, +0x0, 0xf1,0xe6,0xe4,0x12,0x1, 0xc5,0xf1,0xdb,0xe4,0x12,0x1, 0xc5,0x80,0x4, 0x5, +0x2c,0xc1,0x1b,0x5, 0x2a,0x81,0xd1,0xe4,0xf5,0x2a,0xe5,0x2a,0x75,0xf0,0x7, 0xa4, +0xff,0xae,0xf0,0xf1,0xfb,0x3e,0xf1,0x78,0xfd,0x12,0x15,0x30,0x12,0x1, 0x4c,0xfc, +0xed,0xc3,0x9c,0x40,0x12,0xf1,0x6e,0xfa,0x90,0x0, 0x3, 0x12,0x17,0xac,0x90,0x0, +0x5, 0x12,0x17,0xac,0x12,0x6a,0x88,0x5, 0x2a,0xe5,0x2a,0xb4,0x5, 0xcc,0x22,0x12, +0x1, 0x65,0xff,0xe5,0x2c,0x75,0xf0,0x7, 0xa4,0x22,0x90,0x3, 0x80,0x75,0xf0,0x20, +0x12,0x5, 0x40,0x75,0xf0,0x2, 0xe5,0x24,0x12,0x5, 0x40,0x12,0x2, 0xb7,0xfd,0xac, +0xf0,0x22,0xac,0x6, 0xad,0x7, 0xe5,0x2e,0x75,0xf0,0x7, 0xa4,0xff,0xae,0xf0,0xab, +0x27,0x25,0x29,0xf9,0xe5,0x28,0x3e,0xfa,0xec,0x8d,0xf0,0x12,0x3, 0x5b,0xab,0x21, +0xe5,0x23,0x2f,0xf9,0xe5,0x22,0x3e,0x22,0xfa,0x90,0x0, 0x7, 0x2, 0x1, 0x65,0xaf, +0x2d,0xef,0x33,0x95,0xe0,0xfe,0x7c,0x0, 0x7d,0x7, 0x12,0x1, 0xf9,0xab,0x27,0xe5, +0x29,0x2f,0xf9,0xe5,0x28,0x3e,0xfa,0x22,0xab,0x24,0xe5,0x26,0x24,0x37,0xf9,0xe4, +0x35,0x25,0xfa,0x22,0xab,0x24,0xe5,0x26,0x24,0x2d,0xf9,0xe4,0x35,0x25,0xfa,0x22, +0xf9,0xe4,0x35,0x22,0xfa,0xe5,0x2a,0x75,0xf0,0x7, 0xa4,0x29,0xf9,0xea,0x35,0xf0, +0x22,0x90,0x0, 0xe, 0x2, 0x1, 0x65,0xd3,0xef,0x9d,0xee,0x9c,0x40,0x3, 0x2, 0x3c, +0xf6,0xc3,0xed,0x9f,0xff,0xec,0x9e,0xfe,0x22,0x7e,0x0, 0xab,0x24,0xe5,0x26,0x24, +0x23,0xf9,0xe4,0x35,0x25,0xfa,0xe9,0x2f,0xf9,0xee,0x3a,0xfa,0x22,0x7e,0x0, 0x7f, +0x7, 0x2, 0x1, 0x26,0x8b,0x21,0x8a,0x22,0x89,0x23,0x22,0xab,0x21,0x25,0x23,0xf9, +0xe5,0x22,0x22,0xc3,0xee,0x94,0x0, 0x40,0x2, 0x80,0x3, 0xe4,0xfe,0xff,0x7d,0x6d, +0x11,0x39,0xe4,0x7f,0x63,0x7e,0x1, 0x11,0x2b,0x40,0xb, 0xe4,0x75,0x34,0x62,0x75, +0x33,0x1, 0xf5,0x32,0xf5,0x31,0xae,0x33,0xaf,0x34,0x22,0xfd,0xfc,0xab,0x34,0xaa, +0x33,0xa9,0x32,0xa8,0x31,0xc3,0x2, 0x4, 0xbb,0x7c,0x0, 0x12,0x5, 0x9c,0x8f,0x34, +0x8e,0x33,0x8d,0x32,0x8c,0x31,0x78,0x8, 0x12,0x4, 0xcc,0x8f,0x34,0x8e,0x33,0x8d, +0x32,0x8c,0x31,0x22,0x8e,0x25,0x8f,0x26,0x8b,0x27,0x8a,0x28,0x89,0x29,0xc3,0xe5, +0x25,0x94,0x0, 0x50,0x5, 0xe4,0xf5,0x25,0xf5,0x26,0xc3,0xec,0x94,0x0, 0x50,0x3, +0xe4,0xfc,0xfd,0xd3,0xe5,0x26,0x94,0x3f,0xe5,0x25,0x94,0x0, 0x50,0x12,0xe5,0x26, +0x25,0xe0,0xff,0xe5,0x25,0x31,0x21,0x50,0x2b,0xe4,0xf5,0x2a,0xf5,0x2b,0x80,0x24, +0xc3,0xe5,0x25,0x94,0x2, 0x40,0x23,0xe4,0x25,0x26,0xff,0xe5,0x25,0x34,0xfe,0xfe, +0xe5,0x26,0x2f,0xf5,0x2b,0xe5,0x25,0x3e,0x31,0x15,0x94,0x82,0x40,0x6, 0x75,0x2a, +0x2, 0x75,0x2b,0x3f,0x85,0x2a,0x25,0x85,0x2b,0x26,0xd3,0xed,0x94,0x3f,0xec,0x94, +0x0, 0x50,0x10,0xed,0x25,0xe0,0xff,0xec,0x31,0x21,0x50,0x25,0xe4,0xf5,0x2a,0xf5, +0x2b,0x80,0x1e,0xc3,0xec,0x94,0x3, 0x40,0x1c,0xe4,0x2d,0xff,0xec,0x34,0xfd,0xcf, +0x2d,0xf5,0x2b,0xef,0x3c,0x31,0x15,0x94,0x83,0x40,0x6, 0x75,0x2a,0x3, 0x75,0x2b, +0x3f,0xac,0x2a,0xad,0x2b,0x12,0x15,0x30,0xe5,0x25,0x85,0x26,0xf0,0x12,0x3, 0x3c, +0xab,0x27,0x74,0x2, 0x25,0x29,0xf9,0xf5,0x29,0xe4,0x35,0x28,0xfa,0xf5,0x28,0xec, +0x8d,0xf0,0x2, 0x3, 0x3c,0xf5,0x2a,0xd3,0xe5,0x2b,0x94,0x3d,0xe5,0x2a,0x64,0x80, +0x22,0x33,0xfe,0xef,0x24,0xc1,0xf5,0x2b,0xee,0x34,0xff,0xf5,0x2a,0xc3,0xe5,0x2b, +0x94,0x2, 0xe5,0x2a,0x64,0x80,0x94,0x80,0x22,0x12,0x1f,0xf4,0xe4,0xf5,0x24,0x12, +0x17,0x30,0x12,0x32,0x17,0xff,0xe5,0x24,0xc3,0x9f,0x50,0x1f,0xe5,0x24,0x12,0x1f, +0xb7,0xfa,0x90,0x0, 0xa, 0x12,0x17,0x18,0x90,0x0, 0xc, 0x12,0x1f,0x4b,0xe9,0x24, +0xa, 0xf9,0xe4,0x3a,0xfa,0x11,0x54,0x5, 0x24,0x80,0xd4,0x22,0x12,0x69,0xe1,0x12, +0x6a,0x1f,0x75,0x28,0xa, 0x75,0x29,0x24,0x7b,0x1, 0x7a,0x9, 0x79,0x17,0x12,0x50, +0xb4,0x91,0xea,0x12,0x47,0xe2,0x75,0x36,0x1, 0x75,0x37,0x8, 0x75,0x38,0xc5,0x7b, +0x1, 0x7a,0x8, 0x79,0x33,0x12,0x3e,0x5d,0x7b,0x1, 0x7a,0x9, 0x79,0xde,0x12,0x4e, +0x4b,0x7b,0x1, 0x7a,0xa, 0x79,0x2c,0x12,0x4e,0xc1,0xe4,0x90,0xc, 0xd8,0xf0,0x7b, +0x1, 0x7a,0x9, 0x79,0x3a,0x12,0xe, 0xbd,0x90,0xb, 0xd7,0x74,0xa, 0xf0,0x90,0xb, +0xd7,0xe0,0x70,0xfa,0x90,0x0, 0x55,0x74,0x21,0xf0,0x7b,0x1, 0x7a,0x9, 0x79,0x5d, +0x12,0x49,0x7e,0x7b,0x1, 0x7a,0x9, 0x79,0x5d,0xd1,0x7, 0xf1,0x3, 0x12,0x47,0x4e, +0x12,0x6a,0x4c,0x75,0x2b,0x9, 0x75,0x2c,0x3a,0x7b,0x1, 0x12,0xf, 0xd4,0x7e,0x0, +0x7f,0x83,0x12,0x4e,0x97,0x91,0xd0,0x12,0x3f,0x5b,0x12,0x45,0x6d,0x12,0x6b,0xe7, +0x75,0x36,0x1, 0x75,0x37,0x0, 0x75,0x38,0x83,0x91,0xea,0xf1,0xc4,0xe4,0x90,0x0, +0x52,0xf0,0xa3,0x4, 0xf0,0xa3,0x74,0x8, 0xf0,0x90,0xc, 0x78,0x74,0x1, 0xf0,0xe4, +0x90,0xa, 0xe9,0xf0,0xa3,0xf0,0x90,0xa, 0x2a,0xe0,0xff,0x12,0x37,0xec,0x90,0xc, +0x78,0xe0,0x64,0x1, 0x60,0x2, 0x81,0x82,0x12,0x45,0x6e,0x12,0x6b,0xe7,0x12,0x6a, +0x1f,0x75,0x28,0xa, 0x75,0x29,0x24,0x7b,0x1, 0x7a,0x9, 0x79,0x17,0x12,0x4c,0xe, +0xe4,0xf5,0x10,0xf5,0xf, 0x90,0xc, 0x76,0xe0,0x70,0x5, 0x90,0x8, 0x2b,0x80,0x3, +0x90,0x8, 0x2d,0xe0,0xf5,0x11,0x90,0xc, 0x71,0xe0,0xf4,0x60,0x1a,0x7e,0x0, 0x7f, +0x0, 0x7c,0x9, 0x7d,0x3a,0x7a,0x0, 0x7b,0x83,0x75,0x27,0x9, 0x75,0x28,0x5d,0xf1, +0x65,0x90,0xc, 0x71,0x74,0xff,0xf0,0x91,0xe1,0x12,0x53,0xeb,0x60,0xf9,0x90,0x8, +0x32,0xe0,0xb4,0x1, 0x5, 0xe4,0xff,0x12,0x37,0x45,0x12,0x69,0x70,0x91,0xd0,0x12, +0x60,0xd9,0x12,0x6a,0x4c,0x12,0x6b,0xd5,0x7a,0x8, 0x79,0x33,0x12,0x33,0x3, 0x90, +0x8, 0x20,0xe0,0x64,0x6, 0x70,0x56,0x12,0x57,0x22,0x40,0x24,0x75,0x33,0x1, 0x75, +0x34,0x0, 0x75,0x35,0x83,0x75,0x36,0x1, 0x75,0x37,0x9, 0x75,0x38,0x17,0x75,0x39, +0x1, 0x75,0x3a,0x0, 0x75,0x3b,0x0, 0x7b,0x1, 0x7a,0x8, 0x79,0x33,0x12,0x28,0x7c, +0x90,0x8, 0x62,0xe0,0x20,0xe0,0x5, 0x91,0xd0,0x12,0x2c,0x93,0x91,0xd7,0x75,0x27, +0x1, 0x75,0x28,0x0, 0x75,0x29,0x0, 0x12,0x69,0x82,0x91,0xc0,0x12,0x50,0x2b,0x90, +0x8, 0x62,0xe0,0x30,0xe0,0xd, 0xe4,0x90,0x8, 0x20,0xf0,0x80,0x6, 0x90,0x9, 0x20, +0x12,0x6b,0x42,0x90,0x8, 0x27,0xe0,0x70,0x10,0x90,0x8, 0x20,0xe0,0xb4,0x4, 0x9, +0x90,0xa, 0xe9,0xe4,0xf0,0xa3,0x74,0xa, 0xf0,0xd3,0x90,0xa, 0xea,0xe0,0x94,0x0, +0x90,0xa, 0xe9,0xe0,0x94,0x0, 0x40,0x12,0xa3,0xe0,0x24,0xff,0xf0,0x90,0xa, 0xe9, +0xe0,0x34,0xff,0xf0,0x90,0x8, 0x20,0x74,0x4, 0xf0,0x91,0xd7,0x75,0x27,0x1, 0x75, +0x28,0x8, 0x75,0x29,0x33,0x75,0x2a,0x1, 0x12,0x6b,0xd5,0x7a,0xa, 0x79,0x2c,0x12, +0x30,0x41,0x91,0xd7,0x7b,0x1, 0x7a,0x8, 0x79,0x33,0x12,0x32,0x1d,0x91,0xc7,0x12, +0x4e,0xde,0x90,0x9, 0x15,0xef,0xf0,0x12,0x69,0x70,0x91,0xd0,0x12,0x5a,0x9c,0x7b, +0x1, 0x7a,0x8, 0x79,0x33,0x31,0x39,0x90,0x8, 0x20,0xe0,0xb4,0x6, 0xe, 0x90,0x8, +0x60,0xe0,0xd3,0x94,0x1, 0x40,0x5, 0xe4,0x90,0x8, 0x20,0xf0,0x91,0xd7,0x75,0x27, +0x1, 0x75,0x28,0x9, 0x75,0x29,0x17,0x91,0xea,0x12,0x3b,0x70,0x90,0x8, 0x27,0xe0, +0x70,0xf, 0x90,0x8, 0x61,0xe0,0xff,0x90,0x8, 0x60,0xe0,0xd3,0x9f,0x40,0x7, 0x80, +0x0, 0x91,0xc7,0x12,0x58,0x4e,0x90,0x8, 0x60,0xe0,0xa3,0xf0,0x90,0x9, 0x10,0xf0, +0x91,0xc0,0x91,0x87,0x91,0xc0,0x12,0x2f,0xef,0x90,0x9, 0x10,0xe0,0x90,0x8, 0x60, +0xf0,0x90,0xa, 0x21,0x74,0x1, 0xf0,0xa3,0x74,0xa, 0xf0,0xa3,0x74,0x24,0xf0,0x75, +0x24,0x1, 0x75,0x25,0x8, 0x75,0x26,0x33,0x7b,0x1, 0x7a,0x9, 0x79,0xde,0x12,0x17, +0x37,0x90,0x8, 0xc5,0x74,0x1, 0xf0,0xa3,0x74,0x9, 0xf0,0xa3,0x74,0xde,0xf0,0x90, +0x8, 0x60,0xe0,0x90,0x9, 0x10,0xf0,0x75,0x24,0x1, 0x75,0x25,0xa, 0x75,0x26,0x24, +0x75,0x27,0x1, 0x75,0x28,0x8, 0x75,0x29,0xc5,0x7b,0x1, 0x7a,0x8, 0x79,0x33,0x12, +0x18,0x2d,0x75,0x24,0x1, 0x75,0x25,0x9, 0x75,0x26,0xde,0x75,0x27,0x1, 0x75,0x28, +0xa, 0x75,0x29,0x24,0x91,0xc0,0x12,0x1c,0x59,0x91,0xc0,0x7c,0xa, 0x7d,0x24,0x12, +0x37,0xf2,0x75,0x24,0x1, 0x75,0x25,0xa, 0x75,0x26,0x24,0x91,0xc0,0x12,0x34,0xf9, +0x12,0x6a,0x1f,0x75,0x28,0x0, 0x75,0x29,0x0, 0x75,0x2a,0x1, 0x75,0x2b,0x0, 0x75, +0x2c,0x83,0x75,0x2d,0x1, 0x75,0x2e,0x8, 0x75,0x2f,0x33,0x91,0xc0,0x12,0x15,0xb4, +0x41,0x2e,0xb1,0xce,0x2, 0x0, 0x1a,0x12,0x1f,0xf4,0x12,0x17,0xca,0x70,0x26,0x12, +0x37,0x96,0xff,0xd3,0x94,0x0, 0x40,0x1d,0xe5,0xc, 0x70,0x15,0x90,0x0, 0x4b,0xef, +0x12,0x1, 0xd7,0xe9,0x24,0x4f,0x12,0x30,0x3a,0x44,0x8, 0x12,0x1, 0xc5,0x5, 0xc, +0x22,0xe4,0xf5,0xc, 0x22,0xe4,0xf5,0xc, 0x12,0x69,0x53,0x54,0xf7,0x2, 0x1, 0xc5, +0x7b,0x1, 0x7a,0x8, 0x79,0xc5,0x22,0x75,0x24,0x1, 0x75,0x25,0x8, 0x75,0x26,0x33, +0x7b,0x1, 0x7a,0x0, 0x79,0x83,0x22,0x75,0x24,0x1, 0x75,0x25,0x0, 0x75,0x26,0x83, +0x22,0x75,0x47,0x1, 0x75,0x48,0x0, 0x75,0x49,0x83,0x7b,0x1, 0x7a,0x0, 0x79,0x0, +0x22,0x75,0x12,0x4, 0x75,0x13,0x3, 0x12,0x69,0xe1,0x12,0x47,0x2e,0x12,0x3f,0xf0, +0x91,0xea,0x12,0x47,0xe2,0x7b,0x1, 0x7a,0x8, 0x79,0x28,0x12,0xe, 0xbd,0x90,0x0, +0x55,0x74,0x21,0xf0,0xb1,0xf8,0xf1,0x3, 0x90,0x0, 0x1, 0xe0,0x90,0xc, 0xb9,0xf0, +0x90,0x0, 0x0, 0xe0,0x90,0xc, 0xb8,0xf0,0x12,0x3f,0x1c,0x12,0x6c,0xc7,0xa3,0x74, +0x8, 0xf0,0x90,0xc, 0x3a,0xe0,0xb4,0x2, 0xa, 0x74,0x4, 0xf0,0xe4,0x90,0xc, 0xb5, +0xf0,0x80,0x3, 0x12,0x47,0x39,0x90,0xc, 0xb6,0x74,0x3, 0xf0,0x12,0x3f,0x1c,0x90, +0xc, 0xb5,0xe0,0x70,0x2e,0x12,0x0, 0x4e,0x90,0xc, 0xb5,0x74,0x1, 0xf0,0x7f,0x0, +0x7e,0x7c,0x12,0x58,0x3a,0x91,0xd7,0x75,0x27,0x4, 0x91,0xea,0x12,0x52,0x53,0xe4, +0xfd,0xff,0xfe,0x12,0x47,0xd6,0x7f,0x4, 0x12,0x46,0xc6,0x90,0xc, 0x3a,0x74,0x5, +0x12,0x47,0x38,0x90,0xc, 0xb6,0xe0,0x64,0x3, 0x70,0x3b,0x90,0xc, 0x39,0xe0,0xff, +0xc4,0x13,0x13,0x13,0x54,0x1, 0x30,0xe0,0xb3,0x91,0xea,0x12,0x47,0xe2,0xb1,0xce, +0x53,0xdb,0xf0,0xb1,0xef,0xf1,0x3, 0x12,0x6c,0xc7,0x90,0x0, 0x55,0x74,0x21,0xf0, +0x91,0xe1,0x12,0x53,0xeb,0x60,0xf9,0x75,0x12,0x4, 0x75,0x13,0x3, 0x90,0xc, 0x39, +0xe0,0x54,0x7f,0xf0,0x80,0x86,0x90,0xc, 0xb6,0xe0,0x90,0xc, 0x78,0xf0,0xe4,0xff, +0xfd,0xfc,0xe5,0xdb,0x20,0xe1,0xf, 0xf, 0xbf,0xff,0x5, 0xd, 0xbd,0x0, 0x1, 0xc, +0xbc,0x3, 0xef,0xbd,0xe8,0xec,0x53,0xdb,0xfe,0x53,0xdb,0xfd,0xc2,0xba,0x22,0x7b, +0x1, 0x7a,0x8, 0x79,0x28,0x12,0xe, 0xbd,0x7b,0x1, 0x7a,0x8, 0x79,0x4b,0x12,0x49, +0x7e,0x7b,0x1, 0x7a,0x8, 0x79,0x4b,0x12,0x4b,0xde,0xe4,0xf5,0x2c,0x12,0xf, 0xc1, +0x85,0x2c,0x82,0x12,0x2f,0x8a,0xfd,0xaf,0x2c,0x12,0x0, 0x1e,0xe5,0x2c,0x24,0x1c, +0x12,0x4b,0xed,0xd1,0xe8,0x12,0x1, 0x4c,0xfd,0x12,0x0, 0x1e,0xe5,0x2c,0x24,0x38, +0xff,0xab,0x29,0xe5,0x2b,0x24,0x38,0xd1,0xe8,0x12,0x1, 0x4c,0xfd,0x12,0x0, 0x1e, +0xe5,0x2c,0x24,0x54,0xd1,0xe1,0xd1,0xf7,0xc3,0x94,0x1c,0x40,0xc0,0x12,0xf, 0xc1, +0x90,0x0, 0x70,0x12,0x1, 0x65,0x7f,0x7e,0x12,0xf, 0xbd,0x90,0x0, 0x71,0x12,0x1, +0x65,0xfd,0x7f,0x7f,0x12,0xf, 0xbe,0x90,0x0, 0x73,0x12,0x1, 0x65,0xfd,0x7f,0x81, +0x12,0xf, 0xbe,0x90,0x0, 0x74,0x12,0x1, 0x65,0x7f,0x82,0x12,0x6c,0x87,0xe5,0x2c, +0x24,0x83,0xff,0xab,0x29,0xe5,0x2b,0x24,0x75,0xd1,0xe8,0xd1,0xf7,0xc3,0x94,0x4, +0x40,0xec,0xe4,0xf5,0x2c,0xe5,0x2c,0x24,0x87,0xff,0xab,0x29,0xe5,0x2b,0x24,0x79, +0xd1,0xe8,0xd1,0xf7,0xc3,0x94,0x2, 0x40,0xec,0x12,0xf, 0xc1,0x90,0x0, 0x7b,0x12, +0x1, 0x65,0x7f,0x89,0x12,0xf, 0xbd,0x90,0x0, 0x7c,0x12,0x1, 0x65,0x7f,0x8c,0x12, +0x6c,0x87,0xe5,0x2c,0x24,0x8d,0xff,0xab,0x29,0xe5,0x2b,0x24,0x7d,0xd1,0xe8,0xd1, +0xf7,0xc3,0x94,0x3, 0x40,0xec,0x12,0xf, 0xc1,0x12,0x6c,0x48,0x7f,0x90,0x2, 0x0, +0x1e,0xff,0xab,0x29,0xe5,0x2b,0x24,0x54,0xf9,0xe4,0x35,0x2a,0xfa,0xe5,0x2c,0x7c, +0x0, 0x29,0xf9,0xec,0x3a,0xfa,0x22,0x12,0x1, 0x4c,0xfd,0x12,0x0, 0x1e,0x5, 0x2c, +0xe5,0x2c,0x22,0x53,0xdb,0xfd,0xd2,0xba,0x43,0xdb,0x1, 0x43,0xdb,0x20,0x22,0x12, +0x3f,0x1c,0x12,0x69,0xe1,0x91,0xea,0x12,0x47,0xe2,0xb1,0xef,0x53,0xdb,0xf0,0xf1, +0x3, 0x90,0xb, 0x60,0x74,0x1, 0xf0,0xa3,0x74,0x2c,0xf0,0x90,0xc, 0x3a,0x74,0x1, +0xf0,0xf5,0x24,0x75,0x25,0x0, 0x75,0x26,0x0, 0xf5,0x27,0x75,0x28,0x0, 0x75,0x29, +0x83,0xf5,0x2a,0x75,0x2b,0x8, 0x75,0x2c,0x28,0xfb,0x12,0xf, 0xd4,0x90,0xc, 0x3a, +0x74,0x2, 0xf0,0xb1,0xce,0x90,0xc, 0x78,0x74,0x3, 0xf0,0x90,0xc, 0x39,0xe0,0x54, +0x8f,0x44,0x40,0xf0,0x22,0x8e,0x21,0x8f,0x22,0x8c,0x23,0x8d,0x24,0x8a,0x25,0x8b, +0x26,0xb1,0xce,0x53,0xdb,0xf0,0x12,0x45,0x75,0xaa,0x21,0xa9,0x22,0x7b,0x1, 0x12, +0x47,0xe2,0xaa,0x23,0xa9,0x24,0x7b,0x1, 0x12,0xe, 0xbd,0xe5,0x22,0x24,0x55,0xf5, +0x82,0xe4,0x35,0x21,0xf5,0x83,0x74,0x21,0xf0,0xaa,0x27,0xa9,0x28,0x7b,0x1, 0x12, +0x49,0x7e,0xaa,0x27,0xa9,0x28,0x7b,0x1, 0xd1,0x7, 0xf1,0x3, 0xaa,0x25,0xa9,0x26, +0x7b,0x1, 0x12,0x3f,0x1a,0xaa,0x21,0xa9,0x22,0x7b,0x1, 0xc0,0x3, 0x8b,0x36,0x12, +0x50,0xad,0xd0,0x3, 0x12,0x3f,0xe1,0x90,0x0, 0x53,0x12,0x1, 0x65,0x90,0xa, 0x44, +0xf0,0x90,0x0, 0x52,0x12,0x1, 0x65,0x90,0xa, 0x45,0xf0,0x90,0x0, 0x53,0xe4,0x12, +0x1, 0xd7,0x90,0x0, 0x52,0xe4,0x12,0x1, 0xd7,0xe5,0x38,0x24,0x80,0xf9,0xe5,0x37, +0x34,0x3, 0xaf,0x1, 0xf5,0x3f,0x8f,0x40,0x85,0x37,0x3d,0x85,0x38,0x3e,0x75,0x39, +0x1, 0x85,0x36,0x47,0x85,0x37,0x48,0x85,0x38,0x49,0x11,0x75,0x12,0x53,0xeb,0x60, +0xf0,0xe4,0xf5,0x3b,0xf5,0x3c,0xf5,0x3a,0xe4,0xf9,0x12,0x6a,0x2c,0x12,0x6c,0x60, +0x12,0x3d,0x5e,0x78,0x2, 0xce,0xa2,0xe7,0x13,0xce,0x13,0xd8,0xf8,0xfd,0xac,0x6, +0x12,0x6a,0x2c,0xe5,0x3e,0x2f,0xf5,0x82,0xe5,0x3d,0x3e,0xf5,0x83,0xec,0x8d,0xf0, +0x12,0x2, 0x60,0x5, 0x3c,0xe5,0x3c,0x70,0x2, 0x5, 0x3b,0x9, 0xb9,0x10,0xcb,0x5, +0x3a,0xe5,0x3a,0xb4,0x1c,0xc2,0x5, 0x39,0xe5,0x39,0xd3,0x94,0x4, 0x40,0xa2,0x90, +0xa, 0x44,0xe0,0x11,0x75,0x90,0x0, 0x53,0x12,0x1, 0xd7,0x90,0xa, 0x45,0xe0,0x90, +0x0, 0x52,0x2, 0x1, 0xd7,0xab,0x33,0xaa,0x34,0xa9,0x35,0x22,0x8b,0x30,0x8a,0x31, +0x89,0x32,0x12,0x32,0x17,0xf5,0x42,0x90,0x0, 0x86,0x12,0x1, 0x65,0xf5,0x43,0xe5, +0x42,0xd3,0x94,0x0, 0x50,0x8, 0xe5,0x43,0x94,0x0, 0x50,0x2, 0x61,0x5b,0x71,0x77, +0x90,0x0, 0x82,0x74,0x1, 0x12,0x1, 0x92,0x12,0x55,0x99,0x64,0x5, 0x60,0x2, 0x61, +0x67,0x71,0x77,0x90,0x0, 0x82,0xf1,0x80,0x12,0x1, 0x65,0x60,0x2, 0x21,0x91,0x71, +0x9c,0x60,0x2, 0x21,0x91,0x90,0x0, 0x83,0xf1,0x80,0xe5,0x42,0x12,0x1, 0xd7,0x90, +0x0, 0x81,0xe5,0x43,0x12,0x1, 0xd7,0xe4,0xf5,0x3c,0xe5,0x42,0x25,0x43,0xff,0xe4, +0x33,0xfe,0xc3,0xe5,0x3c,0xf1,0xd5,0x40,0x2, 0x61,0x67,0xe5,0x3c,0xc3,0x95,0x42, +0x50,0x2a,0xe5,0x32,0x24,0x30,0xf9,0xe4,0x35,0x31,0xf1,0xa3,0x12,0x1f,0xba,0x71, +0x95,0x71,0x77,0x75,0xf0,0x2, 0xe5,0x3c,0x12,0x15,0x84,0x12,0x6c,0x8f,0xe5,0x3c, +0x75,0xf0,0x2, 0x12,0x1f,0xba,0xfa,0x90,0x0, 0x1, 0x80,0x3d,0xab,0x30,0xe5,0x32, +0x24,0x58,0xf9,0xe4,0x35,0x31,0xfa,0xc3,0xe5,0x3c,0x95,0x42,0xfd,0xe4,0x94,0x0, +0xfc,0xed,0xae,0x4, 0x78,0x3, 0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0x29,0xf9,0xea, +0x3e,0x71,0x95,0x12,0x3f,0xe8,0xab,0x30,0xe5,0x32,0x2f,0xf9,0xe5,0x31,0x3e,0xfa, +0x90,0x0, 0x87,0x12,0x6c,0x8f,0x90,0x0, 0x88,0x12,0x1, 0x65,0xc3,0x13,0xf5,0x40, +0x71,0x6f,0xa3,0xe5,0x41,0xf0,0x71,0x6f,0xe5,0x40,0xf0,0x71,0x8b,0xf5,0x83,0x74, +0x1, 0xf0,0x11,0x75,0xf1,0x79,0xe5,0x41,0xd1,0x64,0xe5,0x40,0x12,0x5, 0x40,0x12, +0x2, 0xb7,0xff,0x71,0x6f,0xa3,0xa3,0xe5,0xf0,0xf0,0xa3,0xef,0xf0,0x5, 0x3c,0x1, +0xda,0x71,0x9c,0xff,0x90,0x0, 0x80,0x12,0x1, 0x65,0x2f,0xf5,0x3d,0xe4,0xf5,0x3c, +0x71,0x9c,0xf1,0xc5,0x40,0x2, 0x41,0xfd,0xe5,0x3c,0xc3,0x9d,0x50,0x7, 0xf1,0x9d, +0x12,0x1f,0xba,0x80,0x11,0x71,0x77,0x12,0x6a,0x76,0x78,0x3, 0xc3,0x33,0xce,0x33, +0xce,0xd8,0xf9,0x12,0x6b,0x15,0x71,0x95,0x12,0x6b,0x75,0x71,0x6e,0xa3,0xe0,0x75, +0xf0,0x20,0x71,0x68,0xe0,0x12,0x15,0x81,0x12,0x2, 0xb7,0xf5,0x3f,0x85,0xf0,0x3e, +0x71,0x8b,0xf5,0x83,0xe0,0x70,0x4, 0x15,0x3d,0x41,0xf9,0xe4,0xf5,0x47,0xf5,0x46, +0xab,0x39,0xaa,0x3a,0xa9,0x3b,0x12,0x1, 0x4c,0xff,0xe5,0x46,0xc3,0x9f,0x40,0x2, +0x41,0xa1,0x71,0x6f,0xa3,0xe0,0xff,0x65,0x46,0x70,0x2, 0x41,0x9d,0x12,0x6b,0x75, +0xfa,0x75,0xf0,0x20,0xef,0x71,0x68,0xe0,0x12,0x15,0x81,0x12,0x1f,0x4b,0x71,0x6f, +0xa3,0xe0,0x75,0xf0,0x10,0xa4,0xff,0x71,0x6f,0xe0,0x12,0x6c,0x58,0x71,0x84,0x33, +0xaa,0x34,0xa9,0x35,0xb1,0xd1,0x2d,0xfd,0xec,0x35,0xf0,0xfc,0xc0,0x4, 0xc0,0x5, +0xf1,0x79,0xe5,0x46,0x12,0x5, 0x40,0xc0,0x83,0xc0,0x82,0x71,0x6f,0xe0,0xff,0xd0, +0x82,0xd0,0x83,0x75,0xf0,0x2, 0x12,0x1f,0x48,0xef,0xfb,0x7a,0x0, 0xe5,0x46,0x75, +0xf0,0x10,0xa4,0x2b,0xff,0xea,0x35,0xf0,0x71,0x84,0x33,0xab,0x33,0xaa,0x34,0xb1, +0xd1,0x2d,0xff,0xec,0x35,0xf0,0xfe,0xc3,0xd0,0xe0,0x9f,0xff,0xd0,0xe0,0x9e,0xfe, +0x71,0x77,0x12,0x6c,0x48,0xe5,0x3c,0xc3,0x9d,0x50,0x12,0xb1,0xdb,0x12,0x2, 0x8c, +0xfd,0xd3,0xef,0x9d,0xe5,0xf0,0x12,0x69,0x1f,0x40,0x2, 0x5, 0x47,0x5, 0x46,0x21, +0xf0,0xab,0x39,0xaa,0x3a,0xa9,0x3b,0x12,0x1, 0x4c,0xc3,0x13,0xff,0xe5,0x47,0xc3, +0x9f,0x40,0x12,0x11,0x75,0x90,0x7, 0x9d,0x12,0x1, 0x65,0x64,0x6, 0x60,0x6, 0x71, +0x8b,0xf5,0x83,0xe4,0xf0,0x71,0x6f,0xa3,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0xc3,0xe5, +0x3f,0x9f,0xff,0xe5,0x3e,0x9e,0xfe,0x12,0x0, 0x6, 0x8e,0x3e,0x8f,0x3f,0xb1,0xdb, +0x90,0x0, 0x20,0x12,0x1, 0x65,0xff,0xd3,0xe5,0x3f,0x9f,0x74,0x80,0xf8,0x65,0x3e, +0x98,0x40,0x6, 0x71,0x8b,0xf5,0x83,0xe4,0xf0,0x5, 0x3c,0x21,0xa0,0xe5,0x3d,0x70, +0x7, 0x71,0x77,0x90,0x0, 0x80,0x80,0x5c,0x71,0x77,0x90,0x0, 0x83,0x12,0x1, 0x65, +0xc3,0x94,0xc, 0x40,0x3c,0xe4,0xf5,0x3c,0x71,0x9c,0xf1,0xc5,0x50,0x49,0xe5,0x3c, +0xc3,0x9d,0x50,0x7, 0xf1,0x9d,0x12,0x1f,0xba,0x80,0x11,0x71,0x77,0x12,0x6a,0x76, +0x78,0x3, 0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0x12,0x6b,0x15,0x71,0x95,0x71,0x8b, +0xf5,0x83,0xe0,0xb4,0x1, 0x7, 0x71,0x8b,0xf5,0x83,0x74,0x2, 0xf0,0x5, 0x3c,0x80, +0xc7,0x71,0x77,0x90,0x0, 0x83,0x74,0x1, 0x2, 0x1, 0x92,0x71,0x77,0x90,0x0, 0x83, +0xe4,0xf1,0x80,0xe4,0x12,0x6b,0xc0,0x22,0xa4,0x29,0xf9,0xe5,0xf0,0x3a,0xfa,0x85, +0x45,0x82,0x85,0x44,0x83,0xa3,0x22,0xab,0x30,0xaa,0x31,0xa9,0x32,0x22,0xaf,0x3c, +0xef,0x33,0x95,0xe0,0xfe,0xef,0x25,0xe0,0xff,0xee,0x22,0xe5,0x45,0x24,0x7, 0xf5, +0x82,0xe4,0x35,0x44,0x22,0xaf,0x1, 0xf5,0x44,0x8f,0x45,0x22,0xab,0x30,0xaa,0x31, +0xa9,0x32,0x90,0x0, 0x81,0x2, 0x1, 0x65,0x8b,0x30,0x8a,0x31,0x89,0x32,0x12,0x1, +0x4c,0x13,0x13,0x54,0x3f,0xf5,0x3b,0x12,0x17,0xc4,0x13,0x13,0x54,0x3f,0xf5,0x3c, +0xe4,0xf5,0x3d,0xf5,0x3e,0xf5,0x3f,0xf5,0x39,0x71,0x77,0x12,0x1, 0x4c,0xff,0xe5, +0x39,0xc3,0x9f,0x50,0x50,0xe4,0xf5,0x3a,0x71,0x77,0x12,0x17,0xc4,0xff,0xe5,0x3a, +0xc3,0x9f,0x50,0x39,0x12,0x68,0x2b,0xfd,0xd3,0xef,0x9d,0x74,0x80,0xf8,0x65,0xf0, +0x98,0x40,0x4, 0x5, 0x3d,0x80,0x1c,0x12,0x68,0x2b,0xfd,0xc3,0xe4,0x9d,0xfd,0xe4, +0x94,0x0, 0xfc,0xc3,0xef,0x9d,0xec,0x64,0x80,0xf8,0xe5,0xf0,0x64,0x80,0x98,0x50, +0x2, 0x5, 0x3e,0x5, 0x3f,0xe5,0x3c,0x25,0x3a,0xf5,0x3a,0x80,0xbb,0xe5,0x3b,0x25, +0x39,0xf5,0x39,0x80,0xa4,0xe5,0x3f,0xc3,0x13,0xff,0xe5,0x3d,0xd3,0x9f,0x40,0x21, +0x90,0x7, 0x9f,0x12,0x68,0x98,0xfe,0x11,0x75,0x90,0x7, 0x9e,0x12,0x1, 0x65,0xc3, +0x9e,0x90,0x7, 0x9e,0x50,0x2, 0x80,0x25,0xe4,0x12,0x1, 0xd7,0x75,0x16,0x1, 0x80, +0x3f,0xe5,0x3e,0xd3,0x9f,0x40,0x26,0x90,0x7, 0x9e,0x12,0x68,0x98,0xff,0x11,0x75, +0x90,0x7, 0x9f,0x12,0x1, 0x65,0xc3,0x9f,0x90,0x7, 0x9f,0x50,0x7, 0x74,0x1, 0x12, +0x1, 0x92,0x80,0x1c,0xe4,0x12,0x1, 0xd7,0x75,0x16,0x2, 0x80,0x13,0x11,0x75,0x90, +0x7, 0x9f,0xe4,0x12,0x1, 0xd7,0x90,0x7, 0x9e,0xe4,0x12,0x1, 0xd7,0xe4,0xf5,0x16, +0xaf,0x16,0x22,0x12,0x1f,0xf4,0xe4,0xf5,0x24,0xe4,0xf5,0x25,0x12,0x17,0x30,0xf1, +0x79,0xe5,0x25,0xd1,0x64,0xe5,0x24,0x12,0x37,0xdc,0x94,0xd8,0x12,0x50,0x24,0x40, +0x2, 0xa1,0xb7,0xe4,0xf5,0x27,0x85,0x25,0x26,0x12,0x17,0x30,0xd1,0x5c,0xe5,0x24, +0x12,0x17,0x15,0x12,0x0, 0x6, 0xc3,0x12,0x6b,0x23,0x50,0x5, 0x75,0x27,0x1, 0x80, +0xb, 0xe5,0x26,0xd3,0x94,0x0, 0x40,0x4, 0x15,0x26,0x80,0xdd,0xe5,0x27,0x70,0x28, +0xe5,0x25,0x4, 0xf5,0x26,0xe5,0x26,0xc3,0x94,0xd, 0x50,0x1c,0x12,0x17,0x30,0xd1, +0x5c,0xe5,0x24,0x12,0x17,0x15,0x12,0x0, 0x6, 0xc3,0x12,0x6b,0x23,0x50,0x5, 0x75, +0x27,0x1, 0x80,0x4, 0x5, 0x26,0x80,0xdd,0xe5,0x27,0x64,0x1, 0x60,0x2, 0xa1,0xb7, +0x12,0x17,0x30,0xe5,0x25,0x12,0x1f,0x3a,0xe5,0x25,0xf1,0x90,0x71,0x84,0xb1,0xce, +0xae,0xf0,0x2d,0xf5,0x29,0xec,0x3e,0xf5,0x28,0xe5,0x26,0x12,0x1f,0x3a,0xe5,0x26, +0xf1,0x90,0x71,0x84,0xb1,0xce,0xae,0xf0,0x2d,0xf5,0x2b,0xec,0x3e,0xf5,0x2a,0xe5, +0x26,0x12,0x6b,0xca,0x35,0xf0,0x71,0x84,0x33,0x8f,0x82,0xf5,0x83,0x12,0x1f,0x4b, +0xe5,0x25,0xf1,0x90,0x71,0x84,0xb1,0xce,0x12,0x6b,0xa0,0xc0,0x6, 0xc0,0x7, 0xc3, +0xe5,0x29,0x95,0x2b,0xff,0xe5,0x28,0x95,0x2a,0xfe,0x12,0x0, 0x6, 0xd0,0x5, 0xd0, +0x4, 0xd3,0xef,0x9d,0xec,0x12,0x69,0x1f,0x40,0x3d,0xab,0x21,0xe5,0x23,0x24,0x60, +0xf9,0xe5,0x22,0x34,0x7, 0xfa,0xe5,0x25,0x12,0x6b,0xca,0x35,0xf0,0xfe,0xef,0x78, +0x3, 0xce,0xa2,0xe7,0x13,0xce,0x13,0xd8,0xf8,0x12,0xe, 0xb5,0xff,0xe5,0x25,0xc4, +0x54,0xf0,0x25,0x24,0x54,0x7, 0xfe,0x74,0x1, 0xa8,0x6, 0x8, 0x80,0x2, 0xc3,0x33, +0xd8,0xfc,0xf4,0x5f,0x12,0x1, 0xc5,0x5, 0x25,0xe5,0x25,0xc3,0x94,0xd, 0x50,0x2, +0x81,0x9c,0x5, 0x24,0xe5,0x24,0xc3,0x94,0x9, 0x50,0x2, 0x81,0x99,0x22,0x33,0xaa, +0x22,0x8f,0x82,0xf5,0x83,0x2, 0x2, 0xb7,0xfd,0xd1,0x3f,0xab,0x36,0xaa,0x37,0xa9, +0x38,0x22,0x8b,0x36,0x8a,0x37,0x89,0x38,0x90,0x0, 0x19,0x12,0x1, 0x65,0x7f,0x6, +0xb1,0xd8,0x90,0x0, 0x1a,0x12,0x1, 0x65,0xfd,0x7f,0xa, 0xb1,0xd9,0x90,0x0, 0x20, +0x12,0x1, 0x65,0xfd,0x7f,0x8, 0xb1,0xd9,0x90,0x0, 0x1c,0x12,0x1, 0x65,0xfd,0x7f, +0xc, 0xb1,0xd9,0x90,0x0, 0x1d,0x12,0x1, 0x65,0xfd,0x7f,0x2a,0xd1,0x3f,0x12,0x68, +0x48,0xfd,0x7f,0x2e,0xd1,0x3f,0xe4,0xfd,0x7f,0x1c,0xb1,0xd9,0x90,0x0, 0x21,0x12, +0x1, 0x65,0x7f,0x2, 0xb1,0xd8,0x90,0x0, 0x22,0x12,0x1, 0x65,0xfd,0x7f,0x4, 0x12, +0x5a,0x5b,0x44,0x40,0xf5,0xa1,0xe5,0xdb,0x30,0xe3,0xfb,0x53,0xdb,0xf3,0x8d,0xa1, +0xe5,0xdb,0x30,0xe3,0xfb,0x53,0xdb,0xf3,0x43,0xab,0x4, 0x22,0x90,0x3, 0x80,0x75, +0xf0,0x20,0xe5,0x26,0x12,0x5, 0x40,0x75,0xf0,0x2, 0x22,0x12,0x3f,0xe1,0xe4,0xff, +0x12,0x5a,0x12,0x11,0x75,0x90,0x0, 0x18,0x12,0x1, 0x65,0xff,0x12,0x59,0xfa,0x7f, +0x1, 0x12,0x5a,0x1d,0xf1,0xe5,0xef,0x70,0x2, 0xff,0x22,0x7d,0x7f,0x7f,0x14,0xf1, +0xaa,0xef,0x70,0x2, 0xff,0x22,0x12,0x6b,0xf9,0x85,0x33,0x39,0xf5,0x3a,0x89,0x3b, +0x11,0x75,0xd1,0xb7,0x11,0x75,0xb1,0xe2,0xe4,0xff,0x12,0x5a,0x1d,0xf1,0xbc,0xef, +0x7f,0x0, 0x60,0x2, 0x7f,0x1, 0x22,0x8b,0x36,0x8a,0x37,0x89,0x38,0xe4,0xf5,0x3c, +0xb1,0xdb,0xf1,0x87,0xfd,0xe4,0xff,0x12,0x59,0xd7,0x8e,0x3d,0x8f,0x3e,0xe5,0x3c, +0x70,0x3, 0x43,0x3d,0x20,0xf1,0x6c,0x94,0x10,0x40,0xe5,0x75,0x3c,0x10,0xe4,0xfd, +0x7f,0xc0,0xf1,0x71,0x94,0x20,0x40,0xf6,0xe4,0xf5,0x3c,0xab,0x39,0xaa,0x3a,0xa9, +0x3b,0xf1,0x87,0xfe,0x54,0xf, 0xff,0xee,0xc4,0x54,0xf, 0xfd,0x12,0x59,0xe3,0x8e, +0x3d,0x8f,0x3e,0xf1,0x6c,0x94,0x8, 0x40,0xe2,0x75,0x3c,0x8, 0xe4,0xfd,0x7f,0xc0, +0xf1,0x71,0x94,0x20,0x40,0xf6,0xe4,0xf5,0x3c,0x75,0xf0,0x2, 0xe5,0x3c,0xa4,0x24, +0x54,0xf5,0x82,0xe5,0xf0,0x34,0xc, 0xf5,0x83,0xe4,0x93,0xf5,0x3d,0x74,0x1, 0x93, +0xf5,0x3e,0xf1,0x6c,0x94,0xff,0x40,0xe1,0x90,0xe, 0x52,0xe4,0x93,0xfc,0x74,0x1, +0x93,0xfd,0xec,0xff,0x53,0xab,0x3, 0x53,0xdb,0xf3,0x8f,0xa1,0xe5,0xdb,0x30,0xe3, +0xfb,0x85,0xa1,0x14,0x53,0xdb,0xf3,0x8d,0xa1,0xe5,0xdb,0x30,0xe3,0xfb,0x85,0xa1, +0x15,0x53,0xdb,0xf3,0x43,0xab,0x4, 0xae,0x14,0xaf,0x15,0x22,0xe5,0x3d,0xff,0xad, +0x3e,0xf1,0x44,0x5, 0x3c,0xe5,0x3c,0xc3,0x22,0x90,0x3, 0x80,0x75,0xf0,0x20,0x22, +0x12,0x1, 0xd7,0x90,0x0, 0x80,0x22,0x85,0x3c,0x82,0x75,0x83,0x0, 0x2, 0x1, 0x65, +0x75,0xf0,0x10,0xa4,0x7a,0x0, 0x25,0x24,0xff,0xea,0x35,0xf0,0x22,0xe9,0x24,0x30, +0xf9,0xe4,0x3a,0xfa,0xe5,0x3c,0x75,0xf0,0x8, 0x22,0xae,0x5, 0xac,0x7, 0xd1,0x3f, +0x12,0x5a,0x3f,0xef,0x7f,0x0, 0xb5,0x6, 0x2, 0x7f,0x1, 0x22,0xe4,0xfd,0xf1,0xde, +0x60,0x2, 0x7f,0x1, 0x22,0xff,0x90,0x0, 0x80,0x12,0x1, 0x65,0xfd,0x2f,0xff,0xe4, +0x33,0xfe,0xe5,0x3c,0xc3,0x9f,0xee,0x64,0x80,0xf8,0x74,0x80,0x98,0x22,0xff,0xf1, +0xaa,0xef,0x7f,0x0, 0x22,0x7d,0x3, 0xe4,0xf1,0xde,0x60,0x2, 0x7f,0x1, 0x22,0x12, +0x37,0x96,0xff,0xd3,0x94,0x0, 0x50,0x37,0x12,0x17,0xca,0xd3,0x9f,0x40,0x1c,0x90, +0x0, 0x50,0x12,0x1, 0x65,0xff,0x90,0xc, 0xd8,0xe0,0xd3,0x9f,0x50,0x12,0xe0,0x4, +0xf0,0xf1,0x96,0x90,0x0, 0x4b,0x12,0x1, 0xd7,0x80,0x5, 0xe4,0x90,0xc, 0xd8,0xf0, +0x12,0x17,0xca,0x70,0xa, 0xe9,0x24,0x4f,0x11,0x3a,0x54,0xfe,0x12,0x1, 0xc5,0x22, +0x90,0x0, 0x16,0xe4,0x12,0x1, 0xd7,0xe9,0x24,0x17,0xf9,0xe4,0x3a,0xfa,0x2, 0x1, +0x4c,0x12,0x1f,0xf4,0x75,0x2d,0xff,0x12,0x15,0x30,0x51,0x17,0x70,0x2, 0x21,0xb, +0x12,0x17,0x30,0x11,0x30,0x44,0x2, 0x12,0x1, 0xc5,0x91,0x1e,0x12,0x15,0x30,0x51, +0x17,0xff,0xe5,0x2e,0xc3,0x9f,0x50,0x4e,0xab,0x24,0x12,0x55,0x9f,0x34,0x3, 0xfa, +0xc0,0x3, 0xc0,0x2, 0xc0,0x1, 0x12,0x15,0x30,0x75,0xf0,0x2, 0xe5,0x2e,0x12,0x15, +0x84,0x12,0x1, 0x65,0xc3,0x13,0x75,0xf0,0x20,0xa4,0xd0,0x1, 0xd0,0x2, 0xd0,0x3, +0x29,0xf9,0xe5,0xf0,0x3a,0xfa,0xc0,0x3, 0xc0,0x2, 0xc0,0x1, 0xe5,0x2e,0x75,0xf0, +0x2, 0x12,0x15,0x51,0x12,0x17,0xc4,0xc3,0x13,0x12,0x15,0x81,0xd0,0x1, 0xd0,0x2, +0xd0,0x3, 0xf1,0xa2,0x80,0xa6,0xae,0x2f,0xaf,0x30,0x12,0x15,0x30,0x51,0x17,0xfd, +0x7c,0x0, 0x91,0x16,0xab,0x21,0xe5,0x23,0x24,0x1, 0xf9,0xe4,0x35,0x22,0xfa,0xc0, +0x2, 0xc0,0x1, 0xaa,0x22,0xa9,0x23,0x90,0x0, 0x15,0x12,0x15,0x7e,0xd0,0x1, 0xd0, +0x2, 0xe5,0x2f,0x85,0x30,0xf0,0x12,0x3, 0x5b,0x12,0x17,0x30,0x90,0x0, 0x15,0x74, +0x1, 0x12,0x1, 0x92,0x90,0x0, 0x15,0x12,0x1, 0x65,0xc3,0x94,0xa, 0x40,0x56,0x12, +0x17,0x30,0x90,0x0, 0x15,0x11,0x33,0x44,0x1, 0x80,0x47,0x12,0x17,0x30,0x90,0x0, +0x17,0x12,0x1, 0x65,0xc3,0x13,0x30,0xe0,0x2c,0x90,0x0, 0x16,0x74,0x1, 0x12,0x1, +0x92,0x90,0x0, 0x16,0x12,0x1, 0x65,0xc3,0x94,0x3c,0x40,0x29,0x12,0x17,0x30,0x11, +0x30,0x54,0xfd,0x12,0x1, 0xc5,0xe4,0xf5,0x2d,0x12,0x17,0x30,0x90,0x0, 0x15,0x11, +0x34,0x54,0xfe,0x80,0xd, 0xe4,0xf5,0x2d,0x12,0x17,0x30,0x90,0x0, 0x15,0x11,0x34, +0x54,0xfe,0x12,0x1, 0xc5,0xe5,0x2d,0xf4,0x70,0x69,0xf5,0x2d,0x12,0x17,0x30,0x90, +0x0, 0x17,0x12,0x1, 0x65,0x30,0xe0,0x5b,0x91,0x1e,0x12,0x17,0x30,0x90,0x0, 0x1, +0x75,0xf0,0x2, 0xe5,0x2e,0x12,0x5, 0x40,0xf1,0xa2,0xe5,0x2e,0xb4,0xa, 0xeb,0xae, +0x2f,0xaf,0x30,0x7c,0x0, 0x7d,0xa, 0x91,0x16,0xe4,0xf5,0x2e,0xe5,0x2e,0x75,0xf0, +0x3, 0xa4,0x24,0x5e,0xf5,0x82,0xe4,0x34,0x7, 0xf5,0x83,0xd3,0x74,0x1, 0x93,0x95, +0x30,0xe4,0x93,0x95,0x2f,0x50,0x15,0xe5,0x2e,0x75,0xf0,0x3, 0xa4,0x24,0x60,0xf5, +0x82,0xe4,0x34,0x7, 0xf5,0x83,0xe4,0x93,0xf5,0x2d,0x80,0x7, 0x5, 0x2e,0xe5,0x2e, +0xb4,0x3, 0xc9,0xe4,0x12,0x15,0x2f,0x51,0x17,0xb4,0x2, 0x1c,0x90,0x0, 0x2, 0x12, +0x1, 0x65,0xfe,0x12,0x1, 0x4c,0x6e,0x60,0xd, 0x90,0x0, 0x3, 0x12,0x1, 0x65,0xfe, +0x12,0x17,0xc4,0xb5,0x6, 0x2, 0x7f,0x1, 0xe5,0x2d,0x25,0xe0,0x24,0x67,0xf5,0x82, +0xe4,0x34,0x7, 0xf1,0x57,0xe4,0x93,0x12,0x17,0x30,0x12,0x1, 0xc5,0x12,0x17,0x30, +0x12,0x1, 0x4c,0x90,0x7, 0x6f,0x93,0xff,0x12,0x17,0xd1,0xe4,0x8f,0xf0,0x2, 0x3, +0x3c,0xab,0x2a,0xaa,0x2b,0xa9,0x2c,0x90,0x0, 0x2d,0x2, 0x1, 0x65,0x12,0x1f,0xf4, +0x51,0x17,0xc3,0x94,0x2, 0x50,0x2, 0x61,0x2, 0x12,0x17,0x30,0x12,0x4e,0x3a,0x12, +0x1, 0x4c,0x91,0x26,0xce,0xa2,0xe7,0x13,0xce,0x13,0xd8,0xf8,0xf5,0x29,0x90,0x0, +0x3, 0x12,0x1, 0x65,0xff,0x12,0x17,0xc4,0x91,0x26,0xce,0xa2,0xe7,0x13,0xce,0x13, +0xd8,0xf8,0xf5,0x2a,0x12,0x15,0xa3,0x12,0x2f,0x79,0xe5,0x29,0x12,0x2e,0x64,0xe5, +0x2a,0xf1,0xdc,0x94,0xd4,0xe5,0xf0,0x64,0x80,0x94,0x7e,0x50,0x2, 0x61,0x2, 0xe4, +0xf5,0x27,0x12,0x17,0x30,0x51,0x17,0xff,0xe5,0x27,0xc3,0x9f,0x40,0x2, 0x61,0x2, +0x75,0xf0,0x2, 0xe5,0x27,0x12,0x15,0x84,0x12,0x1, 0x65,0xf5,0x29,0xe5,0x27,0xf1, +0xe4,0x12,0x17,0xc1,0xf5,0x2a,0xe4,0xf5,0x28,0x12,0x17,0x30,0x51,0x17,0xff,0xe5, +0x28,0xc3,0x9f,0x50,0x59,0xe5,0x27,0x65,0x28,0x60,0x4f,0x75,0xf0,0x2, 0xe5,0x28, +0x12,0x15,0x84,0x12,0x1, 0x65,0xff,0xc3,0xe5,0x29,0x91,0x30,0x91,0xe, 0x94,0x80, +0x40,0x17,0xe5,0x28,0x75,0xf0,0x2, 0x12,0x1c,0x4d,0x12,0x17,0xc4,0xff,0xc3,0xe5, +0x2a,0x91,0x30,0x91,0xe, 0x94,0x80,0x50,0x21,0x12,0x15,0xa3,0x90,0x3, 0x80,0xe5, +0x29,0xc3,0x13,0x75,0xf0,0x20,0x12,0x5, 0x40,0xe5,0x2a,0xc3,0x13,0x75,0xf0,0x2, +0x12,0x5, 0x40,0xe4,0x75,0xf0,0x50,0x12,0x2, 0xef,0x5, 0x28,0x80,0x9b,0x5, 0x27, +0x41,0x72,0x22,0x12,0x1f,0xf4,0x75,0x2f,0x1, 0x71,0xfb,0x12,0x15,0xa3,0x12,0x3d, +0x66,0x8f,0x2d,0x71,0xfb,0x12,0x15,0xa3,0x12,0x2b,0xa8,0x8f,0x2e,0x12,0x15,0x30, +0x90,0x7, 0xa4,0x12,0x1, 0x65,0xff,0x70,0x37,0x90,0x7, 0x9d,0x4, 0x12,0x1, 0xd7, +0xe5,0x2d,0xb4,0x2, 0xa, 0x90,0x7, 0x9d,0x74,0x6, 0x12,0x1, 0xd7,0x80,0x6e,0x12, +0x17,0x30,0x51,0x17,0x70,0x10,0x90,0x0, 0x86,0x12,0x1, 0x65,0x70,0x8, 0x12,0x15, +0x30,0x90,0x7, 0xa4,0x80,0x43,0x12,0x15,0x30,0x90,0x7, 0x9d,0x74,0x4, 0x80,0x7a, +0xef,0x64,0x1, 0x70,0x4d,0x12,0x15,0x30,0x90,0x7, 0x9d,0x12,0x1, 0xd7,0xe5,0x2e, +0x60,0x7, 0x90,0x7, 0xa4,0x74,0x3, 0x80,0x61,0xe5,0x2d,0xb4,0x2, 0x6, 0x90,0x7, +0x9d,0xe4,0x80,0x56,0x12,0x17,0x30,0x51,0x17,0x70,0x11,0x90,0x0, 0x86,0x12,0x1, +0x65,0x70,0x9, 0x12,0x15,0x30,0x90,0x7, 0x9d,0x4, 0x80,0x3e,0x71,0xfb,0x85,0x24, +0x39,0x85,0x25,0x3a,0x85,0x26,0x3b,0x12,0x17,0x30,0x12,0x28,0x7c,0xe4,0xf5,0x2f, +0x80,0x2b,0x12,0x15,0x30,0x90,0x7, 0xa4,0x12,0x1, 0x65,0xb4,0x3, 0x1f,0xe5,0x2e, +0x24,0xfe,0x60,0xa, 0x4, 0x70,0xe, 0x90,0x7, 0x9d,0x74,0x3, 0x80,0xc, 0x90,0x7, +0x9d,0x74,0x2, 0x80,0x5, 0x90,0x7, 0xa4,0x74,0x1, 0x12,0x1, 0xd7,0xe5,0x2f,0xb4, +0x1, 0x18,0x12,0x17,0x30,0x90,0x0, 0x80,0xe4,0x12,0x6b,0xc0,0x90,0x0, 0x82,0xe4, +0x12,0x1, 0xd7,0x90,0x0, 0x84,0xe4,0x12,0x1, 0xd7,0x22,0x85,0x27,0x33,0x85,0x28, +0x34,0x85,0x29,0x35,0x85,0x2a,0x36,0x85,0x2b,0x37,0x85,0x2c,0x38,0x22,0xd3,0xef, +0x94,0x4, 0xee,0x64,0x80,0x22,0x12,0x2, 0xb, 0x8e,0x2f,0x8f,0x30,0x22,0xe4,0xf5, +0x2f,0xf5,0x30,0xf5,0x2e,0x22,0x2f,0xff,0xe4,0x33,0xfe,0xef,0x78,0x4, 0x22,0xc3, +0x9f,0xff,0xe4,0x94,0x0, 0xfe,0x2, 0x0, 0x6, 0x8f,0x33,0x8b,0x34,0x8a,0x35,0x89, +0x36,0x74,0xec,0x2f,0x91,0xf1,0xe0,0xff,0x60,0x35,0x12,0x1, 0x4c,0x91,0x2f,0xd3, +0xef,0x94,0xf, 0xee,0x64,0x80,0x94,0x80,0x40,0x17,0x91,0xe3,0xe0,0xfe,0xef,0xd3, +0x9e,0x74,0xec,0x40,0x7, 0x91,0xef,0xe0,0x4, 0xf0,0x80,0x5, 0x91,0xef,0xe0,0x14, +0xf0,0x91,0xed,0xe0,0xab,0x34,0xaa,0x35,0xa9,0x36,0x12,0x1, 0xc5,0x80,0x4, 0x91, +0xe3,0xef,0xf0,0xab,0x37,0xaa,0x38,0xa9,0x39,0x12,0x1, 0x4c,0xff,0x60,0x39,0x91, +0xd7,0xe0,0xfd,0xc3,0xef,0x9d,0x91,0x31,0xd3,0xef,0x94,0x20,0xee,0x64,0x80,0x94, +0x80,0x40,0x19,0x91,0xcd,0xe0,0xfe,0xef,0xd3,0x9e,0x74,0x2a,0x40,0x8, 0x91,0xd9, +0xe0,0x24,0x10,0xf0,0x80,0x6, 0x91,0xd9,0xe0,0x24,0xf0,0xf0,0x91,0xd7,0xe0,0xab, +0x37,0xaa,0x38,0xa9,0x39,0x2, 0x1, 0xc5,0x91,0xcd,0xef,0xf0,0x22,0xab,0x37,0xaa, +0x38,0xa9,0x39,0x12,0x1, 0x4c,0xff,0x74,0x2a,0x25,0x33,0xf5,0x82,0xe4,0x34,0xc, +0xf5,0x83,0x22,0xab,0x34,0xaa,0x35,0xa9,0x36,0x12,0x1, 0x4c,0xff,0x74,0xec,0x25, +0x33,0xf5,0x82,0xe4,0x34,0xb, 0xf5,0x83,0x22,0x12,0x1f,0xf4,0xe4,0xf5,0x2c,0xf5, +0x2d,0x12,0x5, 0x4c,0xaf,0x1, 0x8a,0x31,0x8f,0x32,0x12,0x17,0x30,0xf1,0x87,0x20, +0xe0,0x10,0x13,0x13,0x54,0x3f,0x20,0xe0,0x9, 0xf1,0x87,0xc3,0x13,0x20,0xe0,0x2, +0xe1,0x43,0x20,0x1, 0x8, 0x75,0x2a,0xb, 0x75,0x2b,0xf6,0x80,0x6, 0x75,0x2a,0xc, +0x75,0x2b,0x10,0xe4,0xf5,0x27,0xe5,0x2b,0x25,0x27,0xf1,0x68,0x74,0xff,0xf0,0x5, +0x27,0xe5,0x27,0xb4,0x1a,0xf0,0x85,0x2b,0x82,0x85,0x2a,0x83,0x74,0xaa,0xf0,0xa3, +0xf1,0x8d,0xa3,0x74,0x1a,0xf0,0x12,0x17,0x30,0x90,0x0, 0x49,0xf1,0xd5,0x24,0x4, +0xf1,0x68,0xef,0xf0,0xe4,0xf5,0x29,0xf5,0x27,0x12,0x15,0xa3,0x12,0x1, 0x4c,0xff, +0xe5,0x27,0xc3,0x9f,0x40,0x2, 0xc1,0xd4,0xe5,0x27,0x12,0x1c,0x4a,0x12,0x1f,0x79, +0xff,0x54,0xf0,0xd3,0x94,0x0, 0x40,0x2, 0xc1,0xd0,0xf1,0x4e,0xe0,0x64,0x3, 0x70, +0x2, 0xc1,0xd0,0xe5,0x29,0x25,0xe0,0x25,0xe0,0xf5,0x28,0x90,0x0, 0x8, 0x12,0x1, +0x65,0xf5,0x2e,0x90,0x0, 0x9, 0x12,0x1, 0x65,0xc4,0x54,0xf0,0xf5,0x2f,0x12,0x1f, +0x79,0xf5,0x30,0x12,0x15,0xa3,0x12,0x1, 0x4c,0xff,0xe5,0x30,0xc3,0x9f,0x50,0x5d, +0x12,0x17,0x30,0xf1,0x87,0x13,0x13,0x13,0x54,0x1f,0x20,0xe0,0x15,0x75,0x37,0x0, +0x75,0x38,0x0, 0x75,0x39,0x2f,0x7b,0x0, 0x7a,0x0, 0x79,0x2e,0xaf,0x30,0x91,0x39, +0x80,0x12,0x74,0xec,0x25,0x30,0x91,0xf1,0xe0,0xf5,0x2e,0x74,0x2a,0x25,0x30,0x91, +0xdb,0xe0,0xf5,0x2f,0xe5,0x32,0x24,0x23,0xf5,0x82,0xe4,0x35,0x31,0xf5,0x83,0xe5, +0x82,0x25,0x30,0xf1,0x5c,0xe0,0xb4,0x1, 0x14,0x74,0xec,0x25,0x30,0x91,0xf1,0xe4, +0xf0,0x74,0x2a,0x25,0x30,0x91,0xdb,0xe4,0xf0,0xf5,0x2e,0xf5,0x2f,0xa2,0x1, 0xe4, +0xfe,0x33,0xff,0x90,0xc, 0x3c,0x75,0xf0,0xa, 0xf1,0xc4,0xf1,0x5c,0xe5,0x2e,0xf0, +0x90,0xb, 0xd8,0x75,0xf0,0xa, 0xef,0xf1,0xc4,0xf1,0x5c,0xe5,0x2f,0xf0,0xe5,0x27, +0x12,0x1c,0x4a,0xf1,0x9c,0xe5,0xf0,0x54,0xf, 0xff,0xe5,0x28,0x24,0x5, 0xf1,0x70, +0x12,0x1c,0x50,0xf1,0x9c,0xff,0xe5,0x28,0x24,0x6, 0xf1,0x70,0x12,0x1c,0x50,0x90, +0x0, 0x5, 0x12,0x2, 0xb7,0xe5,0xf0,0x54,0xf, 0xff,0xe5,0x28,0x24,0x7, 0xf1,0x70, +0x12,0x1c,0x50,0x90,0x0, 0x5, 0x12,0x2, 0xb7,0xff,0xe5,0x28,0x24,0x8, 0xf1,0x70, +0x12,0x1c,0x50,0x12,0x1f,0x79,0xc4,0x54,0xf0,0xff,0xe5,0x28,0x24,0x7, 0xf1,0xb3, +0xf1,0x7f,0x12,0x1c,0x50,0x12,0x1f,0x79,0xff,0xf4,0x60,0x1c,0xf1,0x4e,0xe0,0xff, +0x64,0x1, 0x60,0x2, 0x5, 0x2c,0x5, 0x2d,0xef,0xc4,0x33,0x33,0x54,0xc0,0xff,0xe5, +0x28,0x24,0x5, 0xf1,0xb3,0xf0,0x80,0x16,0xe5,0x28,0x24,0x5, 0xff,0xe4,0x33,0xfe, +0xe5,0x2b,0x2f,0xf5,0x82,0xe5,0x2a,0x3e,0xf5,0x83,0xe0,0x24,0xc0,0xf0,0x5, 0x29, +0x5, 0x27,0xa1,0x69,0xf1,0x8e,0xa3,0xa3,0xe5,0x2c,0xf1,0x8d,0xa3,0xa3,0xe0,0xff, +0xe5,0x2d,0xc4,0x54,0xf0,0xfe,0xef,0x4e,0xf0,0xe5,0x2b,0x24,0x19,0xf1,0x68,0xe4, +0xf0,0xf5,0x27,0xe5,0x2b,0x24,0x19,0xf1,0x68,0xc0,0x83,0xc0,0x82,0xe0,0xff,0xe5, +0x2b,0x25,0x27,0xf1,0x68,0xe0,0xfe,0xef,0x6e,0xd0,0x82,0xd0,0x83,0xf0,0x5, 0x27, +0xe5,0x27,0xb4,0x19,0xde,0xb2,0x1, 0x7f,0x1, 0xf1,0x45,0x12,0x17,0x30,0xf1,0x87, +0xff,0x13,0x13,0x54,0x3f,0x30,0xe0,0x9, 0xaa,0x31,0xa9,0x32,0x7b,0x1, 0x12,0x4e, +0x4b,0x12,0x69,0x53,0x54,0xfe,0x12,0x1, 0xc5,0x54,0xfb,0x12,0x1, 0xc5,0x54,0xfd, +0x2, 0x1, 0xc5,0xe4,0xff,0xef,0x70,0x3, 0xd2,0x98,0x22,0xc2,0x98,0x22,0xe5,0x32, +0x24,0x23,0xf5,0x82,0xe4,0x35,0x31,0xf5,0x83,0xe5,0x82,0x2f,0xf5,0x82,0xe4,0x35, +0x83,0xf5,0x83,0x22,0xe5,0x2b,0x24,0x7, 0xf5,0x82,0xe4,0x35,0x2a,0xf5,0x83,0x22, +0xfd,0xe4,0x33,0xfc,0xe5,0x2b,0x2d,0xf5,0x82,0xe5,0x2a,0x3c,0xf5,0x83,0xef,0xf0, +0xe5,0x27,0x75,0xf0,0x7, 0xa4,0x22,0x90,0x0, 0x4f,0x2, 0x1, 0x65,0xf0,0x85,0x2b, +0x82,0x85,0x2a,0x83,0xa3,0x22,0x90,0x0, 0x4c,0x2, 0x1, 0x65,0x90,0x0, 0x3, 0x2, +0x2, 0xb7,0x12,0x2, 0xb7,0xae,0xf0,0x25,0x30,0xf5,0x30,0xee,0x35,0x2f,0xf5,0x2f, +0x5, 0x2e,0x22,0xfd,0xe4,0x33,0xfc,0xe5,0x2b,0x2d,0xf5,0x82,0xe5,0x2a,0x3c,0xf5, +0x83,0xe0,0x2f,0x22,0x12,0x5, 0x40,0xee,0x75,0xf0,0xa, 0xa4,0x25,0x83,0xf5,0x83, +0xe5,0x82,0x25,0x29,0x22,0x12,0x1, 0x65,0xff,0xe5,0x2b,0x22,0x12,0x5, 0x40,0x12, +0x2, 0xb7,0xc3,0x22,0x75,0xf0,0x2, 0xa4,0x29,0xf9,0xea,0x22,0x8f,0xd, 0xe4,0xf5, +0xe, 0x22,0x8c,0x24,0x8d,0x25,0x12,0x1f,0xf4,0x12,0x17,0xca,0xf5,0x2a,0x12,0x5, +0x4c,0xaf,0x1, 0x8a,0x2b,0x8f,0x2c,0x12,0x17,0x30,0x12,0x37,0x96,0x65,0x2a,0x60, +0x2e,0xe4,0xf5,0x26,0xe5,0x26,0x12,0x1c,0x4a,0x12,0x1f,0x79,0xf5,0x27,0xf4,0x60, +0x8, 0x31,0x31,0xe5,0xf0,0xf0,0xa3,0xef,0xf0,0x5, 0x26,0xe5,0x26,0xb4,0x5, 0xe4, +0xe5,0x2a,0x60,0x2, 0x21,0x23,0xe5,0x25,0x24,0x6, 0x31,0x28,0xff,0x80,0xad,0xe4, +0xf5,0x26,0x12,0x17,0x30,0x12,0x17,0xca,0xff,0xe5,0x26,0xc3,0x9f,0x40,0x2, 0x21, +0x23,0xe5,0x26,0x12,0x1f,0xb7,0x12,0x1f,0x78,0xf5,0x27,0xf4,0x70,0x2, 0x21,0x1f, +0x90,0x0, 0x3, 0x12,0x17,0x18,0xb1,0x1c,0x31,0x7e,0xfd,0x12,0x1f,0xc7,0x8e,0x28, +0x8f,0x29,0xe5,0x26,0x12,0x1c,0x4a,0x90,0x0, 0x5, 0x12,0x17,0x18,0x31,0x54,0xe0, +0xfc,0xa3,0xe0,0xfd,0x12,0x1f,0xc7,0xad,0xd, 0x7c,0x0, 0xc3,0xe5,0x29,0x9d,0xe5, +0x28,0x9c,0x50,0x63,0xc3,0xef,0x9d,0xee,0x9c,0x50,0x5c,0xb1,0x1c,0x31,0x7e,0xfd, +0xe5,0x26,0x12,0x1c,0x4a,0x90,0x0, 0x3, 0x12,0x4e,0x20,0x31,0x54,0xe0,0xff,0xa3, +0xe0,0x90,0x0, 0x5, 0xcf,0x8f,0xf0,0x12,0x3, 0x5b,0xe5,0x2c,0x24,0x23,0xf5,0x82, +0xe4,0x35,0x2b,0xf5,0x83,0xe5,0x82,0x25,0x27,0x12,0x37,0x5c,0xe0,0xb4,0x2, 0x9, +0xe5,0x2a,0xd3,0x94,0x0, 0x40,0x2, 0x15,0x2a,0xe5,0x2a,0x70,0x42,0x5, 0xe, 0x31, +0x24,0xff,0xe5,0xd, 0xc3,0x9f,0x50,0x5, 0x5, 0xd, 0xe4,0xf5,0xe, 0x12,0x69,0x53, +0x54,0xfe,0x12,0x1, 0xc5,0x80,0x28,0xe5,0x26,0x12,0x1c,0x4a,0x31,0x31,0xe5,0xf0, +0xf0,0xa3,0xef,0xf0,0xe5,0x25,0x24,0x6, 0x31,0x28,0xb5,0xd, 0x6, 0x31,0x24,0xf5, +0xd, 0x80,0x9, 0xe5,0xd, 0xd3,0x94,0x1, 0x40,0x2, 0x15,0xd, 0xe4,0xf5,0xe, 0x5, +0x26,0x1, 0x42,0x22,0xe5,0x25,0x24,0x7, 0xf5,0x82,0xe4,0x35,0x24,0xf5,0x83,0xe0, +0x22,0x90,0x0, 0x3, 0x12,0x2, 0xb7,0xff,0xe5,0x27,0x25,0xe0,0x25,0xe0,0x24,0xc4, +0xf5,0x82,0xe4,0x34,0xc, 0xf5,0x83,0xe5,0xf0,0xf0,0xa3,0xef,0xf0,0x90,0x0, 0x5, +0x12,0x2, 0xb7,0xff,0xe5,0x27,0x25,0xe0,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34, +0xc, 0xf5,0x83,0x22,0xe5,0x2e,0x75,0xf0,0x7, 0xa4,0x24,0xb8,0xf5,0x82,0xe4,0x34, +0xa, 0xf5,0x83,0xe0,0xff,0x25,0xe0,0x24,0xd7,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83, +0xe0,0xfc,0xa3,0xe0,0x22,0x12,0x6c,0x97,0xf5,0x2f,0xf5,0x30,0x12,0x15,0x8b,0xf5, +0x31,0x70,0x31,0xf5,0x2d,0xe5,0x2d,0xfd,0x33,0x95,0xe0,0xfc,0xf1,0xe8,0x74,0xd7, +0x2f,0xf5,0x82,0x74,0xa, 0xf1,0xd9,0x90,0xa, 0xb8,0x75,0xf0,0x7, 0xed,0x12,0x5, +0x40,0xec,0x75,0xf0,0x7, 0xa4,0x25,0x83,0xf5,0x83,0x74,0xff,0xf0,0x5, 0x2d,0xe5, +0x2d,0xb4,0x5, 0xd1,0xe4,0xf5,0x2d,0x12,0x15,0x30,0x12,0x15,0x8b,0xfd,0x91,0xe4, +0xc3,0xef,0x9d,0x74,0x80,0xf8,0x6e,0x98,0x40,0x2, 0x61,0x3e,0x7c,0x0, 0x7d,0x7, +0xd1,0x53,0x71,0x6a,0xff,0xf4,0x70,0x2, 0x61,0x3a,0xb1,0x6, 0x12,0x1f,0xe5,0x12, +0x1, 0x4c,0x60,0x6, 0x64,0x2, 0x60,0x2, 0x61,0x3a,0xe4,0xf5,0x2e,0x12,0x1f,0x7f, +0x71,0x6a,0xff,0xb1,0x2a,0x6f,0x60,0x2, 0x61,0x33,0x90,0x0, 0x2, 0x12,0x17,0x18, +0xe5,0x2e,0x75,0xf0,0x7, 0xa4,0x24,0xb6,0xf5,0x82,0xe4,0x34,0xa, 0x31,0x7e,0x91, +0xf4,0x12,0x0, 0x6, 0xc0,0x6, 0xc0,0x7, 0x12,0x15,0x30,0xaf,0x2d,0xef,0x33,0x95, +0xe0,0x8f,0x82,0xf5,0x83,0x74,0x7, 0x12,0x5, 0x2f,0x12,0x17,0x18,0xe5,0x2e,0x75, +0xf0,0x7, 0xa4,0x24,0xb4,0xf5,0x82,0xe4,0x34,0xa, 0x31,0x7e,0x91,0xf4,0x12,0x0, +0x6, 0xd0,0xe0,0x2f,0xf5,0x30,0xd0,0xe0,0x3e,0xf5,0x2f,0x31,0x64,0xfd,0xd3,0x94, +0x64,0xec,0x94,0x0, 0x40,0xd, 0xd3,0xe5,0x30,0x94,0x64,0xe5,0x2f,0x94,0x0, 0x40, +0x2, 0x80,0x1a,0xed,0x24,0x32,0xff,0xe4,0x3c,0xfe,0xd3,0xe5,0x30,0x9f,0xe5,0x2f, +0x9e,0x40,0xd, 0x31,0x64,0xd3,0x94,0x32,0xec,0x94,0x0, 0x40,0x3, 0xef,0x61,0x1f, +0x12,0x17,0xd1,0x12,0x4e,0x32,0xd3,0xe5,0x30,0x9f,0xe5,0x2f,0x95,0xf0,0x40,0x7d, +0x12,0x1f,0x7f,0x71,0x6a,0xff,0xb1,0x6, 0x12,0x1f,0xe5,0x12,0x1, 0x4c,0x70,0x4, +0x74,0x3, 0x80,0x2, 0x74,0x1, 0x12,0x1, 0xc5,0x12,0x1f,0x7f,0x71,0x6a,0x12,0x6c, +0x40,0x35,0x28,0x12,0x4b,0xe5,0x74,0x3, 0x12,0x1, 0xc5,0x12,0x1f,0x8d,0x78,0x44, +0x7c,0xa, 0x7d,0x1, 0x12,0x1f,0xed,0xe5,0x31,0xd3,0x94,0x0, 0x40,0x3f,0x15,0x31, +0xe5,0x31,0x12,0x15,0x4e,0xc0,0x3, 0xc0,0x2, 0xc0,0x1, 0x91,0xe4,0x7c,0x0, 0x7d, +0x7, 0x12,0x1, 0xf9,0xe5,0x29,0x2f,0xf9,0xe5,0x28,0x3e,0xa8,0x1, 0xfc,0xad,0x3, +0xd0,0x1, 0xd0,0x2, 0xd0,0x3, 0x12,0x1f,0xed,0xe5,0x31,0x75,0xf0,0x7, 0xa4,0x25, +0x29,0xf9,0xe5,0x28,0x35,0xf0,0x7f,0x7, 0x12,0x69,0x9d,0x15,0x2d,0xb1,0x2a,0x25, +0xe0,0x24,0xd7,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0xe5,0x2f,0xf0,0xa3,0xe5,0x30, +0xf0,0x80,0x7, 0x12,0x6c,0x9f,0x50,0x2, 0x21,0xfd,0x5, 0x2d,0x21,0xc7,0x12,0x15, +0x30,0x90,0x0, 0x41,0xe5,0x31,0x12,0x1, 0xd7,0xe4,0xf5,0x2d,0x12,0x1f,0x7f,0xc0, +0x1, 0x74,0xb4,0x2f,0xf9,0x74,0xa, 0x3e,0xa8,0x1, 0xfc,0x7d,0x1, 0xd0,0x1, 0x12, +0x1f,0xed,0x5, 0x2d,0xe5,0x2d,0xb4,0x5, 0xe3,0x22,0x90,0x0, 0x4, 0x2, 0x1, 0x65, +0x12,0x15,0x9d,0x90,0x7, 0x9d,0x12,0x1, 0x65,0xff,0xf5,0x34,0x12,0x15,0x30,0x90, +0x0, 0x15,0x12,0x1, 0x65,0xf5,0x35,0x90,0x0, 0x16,0x12,0x1, 0x65,0xf5,0x36,0xef, +0x70,0x2, 0x81,0xc4,0x12,0x15,0xa3,0x90,0x7, 0x9d,0x12,0x1, 0x65,0xb4,0x4, 0x8, +0xe5,0x35,0x25,0xe0,0x25,0xe0,0xf5,0x35,0xae,0x2, 0xaf,0x1, 0x8e,0x2e,0x8f,0x2f, +0xd1,0x40,0xf5,0x30,0x8f,0x31,0xe5,0x26,0x24,0x60,0xf9,0xe5,0x25,0x34,0x7, 0xaf, +0x1, 0xf5,0x32,0x8f,0x33,0xe4,0xf5,0x2a,0x12,0x17,0x30,0x12,0x6c,0x1d,0x40,0x2, +0x81,0xc4,0xe5,0x2a,0x75,0xf0,0x10,0xa4,0x85,0xf0,0x2c,0xf5,0x2d,0xe4,0xf5,0x2b, +0x12,0x17,0x30,0x12,0x17,0xc4,0xff,0xe5,0x2b,0xc3,0x9f,0x40,0x2, 0x81,0xc0,0xe5, +0x34,0xb4,0x3, 0x2, 0x81,0x8a,0xe5,0x34,0xb4,0x2, 0xf, 0x91,0xc5,0xc0,0x83,0xc0, +0x82,0x91,0xd9,0xd5,0x82,0x2, 0x15,0x83,0x81,0xa8,0xe5,0x34,0xb4,0x5, 0x10,0x91, +0xfd,0xfe,0xe5,0x31,0x2f,0xf5,0x82,0xe5,0x30,0x3e,0x31,0x7e,0xfd,0x80,0x2b,0xe5, +0x34,0x64,0x6, 0x70,0x5f,0xe5,0x2d,0xae,0x2c,0x78,0x3, 0xce,0xc3,0x13,0xce,0x13, +0xd8,0xf9,0x91,0xec,0xf5,0x83,0xb1,0x3b,0x93,0xfe,0xef,0x5e,0x60,0x24,0xb1,0x4e, +0xb1,0x11,0x40,0xb, 0xe5,0x35,0xfd,0x91,0xfd,0xfe,0x91,0xce,0xec,0x80,0x41,0xf1, +0x2e,0x50,0x61,0x91,0xce,0xc0,0x83,0xc0,0x82,0x91,0xd9,0xd5,0x82,0x2, 0x15,0x83, +0x80,0x46,0xe5,0x2d,0xae,0x2c,0x78,0x3, 0xce,0xc3,0x13,0xce,0x13,0xd8,0xf9,0x91, +0xec,0xf5,0x83,0xc0,0x83,0xc0,0x82,0xb1,0x3b,0x93,0xfe,0xef,0x4e,0xd0,0x82,0xd0, +0x83,0xf0,0x80,0x30,0xb1,0x4e,0xb1,0x11,0x40,0xd, 0xe5,0x35,0xfd,0x91,0xc5,0xe4, +0x8d,0xf0,0x12,0x2, 0x60,0x80,0x1d,0xf1,0x2e,0x50,0x19,0x91,0xce,0xc0,0x83,0xc0, +0x82,0x91,0xd9,0xd5,0x82,0x2, 0x15,0x83,0x15,0x82,0xe0,0x9e,0xd0,0x82,0xd0,0x83, +0xf0,0xa3,0xef,0xf0,0x5, 0x2d,0xe5,0x2d,0x70,0x2, 0x5, 0x2c,0x5, 0x2b,0x61,0xe0, +0x5, 0x2a,0x61,0xc8,0x22,0xe5,0x2d,0x25,0xe0,0xff,0xe5,0x2c,0x33,0xfe,0xe5,0x2f, +0x2f,0xf5,0x82,0xe5,0x2e,0x3e,0xf5,0x83,0x22,0x7e,0x0, 0xc3,0xa3,0xe0,0x95,0x35, +0xff,0x5, 0x82,0x22,0xaf,0x2d,0xef,0x33,0x95,0xe0,0xfe,0x22,0x25,0x33,0xf5,0x82, +0xe5,0x32,0x3e,0x22,0xfd,0xc3,0xef,0x9d,0xff,0xee,0x9c,0xfe,0x22,0xe5,0x2d,0x25, +0xe0,0xff,0xe5,0x2c,0x33,0x22,0x7e,0x0, 0xe5,0x29,0x24,0x23,0xf9,0xe4,0x35,0x28, +0x22,0xd3,0x95,0x36,0x74,0x80,0xf8,0xee,0x64,0x80,0x98,0x22,0xe5,0x27,0x25,0xe0, +0x25,0xe0,0x24,0xc4,0xf5,0x82,0xe4,0x34,0xc, 0x22,0xe5,0x2e,0x75,0xf0,0x7, 0xa4, +0x24,0xb8,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0xe0,0x22,0xe0,0xff,0x7c,0x0, 0xe5, +0x2d,0x54,0x7, 0x24,0x12,0xf5,0x82,0xec,0x34,0x0, 0xf5,0x83,0xe4,0x22,0xe5,0x2d, +0x25,0xe0,0xff,0xe5,0x2c,0x33,0xfe,0xe5,0x31,0x2f,0xf5,0x82,0xe5,0x30,0x3e,0xf5, +0x83,0xe0,0xfe,0xa3,0xe0,0x22,0x8b,0x30,0x8a,0x31,0x89,0x32,0x75,0x3f,0x1, 0xaa, +0x34,0xa9,0x35,0xae,0x2, 0xaf,0x1, 0x8e,0x40,0x8f,0x41,0xd1,0x40,0xf5,0x42,0x8f, +0x43,0xe4,0xf5,0x39,0x12,0x2b,0x77,0x12,0x17,0xc4,0xff,0xe5,0x39,0xc3,0x9f,0x40, +0x2, 0xc1,0x3d,0xe4,0xf5,0x3b,0xf5,0x3c,0x75,0x3d,0x7f,0x75,0x3e,0xff,0x12,0x2d, +0xdb,0x90,0x0, 0x1a,0x12,0x1, 0x65,0xfd,0x75,0xf0,0x10,0xa4,0xff,0xae,0xf0,0xe5, +0x39,0x7a,0x0, 0x2f,0xf5,0x45,0xea,0x3e,0xf5,0x44,0x8d,0x3a,0x12,0x2d,0xdb,0x90, +0x0, 0x1b,0x12,0x1, 0x65,0xff,0xe5,0x3a,0xd3,0x9f,0x50,0x4b,0xe5,0x45,0x25,0xe0, +0xff,0xe5,0x44,0x33,0xfe,0xe5,0x41,0x2f,0xf5,0x82,0xe5,0x40,0x3e,0x31,0x7e,0xfd, +0xe5,0x43,0x2f,0xf5,0x82,0xe5,0x42,0xb1,0x5e,0x2d,0xff,0xee,0x3c,0xfe,0xd3,0xef, +0x95,0x3c,0xee,0x95,0x3b,0x40,0x4, 0x8e,0x3b,0x8f,0x3c,0xc3,0xef,0x95,0x3e,0xee, +0x95,0x3d,0x50,0x4, 0x8e,0x3d,0x8f,0x3e,0x74,0x10,0x25,0x45,0xf5,0x45,0xe4,0x35, +0x44,0xf5,0x44,0x5, 0x3a,0x80,0xa5,0x12,0x2d,0xdb,0x90,0x0, 0x1c,0x12,0x2, 0xb7, +0xff,0xc3,0xe5,0x3c,0x95,0x3e,0xfd,0xe5,0x3b,0x95,0x3d,0xfc,0xd3,0xed,0x9f,0xec, +0x95,0xf0,0x40,0x5, 0x75,0x3f,0x2, 0x80,0x4, 0x5, 0x39,0xa1,0x84,0xaf,0x3f,0x22, +0xe9,0x24,0x80,0xf9,0xea,0x34,0x3, 0xaf,0x1, 0x22,0xf9,0xe4,0x35,0x37,0xfa,0xae, +0x39,0xaf,0x3a,0x12,0x1, 0xf9,0xe9,0x2f,0xf9,0xea,0x3e,0xfa,0x22,0xf1,0xe1,0xe4, +0xf5,0x39,0xf5,0x3a,0xf1,0x5, 0x70,0x2, 0x5, 0x39,0x64,0x92,0x45,0x39,0x70,0xf4, +0x12,0x2d,0xdb,0xe4,0xf5,0x39,0xf5,0x3a,0xf1,0x5, 0x70,0x2, 0x5, 0x39,0x64,0x52, +0x45,0x39,0x70,0xf4,0xe4,0xf5,0x39,0xf5,0x3a,0xab,0x33,0xe5,0x35,0x24,0xa, 0xf9, +0xe4,0x35,0x34,0xfa,0xae,0x39,0xaf,0x3a,0x7c,0x0, 0x7d,0x7, 0xd1,0x53,0xd1,0xfe, +0x24,0x3, 0xd1,0x4a,0xd1,0xfe,0x24,0x26,0xd1,0x4a,0xd1,0xe5,0x5, 0x3a,0xe5,0x3a, +0x70,0x2, 0x5, 0x39,0xc3,0x94,0x5, 0xe5,0x39,0x94,0x0, 0x40,0xcc,0x12,0x2d,0xdb, +0x90,0x0, 0x51,0x74,0x1, 0x12,0x1, 0xd7,0xe4,0xf5,0x10,0xf5,0x11,0xf5,0xf, 0xf1, +0x1d,0xe4,0xa3,0xf0,0x90,0xa, 0xeb,0xf0,0xa3,0xf0,0xa3,0xf0,0xc2,0x0, 0x90,0xa, +0xe4,0xf0,0xa3,0xf0,0x22,0x74,0xff,0xf5,0xf0,0x12,0x3, 0x3c,0x90,0x0, 0x2, 0x74, +0xff,0xf5,0xf0,0x12,0x3, 0x5b,0x90,0x0, 0x4, 0x74,0xff,0x2, 0x1, 0xd7,0xd1,0xe5, +0xab,0x36,0xe5,0x38,0x22,0xe4,0x12,0x1, 0xc5,0x4, 0x29,0xf9,0xe4,0x3a,0xfa,0x5, +0x3a,0xe5,0x3a,0x22,0xab,0x24,0xaa,0x25,0xa9,0x26,0xf1,0x5b,0xe4,0x90,0xa, 0xe7, +0xf0,0xa3,0xf0,0x90,0xa, 0xe1,0x74,0xd, 0xf0,0xa3,0x74,0xac,0xf0,0x22,0xe5,0x2d, +0x25,0xe0,0xff,0xe5,0x2c,0x33,0xfe,0xe5,0x31,0x2f,0xf5,0x82,0xe5,0x30,0x3e,0xf5, +0x83,0xe0,0xfc,0xa3,0xe0,0xfd,0xc3,0xe4,0x95,0x36,0xfb,0xe4,0x94,0x0, 0xfa,0xc3, +0xed,0x9b,0xea,0x64,0x80,0xf8,0xec,0x64,0x80,0x98,0x22,0x90,0xc, 0x72,0x74,0x30, +0xf0,0xa3,0x74,0x1, 0xf0,0x90,0x7, 0xa4,0xe4,0x12,0x1, 0xd7,0xae,0x2, 0xaf,0x1, +0x8e,0x37,0x8f,0x38,0xe9,0x24,0x60,0xf9,0xea,0x34,0x7, 0x8b,0x39,0xf5,0x3a,0x89, +0x3b,0xe4,0xf5,0x35,0xf5,0x36,0xf5,0x33,0xe4,0xf5,0x34,0xe5,0x36,0x25,0xe0,0xff, +0xe5,0x35,0x33,0xfe,0xe5,0x38,0x2f,0xf5,0x82,0xe5,0x37,0xf1,0xd9,0xe5,0x36,0xae, +0x35,0x78,0x3, 0xce,0xc3,0x13,0xce,0x13,0xd8,0xf9,0xab,0x39,0x25,0x3b,0xf9,0xe5, +0x3a,0x3e,0xfa,0x12,0x1, 0x4c,0xff,0x7c,0x0, 0xe5,0x36,0xb1,0x41,0x93,0x4f,0x12, +0x1, 0xc5,0x5, 0x36,0xe5,0x36,0x70,0x2, 0x5, 0x35,0x5, 0x34,0xe5,0x34,0xb4,0x10, +0xba,0x5, 0x33,0xe5,0x33,0xb4,0x1c,0xb0,0x22,0x3e,0xf5,0x83,0xe4,0xf0,0xa3,0xf0, +0x22,0x8b,0x33,0x8a,0x34,0x89,0x35,0x22,0xed,0x25,0xe0,0xff,0xec,0x33,0xfe,0x22, +0xe4,0x90,0xc, 0xbf,0xf0,0x90,0xc, 0x92,0xf0,0x22,0x8d,0x65,0xef,0xc3,0x94,0xa, +0x50,0xa, 0x74,0xb5,0x2f,0xf5,0x82,0xe4,0x34,0xc, 0x80,0x2c,0xef,0x24,0xf6,0xf5, +0x66,0xc3,0x94,0xe9,0x50,0x27,0xe5,0x66,0xc3,0x94,0x10,0x40,0x17,0xe5,0x66,0xd3, +0x94,0x1d,0x50,0x10,0x7d,0x77,0xaf,0x65,0x12,0x6, 0xa8,0x11,0x3e,0x34,0xa, 0xf5, +0x83,0xef,0xf0,0x22,0x11,0x3e,0x34,0xa, 0xf5,0x83,0xe5,0x65,0xf0,0x22,0x74,0xee, +0x25,0x66,0xf5,0x82,0xe4,0x22,0x7b,0x1, 0x7a,0xc, 0x79,0x39,0xef,0x12,0x1, 0xc5, +0x53,0x7, 0x70,0xef,0xc4,0x54,0xf, 0xff,0xbf,0x4, 0xd, 0x90,0xc, 0x78,0xe0,0x7d, +0x3, 0xb4,0x3, 0x2, 0x80,0xb, 0x80,0xd, 0x90,0xc, 0x78,0xe0,0x7d,0x1, 0xb4,0x3, +0x4, 0x7f,0x1, 0x80,0x85,0x7f,0x27,0xef,0xd3,0x94,0x3f,0x50,0x27,0xef,0x64,0x26, +0x60,0x22,0xef,0x64,0x28,0x60,0x1d,0xef,0x64,0x23,0x60,0x18,0xef,0x64,0x2f,0x60, +0x13,0x74,0x51,0x2f,0xf5,0x82,0xe4,0x34,0xc, 0xf5,0x83,0xed,0xf0,0x90,0xc, 0x91, +0xe0,0x44,0x1, 0xf0,0x22,0x8f,0x63,0x8d,0x64,0xe5,0x63,0x24,0xb3,0x60,0x6d,0x24, +0x4d,0xb4,0x8, 0x0, 0x50,0x75,0x90,0x40,0xbd,0xf8,0x28,0x28,0x73,0x2, 0x40,0xd5, +0x2, 0x40,0xd9,0x2, 0x40,0xf0,0x2, 0x41,0x3, 0x2, 0x41,0x8, 0x2, 0x41,0xd, 0x2, +0x41,0x12,0x2, 0x41,0x17,0xaf,0x64,0x1, 0x46,0x90,0xc, 0x37,0xe5,0x64,0xf0,0xe0, +0x75,0xf0,0x20,0xa4,0xae,0xf0,0x25,0x13,0xf5,0x9, 0xee,0x35,0x12,0xf5,0x8, 0x22, +0xe5,0x64,0xb4,0x4, 0x2, 0x80,0x2d,0xe5,0x64,0x64,0x5, 0x60,0x2, 0x21,0xb6,0xfd, +0xff,0x80,0x25,0x90,0xa, 0xee,0x21,0xb3,0x90,0xa, 0xef,0x21,0xb3,0x90,0xa, 0xf0, +0x21,0xb3,0x90,0xa, 0xf1,0x21,0xb3,0x90,0xa, 0xf2,0x21,0xb3,0xe5,0x64,0x64,0x4, +0x60,0x2, 0x21,0xb6,0x7d,0x4, 0x7f,0x1, 0x2, 0x3f,0xfa,0xe5,0x63,0xc3,0x94,0x50, +0x40,0x17,0xe5,0x63,0xd3,0x94,0x77,0x50,0x10,0x7d,0x77,0xaf,0x64,0x12,0x6, 0xa8, +0x74,0xae,0x25,0x63,0x91,0xbe,0xef,0xf0,0x22,0xe5,0x63,0xc3,0x94,0x78,0x40,0x14, +0xe5,0x63,0xd3,0x94,0x9f,0x50,0xd, 0x74,0xa2,0x25,0x63,0xf5,0x82,0xe4,0x34,0xa, +0xf5,0x83,0x80,0x4f,0xe5,0x63,0xc3,0x94,0xa0,0x40,0x14,0xe5,0x63,0xd3,0x94,0xbe, +0x50,0xd, 0x74,0x96,0x25,0x63,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0x80,0x34,0xe5, +0x63,0xc3,0x94,0xbf,0x40,0x14,0xe5,0x63,0xd3,0x94,0xd2,0x50,0xd, 0x74,0x87,0x25, +0x63,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0x80,0x19,0xe5,0x63,0xc3,0x94,0xd3,0x40, +0x15,0xe5,0x63,0xd3,0x94,0xe1,0x50,0xe, 0x74,0x81,0x25,0x63,0xf5,0x82,0xe4,0x34, +0xa, 0xf5,0x83,0xe5,0x64,0xf0,0x22,0x30,0x95,0x4b,0x90,0xc, 0x36,0xe0,0x4, 0xf0, +0xe0,0xff,0xb4,0x1, 0x8, 0x90,0xc, 0x50,0xe5,0x95,0xf0,0x80,0x2a,0x90,0xc, 0x39, +0xe0,0xfe,0xc4,0x54,0x7, 0x70,0xe, 0x90,0xc, 0x50,0xe0,0x2f,0x24,0xfe,0xff,0xad, +0x95,0x91,0x90,0x80,0x12,0x71,0x29,0xff,0xbf,0x4, 0xc, 0x90,0xc, 0x36,0x71,0x34, +0x24,0xfe,0xff,0xad,0x95,0x11,0xa5,0x71,0x29,0xfa,0x70,0x4, 0x91,0x68,0x80,0x5, +0xba,0x4, 0x2, 0x71,0x3c,0x30,0x94,0x15,0x90,0xc, 0x34,0xe0,0x4, 0x71,0x28,0xfa, +0x70,0x4, 0x71,0x31,0x81,0x6c,0xba,0x4, 0x4, 0x71,0x31,0x71,0x40,0x22,0x91,0xc6, +0x15,0x17,0x15,0x17,0xe5,0x17,0x24,0x3, 0xf8,0xe6,0xfe,0x14,0x60,0x16,0x14,0x60, +0x1a,0x24,0xfa,0x50,0x1a,0x24,0xbb,0x60,0x3c,0x24,0x4d,0x70,0x42,0x90,0xc, 0x39, +0xe0,0xff,0x61,0x18,0x90,0xc, 0x37,0xe0,0xff,0x61,0x18,0x7f,0xff,0x61,0x18,0xa8, +0x17,0x76,0x1, 0x8, 0x76,0xa, 0x8, 0x76,0xee,0xee,0x7e,0x0, 0x24,0xfd,0xf5,0x82, +0xee,0x34,0xff,0xf5,0x83,0xa8,0x17,0x86,0x3, 0x8, 0xe6,0xfa,0x8, 0xe6,0xf9,0x12, +0x1, 0x65,0xff,0x61,0x18,0x90,0xc, 0x3a,0xe0,0xc4,0x54,0xf0,0xff,0x61,0x18,0x71, +0x1f,0x94,0x10,0x40,0x1b,0xef,0x94,0x22,0x50,0x16,0xe5,0x9, 0x2f,0xf5,0x82,0xe4, +0x35,0x8, 0xf5,0x83,0xe5,0x82,0x24,0xf0,0xf5,0x82,0xe5,0x83,0x34,0xff,0x80,0x70, +0x71,0x1f,0x94,0x50,0x40,0x14,0xef,0xd3,0x94,0x77,0x50,0xe, 0x74,0xae,0x2f,0x91, +0xbe,0xe0,0xff,0x7d,0x77,0x12,0x0, 0x26,0x80,0x5e,0x71,0x1f,0x94,0x78,0x40,0x10, +0xef,0xd3,0x94,0x9f,0x50,0xa, 0x74,0xa2,0x2f,0xf5,0x82,0xe4,0x34,0xa, 0x80,0x40, +0x71,0x1f,0x94,0xa0,0x40,0x10,0xef,0xd3,0x94,0xbe,0x50,0xa, 0x74,0x96,0x2f,0xf5, +0x82,0xe4,0x34,0xa, 0x80,0x2a,0x71,0x1f,0x94,0xbf,0x40,0x10,0xef,0xd3,0x94,0xd2, +0x50,0xa, 0x74,0x87,0x2f,0xf5,0x82,0xe4,0x34,0xa, 0x80,0x14,0x71,0x1f,0x94,0xd3, +0x40,0x14,0xef,0xd3,0x94,0xe1,0x50,0xe, 0x74,0x81,0x2f,0xf5,0x82,0xe4,0x34,0xa, +0xf5,0x83,0xe0,0xff,0x80,0x2, 0x7f,0xff,0xe5,0x17,0x24,0x4, 0xf5,0x17,0x22,0xe5, +0x17,0x24,0x3, 0xf8,0xe6,0xff,0xc3,0x22,0xf0,0x90,0xc, 0x39,0xe0,0xc4,0x54,0x7, +0x22,0x90,0xc, 0x34,0xe0,0xff,0x90,0xc, 0x50,0xe0,0x2f,0x22,0x90,0xc, 0x50,0xe0, +0xff,0x51,0x1e,0x8f,0x95,0x22,0xe4,0x90,0xc, 0x38,0xf0,0x90,0xc, 0x34,0x71,0x28, +0x70,0x4, 0x91,0x68,0x80,0x8, 0x71,0x29,0xff,0xbf,0x4, 0x2, 0x71,0x3c,0xe4,0x90, +0xc, 0x36,0xf0,0x90,0xc, 0x35,0xf0,0x90,0xb, 0xf6,0x74,0xaa,0xf0,0xa3,0xf0,0x90, +0xc, 0x10,0xf0,0xa3,0xf0,0x22,0x91,0xc6,0xa8,0x17,0x8, 0xe6,0xff,0xc3,0x94,0x80, +0x40,0x10,0xef,0xd3,0x94,0xc3,0x50,0xa, 0x74,0xd1,0x2f,0xf5,0x82,0xe4,0x34,0xb, +0x81,0x45,0xa8,0x17,0x8, 0xe6,0xff,0xc3,0x94,0x3, 0x50,0x2, 0x81,0x21,0xef,0xd3, +0x94,0x3e,0x50,0x7d,0xa8,0x17,0x8, 0xe6,0xfb,0x24,0xfd,0xff,0xe4,0x34,0xff,0xfe, +0x7c,0x0, 0x7d,0x6, 0x12,0x2, 0xb, 0xa8,0x17,0xef,0xf6,0x75,0xf0,0x6, 0xa4,0xff, +0xc3,0xeb,0x9f,0x24,0xfd,0x24,0xfc,0x50,0x7, 0x60,0x28,0x14,0x60,0x3c,0x80,0x51, +0x91,0x72,0xa8,0x17,0xe6,0x25,0xe0,0xff,0xe4,0x33,0xfe,0x8, 0xe6,0x24,0x2, 0xfd, +0xe4,0x33,0xcd,0xc3,0x9f,0xff,0xed,0x9e,0xfe,0xe5,0xb, 0x2f,0xf5,0x82,0xe5,0xa, +0x3e,0x80,0x52,0x7f,0x0, 0x20,0x1, 0x2, 0x7f,0x1, 0xef,0x75,0xf0,0xa, 0xa4,0x24, +0x3c,0xf5,0x82,0xe4,0x34,0xc, 0x91,0x83,0x80,0x3b,0x7f,0x0, 0x20,0x1, 0x2, 0x7f, +0x1, 0xef,0x75,0xf0,0xa, 0xa4,0x24,0xd8,0xf5,0x82,0xe4,0x34,0xb, 0x91,0x83,0x80, +0x24,0xa8,0x17,0x8, 0xe6,0x14,0x60,0x12,0x14,0x60,0x20,0x24,0x6, 0x60,0x2b,0x24, +0xfc,0x70,0x2e,0x90,0xc, 0x39,0xe0,0xff,0x80,0x29,0x91,0x72,0xe5,0xb, 0x24,0x4, +0xf5,0x82,0xe4,0x35,0xa, 0xf5,0x83,0xe0,0xff,0x80,0x18,0x91,0x72,0x85,0xb, 0x82, +0x85,0xa, 0x83,0xa3,0xa3,0xa3,0xe0,0xff,0x80,0x9, 0x90,0xc, 0x78,0xe0,0xff,0x80, +0x2, 0x7f,0x0, 0x5, 0x17,0x5, 0x17,0x22,0x90,0xc, 0x50,0xe0,0xff,0x71,0x76,0x8f, +0x95,0x22,0x30,0x1, 0x7, 0x75,0xa, 0xb, 0x75,0xb, 0xf6,0x22,0x75,0xa, 0xc, 0x75, +0xb, 0x10,0x22,0xf5,0x83,0xa8,0x17,0xe6,0x25,0x82,0xf5,0x82,0xe4,0x35,0x83,0x22, +0x8f,0x63,0x8d,0x64,0xe5,0x63,0xc3,0x94,0x80,0x40,0xe, 0xe5,0x63,0xd3,0x94,0xc3, +0x50,0x7, 0xe5,0x63,0x24,0x80,0xff,0x80,0x12,0xe5,0x63,0x24,0x4, 0x60,0x8, 0x24, +0xfc,0x70,0xa, 0xaf,0x64,0x1, 0x46,0xad,0x64,0x7f,0x27,0x11,0x77,0x22,0xf5,0x82, +0xe4,0x34,0xa, 0xf5,0x83,0x22,0x15,0x17,0xa8,0x17,0xa6,0x7, 0x15,0x17,0x22,0xe4, +0x90,0xc, 0x39,0xf0,0x91,0xd8,0x61,0x46,0x75,0x90,0x4, 0x75,0x93,0xe0,0xd2,0xac, +0x53,0xe8,0x3f,0x43,0xe8,0xc0,0xd2,0xec,0xd2,0xb9,0xc2,0xc1,0x43,0xb9,0x10,0x53, +0xa9,0xef,0x22,0x12,0x3f,0x1c,0xf1,0x2b,0xf1,0x40,0x7f,0x1, 0x12,0x59,0xa2,0x91, +0xcf,0xb1,0x75,0x90,0xc, 0x78,0x74,0x1, 0xf0,0x90,0xc, 0x78,0xe0,0x24,0xfd,0x60, +0x14,0x14,0x60,0x16,0x24,0xaf,0x60,0x2e,0x24,0xab,0x60,0x13,0x24,0xa9,0x70,0xe9, +0x12,0x21,0x6c,0x80,0xe4,0x12,0x24,0xf1,0x80,0xdf,0x12,0x27,0xf, 0x80,0xda,0xb1, +0x6d,0x90,0xa, 0xeb,0xe0,0x64,0xaa,0x60,0xd0,0xe4,0x90,0xa, 0xe3,0xf0,0x90,0xa, +0xeb,0x74,0xaa,0xf0,0x80,0xc3,0xb1,0x6d,0x90,0xa, 0xeb,0xe0,0xb4,0xaa,0xba,0x74, +0x55,0xf0,0x90,0xc, 0xe3,0xf1,0x51,0x90,0xc, 0xe3,0x74,0xff,0xf5,0xf0,0x12,0x2, +0x76,0x45,0xf0,0x70,0xf2,0x12,0x58,0x3c,0x75,0xe9,0xff,0x80,0x9c,0xe4,0x90,0xa, +0xe7,0xf0,0xa3,0xf0,0x22,0x75,0x3e,0x0, 0x75,0x3f,0x0, 0x75,0x40,0x2e,0x75,0x41, +0xd, 0x75,0x42,0x77,0x7b,0xff,0x7a,0x6, 0x79,0xea,0x12,0x8, 0x0, 0xe4,0xff,0xfe, +0xf1,0x3, 0x8f,0x29,0x90,0xc, 0x71,0xe0,0x70,0x3, 0x75,0x29,0xff,0xe5,0x29,0xf4, +0x60,0x56,0x7f,0xf0,0x7e,0x3, 0xf1,0x3, 0x8f,0x2a,0x7f,0xf1,0x7e,0x3, 0xf1,0x3, +0x8f,0x2b,0xe5,0x2a,0xb4,0xff,0x8, 0xe5,0x2b,0xb4,0xff,0x3, 0x75,0x29,0xff,0xe5, +0x2a,0x45,0x2b,0xf4,0x60,0x3, 0x75,0x29,0xff,0xe4,0xf5,0x2b,0xf5,0x2c,0xf5,0x2d, +0xe5,0x2d,0x24,0x4, 0xff,0xe4,0x35,0x2c,0xfe,0xf1,0x3, 0xef,0x62,0x2b,0x5, 0x2d, +0xe5,0x2d,0x70,0x2, 0x5, 0x2c,0xc3,0x94,0xe9,0xe5,0x2c,0x94,0x0, 0x40,0xe1,0xe5, +0x2a,0x65,0x2b,0x60,0x3, 0x75,0x29,0xff,0xe5,0x29,0xf4,0x60,0x2, 0xc1,0xc4,0x90, +0xa, 0xee,0x74,0xd, 0xf0,0xa3,0x74,0x9, 0xf0,0xa3,0x74,0x3, 0xf0,0xe4,0xa3,0xf0, +0xa3,0x74,0x34,0xf0,0x90,0xa, 0xfc,0x12,0x6c,0xaf,0xf1,0x4e,0xe4,0xf5,0x29,0x90, +0xa, 0xee,0xe0,0xff,0xe5,0x29,0xc3,0x9f,0x40,0xb, 0x74,0xfe,0x25,0x29,0xf1,0x23, +0x74,0xff,0xf0,0x80,0xf, 0x74,0x2e,0x25,0x29,0xf8,0xe6,0xff,0x74,0xfe,0x25,0x29, +0xf1,0x23,0xef,0xf0,0xe5,0x29,0x90,0x7, 0x0, 0x93,0xff,0x74,0x1a,0x25,0x29,0x12, +0x4b,0xc7,0xef,0xf0,0x5, 0x29,0xe5,0x29,0xb4,0x1c,0xc4,0xe4,0xf5,0x29,0xe5,0x29, +0x90,0x7, 0x2c,0x93,0xff,0x74,0x46,0x25,0x29,0xf1,0x5d,0xef,0xf0,0x5, 0x29,0xe5, +0x29,0xb4,0xe, 0xea,0xe4,0xf5,0x29,0xe5,0x29,0x90,0x7, 0x1c,0x93,0xff,0x74,0x36, +0x25,0x29,0x12,0x6c,0xa7,0xef,0xf0,0x5, 0x29,0xe5,0x29,0xb4,0x10,0xe9,0xe4,0xf5, +0x29,0xe5,0x29,0x90,0x7, 0x3a,0x93,0xff,0x74,0x54,0x25,0x29,0x12,0xf, 0xcc,0xef, +0xf0,0x5, 0x29,0xe5,0x29,0xb4,0x8, 0xe9,0xe4,0xf5,0x2c,0xf5,0x2d,0x74,0x62,0x25, +0x2d,0x12,0x55,0xa7,0xf0,0x5, 0x2d,0xe5,0x2d,0x70,0x2, 0x5, 0x2c,0x64,0x75,0x45, +0x2c,0x70,0xea,0x22,0x7f,0x4, 0x8f,0x3b,0x75,0x3c,0xa, 0x75,0x3d,0xee,0xe4,0xf5, +0x3e,0xf5,0x3f,0x7e,0x0, 0xe5,0x3f,0x25,0x3b,0xff,0xee,0x35,0x3e,0xfe,0xf1,0x3, +0x5, 0x3d,0xe5,0x3d,0xac,0x3c,0x70,0x2, 0x5, 0x3c,0x14,0xf5,0x82,0x8c,0x83,0xef, +0xf0,0x5, 0x3f,0xe5,0x3f,0x70,0x2, 0x5, 0x3e,0xc3,0x94,0xe9,0xe5,0x3e,0x94,0x0, +0x40,0xd1,0x22,0xf1,0xda,0xf1,0x65,0x8c,0xf9,0x8d,0xfa,0x43,0xfc,0x3, 0x75,0xf8, +0xe0,0xaf,0xfb,0x43,0xfc,0x3, 0xf5,0xf8,0xd2,0xaf,0x22,0xef,0x12,0x1, 0xc5,0x74, +0xfe,0x25,0x2c,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0x22,0x2, 0x0, 0x49,0x90,0xc, +0xb6,0x74,0x3, 0xf0,0xe4,0x90,0xc, 0xbd,0xf0,0x90,0xc, 0xb5,0x74,0xff,0xf0,0x22, +0x12,0x57,0x3b,0xc2,0x8e,0x43,0xa2,0x10,0x12,0x57,0x19,0xd2,0xab,0x22,0x90,0xb, +0x60,0x74,0x3, 0xf0,0xa3,0x74,0xe8,0xf0,0x22,0xc3,0x13,0x24,0x46,0xf5,0x82,0xe4, +0x34,0xb, 0xf5,0x83,0x22,0xad,0x7, 0xac,0x6, 0xc2,0xaf,0x43,0xfc,0x3, 0xe4,0xf5, +0xf8,0x22,0xab,0x7, 0xaa,0x6, 0xf1,0x69,0x8a,0xf9,0x8b,0xfa,0x8d,0xfb,0x43,0xfc, +0x3, 0x75,0xf8,0x82,0x7f,0xa, 0xf1,0xad,0xd2,0xf8,0x7f,0x4, 0xf1,0xad,0xd2,0xfe, +0x7f,0x26,0xf1,0xad,0xc2,0xfe,0xc2,0xf9,0x7f,0xc, 0xf1,0xad,0xc2,0xf8,0x7f,0x1, +0xf1,0xad,0xf1,0x6b,0xd2,0xaf,0x22,0x7f,0xfa,0xf1,0xad,0x7f,0xfa,0xae,0x7, 0x1f, +0xee,0x60,0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x80,0xeb,0x22,0xad,0x7, 0xaf,0x5, 0x1d,0xef,0x60,0xa, 0xf1,0xa7,0x7f,0xfa,0xf1, +0xad,0xf1,0xa7,0x80,0xf0,0x22,0xf1,0xda,0x80,0x98,0xe4,0x2f,0xff,0xee,0x34,0x7c, +0xfe,0x22,0x12,0x4b,0xde,0x75,0x44,0xff,0xe4,0xf5,0x45,0x75,0x46,0xff,0xf5,0x47, +0xf5,0x54,0x75,0x55,0x0, 0x75,0x56,0x48,0x12,0x4b,0xcf,0x12,0xf, 0xc1,0x71,0xb8, +0x74,0x1, 0x12,0x1, 0xd7,0x90,0x0, 0x54,0x74,0x8, 0x12,0x1, 0xd7,0x90,0xa, 0xee, +0xe0,0x12,0x1, 0xc5,0x90,0xa, 0xef,0xe0,0x12,0xf, 0xc1,0x90,0x0, 0x1, 0x12,0x1, +0xd7,0x12,0x17,0xc4,0xff,0x12,0x1, 0x4c,0x8f,0xf0,0x90,0x0, 0x2, 0x91,0x5, 0xe4, +0xf5,0x2c,0x12,0xf, 0xc1,0xd1,0x42,0x50,0x2d,0x71,0xc3,0xe0,0xff,0xe9,0x24,0x31, +0xf9,0xe4,0x3a,0xfa,0xe5,0x2c,0xfd,0x12,0x26,0xef,0x12,0x47,0x1b,0xe0,0xff,0xab, +0x29,0xe5,0x2b,0x24,0x4, 0xf9,0xe4,0x35,0x2a,0x71,0xe5,0x12,0x47,0x1b,0xe0,0xff, +0x74,0x2e,0x31,0x5f,0x80,0xcc,0xe4,0xf5,0x2c,0x12,0xf, 0xc1,0x12,0x17,0xc4,0xff, +0xe5,0x2c,0xc3,0x9f,0x50,0x17,0x31,0x67,0xe9,0x24,0x20,0xf9,0xe4,0x3a,0x12,0x26, +0xec,0xef,0x12,0x1, 0xc5,0x31,0x67,0x74,0x3b,0x31,0x5f,0x80,0xdc,0xe4,0xf5,0x2c, +0x90,0xa, 0xef,0xe0,0xff,0xe5,0x2c,0xc3,0x9f,0x50,0x3e,0xe4,0xf5,0x2d,0x90,0xa, +0xef,0xe0,0xff,0xe5,0x2d,0xc3,0x9f,0x50,0x15,0x74,0x3b,0x25,0x2d,0xf8,0xe6,0xff, +0xc3,0x95,0x46,0x50,0x5, 0x8f,0x46,0x85,0x2d,0x47,0x5, 0x2d,0x80,0xe0,0x74,0x3b, +0x25,0x47,0xf8,0x76,0xff,0x75,0x46,0xff,0xab,0x29,0xe5,0x2b,0x24,0x72,0x31,0x6f, +0xe5,0x47,0x12,0x1, 0xc5,0x5, 0x2c,0x80,0xb7,0xe4,0xf5,0x2c,0x90,0xa, 0xee,0xe0, +0xff,0xe5,0x2c,0xc3,0x9f,0x50,0x3e,0xe4,0xf5,0x2d,0x90,0xa, 0xee,0xe0,0xff,0xe5, +0x2d,0xc3,0x9f,0x50,0x15,0x74,0x2e,0x25,0x2d,0xf8,0xe6,0xff,0xc3,0x95,0x44,0x50, +0x5, 0x8f,0x44,0x85,0x2d,0x45,0x5, 0x2d,0x80,0xe0,0x74,0x2e,0x25,0x45,0xf8,0x76, +0xff,0x75,0x44,0xff,0xab,0x29,0xe5,0x2b,0x24,0x56,0x31,0x6f,0xe5,0x45,0x12,0x1, +0xc5,0x5, 0x2c,0x80,0xb7,0x90,0xa, 0xf1,0xe0,0x12,0xf, 0xc1,0x90,0x0, 0x30,0x12, +0x1, 0xd7,0x90,0x0, 0x31,0x12,0x1, 0x65,0x90,0x0, 0x51,0x71,0xfd,0x90,0x0, 0x4d, +0x71,0xf5,0xff,0x90,0x0, 0x4e,0x12,0x1, 0xd7,0x90,0x0, 0x4f,0xef,0x12,0x1, 0xd7, +0x90,0x0, 0x50,0xef,0x12,0x1, 0xd7,0x90,0x0, 0x82,0x74,0x1, 0x2, 0x1, 0xd7,0x25, +0x2c,0xf8,0xa6,0x7, 0x5, 0x2c,0x22,0x74,0x48,0x25,0x2c,0xf8,0xe6,0xff,0x22,0xf9, +0xe4,0x35,0x2a,0xfa,0x7e,0x0, 0xe9,0x25,0x2c,0xf9,0xee,0x3a,0xfa,0x22,0x71,0xde, +0x78,0x2d,0x7c,0x0, 0x7d,0x0, 0x7b,0xff,0x7a,0x7, 0x79,0x42,0x7e,0x0, 0x7f,0x1c, +0x12,0x1, 0x26,0xe4,0xf5,0x2c,0x12,0x47,0x1f,0xe0,0xff,0xc3,0x94,0x1c,0x50,0x4b, +0x71,0xc3,0xe0,0x12,0xf, 0xc1,0x8f,0x82,0x75,0x83,0x0, 0x12,0x1, 0xd7,0xe5,0x2c, +0x20,0xe0,0xf, 0x12,0x47,0x59,0xe0,0x54,0xf, 0xff,0xe9,0x24,0x1c,0xf9,0xe4,0x3a, +0x80,0xf, 0xe5,0x2c,0x12,0x47,0x59,0xe0,0xc4,0x54,0xf, 0x71,0xed,0xf9,0xe4,0x35, +0x2a,0xfa,0x12,0x47,0x1f,0xe0,0x12,0x26,0xef,0xef,0x12,0x1, 0xc5,0x12,0x47,0x1f, +0xe0,0x24,0x2d,0xf8,0xe6,0x12,0x26,0xe1,0xef,0x80,0x9, 0xab,0x29,0xe5,0x2b,0x24, +0x54,0x31,0x6f,0xe4,0x12,0x1, 0xc5,0xab,0x29,0xe5,0x2b,0x24,0x38,0x31,0x6f,0x74, +0x14,0x12,0x1, 0xc5,0x5, 0x2c,0xe5,0x2c,0x64,0x1c,0x70,0x8a,0x12,0xf, 0xc1,0x90, +0x0, 0x70,0xe4,0x12,0x1, 0xd7,0x90,0x0, 0x71,0x74,0x7, 0x12,0x1, 0xd7,0x90,0x0, +0x72,0x74,0x17,0x12,0x1, 0xd7,0x90,0x0, 0x73,0x74,0x2, 0x12,0x1, 0xd7,0x90,0x0, +0x74,0x74,0x7f,0x12,0x1, 0xd7,0xe4,0xfd,0x51,0x71,0x12,0xf, 0xc1,0x7d,0x1, 0x51, +0x71,0x12,0xf, 0xc1,0x90,0x0, 0x7b,0x74,0xf, 0x12,0x1, 0xd7,0x90,0x0, 0x7c,0x74, +0x21,0x12,0x1, 0xd7,0x90,0x0, 0x7d,0x74,0x8, 0x12,0x1, 0xd7,0x90,0x0, 0x7e,0x74, +0x8, 0x12,0x1, 0xd7,0x90,0x0, 0x7f,0x74,0x8, 0x12,0x2f,0x80,0x74,0x5d,0x2, 0x1, +0xd7,0x8b,0x49,0x8a,0x4a,0x89,0x4b,0x8d,0x4c,0x90,0xa, 0x44,0x12,0x4, 0xfe,0x0, +0x0, 0x0, 0x0, 0x90,0xa, 0x48,0x12,0x4, 0xfe,0x0, 0x0, 0x0, 0x1, 0x75,0x54,0x1, +0x75,0x55,0xa, 0x75,0x56,0x50,0x71,0xcf,0x90,0xa, 0xee,0xe0,0xf5,0x4e,0xa3,0xe0, +0xf5,0x4d,0xe5,0x4c,0x70,0x39,0xf5,0x4f,0xe5,0x4f,0xc3,0x95,0x4e,0x50,0x24,0x71, +0x42,0xc0,0x0, 0xc0,0x1, 0xa3,0x71,0x69,0xff,0x74,0xfe,0x25,0x4f,0x12,0x47,0x23, +0xe0,0xf9,0xf8,0x12,0x4, 0xdf,0xd0,0x1, 0xd0,0x0, 0x71,0x85,0x12,0x4, 0xf2,0x5, +0x4f,0x80,0xd5,0xe4,0xf5,0x4f,0x71,0x51,0x71,0x95,0xb4,0x4, 0xf9,0x80,0x3c,0xe4, +0xf5,0x4f,0xe5,0x4f,0xc3,0x95,0x4d,0x50,0x28,0x71,0x42,0xc0,0x0, 0xc0,0x1, 0xa3, +0x71,0x69,0xff,0x74,0x50,0x25,0x4f,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0xe0,0xf9, +0xf8,0x12,0x4, 0xdf,0xd0,0x1, 0xd0,0x0, 0x71,0x85,0x12,0x4, 0xf2,0x5, 0x4f,0x80, +0xd1,0xe4,0xf5,0x4f,0x71,0x51,0x71,0x95,0xb4,0x2, 0xf9,0xe5,0x4c,0x70,0x11,0xf5, +0x4f,0x71,0xa6,0x24,0x75,0x71,0x74,0x12,0x26,0xef,0x71,0x7c,0xb4,0x4, 0xf2,0x22, +0xe4,0xf5,0x4f,0x71,0xa6,0x24,0x79,0x71,0x74,0x12,0x26,0xef,0x71,0x7c,0xb4,0x2, +0xf2,0x22,0x90,0xa, 0x44,0xe0,0xf8,0xa3,0xe0,0xf9,0xa3,0xe0,0xfa,0xa3,0xe0,0xfb, +0x22,0x90,0xa, 0x44,0xa3,0xa3,0xa3,0xe0,0xff,0x74,0x4c,0x25,0x4f,0xf5,0x82,0xe4, +0x34,0xa, 0xf5,0x83,0xef,0xf0,0x90,0xa, 0x44,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0, +0xfe,0xa3,0xe0,0x22,0xf9,0xe4,0x35,0x4a,0xfa,0xe5,0x4f,0x22,0xef,0x12,0x1, 0xc5, +0x5, 0x4f,0xe5,0x4f,0x22,0xeb,0x4f,0xff,0xea,0x4e,0xfe,0xe9,0x4d,0xfd,0xe8,0x4c, +0xfc,0x90,0xa, 0x44,0x22,0xff,0x78,0x8, 0x12,0x4, 0xcc,0x90,0xa, 0x44,0x12,0x4, +0xf2,0x5, 0x4f,0xe5,0x4f,0x22,0x74,0x4c,0x25,0x4f,0xf5,0x82,0xe4,0x34,0xa, 0xf5, +0x83,0xe0,0xff,0xab,0x49,0xe5,0x4b,0x22,0x90,0x0, 0x52,0xe4,0x12,0x1, 0xd7,0x90, +0x0, 0x53,0x22,0x74,0x1a,0x25,0x2c,0xf5,0x82,0xe4,0x34,0xb, 0xf5,0x83,0x22,0x75, +0x57,0x9, 0x75,0x58,0x77,0x7b,0xff,0x7a,0x6, 0x79,0xf7,0x2, 0xa, 0x57,0x8b,0x29, +0x8a,0x2a,0x89,0x2b,0x22,0xfa,0xe9,0x2d,0xf9,0xec,0x3a,0xfa,0x22,0xff,0xab,0x29, +0xe5,0x2b,0x24,0x1c,0x22,0x12,0x1, 0xd7,0x90,0xa, 0xf2,0xe0,0x22,0x12,0x1, 0xd7, +0x90,0xb, 0x46,0xe0,0x22,0xa4,0xff,0xe5,0xf0,0x8f,0xf0,0x2, 0x3, 0x5b,0x12,0x1f, +0xf4,0x75,0x2a,0xc, 0x75,0x2b,0x51,0x90,0xc, 0x91,0xe0,0x20,0xe0,0x2, 0xa1,0xfd, +0x54,0xfe,0xf0,0xd1,0x3a,0x85,0x2b,0x82,0x85,0x2a,0x83,0xe0,0x6f,0x60,0x15,0xe0, +0xff,0x90,0x0, 0x2, 0x12,0x1, 0xd7,0xef,0x75,0xf0,0x4, 0xa4,0xff,0xe5,0xf0,0x8f, +0xf0,0x12,0x3, 0x3c,0x12,0x17,0x30,0x12,0x37,0x9c,0xff,0x12,0x37,0x8e,0xe0,0xfd, +0x7c,0x0, 0x6f,0x70,0x2, 0xe5,0xf0,0x60,0x5, 0x90,0x0, 0x3, 0xd1,0x20,0x12,0x15, +0x30,0x90,0x0, 0x3, 0x12,0x37,0xd5,0x24,0x5, 0x12,0x37,0x68,0xe0,0xfe,0x6f,0x60, +0x17,0x90,0x0, 0x3, 0xee,0x12,0x1, 0xd7,0xe5,0x2b,0x24,0x5, 0x12,0x37,0x68,0xe0, +0x75,0xf0,0x20,0x90,0x0, 0x1, 0x91,0x5, 0x12,0x15,0x30,0x12,0x1, 0x4c,0xff,0xe5, +0x2b,0x24,0x10,0x12,0x37,0x68,0xe0,0xfe,0x6f,0x60,0x4, 0xee,0x12,0x1, 0xc5,0x12, +0x15,0x30,0xd1,0x32,0xe5,0x2b,0x24,0x2e,0x12,0x37,0x68,0xe0,0xfd,0x7c,0x0, 0x6f, +0x70,0x2, 0xe5,0xf0,0x60,0x5, 0x90,0x0, 0x4, 0xd1,0x20,0x12,0x15,0xa3,0x12,0x1, +0x4c,0xff,0xe5,0x2b,0x24,0x25,0x12,0x37,0x68,0xe0,0xfe,0x6f,0x60,0x4, 0xee,0x12, +0x1, 0xc5,0x12,0x15,0xa3,0x12,0x17,0xc4,0xff,0xe5,0x2b,0x24,0x6, 0x12,0x37,0x68, +0xe0,0xfe,0x6f,0x60,0x7, 0x90,0x0, 0x1, 0xee,0x12,0x1, 0xd7,0x90,0x0, 0x4, 0x12, +0x37,0xd5,0x24,0x8, 0x12,0x37,0x68,0xe0,0xfe,0x6f,0x60,0x2b,0xee,0xd1,0x26,0xe5, +0x2b,0x24,0x8, 0x12,0x37,0x68,0xe0,0xc3,0x94,0xf, 0x40,0x9, 0xe5,0x2b,0x24,0x8, +0x12,0x37,0x68,0xe4,0xf0,0xe5,0x2b,0x24,0x8, 0x12,0x37,0x68,0xe0,0x90,0x7, 0x73, +0x93,0x90,0x0, 0x3, 0x12,0x1, 0xd7,0x12,0x15,0xa3,0x90,0x0, 0x6, 0x12,0x37,0xd5, +0x24,0x9, 0x12,0x37,0x68,0xe0,0xfe,0x6f,0x60,0x15,0x90,0x0, 0x6, 0xee,0x12,0x1, +0xd7,0xe5,0x2b,0x24,0x9, 0x12,0x37,0x68,0xe0,0x90,0x0, 0x5, 0x12,0x1, 0xd7,0x12, +0x15,0xa3,0x90,0x0, 0x8, 0x12,0x1, 0x65,0xff,0x12,0x37,0x64,0xe0,0xfe,0x6f,0x60, +0x7, 0x90,0x0, 0x8, 0xee,0x12,0x1, 0xd7,0x90,0x0, 0x9, 0x12,0x37,0xd5,0x24,0x29, +0x12,0x37,0x68,0xe0,0xfe,0x6f,0x60,0x7, 0x90,0x0, 0x9, 0xee,0x12,0x1, 0xd7,0x90, +0x0, 0xa, 0x12,0x37,0xd5,0x24,0x24,0x12,0x37,0x68,0xe0,0xfe,0x6f,0x60,0x7, 0x90, +0x0, 0xa, 0xee,0x12,0x1, 0xd7,0xe5,0x2b,0x24,0x32,0x12,0x37,0x68,0xe0,0xff,0xd3, +0x94,0x32,0x50,0x6, 0x12,0x15,0x30,0xef,0xd1,0x2c,0xe5,0x2b,0x24,0x33,0x12,0x37, +0x68,0xe0,0xff,0xd3,0x94,0xa, 0x50,0xa, 0x12,0x15,0x30,0x90,0x0, 0x7, 0xef,0x12, +0x1, 0xd7,0x12,0x17,0x30,0x90,0x0, 0xb, 0x12,0x2, 0xb7,0xff,0xe5,0x2b,0x24,0x34, +0x12,0x37,0x68,0xe0,0xfd,0x7c,0x0, 0x6f,0x70,0x2, 0xe5,0xf0,0x60,0x5, 0x90,0x0, +0xb, 0xd1,0x20,0x12,0x17,0x30,0x90,0x0, 0xd, 0x12,0x37,0xd5,0x24,0x35,0x12,0x37, +0x68,0xe0,0xfe,0x6f,0x60,0x7, 0x90,0x0, 0xd, 0xee,0x12,0x1, 0xd7,0x22,0xff,0xe5, +0xf0,0xc4,0xf8,0x54,0xf0,0xc8,0x68,0xfc,0xef,0xc4,0x54,0xf, 0x48,0xfd,0xe5,0x2e, +0x75,0xf0,0x7, 0xa4,0xff,0xae,0xf0,0xab,0x21,0x25,0x23,0xf9,0xe5,0x22,0x3e,0xfa, +0xec,0x8d,0xf0,0x2, 0x3, 0x5b,0x90,0x0, 0x4, 0x2, 0x1, 0xd7,0x90,0x0, 0x6, 0x2, +0x1, 0xd7,0x90,0x0, 0x4, 0x12,0x2, 0xb7,0xff,0x22,0x90,0x0, 0x2, 0x12,0x1, 0x65, +0xff,0x22,0x12,0x1, 0x4c,0xff,0xe5,0x2c,0xc3,0x9f,0x22,0x12,0x3f,0xe1,0xe4,0xff, +0xab,0x33,0xe5,0x35,0x24,0x28,0xf9,0xe4,0x35,0x34,0xfa,0xef,0xfd,0x12,0x26,0xef, +0x74,0x3, 0x12,0x1, 0xc5,0xab,0x33,0xe5,0x35,0x24,0x23,0xf9,0xe4,0x35,0x34,0x71, +0xe5,0x74,0x3, 0x12,0x1, 0xc5,0x90,0x0, 0x2d,0x12,0x17,0x9f,0x90,0x0, 0x37,0x12, +0x17,0x9f,0xf, 0xbf,0x5, 0xca,0x12,0x28,0x75,0x90,0x0, 0x41,0xe4,0x12,0x1, 0xd7, +0x90,0x0, 0x42,0xe4,0x2, 0x1, 0xd7,0xd1,0xb6,0xe4,0xf0,0xef,0x24,0x9f,0xd1,0xb9, +0xe4,0xf0,0xef,0x24,0x9e,0xd1,0xb9,0xe4,0xf0,0xd1,0xb6,0x74,0x1, 0xf0,0xef,0x24, +0xa4,0xd1,0xb9,0xe4,0xf0,0x22,0xef,0x24,0x9d,0xf5,0x82,0xee,0x34,0x7, 0xf5,0x83, +0x22,0x12,0x1f,0xf4,0xe4,0x12,0x1, 0xc5,0x12,0x17,0x30,0x90,0x0, 0x15,0x12,0x1, +0xd7,0x12,0x30,0x30,0x54,0xfe,0x12,0x1, 0xc5,0x54,0xfd,0x2, 0x1, 0xc5,0x12,0x1f, +0xf4,0xe4,0xf5,0x2b,0xf5,0x2c,0x12,0x15,0xa3,0x12,0x32,0x17,0x60,0x8, 0x90,0x0, +0x2e,0x12,0x1, 0x65,0x60,0x3, 0x7f,0x0, 0x22,0x12,0x1, 0x4c,0xc3,0x13,0xf5,0x28, +0x12,0x17,0xc4,0xc3,0x13,0xf5,0x29,0xe4,0xf5,0x2a,0xf5,0x27,0x12,0x16,0xff,0x12, +0x0, 0x6, 0xd3,0x12,0x6b,0x23,0x40,0x2, 0x5, 0x2a,0x12,0x6b,0x81,0x40,0xed,0xe5, +0x2a,0xd3,0x94,0x5, 0x40,0x3, 0x12,0x69,0x0, 0xe4,0xf5,0x2a,0xe5,0x28,0xd3,0x94, +0x0, 0x40,0x32,0xe4,0xf5,0x27,0x12,0x16,0xff,0x12,0x0, 0x6, 0xc0,0x6, 0xc0,0x7, +0xe5,0x28,0x75,0xf0,0x20,0xa4,0x24,0x60,0x12,0x17,0x28,0x12,0x17,0x10,0x12,0x0, +0x6, 0xd0,0x5, 0xd0,0x4, 0xd3,0xed,0x9f,0xee,0x12,0x3f,0x53,0x40,0x2, 0x5, 0x2a, +0x12,0x6b,0x81,0x40,0xd1,0xe5,0x2a,0xd3,0x94,0x5, 0x40,0x3, 0x12,0x69,0x0, 0xe4, +0xf5,0x2a,0xe5,0x28,0xc3,0x94,0xc, 0x50,0x32,0xe4,0xf5,0x27,0x12,0x16,0xff,0x12, +0x0, 0x6, 0xc0,0x6, 0xc0,0x7, 0xe5,0x28,0x75,0xf0,0x20,0xa4,0x24,0xa0,0x12,0x17, +0x28,0x12,0x17,0x10,0x12,0x0, 0x6, 0xd0,0x5, 0xd0,0x4, 0xd3,0xed,0x9f,0xee,0x12, +0x3f,0x53,0x40,0x2, 0x5, 0x2a,0x12,0x6b,0x81,0x40,0xd1,0xe5,0x2a,0xd3,0x94,0x5, +0x40,0x3, 0x12,0x69,0x0, 0xe5,0x29,0xd3,0x94,0x0, 0x40,0x21,0xe5,0x28,0x75,0xf0, +0x20,0x12,0x1c,0x4d,0xe5,0x29,0x75,0xf0,0x2, 0xa4,0x24,0x7e,0xff,0xe5,0xf0,0x34, +0x3, 0xfe,0x12,0x3e,0x56,0x12,0x50,0x1e,0x50,0x3, 0x12,0x50,0x12,0xe5,0x29,0x24, +0x1, 0xff,0xe4,0x33,0xfe,0xc3,0xef,0x94,0xd, 0xee,0x64,0x80,0x94,0x80,0x50,0x1f, +0xe5,0x28,0x75,0xf0,0x20,0x12,0x1c,0x4d,0xe5,0x29,0x75,0xf0,0x2, 0xa4,0x24,0x82, +0xff,0xe5,0xf0,0x34,0x3, 0xfe,0x12,0x3e,0x56,0x11,0x1e,0x50,0x2, 0x11,0x12,0xaf, +0x2c,0x22,0x74,0xa, 0x25,0x2c,0xf5,0x2c,0xe4,0x35,0x2b,0xf5,0x2b,0x22,0x12,0x2, +0x8c,0xc3,0x94,0xce,0xe5,0xf0,0x64,0x80,0x94,0x7f,0x22,0x12,0x1f,0xf4,0x12,0x17, +0xd1,0x90,0x0, 0x2f,0x12,0x1, 0x65,0x30,0xe0,0x33,0x12,0x17,0x30,0x90,0x0, 0x4d, +0x12,0x2, 0xb7,0xc3,0x94,0x3c,0xe5,0xf0,0x94,0x0, 0x50,0xc, 0x90,0x0, 0x4d,0xe4, +0x75,0xf0,0x1, 0x12,0x2, 0xef,0x80,0x15,0x12,0x3f,0x14,0x11,0xaa,0x12,0x15,0x30, +0x12,0x27,0xc4,0x90,0xa, 0xec,0x74,0x5, 0xf0,0xa3,0x74,0xdc,0xf0,0x12,0x17,0xd1, +0x90,0x0, 0x2f,0x12,0x1, 0x65,0x20,0xe0,0x30,0x12,0x17,0x30,0x90,0x0, 0x4d,0xe4, +0xf5,0xf0,0x12,0x3, 0x5b,0x12,0x32,0x11,0xff,0x70,0x8, 0x90,0xa, 0xec,0xf0,0xa3, +0xf0,0xc2,0x0, 0x30,0x0, 0x13,0xc2,0x0, 0xef,0xd3,0x94,0x0, 0x40,0xb, 0x12,0x3f, +0x14,0x11,0xaa,0x12,0x15,0x30,0x12,0x27,0xc4,0x22,0x85,0x24,0x36,0x85,0x25,0x37, +0x85,0x26,0x38,0x22,0x12,0x1f,0xf4,0x90,0xc, 0x51,0x74,0x14,0xf0,0xa3,0x74,0x3c, +0xf0,0x90,0xc, 0x56,0x74,0xa0,0xf0,0xa3,0x74,0x1, 0xf0,0xa3,0x74,0xc8,0xf0,0xa3, +0x74,0x7, 0xf0,0xa3,0x74,0x28,0xf0,0x90,0xc, 0x61,0x74,0x2, 0xf0,0x90,0xc, 0x71, +0x74,0xff,0xf0,0x90,0xc, 0x74,0x74,0x55,0xf0,0xa3,0x74,0x1, 0xf0,0xe4,0xa3,0xf0, +0xa3,0x74,0x17,0xf0,0xa3,0x74,0x1, 0xf0,0xa3,0x74,0x61,0xf0,0xe4,0xa3,0xf0,0xa3, +0xf0,0x90,0xc, 0x80,0x4, 0xf0,0x90,0xc, 0x7f,0x74,0xc8,0xf0,0x90,0xc, 0x83,0x74, +0x5, 0xf0,0xa3,0x74,0x2, 0xf0,0xa3,0x74,0x3c,0xf0,0xa3,0x74,0x1e,0xf0,0x12,0x15, +0xa3,0xe4,0x12,0x1, 0xc5,0x12,0x15,0xa3,0x90,0x0, 0x1, 0x4, 0x12,0x1, 0xd7,0x90, +0x0, 0x9, 0xe4,0x12,0x1, 0xd7,0x90,0x0, 0x3, 0x74,0xd, 0x12,0x1, 0xd7,0x74,0x7, +0x12,0x17,0xf4,0x90,0x0, 0x5, 0x74,0x28,0x12,0x1, 0xd7,0x74,0x28,0x12,0x4e,0x2c, +0x90,0x0, 0x8, 0x74,0xc8,0x12,0x1, 0xd7,0x90,0x0, 0xa, 0x74,0x1, 0x12,0x1, 0xd7, +0x51,0x38,0x12,0x17,0x30,0xe4,0x75,0xf0,0x50,0x12,0x3, 0x3c,0x12,0x17,0x30,0x90, +0x0, 0x2, 0x74,0x14,0x12,0x1, 0xd7,0x90,0x0, 0x3, 0x51,0x31,0x90,0x0, 0x22,0x74, +0x10,0x12,0x1, 0xd7,0x90,0x0, 0x15,0x74,0x3, 0x12,0x1, 0xd7,0x90,0x0, 0x16,0x74, +0x3, 0x12,0x1, 0xd7,0x90,0x0, 0x1a,0xe4,0x12,0x1, 0xd7,0x90,0x0, 0x1b,0x74,0xc, +0x12,0x1, 0xd7,0x90,0x0, 0x17,0xe4,0x12,0x1, 0xd7,0x90,0x0, 0x1c,0xe4,0x75,0xf0, +0xfa,0x12,0x3, 0x5b,0x90,0x0, 0x1e,0x51,0x3f,0x74,0x5, 0x12,0x1, 0xd7,0x90,0x0, +0x20,0x74,0x23,0x12,0x1, 0xd7,0x90,0x0, 0x9, 0x12,0x17,0xac,0x51,0x48,0x74,0x3, +0x12,0x1, 0xd7,0x90,0x0, 0x11,0xe4,0x12,0x1, 0xd7,0x90,0x0, 0x12,0x74,0x4, 0x12, +0x1, 0xd7,0x90,0x0, 0x13,0xe4,0x75,0xf0,0x64,0x12,0x3, 0x5b,0x90,0x0, 0xb, 0x51, +0x31,0x90,0x0, 0xd, 0x74,0x1e,0x12,0x1, 0xd7,0x12,0x15,0x30,0x74,0x2, 0x12,0x1, +0xc5,0x12,0x15,0x30,0x90,0x0, 0x1, 0x74,0xa, 0x75,0xf0,0x0, 0x12,0x3, 0x5b,0x90, +0x0, 0x3, 0x74,0xa0,0x12,0x1, 0xd7,0x90,0x0, 0x4, 0xe4,0x75,0xf0,0xc8,0x12,0x3, +0x5b,0x90,0x0, 0x6, 0x74,0x5, 0x12,0x1, 0xd7,0x90,0x0, 0x7, 0x74,0x2, 0x2, 0x1, +0xd7,0xe4,0x75,0xf0,0x3c,0x2, 0x3, 0x5b,0x90,0x0, 0x7, 0xe4,0x2, 0x1, 0xd7,0x74, +0xa, 0x12,0x1, 0xd7,0x90,0x0, 0x1f,0x22,0x90,0x0, 0xf, 0xe4,0x12,0x1, 0xd7,0x90, +0x0, 0x10,0x22,0x12,0x1f,0xf4,0xe4,0xf5,0x40,0xf5,0x41,0x74,0x62,0x25,0x41,0xb1, +0xa7,0xf0,0x5, 0x41,0xe5,0x41,0x70,0x2, 0x5, 0x40,0x64,0x75,0x45,0x40,0x70,0xeb, +0x12,0x25,0xce,0x12,0x27,0x3, 0x85,0x24,0x47,0x85,0x25,0x48,0x85,0x26,0x49,0x12, +0x17,0x30,0x71,0xeb,0x60,0xf0,0xb1,0x9f,0x34,0x3, 0xaf,0x1, 0xf5,0x12,0x8f,0x13, +0xe4,0xf5,0x2a,0xf5,0x2b,0xe4,0xf5,0x3f,0xe5,0x2b,0x45,0x2a,0x70,0x6, 0x71,0xcc, +0xe4,0xf6,0x8, 0xf6,0xe5,0x2b,0xae,0x2a,0x78,0x5, 0xc3,0x33,0xce,0x33,0xce,0xd8, +0xf9,0x71,0xd4,0x71,0xcc,0xe6,0xfc,0x8, 0xe6,0xfd,0xd3,0xef,0x9d,0xee,0x9c,0x40, +0xf, 0xef,0x94,0x1c,0xee,0x94,0x25,0x50,0x7, 0x71,0xcc,0xa6,0x6, 0x8, 0xa6,0x7, +0x5, 0x3f,0xe5,0x3f,0xb4,0x9, 0xc1,0x5, 0x2b,0xe5,0x2b,0x70,0x2, 0x5, 0x2a,0x64, +0xd, 0x45,0x2a,0x70,0xb0,0xe4,0xf5,0x42,0xf5,0x43,0xf5,0x2a,0xf5,0x2b,0xe4,0xf5, +0x3f,0xe5,0x2b,0xae,0x2a,0x78,0x5, 0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0x71,0xd4, +0xd3,0x94,0x1c,0xee,0x94,0x25,0x40,0xa, 0x5, 0x43,0xe5,0x43,0x70,0x2, 0x5, 0x42, +0x80,0x45,0x71,0xcc,0xe6,0xfc,0x8, 0xe6,0xc3,0x9f,0xf5,0x41,0xec,0x9e,0xf5,0x40, +0xe5,0x41,0xae,0x40,0x78,0x3, 0xce,0xc3,0x13,0xce,0x13,0xd8,0xf9,0xf5,0x41,0x8e, +0x40,0xd3,0x94,0xff,0xe5,0x40,0x94,0x0, 0x40,0x6, 0x75,0x40,0x0, 0x75,0x41,0xff, +0x5, 0x43,0xe5,0x43,0xac,0x42,0x70,0x2, 0x5, 0x42,0x14,0x24,0x62,0xf5,0x82,0x74, +0xb, 0x3c,0xf5,0x83,0xe5,0x41,0xf0,0x5, 0x3f,0xe5,0x3f,0x64,0x9, 0x70,0x92,0x5, +0x2b,0xe5,0x2b,0x70,0x2, 0x5, 0x2a,0x64,0xd, 0x45,0x2a,0x70,0x81,0x75,0x28,0xa, +0x75,0x29,0xee,0xe4,0xf5,0x2c,0xf5,0x2a,0xf5,0x2b,0x85,0x29,0x82,0x85,0x28,0x83, +0xe0,0x62,0x2c,0x7e,0x0, 0xe5,0x2b,0x25,0x27,0xff,0xee,0x35,0x2a,0xfe,0x5, 0x29, +0xe5,0x29,0xac,0x28,0x70,0x2, 0x5, 0x28,0x14,0xf5,0x82,0x8c,0x83,0xe0,0xfd,0x12, +0x47,0xd6,0x5, 0x2b,0xe5,0x2b,0x70,0x2, 0x5, 0x2a,0xc3,0x94,0xe9,0xe5,0x2a,0x94, +0x0, 0x40,0xc7,0xad,0x2c,0x7f,0xf0,0x7e,0x3, 0x12,0x47,0xd6,0xc3,0x74,0xff,0x95, +0x2c,0xfd,0x7f,0xf1,0x7e,0x3, 0x12,0x47,0xd6,0x7f,0x1, 0x22,0xe5,0x3f,0x25,0xe0, +0x24,0x2d,0xf8,0x22,0x25,0x13,0xf5,0x82,0xe5,0x12,0x3e,0xf5,0x83,0x75,0xf0,0x2, +0xe5,0x3f,0x12,0x5, 0x40,0xe0,0xfe,0xa3,0xe0,0xff,0x22,0x71,0xf1,0xef,0x64,0xaa, +0x22,0x8b,0x44,0x8a,0x45,0x89,0x46,0x75,0x4d,0x20,0x90,0x0, 0x55,0x12,0x1, 0x65, +0xf5,0x55,0x12,0x17,0xc4,0xf5,0x5c,0x12,0x1, 0x4c,0xf5,0x5d,0x85,0x5c,0x5e,0xe5, +0x5c,0x25,0xe0,0xf5,0x5f,0x90,0x0, 0x53,0x12,0x1, 0x65,0xf5,0x60,0xb1,0xb0,0xef, +0x70,0x3, 0x7f,0xaa,0x22,0xab,0x47,0xaa,0x48,0xa9,0x49,0x90,0x7, 0x9a,0x12,0x5, +0x6c,0xaf,0x1, 0x8a,0x61,0x8f,0x62,0xaf,0x5d,0x7e,0x0, 0xab,0x44,0xe5,0x46,0x24, +0x56,0xf9,0xe4,0x78,0x67,0x7c,0x0, 0xb1,0x83,0xaf,0x5c,0x7e,0x0, 0xab,0x44,0xe5, +0x46,0x24,0x72,0xf9,0xe4,0x78,0x83,0x7c,0x0, 0xb1,0x83,0xe5,0x55,0x54,0x3, 0xf5, +0x54,0x70,0x2, 0xa1,0x7d,0xb1,0x93,0xff,0xb4,0x1, 0x8, 0x75,0x4a,0x10,0x75,0x4b, +0x60,0x80,0x9, 0xef,0x70,0x6, 0x75,0x4a,0x10,0x75,0x4b,0x48,0x85,0x4a,0x4e,0x85, +0x4b,0x4f,0xe5,0x49,0x24,0x80,0xf9,0xe5,0x48,0x34,0x3, 0xaf,0x1, 0xf5,0x50,0x8f, +0x51,0x85,0x48,0x52,0x85,0x49,0x53,0xe4,0xf5,0x4c,0xe5,0x4c,0xc3,0x95,0x5d,0x40, +0x2, 0xa1,0x7d,0x85,0x4d,0xf0,0xb1,0x8b,0xff,0xae,0xf0,0x25,0x51,0xfd,0xe5,0x50, +0x3e,0xf5,0x56,0x8d,0x57,0xe5,0x53,0x2f,0xff,0xe5,0x52,0x3e,0xf5,0x58,0x8f,0x59, +0xe4,0xfd,0xed,0xc3,0x95,0x5c,0x40,0x2, 0xa1,0x5b,0x85,0x4b,0x82,0x85,0x4a,0x83, +0xe0,0xf5,0x5a,0xa3,0xe0,0xf5,0x5b,0x85,0x5c,0xf0,0xb1,0x8b,0x25,0x62,0xf5,0x82, +0xe5,0x61,0x35,0xf0,0xf5,0x83,0x74,0x83,0x2d,0xf8,0xe6,0xf9,0x25,0x82,0x12,0x37, +0x5c,0xe0,0x75,0xf0,0x8, 0xa4,0xae,0xf0,0x25,0x5b,0xf5,0x5b,0xee,0x35,0x5a,0xf5, +0x5a,0xe5,0x60,0x60,0x34,0x85,0x59,0x82,0x85,0x58,0x83,0x74,0x83,0x2d,0xf8,0xe6, +0xff,0x75,0xf0,0x2, 0x12,0x5, 0x40,0xe0,0xfa,0xa3,0xe0,0xfb,0xc3,0xe5,0x5b,0x9b, +0xfb,0xe5,0x5a,0x9a,0xfa,0x85,0x56,0x83,0x85,0x57,0x82,0x75,0xf0,0x2, 0xef,0x12, +0x5, 0x40,0xea,0xf0,0xa3,0xeb,0xf0,0x80,0x14,0x85,0x57,0x82,0x85,0x56,0x83,0x75, +0xf0,0x2, 0xe9,0x12,0x5, 0x40,0xe5,0x5a,0xf0,0xa3,0xe5,0x5b,0xf0,0x74,0x2, 0x25, +0x4b,0xf5,0x4b,0xe4,0x35,0x4a,0xf5,0x4a,0xd, 0x81,0xc2,0xb1,0x93,0xff,0xb4,0x1, +0x4, 0x74,0x20,0x80,0x5, 0xef,0x70,0xb, 0x74,0x48,0x25,0x4f,0xf5,0x4f,0xe4,0x35, +0x4e,0xf5,0x4e,0x85,0x4e,0x4a,0x85,0x4f,0x4b,0x5, 0x4c,0x81,0x9a,0x12,0x27,0x3, +0x7f,0x0, 0x22,0x35,0x45,0xfa,0x7d,0x0, 0x2, 0x1, 0x26,0x74,0x67,0x25,0x4c,0xf8, +0xe6,0xa4,0x22,0xab,0x44,0xaa,0x45,0xa9,0x46,0x90,0x0, 0x82,0x2, 0x1, 0x65,0xe5, +0x26,0x24,0x80,0xf9,0xe5,0x25,0x22,0xf5,0x82,0xe4,0x34,0xb, 0xf5,0x83,0xe4,0x22, +0xe5,0xdb,0x20,0xe1,0x3, 0x7f,0x0, 0x22,0x53,0xdb,0xfd,0x7f,0x1, 0x22,0xc0,0xe0, +0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x0, 0xc0,0x0, 0xc0,0x1, 0xc0, +0x2, 0xc0,0x3, 0xc0,0x4, 0xc0,0x5, 0xc0,0x6, 0xc0,0x7, 0xe5,0xc9,0x54,0x3, 0xff, +0xbf,0x1, 0x6, 0x53,0xc9,0xfc,0x43,0xc9,0x2, 0x12,0x41,0xb7,0x30,0x95,0x2, 0xc2, +0x95,0x30,0x94,0x2, 0xc2,0x94,0x90,0xc, 0x35,0x74,0x1, 0xf0,0xd0,0x7, 0xd0,0x6, +0xd0,0x5, 0xd0,0x4, 0xd0,0x3, 0xd0,0x2, 0xd0,0x1, 0xd0,0x0, 0xd0,0xd0,0xd0,0x82, +0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32,0xc0,0xe0,0xc0,0x83,0xc0,0x82,0xc2,0x93,0x90, +0xc, 0x34,0xe4,0xf0,0x90,0xc, 0x36,0xf0,0xd0,0x82,0xd0,0x83,0xd0,0xe0,0x32,0xc0, +0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x0, 0xc0,0x0, 0xc0,0x1, +0xc0,0x2, 0xc0,0x3, 0xc0,0x4, 0xc0,0x5, 0xc0,0x6, 0xc0,0x7, 0xf1,0x17,0x90,0xb, +0xd7,0xe0,0x60,0x2, 0x14,0xf0,0x90,0xa, 0xe8,0xe0,0x4, 0xf0,0x70,0x6, 0x90,0xa, +0xe7,0xe0,0x4, 0xf0,0x90,0xa, 0xe1,0xe0,0xfe,0xa3,0xe0,0xff,0xc3,0x90,0xa, 0xe8, +0xe0,0x9f,0x90,0xa, 0xe7,0xe0,0x9e,0x50,0x3, 0x12,0x0, 0x4e,0x90,0xa, 0xec,0xe0, +0xfe,0xa3,0xe0,0xff,0x4e,0x60,0x16,0xef,0x64,0x1, 0x4e,0x70,0x2, 0xd2,0x0, 0x90, +0xa, 0xed,0xe0,0x24,0xff,0xf0,0x90,0xa, 0xec,0xe0,0x34,0xff,0xf0,0xf1,0x22,0x40, +0xe, 0x90,0xa, 0xe5,0xe0,0x4, 0xf0,0x70,0x6, 0x90,0xa, 0xe4,0xe0,0x4, 0xf0,0x90, +0xc, 0x78,0xe0,0xb4,0xaa,0x13,0x90,0xa, 0xe3,0xe0,0xff,0x4, 0xf0,0xef,0xd3,0x94, +0x64,0x40,0x6, 0x90,0xc, 0x78,0x74,0x1, 0xf0,0xe5,0x10,0xc3,0x95,0x11,0x50,0x12, +0x5, 0x10,0xe5,0xc9,0x54,0x3, 0xff,0xbf,0x1, 0xb, 0x74,0x3, 0x25,0x10,0xf5,0x10, +0x80,0x3, 0x75,0xf, 0x1, 0x90,0xc, 0x35,0xe0,0xff,0x60,0x10,0xc3,0x94,0x28,0x50, +0x5, 0xe0,0x4, 0xf0,0x80,0x6, 0x12,0x43,0x46,0x12,0x3f,0xf0,0xd0,0x7, 0xd0,0x6, +0xd0,0x5, 0xd0,0x4, 0xd0,0x3, 0xd0,0x2, 0xd0,0x1, 0xd0,0x0, 0xd0,0xd0,0xd0,0x82, +0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32,0xc2,0x8e,0x75,0xa6,0xf0,0x75,0xa5,0x5f,0xd2, +0x8e,0x22,0x90,0xa, 0xe4,0xe0,0xfe,0xa3,0xe0,0xff,0xe4,0xfc,0xfd,0x7b,0x40,0x7a, +0x9c,0xf9,0xf8,0xd3,0x2, 0x4, 0xa5,0x53,0xdb,0xbf,0x22,0xf1,0x37,0x7f,0x1, 0xf1, +0x5a,0xf1,0x6d,0xf1,0x89,0xf1,0x52,0x7f,0x1, 0xef,0x70,0x3, 0xc2,0xaf,0x22,0xd2, +0xaf,0x22,0x75,0x92,0xe8,0xd2,0xae,0xd2,0xbe,0x22,0x53,0xc9,0xf8,0xef,0x70,0x5, +0x43,0xc9,0x3, 0x80,0x3, 0x43,0xc9,0x2, 0xc2,0xce,0xc2,0xca,0x22,0xaf,0xe6,0x75, +0x99,0x1, 0xd2,0x98,0xbf,0xff,0x2, 0x7f,0x6a,0xef,0x64,0x6a,0x60,0x3, 0xbf,0x6b, +0x4, 0x53,0xea,0x7f,0x22,0x43,0xea,0x80,0x22,0xe4,0xff,0xa2,0xaf,0x33,0xfe,0xc2, +0x88,0xd2,0xa8,0xc2,0xaf,0x30,0x89,0x6, 0xc2,0x89,0xe4,0xff,0x80,0x1, 0xf, 0xef, +0xd3,0x94,0xfa,0x40,0xf0,0xee,0x24,0xff,0x92,0xaf,0x75,0xf7,0xff,0x22,0xc0,0xe0, +0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x0, 0xc0,0x0, 0xc0,0x1, 0xc0, +0x2, 0xc0,0x3, 0xc0,0x4, 0xc0,0x5, 0xc0,0x6, 0xc0,0x7, 0x12,0x17,0x1f,0x90,0xc, +0x39,0xe0,0x54,0xfd,0xf0,0xd0,0x7, 0xd0,0x6, 0xd0,0x5, 0xd0,0x4, 0xd0,0x3, 0xd0, +0x2, 0xd0,0x1, 0xd0,0x0, 0xd0,0xd0,0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32, +0xef,0x70,0x3, 0x43,0x87,0x1, 0xbf,0x1, 0x3, 0x43,0x87,0x2, 0xbf,0x2, 0x3, 0x43, +0x87,0x2, 0x22,0xef,0x70,0x3, 0xd2,0x84,0x22,0xc2,0x84,0x22,0x12,0x47,0x65,0x8c, +0xf9,0x8d,0xfa,0x43,0xfc,0x3, 0x75,0xf8,0x88,0x7f,0x14,0x12,0x47,0xad,0x75,0xf8, +0x89,0x7f,0x2d,0x12,0x47,0xc3,0xc2,0xfb,0x7f,0x14,0x12,0x47,0xad,0xc2,0xf8,0x7f, +0xa, 0x12,0x47,0xad,0x12,0x47,0x6b,0xd2,0xaf,0x22,0x80,0xd0,0x7d,0x66,0x7f,0xf8, +0x7e,0x6f,0x12,0x47,0x72,0x7d,0xbb,0x7f,0xf9,0x7e,0x6f,0x2, 0x47,0x72,0x12,0x1f, +0xf4,0xe4,0xf5,0x29,0xe5,0x29,0xc3,0x94,0x5, 0x50,0x13,0xe5,0x26,0x24,0x30,0xf9, +0xe4,0x35,0x25,0xfa,0xe5,0x29,0x75,0xf0,0x8, 0x12,0x1f,0xba,0x80,0x14,0xe5,0x29, +0x75,0xf0,0x8, 0xa4,0x24,0x30,0xff,0xe4,0x35,0xf0,0xfe,0xe5,0x26,0x2f,0xf9,0xe5, +0x25,0x3e,0xaf,0x1, 0xf5,0x2a,0x8f,0x2b,0x12,0x37,0x64,0xe0,0x64,0x2, 0x60,0x2, +0x21,0x5e,0x12,0x37,0x64,0xe4,0x12,0x37,0x8d,0xa3,0xe0,0x24,0xfe,0xf5,0x27,0x12, +0x37,0x8e,0xa3,0x31,0x69,0xad,0x27,0x31,0x73,0x9f,0xee,0x12,0x3f,0x53,0x40,0x2, +0x21,0x5e,0x12,0x37,0x8e,0xe0,0x24,0xfe,0xf5,0x28,0x12,0x37,0x8e,0x31,0x69,0xad, +0x28,0x31,0x73,0x9f,0xee,0x12,0x3f,0x53,0x40,0x2, 0x21,0x5a,0xc3,0xe5,0x27,0x64, +0x80,0x94,0x80,0x50,0x2, 0x21,0x56,0xe5,0x27,0x64,0x80,0x94,0x9c,0x50,0x77,0xc3, +0xe5,0x28,0x64,0x80,0x94,0x80,0x40,0x6e,0xe5,0x28,0x64,0x80,0x94,0x90,0x50,0x66, +0xab,0x21,0x31,0x9a,0x31,0x7b,0x78,0x5, 0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0x29, +0xf9,0xea,0x3e,0xfa,0x12,0x3f,0xe8,0x12,0x3e,0x56,0x12,0x2, 0x8c,0xfd,0xaf,0x27, +0x31,0x87,0xfe,0xab,0x28,0xeb,0x33,0x95,0xe0,0xfa,0xef,0x2b,0xff,0xee,0x3a,0x12, +0x2b,0x84,0x33,0x12,0x17,0x30,0x8f,0x82,0xf5,0x83,0xe5,0xf0,0x8d,0xf0,0x12,0x2, +0xef,0xe9,0x24,0x80,0xf9,0xea,0x31,0x7b,0x78,0x5, 0xc3,0x33,0xce,0x33,0xce,0xd8, +0xf9,0x29,0xf9,0xea,0x3e,0xfa,0xaf,0x28,0x12,0x2b,0x80,0x33,0xfe,0x12,0x3e,0x56, +0xe4,0xf5,0xf0,0x12,0x3, 0x3c,0x5, 0x28,0x1, 0xba,0x5, 0x27,0x1, 0x9f,0x5, 0x29, +0xe5,0x29,0x64,0xa, 0x60,0x2, 0x1, 0x54,0x22,0xe0,0x24,0x2, 0xff,0xe4,0x33,0xfe, +0x22,0xad,0x3c,0xed,0x33,0x95,0xe0,0xfc,0xc3,0xed,0x22,0x34,0x3, 0xfa,0xaf,0x27, +0xef,0x33,0x95,0xe0,0xfe,0xef,0x22,0xef,0x33,0x95,0xe0,0xfe,0xef,0xc4,0xf8,0x54, +0xf, 0xc8,0x68,0xff,0xee,0xc4,0x54,0xf0,0x48,0x22,0xe5,0x23,0x24,0x80,0xf9,0xe5, +0x22,0x22,0xbf,0x1, 0x5, 0x43,0xdb,0x80,0x80,0x6, 0xef,0x70,0x3, 0x53,0xdb,0x7f, +0xc2,0xea,0x43,0xdb,0x10,0xd2,0xd9,0xc2,0xdd,0xc2,0xdc,0xc2,0xdb,0xc2,0xda,0xd2, +0xd8,0x75,0xab,0x6, 0xe4,0xf5,0x9a,0x53,0xdb,0xfd,0xd2,0xed,0xd2,0xba,0xc2,0xc2, +0x43,0xa9,0x4, 0x43,0xb9,0x4, 0x22,0xef,0x31,0xeb,0xed,0x2b,0xfb,0xe4,0x3a,0xfe, +0xaf,0x3, 0x22,0xac,0x7, 0xed,0x31,0xeb,0xec,0x80,0xf0,0x7b,0x0, 0x7a,0xc0,0x75, +0xf0,0x80,0xa4,0x2b,0xfb,0xe5,0xf0,0x3a,0xfa,0x22,0x53,0xc9,0x7, 0x43,0xc9,0x30, +0x75,0xeb,0x80,0xef,0x25,0xe0,0x4, 0x25,0xeb,0xf5,0xeb,0x22,0xc2,0xc2,0x53,0xdb, +0xbf,0x32,0xef,0x70,0x4, 0x53,0xdb,0xbf,0x22,0x43,0xdb,0x40,0x22,0xef,0x24,0xfe, +0x60,0xb, 0x14,0x60,0xc, 0x24,0x2, 0x70,0xc, 0x7d,0x9, 0x80,0xa, 0x7d,0x6, 0x80, +0x6, 0x7d,0x3, 0x80,0x2, 0xe4,0xfd,0xe5,0xdc,0x54,0xf0,0x2d,0xf5,0xdc,0x22,0x51, +0x5b,0x44,0x80,0xf5,0xa1,0xe5,0xdb,0x30,0xe3,0xfb,0x53,0xdb,0xf3,0xe4,0xf5,0xa1, +0xe5,0xdb,0x30,0xe3,0xfb,0xaf,0xa1,0x43,0xab,0x4, 0x22,0x53,0xab,0x3, 0x53,0xdb, +0xf3,0xef,0x22,0xfd,0x7b,0x2, 0xaf,0x3e,0x7e,0x0, 0x7c,0x0, 0x12,0x1f,0xc7,0xeb, +0xfd,0xd3,0xef,0x9d,0xee,0x9c,0x7f,0x0, 0x50,0x2, 0x7f,0x1, 0x22,0xe0,0xfd,0x51, +0x68,0xef,0x22,0xe0,0xfd,0xaf,0x42,0x80,0xdf,0xfd,0x7b,0x2, 0xaf,0x3d,0x51,0x68, +0xef,0x22,0xe0,0xfd,0x7b,0x2, 0xaf,0x41,0x51,0x68,0xef,0x22,0x12,0x1f,0xf4,0xe4, +0xf5,0x2d,0xf5,0x2e,0x12,0x6a,0xe1,0xf5,0x37,0xf5,0x38,0xf5,0x3d,0xf5,0x3e,0x12, +0x15,0x30,0x90,0x0, 0x13,0x12,0x2, 0xb7,0xf5,0x45,0x85,0xf0,0x44,0x90,0x0, 0x22, +0x12,0x1, 0x65,0xf5,0x48,0xaa,0x22,0xa9,0x23,0xae,0x2, 0xaf,0x1, 0x8e,0x49,0x8f, +0x4a,0x12,0x3e,0x40,0xf5,0x3f,0x8f,0x40,0xe5,0x23,0x24,0x60,0xf9,0xea,0x34,0x7, +0xaf,0x1, 0xf5,0x41,0x8f,0x42,0xe4,0xf5,0x2f,0x12,0x60,0xa9,0x12,0x52,0x48,0xe4, +0x12,0x1, 0xd7,0x5, 0x2f,0xe5,0x2f,0xb4,0x5, 0xef,0x12,0x32,0x11,0x70,0x3, 0x2, +0x60,0x95,0xe4,0xf5,0x2f,0x12,0x32,0x11,0xff,0xe5,0x2f,0xc3,0x9f,0x40,0x2, 0xe1, +0x80,0x12,0x12,0xb, 0x12,0x4, 0xfe,0x0, 0x0, 0x0, 0x0, 0x12,0x60,0xc0,0xe4,0x34, +0xa, 0xf5,0x83,0x12,0x4, 0xfe,0x0, 0x0, 0x0, 0x0, 0x12,0x60,0x99,0x12,0x4, 0xfe, +0x0, 0x0, 0x0, 0x0, 0x12,0x68,0xf2,0xf5,0x83,0x12,0x4, 0xfe,0x0, 0x0, 0x0, 0x0, +0x12,0x14,0xe5,0x90,0x0, 0x9, 0x12,0x2, 0xb7,0xfd,0xd3,0xef,0x9d,0xe5,0xf0,0x12, +0x69,0x1f,0x40,0x20,0x12,0x17,0xb4,0xc3,0x13,0xfd,0x12,0x14,0xfc,0x90,0x0, 0x9, +0x12,0x2, 0xb7,0xfd,0xc3,0xef,0x9d,0xff,0xee,0x95,0xf0,0x90,0xa, 0x95,0xf0,0xa3, +0xef,0xf0,0x80,0x7, 0xe4,0x90,0xa, 0x95,0xf0,0xa3,0xf0,0x90,0xa, 0x94,0x74,0x2, +0x12,0x17,0xd0,0xf5,0xf0,0xe5,0x2f,0x12,0x15,0x84,0x12,0x1, 0x65,0x12,0x6a,0xd2, +0x40,0xb, 0x12,0x15,0xa3,0x12,0x1, 0x4c,0x12,0x6a,0x36,0x50,0xc, 0x12,0x15,0x30, +0x12,0x60,0xba,0xc3,0x13,0x90,0xa, 0x94,0xf0,0x12,0x17,0xb4,0x12,0x6a,0xd2,0x40, +0xb, 0x12,0x15,0xa3,0x12,0x17,0xc4,0x12,0x6a,0x36,0x50,0xc, 0x12,0x15,0x30,0x12, +0x60,0xba,0xc3,0x13,0x90,0xa, 0x94,0xf0,0x12,0x17,0xb4,0xc3,0x13,0xfd,0x7c,0x0, +0xaa,0x2b,0xa9,0x2c,0x75,0xf0,0x2, 0xe5,0x2f,0x12,0x15,0x84,0x12,0x1, 0x65,0xc3, +0x13,0x75,0xf0,0x10,0xa4,0x2d,0xff,0xec,0x35,0xf0,0xfe,0xe4,0xf5,0x43,0x12,0x15, +0x1a,0x12,0x6a,0x90,0x40,0x3, 0x75,0x43,0x1, 0x12,0x17,0xd1,0x75,0xf0,0x2, 0xe5, +0x2f,0x12,0x15,0x84,0x12,0x6a,0xc8,0xe0,0xfe,0xc3,0xef,0x9e,0xf5,0x2d,0x12,0x17, +0xd1,0x75,0xf0,0x2, 0xe5,0x2f,0x12,0x15,0x84,0x12,0x6a,0xc8,0xe0,0x2f,0xff,0xe4, +0xad,0x2d,0x12,0x6b,0x51,0x12,0x3f,0x53,0x40,0x2, 0xe1,0x7c,0xe5,0x2f,0x12,0x37, +0xe4,0x12,0x17,0xc1,0x12,0x6a,0xcb,0xe0,0xfe,0xc3,0xef,0x9e,0xf5,0x2e,0x12,0x17, +0xb4,0x12,0x6a,0xcb,0xe0,0x2f,0xff,0xe4,0xad,0x2e,0x12,0x6b,0x51,0x12,0x3f,0x53, +0x40,0x2, 0xe1,0x78,0xc3,0xe5,0x2d,0x64,0x80,0x94,0x80,0x50,0x2, 0xe1,0x74,0x12, +0x15,0xa3,0x12,0x1, 0x4c,0xff,0xad,0x2d,0x31,0x73,0x9f,0x74,0x80,0xf8,0x6c,0x98, +0x40,0x2, 0xe1,0x74,0xc3,0xe5,0x2e,0x64,0x80,0x94,0x80,0x50,0x2, 0xe1,0x74,0x12, +0x17,0xc4,0xff,0xad,0x2e,0x31,0x73,0x9f,0x74,0x80,0xf8,0x6c,0x98,0x40,0x2, 0xe1, +0x74,0xaf,0x2d,0x31,0x87,0xfe,0xef,0x2d,0xf5,0x3c,0xee,0x3c,0xf5,0x3b,0x12,0x6a, +0x2c,0x12,0x6c,0x60,0x12,0x3d,0x5e,0xff,0xc3,0x95,0x48,0xf5,0x47,0xee,0x94,0x0, +0xf5,0x46,0xd3,0xe5,0x47,0x94,0x0, 0xe5,0x46,0x64,0x80,0x94,0x80,0x50,0x2, 0xe1, +0x74,0xef,0x95,0x45,0xee,0x95,0x44,0x40,0xb, 0x12,0x60,0xa9,0x90,0x0, 0x10,0x74, +0x1, 0x12,0x1, 0x92,0xe5,0x43,0x64,0x1, 0x70,0x54,0xe5,0x3c,0xae,0x3b,0x78,0x3, +0xce,0xc3,0x13,0xce,0x13,0xd8,0xf9,0x25,0x42,0xf5,0x82,0xe5,0x41,0x3e,0xf5,0x83, +0xc0,0x83,0xc0,0x82,0xe0,0xff,0x7c,0x0, 0xe5,0x3c,0x12,0x3d,0x41,0x93,0xf4,0xfe, +0xef,0x5e,0xd0,0x82,0xd0,0x83,0xf0,0xd3,0x90,0xa, 0x96,0xe0,0x94,0x0, 0x90,0xa, +0x95,0xe0,0x94,0x0, 0x40,0x18,0xe0,0xfc,0xa3,0xe0,0xfd,0x12,0x6a,0x2c,0xe5,0x4a, +0x2f,0xf5,0x82,0xe5,0x49,0x3e,0xf5,0x83,0xec,0x8d,0xf0,0x12,0x2, 0x60,0xe5,0x2d, +0x25,0xe0,0xf5,0x3d,0xe5,0x2e,0x25,0xe0,0xf5,0x3e,0x12,0x17,0xd1,0x75,0xf0,0x2, +0xe5,0x2f,0x12,0x15,0x84,0x12,0x1, 0x65,0x51,0x89,0x70,0x2, 0xa1,0xdb,0x12,0x17, +0xb4,0x51,0x63,0xef,0x70,0x2, 0xa1,0xdb,0x12,0x12,0xb, 0xc0,0x83,0xc0,0x82,0x12, +0x4b,0x45,0xc0,0x0, 0xc0,0x1, 0xc0,0x2, 0xc0,0x3, 0x12,0x68,0xae,0xd0,0x3, 0xd0, +0x2, 0xd0,0x1, 0xd0,0x0, 0x12,0x68,0xc8,0xfc,0xd0,0x82,0xd0,0x83,0x12,0x68,0xef, +0xf5,0x83,0xc0,0x83,0xc0,0x82,0x12,0x4b,0x45,0xae,0x46,0x12,0x69,0x96,0xeb,0x25, +0x47,0x12,0x68,0xca,0xfc,0xd0,0x82,0xd0,0x83,0x12,0x4, 0xf2,0x12,0x60,0xc0,0xe4, +0x34,0xa, 0xf5,0x83,0xc0,0x83,0xc0,0x82,0x12,0x4b,0x45,0xc0,0x0, 0xc0,0x1, 0xc0, +0x2, 0xc0,0x3, 0x12,0x6a,0xad,0x12,0x68,0xbe,0xd0,0x3, 0xd0,0x2, 0xd0,0x1, 0xd0, +0x0, 0x12,0x68,0xc8,0xfc,0xd0,0x82,0xd0,0x83,0x12,0x4, 0xf2,0xe5,0x2f,0x25,0xe0, +0x25,0xe0,0x24,0x6c,0xf5,0x82,0xe4,0x34,0xa, 0xe1,0x58,0xe4,0xf5,0x39,0xf5,0x3a, +0x12,0x32,0x11,0xff,0xc3,0xe5,0x3a,0x9f,0x74,0x80,0xf8,0x65,0x39,0x98,0x50,0x58, +0xe5,0x2f,0x65,0x3a,0x70,0x2, 0xe5,0x39,0x60,0x44,0x12,0x6c,0x50,0x33,0x12,0x6c, +0x68,0x51,0x89,0x60,0x10,0x12,0x6a,0x9b,0x3e,0x12,0x17,0xc3,0x51,0x63,0xef,0x60, +0x4, 0x74,0xff,0x80,0x23,0x12,0x6c,0x50,0x33,0x12,0x17,0xd1,0x12,0x6c,0x68,0xfd, +0x7b,0x4, 0x51,0x8c,0x60,0x18,0x12,0x6a,0x9b,0x3e,0x12,0x17,0xc3,0xfd,0x7b,0x4, +0xaf,0x3e,0x51,0x68,0xef,0x60,0x7, 0xe4,0xf5,0x39,0xf5,0x3a,0x80,0xa, 0x5, 0x3a, +0xe5,0x3a,0x70,0x2, 0x5, 0x39,0x80,0x98,0xe5,0x3a,0x45,0x39,0x60,0x2, 0xc1,0xdd, +0x12,0x60,0xc0,0xe4,0x34,0xa, 0xf5,0x83,0xc0,0x83,0xc0,0x82,0x12,0x4b,0x45,0xc0, +0x0, 0xc0,0x1, 0xc0,0x2, 0xc0,0x3, 0xae,0x46,0xaf,0x47,0x12,0x69,0x96,0x12,0x6a, +0xff,0xaf,0x2d,0x12,0x68,0xbe,0xd0,0x3, 0xd0,0x2, 0xd0,0x1, 0xd0,0x0, 0x12,0x68, +0xc8,0xfc,0xd0,0x82,0xd0,0x83,0x12,0x12,0x8, 0xc0,0x83,0xc0,0x82,0x12,0x4b,0x45, +0xc0,0x0, 0xc0,0x1, 0xc0,0x2, 0xc0,0x3, 0xae,0x46,0xaf,0x47,0x12,0x69,0x96,0x12, +0x6a,0xff,0x12,0x68,0xbc,0xd0,0x3, 0xd0,0x2, 0xd0,0x1, 0xd0,0x0, 0x12,0x68,0xc8, +0xfc,0xd0,0x82,0xd0,0x83,0x12,0x60,0x96,0xc0,0x83,0xc0,0x82,0x12,0x4b,0x45,0x12, +0x69,0x8c,0x12,0x68,0xc8,0xfc,0xd0,0x82,0xd0,0x83,0x12,0x68,0xef,0xf5,0x83,0xc0, +0x83,0xc0,0x82,0x12,0x4b,0x45,0x12,0x69,0x8c,0xeb,0x2f,0xe1,0x69,0xe5,0x3a,0xf4, +0x70,0x3, 0xe5,0x39,0xf4,0x70,0x2, 0xe1,0x74,0x12,0x60,0xc0,0xe4,0x34,0xa, 0xf5, +0x83,0xc0,0x83,0xc0,0x82,0x12,0x4b,0x45,0xc0,0x0, 0xc0,0x1, 0xc0,0x2, 0xc0,0x3, +0x12,0x6a,0xad,0x12,0x68,0xbe,0xd0,0x3, 0xd0,0x2, 0xd0,0x1, 0xd0,0x0, 0x12,0x68, +0xc8,0xfc,0xd0,0x82,0xd0,0x83,0x12,0x12,0x8, 0xc0,0x83,0xc0,0x82,0x12,0x4b,0x45, +0xc0,0x0, 0xc0,0x1, 0xc0,0x2, 0xc0,0x3, 0x12,0x68,0xae,0xd0,0x3, 0xd0,0x2, 0xd0, +0x1, 0xd0,0x0, 0x12,0x68,0xc8,0xfc,0xd0,0x82,0xd0,0x83,0x12,0x60,0x96,0xc0,0x83, +0xc0,0x82,0x12,0x4b,0x45,0xae,0x46,0x12,0x69,0x96,0xeb,0x25,0x47,0x12,0x68,0xca, +0xfc,0xd0,0x82,0xd0,0x83,0x12,0x68,0xef,0xf5,0x83,0xc0,0x83,0xc0,0x82,0x12,0x4b, +0x45,0xae,0x46,0x12,0x69,0x96,0xeb,0x25,0x47,0x12,0x68,0xca,0xfc,0xd0,0x82,0xd0, +0x83,0x12,0x4, 0xf2,0x5, 0x2e,0x81,0x3e,0x5, 0x2d,0x81,0xe, 0x5, 0x2f,0x61,0x5, +0xe4,0xf5,0x2f,0x12,0x32,0x11,0xff,0xe5,0x2f,0xc3,0x9f,0x40,0x3, 0x2, 0x60,0x8a, +0x12,0x14,0xe5,0x12,0x6a,0x90,0x50,0x3, 0x2, 0x60,0x85,0x12,0x12,0xb, 0xc0,0x83, +0xc0,0x82,0x12,0x4b,0x69,0xff,0x78,0x6, 0x12,0x4, 0xdf,0xd0,0x82,0xd0,0x83,0x12, +0x68,0xef,0xf5,0x83,0x12,0x4b,0x45,0x12,0x12,0xb, 0x12,0x4b,0x69,0xff,0x12,0x4, +0x13,0xef,0x24,0x20,0xf5,0x31,0xe4,0x3e,0xf5,0x30,0x12,0x60,0xc0,0xe4,0x34,0xa, +0xf5,0x83,0xc0,0x83,0xc0,0x82,0x12,0x4b,0x69,0xff,0x78,0x6, 0x12,0x4, 0xdf,0xd0, +0x82,0xd0,0x83,0x12,0x60,0x96,0x12,0x4b,0x45,0x12,0x60,0xc0,0xe4,0x34,0xa, 0xf5, +0x83,0x12,0x4b,0x69,0xff,0x12,0x4, 0x13,0xef,0x24,0x20,0xf5,0x35,0xe4,0x3e,0xf5, +0x34,0xe5,0x38,0x11,0xab,0x90,0x0, 0xa, 0xe5,0x30,0x85,0x31,0xf0,0x12,0x3, 0x5b, +0x90,0x0, 0xc, 0xe5,0x34,0x85,0x35,0xf0,0x12,0x3, 0x5b,0x11,0x99,0xc0,0x83,0xc0, +0x82,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0x12,0x15,0x2b,0x90,0x0, 0x12,0x12,0x1, 0x65, +0xf9,0xf8,0x12,0x4, 0xcc,0xd0,0x82,0xd0,0x83,0x11,0x96,0x12,0x4b,0x69,0xff,0xe4, +0x7b,0x7f,0xfa,0xf9,0xf8,0xc3,0x12,0x4, 0xbb,0x50,0x9, 0x11,0x99,0x12,0x4, 0xfe, +0x0, 0x0, 0x0, 0x7f,0x11,0x99,0xa3,0xa3,0xa3,0xe0,0xfd,0xe5,0x38,0x11,0xab,0x11, +0xd2,0x11,0xa9,0x11,0xba,0xfd,0xe5,0x38,0x75,0xf0,0x7, 0xa4,0x11,0xb1,0x11,0xcb, +0x11,0xba,0xd3,0x94,0xf, 0x40,0xc, 0xe5,0x38,0x11,0xab,0x90,0x0, 0x10,0x74,0xf, +0x12,0x1, 0xd7,0x5, 0x38,0x5, 0x2f,0x2, 0x5f,0x83,0x12,0x17,0xd1,0x90,0x0, 0x2d, +0xe5,0x38,0x12,0x1, 0xd7,0x22,0x12,0x4, 0xf2,0xe5,0x2f,0x25,0xe0,0x25,0xe0,0x24, +0x6c,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0x22,0xe5,0x2f,0x75,0xf0,0x7, 0xa4,0xab, +0x2a,0x25,0x2c,0xf9,0xe5,0x2b,0x35,0xf0,0xfa,0x22,0x90,0x0, 0x10,0x2, 0x1, 0x65, +0xe5,0x2f,0x25,0xe0,0x25,0xe0,0x24,0x58,0xf5,0x82,0x22,0x90,0x0, 0x10,0xed,0x2, +0x1, 0xd7,0x90,0x0, 0xf, 0xed,0x2, 0x1, 0xd7,0x12,0x1f,0xf4,0xe4,0xf5,0x2d,0xf5, +0x2e,0xf5,0x2f,0x12,0x6a,0xe1,0xf5,0x3b,0x75,0x3c,0xff,0xf5,0x41,0xf5,0x42,0x12, +0x15,0x30,0x90,0x0, 0xb, 0x12,0x2, 0xb7,0xf5,0x46,0x85,0xf0,0x45,0xe4,0xf5,0x47, +0xf5,0x48,0xf5,0x49,0x12,0x37,0x9c,0xf5,0x4b,0x85,0xf0,0x4a,0x12,0x59,0x9a,0x34, +0x3, 0xaf,0x1, 0xf5,0x43,0x8f,0x44,0xe4,0xf5,0x2d,0x12,0x15,0xa3,0x12,0x6b,0xde, +0x40,0x2, 0xa1,0xae,0xe5,0x2d,0x75,0xf0,0x10,0xa4,0x85,0xf0,0x3f,0xf5,0x40,0xe4, +0xf5,0x2e,0x12,0x15,0xa3,0x12,0x17,0xc4,0xff,0xe5,0x2e,0xc3,0x9f,0x40,0x2, 0xa1, +0xaa,0x12,0x68,0x16,0x12,0x6c,0x2, 0xef,0x95,0x46,0xee,0x95,0x45,0x40,0x8, 0x5, +0x48,0xe5,0x48,0x70,0x2, 0x5, 0x47,0x12,0x68,0x16,0x12,0x6c,0x2, 0xef,0x95,0x4b, +0xe5,0x4a,0x12,0x69,0x1f,0x50,0x2, 0xa1,0x9e,0xe5,0x2d,0x70,0x6, 0xf5,0x2f,0xf5, +0x30,0x80,0x15,0xe5,0x40,0x24,0xf0,0xff,0xe5,0x3f,0x34,0xff,0x12,0x2b,0x84,0x12, +0x68,0x1d,0xf5,0x2f,0xa3,0xe0,0xf5,0x30,0x12,0x15,0xa3,0x12,0x1, 0x4c,0x14,0xb5, +0x2d,0x7, 0xe4,0xf5,0x31,0xf5,0x32,0x80,0x14,0xe5,0x40,0x24,0x10,0xff,0xe4,0x35, +0x3f,0x12,0x2b,0x84,0x12,0x68,0x1d,0xf5,0x31,0xa3,0xe0,0xf5,0x32,0xe5,0x2e,0x70, +0x6, 0xf5,0x35,0xf5,0x36,0x80,0x15,0xe5,0x40,0x24,0xff,0xff,0xe5,0x3f,0x34,0xff, +0x12,0x2b,0x84,0x12,0x68,0x1d,0xf5,0x35,0xa3,0xe0,0xf5,0x36,0x12,0x17,0xc4,0x14, +0xb5,0x2e,0x7, 0xe4,0xf5,0x33,0xf5,0x34,0x80,0x14,0xe5,0x40,0x24,0x1, 0xff,0xe4, +0x35,0x3f,0x12,0x2b,0x84,0x12,0x68,0x1d,0xf5,0x33,0xa3,0xe0,0xf5,0x34,0x12,0x68, +0x16,0xfe,0xc3,0xee,0x64,0x80,0x94,0x80,0x50,0x2b,0xe5,0x30,0x95,0x32,0xe5,0x31, +0x12,0x69,0x67,0x40,0x6, 0x85,0x31,0x2f,0x85,0x32,0x30,0xd3,0xe5,0x30,0x95,0x34, +0xe5,0x33,0x12,0x69,0x67,0x40,0x6, 0x85,0x33,0x2f,0x85,0x34,0x30,0xd3,0x12,0x69, +0x61,0x40,0x32,0x80,0x2a,0xc3,0xe5,0x30,0x95,0x32,0xe5,0x31,0x12,0x69,0x67,0x50, +0x6, 0x85,0x31,0x2f,0x85,0x32,0x30,0xc3,0xe5,0x30,0x95,0x34,0xe5,0x33,0x12,0x69, +0x67,0x50,0x6, 0x85,0x33,0x2f,0x85,0x34,0x30,0xc3,0x12,0x69,0x61,0x50,0x6, 0x85, +0x35,0x2f,0x85,0x36,0x30,0xe5,0x2d,0x25,0xe0,0xf5,0x41,0xe5,0x2e,0x25,0xe0,0xf5, +0x42,0xc3,0xee,0x64,0x80,0x94,0x80,0x40,0x2, 0x61,0x31,0x12,0x68,0x16,0xfe,0xa3, +0xe0,0xff,0xd3,0x12,0x69,0x1b,0x40,0x2, 0x61,0x27,0xc3,0xe4,0x95,0x4b,0xfd,0xe4, +0x95,0x4a,0xfc,0xd3,0xef,0x9d,0xec,0x12,0x69,0x1f,0x40,0x2, 0x61,0x27,0xe5,0x49, +0x70,0x9, 0x90,0xa, 0x94,0xe5,0x41,0xf0,0xa3,0x61,0x22,0xe5,0x49,0xc3,0x94,0x5, +0x40,0x5, 0x75,0x49,0x5, 0x61,0x27,0xe4,0xf5,0x3c,0x12,0x59,0x71,0x95,0x49,0x74, +0x80,0xf8,0x6c,0x98,0x50,0x5c,0x12,0x3f,0xe8,0x12,0x6b,0x95,0x12,0x5a,0x92,0x60, +0x4d,0x12,0x2b,0x7e,0x33,0xfe,0x12,0x6b,0xb5,0xaf,0x42,0x12,0x5a,0x7d,0x60,0x3e, +0xaf,0x3c,0x12,0x59,0x80,0x25,0xe0,0xfd,0xee,0x33,0xfc,0x74,0x94,0x2d,0xf5,0x82, +0x74,0xa, 0x12,0x69,0x3c,0xa4,0xff,0x74,0x95,0x2d,0xf5,0x82,0x74,0xa, 0xf1,0xf2, +0x12,0x6c,0x14,0x12,0x3f,0x53,0x50,0x11,0x12,0x2b,0x7e,0x33,0xfe,0x12,0x6b,0x95, +0xe5,0x41,0xf0,0x12,0x6b,0xb5,0xe5,0x42,0xf0,0x75,0x3c,0xff,0x80,0x4, 0x5, 0x3c, +0x80,0x98,0xe5,0x49,0xb5,0x3c,0x10,0x12,0x6b,0x69,0xe5,0x41,0xf0,0xe5,0x49,0x12, +0x6b,0x5d,0xe5,0x42,0xf0,0x5, 0x49,0x5, 0x40,0xe5,0x40,0x70,0x2, 0x5, 0x3f,0xa1, +0xa6,0x12,0x68,0x16,0xfe,0xa3,0xe0,0xff,0xc3,0x12,0x69,0x1b,0x50,0x2, 0xa1,0x9e, +0xef,0x95,0x4b,0xe5,0x4a,0x12,0x69,0x1f,0x50,0x2, 0xa1,0x9e,0xe5,0x3b,0x70,0x9, +0x90,0xa, 0x44,0xe5,0x41,0xf0,0xa3,0xa1,0x99,0xe5,0x3b,0xc3,0x94,0x14,0x40,0x5, +0x75,0x3b,0x14,0xa1,0x9e,0xe4,0xf5,0x3c,0x12,0x59,0x71,0x95,0x3b,0x74,0x80,0xf8, +0x6c,0x98,0x40,0x2, 0xa1,0x89,0xed,0x25,0xe0,0xff,0xec,0x12,0x68,0xe2,0x12,0x5a, +0x92,0x60,0x35,0x12,0x2b,0x7e,0x12,0x69,0x46,0x12,0x5a,0x83,0xef,0x60,0x29,0x12, +0x69,0x27,0xa4,0xff,0x74,0x45,0x2d,0xf5,0x82,0x74,0xa, 0xf1,0xf2,0x12,0x6c,0x14, +0x12,0x3f,0x53,0x40,0x2, 0xa1,0x80,0x12,0x2b,0x7e,0x12,0x68,0xe2,0xe5,0x41,0xf0, +0x12,0x69,0x48,0xe5,0x42,0xf0,0xa1,0x80,0x12,0x2b,0x7e,0x12,0x68,0xe2,0xe0,0xfd, +0x7b,0x6, 0x12,0x5a,0x96,0x70,0x2, 0xa1,0x85,0x12,0x2b,0x7e,0x12,0x69,0x46,0x12, +0x5a,0x83,0xef,0x70,0x2, 0xa1,0x85,0x12,0x2b,0x7e,0x12,0x68,0xe2,0xe0,0xfd,0xc3, +0x13,0x25,0x2d,0xf5,0x3d,0x12,0x69,0x48,0xe0,0xc3,0x13,0x25,0x2e,0xf5,0x3e,0xe4, +0xf5,0x2f,0xf5,0x30,0xc3,0xe5,0x30,0x95,0x3b,0x74,0x80,0xf8,0x65,0x2f,0x98,0x50, +0x36,0xaf,0x3c,0x12,0x59,0x80,0x65,0x30,0x70,0x3, 0xee,0x65,0x2f,0x60,0x1e,0x12, +0x6c,0x7f,0x12,0x68,0xe2,0xe0,0x12,0x5a,0x89,0x60,0x12,0x12,0x6c,0x7f,0x12,0x69, +0x46,0xaf,0x3e,0x12,0x5a,0x7d,0x60,0x5, 0x75,0x3d,0xff,0x80,0xa, 0x5, 0x30,0xe5, +0x30,0x70,0x2, 0x5, 0x2f,0x80,0xbd,0xe5,0x3d,0xf4,0x70,0x2, 0xa1,0x85,0x12,0x69, +0x27,0xa4,0xff,0x74,0x45,0x2d,0xf5,0x82,0x74,0xa, 0x3c,0xf5,0x83,0xe0,0xc3,0x13, +0xf9,0xf1,0xf8,0xfe,0xa3,0xe0,0xff,0xd3,0xed,0x9f,0xee,0x12,0x3f,0x53,0x40,0x14, +0x12,0x2b,0x7e,0x12,0x68,0xe2,0x12,0x69,0x3f,0xa4,0xff,0xe9,0x12,0x6b,0xd, 0x12, +0x2b,0x84,0x80,0x7, 0xe5,0x40,0x25,0xe0,0xff,0xe5,0x3f,0x12,0x68,0x1d,0xf5,0x31, +0xa3,0xe0,0xf5,0x32,0xe5,0x32,0xae,0x31,0x78,0x2, 0xce,0xa2,0xe7,0x13,0xce,0x13, +0xd8,0xf8,0xfd,0xac,0x6, 0xe5,0x31,0xa2,0xe7,0x13,0xfe,0xe5,0x32,0x13,0x2d,0xf5, +0x32,0xee,0x3c,0xf5,0x31,0x12,0x15,0x30,0x12,0x2, 0x8c,0xff,0xae,0xf0,0xc3,0xe5, +0x32,0x9f,0xe5,0x31,0x9e,0x50,0x4, 0x8e,0x31,0x8f,0x32,0x12,0x69,0xad,0x12,0x59, +0x8d,0xfe,0xe5,0x3e,0xc3,0x13,0xfd,0x7c,0x0, 0x2f,0xff,0xec,0x3e,0x12,0x2b,0x84, +0x12,0x68,0x1d,0xfa,0xa3,0xe0,0xfb,0xe5,0x3d,0xa2,0xe7,0x13,0xf9,0xff,0x12,0x59, +0x88,0xfe,0xef,0x2d,0xff,0xec,0x3e,0x12,0x2b,0x84,0x12,0x68,0x1d,0xfe,0xa3,0xe0, +0x2b,0xf5,0x34,0xee,0x3a,0xf5,0x33,0xa2,0xe7,0x13,0xf5,0x33,0xe5,0x34,0x13,0xf5, +0x34,0x12,0x69,0xad,0xc4,0xf8,0x54,0xf, 0xc8,0x68,0xfd,0xee,0xc4,0x54,0xf0,0x48, +0xfc,0x12,0x6c,0x77,0x12,0x69,0xba,0x2d,0xff,0xee,0x3c,0x12,0x2b,0x84,0x12,0x68, +0x1d,0xfc,0xa3,0xe0,0xfd,0xe9,0xff,0x33,0x95,0xe0,0xfe,0xef,0xc4,0xf8,0x54,0xf, +0xc8,0x68,0xfb,0xee,0xc4,0x54,0xf0,0x48,0xfa,0x12,0x6c,0x77,0x12,0x69,0xba,0x2b, +0xff,0xee,0x3a,0x12,0x2b,0x84,0x12,0x68,0x1d,0xfe,0xa3,0xe0,0x2d,0xf5,0x36,0xee, +0x3c,0xf5,0x35,0xa2,0xe7,0x13,0xf5,0x35,0xe5,0x36,0x13,0xf5,0x36,0x25,0x34,0xff, +0xe5,0x33,0x35,0x35,0x12,0x69,0xba,0xc3,0x95,0x32,0xe5,0x31,0x12,0x69,0x1f,0x40, +0x14,0x12,0x2b,0x7e,0x12,0x68,0xe2,0xe5,0x3d,0xf0,0x12,0x69,0x48,0xe5,0x3e,0xf0, +0x75,0x3c,0xff,0x80,0x4, 0x5, 0x3c,0x61,0x68,0xe5,0x3b,0xb5,0x3c,0x10,0x12,0x12, +0xf, 0xe5,0x41,0xf0,0xe5,0x3b,0x12,0x68,0xd6,0xe5,0x42,0xf0,0x5, 0x3b,0x5, 0x40, +0xe5,0x40,0x70,0x2, 0x5, 0x3f,0x5, 0x2e,0x21,0x32,0x5, 0x2d,0x21,0x1a,0xe5,0x3b, +0xd3,0x94,0x5, 0x50,0x2, 0xe1,0xa, 0xe4,0xf5,0x3d,0xf5,0x2d,0x12,0x32,0x11,0xff, +0xe5,0x2d,0xc3,0x9f,0x40,0x2, 0xc1,0x72,0x75,0x37,0x3, 0x75,0x38,0xff,0xe4,0xf5, +0x42,0xf5,0x2e,0xe5,0x2e,0xc3,0x95,0x3b,0x50,0x3c,0x12,0x68,0xd4,0x12,0x69,0xc1, +0xe0,0x12,0x34,0x2f,0xc0,0x6, 0xc0,0x7, 0xe5,0x2e,0x12,0x12,0xf, 0x12,0x69,0xd1, +0xe0,0x12,0x34,0x2f,0xd0,0xe0,0x2f,0xf5,0x3a,0xd0,0xe0,0x3e,0xf5,0x39,0xc3,0xe5, +0x3a,0x95,0x38,0xe5,0x39,0x95,0x37,0x50,0x9, 0x85,0x39,0x37,0x85,0x3a,0x38,0x85, +0x2e,0x42,0x5, 0x2e,0x80,0xbd,0xe5,0x42,0x12,0x12,0xf, 0x12,0x69,0x3f,0xa4,0xff, +0xe5,0x42,0x12,0x68,0xd6,0xe0,0xc3,0x13,0x12,0x6b,0xd, 0x12,0x2b,0x84,0x33,0xfe, +0xe5,0x44,0x2f,0xf5,0x82,0xe5,0x43,0x12,0x15,0x28,0x12,0x6a,0x90,0x40,0x2f,0xe5, +0x42,0x12,0x12,0xf, 0xe0,0xfd,0xaf,0x3d,0x12,0x2b,0x80,0x33,0xfe,0x74,0x6c,0x2f, +0xf5,0x82,0x74,0xa, 0x12,0x6c,0x6f,0x12,0x68,0xd6,0xe0,0xfd,0x74,0x6d,0x2f,0xf5, +0x82,0x74,0xa, 0x12,0x6c,0x6f,0x12,0x12,0xf, 0x74,0xff,0xf0,0x5, 0x3d,0x5, 0x2d, +0xa1,0xbc,0x85,0x3d,0x2d,0xe5,0x2d,0xc3,0x94,0x5, 0x50,0x69,0xe4,0xf5,0x2f,0xf5, +0x30,0xf5,0x3e,0xf5,0x2e,0xe5,0x2e,0xc3,0x95,0x3b,0x50,0x41,0xe5,0x2e,0x12,0x12, +0xf, 0xe0,0xff,0xf4,0x60,0x33,0xef,0xc3,0x13,0x75,0xf0,0x10,0xa4,0xff,0x12,0x68, +0xd4,0xe0,0xfd,0xc3,0x13,0x12,0x6c,0x58,0x12,0x2b,0x84,0x12,0x68,0x1d,0xfe,0xa3, +0xe0,0xff,0xd3,0x12,0x69,0x1b,0x40,0x11,0xe5,0x2e,0x12,0x12,0xf, 0xe0,0xf5,0x41, +0x8d,0x42,0x8e,0x2f,0x8f,0x30,0x85,0x2e,0x3e,0x5, 0x2e,0x80,0xb8,0xe5,0x2d,0x11, +0x9d,0xe5,0x41,0x12,0x6a,0xf0,0xe5,0x42,0xf0,0xe5,0x3e,0x12,0x12,0xf, 0x74,0xff, +0xf0,0x5, 0x2d,0x80,0x90,0xe4,0xf5,0x2d,0xe5,0x2d,0x11,0x9d,0xe0,0xff,0xe5,0x2d, +0x12,0x12,0xf, 0xef,0x12,0x6a,0xf0,0xe0,0xff,0xe5,0x2d,0x12,0x68,0xd6,0xef,0xf0, +0x5, 0x2d,0xe5,0x2d,0xb4,0x5, 0xe1,0x75,0x3b,0x5, 0xe4,0xf5,0x2d,0x12,0x69,0xd3, +0x74,0xff,0xf0,0x12,0x69,0xc3,0x74,0xff,0xf0,0x5, 0x2d,0xe5,0x2d,0xb4,0x5, 0xed, +0xe5,0x3b,0xd3,0x94,0x0, 0x40,0x4f,0xe4,0xf5,0x2d,0xe5,0x2d,0xc3,0x95,0x3b,0x50, +0x45,0xe5,0x2d,0x12,0x12,0xf, 0xe0,0xff,0x12,0x17,0xd1,0x75,0xf0,0x2, 0xe5,0x2d, +0x12,0x15,0x84,0xef,0x12,0x1, 0xd7,0xe5,0x2d,0x12,0x68,0xd6,0xe0,0xfd,0xe5,0x2d, +0x75,0xf0,0x2, 0x12,0x1f,0xba,0xfa,0x90,0x0, 0x1, 0xed,0x12,0x1, 0xd7,0xe5,0x2d, +0x12,0x12,0xf, 0x12,0x69,0xd1,0xef,0xf0,0xe5,0x2d,0x12,0x68,0xd6,0x12,0x69,0xc1, +0xef,0xf0,0x5, 0x2d,0x80,0xb4,0xe5,0x49,0xd3,0x94,0x0, 0x40,0x2f,0xe4,0xf5,0x2d, +0xe5,0x2d,0xc3,0x95,0x49,0x50,0x25,0xe5,0x2d,0x12,0x6b,0x69,0xe0,0xfd,0xe5,0x2d, +0x75,0xf0,0x2, 0x11,0xae,0x90,0x0, 0x87,0xed,0x12,0x1, 0xd7,0xe5,0x2d,0x12,0x6b, +0x5d,0xe0,0x90,0x0, 0x88,0x12,0x1, 0xd7,0x5, 0x2d,0x80,0xd4,0x12,0x17,0xd1,0x90, +0x0, 0x86,0xe5,0x49,0x12,0x1, 0xd7,0x90,0x0, 0x2d,0xe5,0x3b,0x12,0x1, 0xd7,0xe9, +0x24,0x2f,0x12,0x30,0x3a,0x54,0xfe,0x12,0x1, 0xc5,0x12,0x15,0x30,0x90,0x0, 0xd, +0x12,0x1, 0x65,0xff,0xd3,0xe5,0x48,0x9f,0xe5,0x47,0x94,0x0, 0x40,0x13,0xab,0x2a, +0xe5,0x2c,0x24,0x2f,0xf9,0xe4,0x35,0x2b,0xfa,0x12,0x1, 0x4c,0x44,0x1, 0x12,0x1, +0xc5,0x22,0x3c,0xf5,0x83,0xe0,0xc3,0x13,0x7c,0x0, 0x2f,0xff,0xec,0x35,0xf0,0xfe, +0xef,0x25,0xe0,0xff,0xee,0x33,0xfe,0xe5,0x44,0x2f,0xf5,0x82,0xe5,0x43,0x3e,0xf5, +0x83,0xe0,0xfc,0xa3,0xe0,0xfd,0xe5,0x40,0x25,0xe0,0xff,0xe5,0x3f,0x33,0xfe,0xe5, +0x44,0x2f,0xf5,0x82,0xe5,0x43,0x3e,0xf5,0x83,0xe0,0x22,0xab,0x33,0xaa,0x34,0xa9, +0x35,0x90,0x3, 0x80,0x75,0xf0,0x20,0xe5,0x39,0x12,0x5, 0x40,0x75,0xf0,0x2, 0xe5, +0x3a,0x12,0x5, 0x40,0x12,0x2, 0xb7,0xff,0xab,0x36,0xaa,0x37,0xa9,0x38,0x90,0x0, +0x1e,0x2, 0x1, 0x65,0xf9,0xe4,0x35,0x22,0xfa,0x7e,0x0, 0xe9,0x25,0x2d,0xf9,0xee, +0x3a,0xfa,0x12,0x1, 0x4c,0x54,0xf, 0xfd,0xe5,0x2d,0x25,0xe0,0xff,0xee,0x33,0xfe, +0x74,0x7c,0x2f,0xf5,0x82,0x74,0xa, 0x3e,0xf5,0x83,0xed,0xf0,0x12,0x1, 0x4c,0x54, +0xf0,0xc4,0x54,0xf, 0xfd,0xe5,0x2d,0x25,0xe0,0xff,0xe4,0x33,0xfe,0x74,0x7d,0x2f, +0xf5,0x82,0x74,0xa, 0x3e,0xf5,0x83,0x22,0xab,0x33,0xaa,0x34,0xa9,0x35,0xe4,0x12, +0x1, 0xd7,0xab,0x36,0xaa,0x37,0xa9,0x38,0x90,0x0, 0x1f,0x2, 0x1, 0x65,0xae,0x46, +0xaf,0x47,0xab,0x7, 0xaa,0x6, 0xea,0x33,0x95,0xe0,0xf9,0xf8,0xaf,0x2e,0xef,0x33, +0x95,0xe0,0xfe,0xfd,0xfc,0x2, 0x3, 0x88,0xeb,0x2f,0xff,0xea,0x3e,0xfe,0xe9,0x3d, +0xfd,0xe8,0x3c,0x22,0xe5,0x2e,0x25,0xe0,0x24,0x45,0xf5,0x82,0xe4,0x34,0xa, 0xf5, +0x83,0x22,0x33,0xfe,0x74,0x44,0x2f,0xf5,0x82,0x74,0xa, 0x3e,0xf5,0x83,0x22,0x12, +0x4, 0xf2,0xe5,0x2f,0x25,0xe0,0x25,0xe0,0x24,0x80,0xf5,0x82,0xe4,0x34,0xa, 0x22, +0xe5,0x2a,0x24,0xfb,0xff,0xe4,0x34,0xff,0xfe,0x7c,0x0, 0x7d,0xa, 0x12,0x1, 0xf9, +0xef,0x25,0x2c,0xf5,0x2c,0xee,0x35,0x2b,0xf5,0x2b,0x22,0x95,0x30,0xe5,0x2f,0x64, +0x80,0xf8,0xee,0x64,0x80,0x98,0x22,0xaf,0x3c,0xef,0x33,0x95,0xe0,0xfe,0xef,0x25, +0xe0,0xfd,0xee,0x33,0xfc,0x74,0x44,0x2d,0xf5,0x82,0x74,0xa, 0x3c,0xf5,0x83,0xe0, +0xc3,0x13,0x75,0xf0,0x10,0x22,0x33,0xfe,0x74,0x45,0x2f,0xf5,0x82,0x74,0xa, 0x3e, +0xf5,0x83,0x22,0xab,0x21,0xe5,0x23,0x24,0x4f,0xf9,0xe4,0x35,0x22,0xfa,0x2, 0x1, +0x4c,0xe5,0x30,0x95,0x36,0xe5,0x35,0x64,0x80,0xf8,0xe5,0x2f,0x64,0x80,0x98,0x22, +0x75,0x24,0x1, 0x75,0x25,0x0, 0x75,0x26,0x0, 0x75,0x27,0x1, 0x75,0x28,0x9, 0x75, +0x29,0x17,0x75,0x2a,0x1, 0x75,0x2b,0x8, 0x75,0x2c,0x33,0x22,0xe5,0x46,0xa2,0xe7, +0x13,0xfe,0xe5,0x47,0x13,0xff,0xee,0x33,0x95,0xe0,0xfd,0xfc,0x22,0xa8,0x1, 0xfc, +0xad,0x27,0x7b,0x1, 0x7a,0xa, 0x79,0x44,0x7e,0x0, 0x2, 0x1, 0x26,0xaf,0x3d,0xef, +0x33,0x95,0xe0,0xfe,0xef,0x24,0x1, 0xff,0xe4,0x3e,0xa2,0xe7,0x13,0xfe,0xef,0x13, +0x22,0xe0,0xff,0xe5,0x2d,0x25,0xe0,0x24,0xda,0xf5,0x82,0xe4,0x34,0xc, 0xf5,0x83, +0x22,0xe0,0xff,0xe5,0x2d,0x25,0xe0,0x24,0xd9,0xf5,0x82,0xe4,0x34,0xc, 0xf5,0x83, +0x22,0x90,0x8, 0x1d,0x74,0x1, 0xf0,0xa3,0x74,0xb, 0xf0,0xa3,0x74,0x62,0xf0,0x22, +0xab,0x27,0xe5,0x29,0x24,0x4f,0xf9,0xe4,0x35,0x28,0xfa,0x2, 0x1, 0x4c,0xf9,0xe4, +0x3a,0xfa,0x12,0x2, 0x8c,0xc4,0xf8,0x54,0xf, 0xc8,0x68,0xff,0xe5,0xf0,0xc4,0x54, +0xf0,0x48,0x8f,0xf0,0x2, 0x3, 0x3c,0x75,0xf0,0x2, 0xe5,0x2c,0x2, 0x5, 0x40,0x75, +0x24,0x1, 0x75,0x25,0x8, 0x75,0x26,0x28,0x75,0x27,0x1, 0x22,0xe5,0x3c,0x25,0xe0, +0xff,0xe5,0x3b,0x33,0xfe,0x22,0x24,0xff,0xff,0xe4,0x34,0xff,0xcf,0xc3,0x95,0x3c, +0xcf,0x95,0x3b,0xfe,0xd3,0xef,0x94,0x0, 0xee,0x94,0x0, 0x22,0x75,0x24,0x1, 0x75, +0x25,0x0, 0x75,0x26,0x0, 0x75,0x27,0x1, 0x75,0x28,0x0, 0x75,0x29,0x83,0x75,0x2a, +0x1, 0x22,0xf9,0xe4,0x3a,0xfa,0x12,0x2, 0x8c,0xc3,0x95,0x2b,0xff,0xe5,0xf0,0x95, +0x2a,0x8f,0xf0,0x2, 0x3, 0x3c,0x90,0x0, 0x80,0x12,0x1, 0x65,0xff,0xc3,0xe5,0x3c, +0x9f,0xff,0xe4,0x94,0x0, 0xfe,0xef,0x22,0x90,0x0, 0x7, 0x74,0xff,0x2, 0x1, 0xd7, +0x12,0x2, 0x8c,0xfd,0xc3,0xef,0x9d,0xee,0x95,0xf0,0x22,0xe5,0x3a,0x25,0xe0,0xff, +0xe5,0x39,0x33,0xfe,0xab,0x2a,0xe5,0x2c,0x2f,0xf9,0xe5,0x2b,0x22,0xae,0x46,0xaf, +0x47,0xab,0x7, 0xaa,0x6, 0xea,0x33,0x95,0xe0,0xf9,0xf8,0xaf,0x2d,0x22,0x24,0x48, +0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0x22,0x12,0x1, 0x65,0xc3,0x13,0xff,0x90,0xa, +0x94,0x22,0xc3,0x13,0x75,0x3b,0x0, 0xf5,0x3c,0xd3,0x94,0x0, 0xe5,0x3b,0x94,0x0, +0x22,0xf5,0x30,0xf5,0x31,0xf5,0x32,0xf5,0x33,0xf5,0x34,0xf5,0x35,0xf5,0x36,0x22, +0xf0,0xe5,0x2d,0x25,0xe0,0x24,0x6d,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0x22,0x78, +0x1, 0x12,0x4, 0xcc,0xa8,0x4, 0xa9,0x5, 0xaa,0x6, 0xab,0x7, 0x22,0x7c,0x0, 0x2f, +0xff,0xec,0x35,0xf0,0x22,0xff,0xe9,0x24,0x58,0xf9,0xe4,0x3a,0xfa,0xe9,0x2f,0xf9, +0xea,0x3e,0x22,0xef,0x94,0x14,0xee,0x64,0x80,0x94,0x80,0x22,0xff,0xc3,0xe5,0x2b, +0x9f,0xe5,0x2a,0x9e,0x22,0x12,0x1f,0xc7,0x8e,0x2a,0x8f,0x2b,0xe5,0x2b,0xa8,0x2c, +0x8, 0x22,0x74,0x7f,0xf0,0xa3,0x74,0xff,0xf0,0x22,0x7e,0x0, 0x7f,0x23,0x2, 0x1, +0x26,0x33,0xfe,0xed,0x33,0x95,0xe0,0xfc,0xd3,0xed,0x9f,0xee,0x22,0x25,0xe0,0x24, +0x95,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0x22,0x25,0xe0,0x24,0x94,0xf5,0x82,0xe4, +0x34,0xa, 0xf5,0x83,0x22,0xab,0x33,0xe5,0x35,0x24,0x80,0xf9,0xe5,0x34,0x34,0x3, +0x22,0x5, 0x27,0xe5,0x27,0xc3,0x94,0x9, 0x22,0xab,0x21,0xe5,0x23,0x24,0xa, 0xf9, +0xe4,0x35,0x22,0xfa,0x22,0x74,0x94,0x2f,0xf5,0x82,0x74,0xa, 0x3e,0xf5,0x83,0x22, +0xc3,0x9d,0xff,0xe5,0xf0,0x9c,0xfe,0x2, 0x0, 0x6, 0x12,0x2, 0xb7,0xd3,0x9d,0xe5, +0xf0,0x9c,0xe5,0x2d,0x22,0x74,0x95,0x2f,0xf5,0x82,0x74,0xa, 0x3e,0xf5,0x83,0x22, +0x12,0x1, 0xd7,0x90,0x0, 0x81,0xe4,0x2, 0x1, 0xd7,0x75,0xf0,0x10,0xa4,0x7c,0x0, +0x25,0x24,0xff,0xec,0x22,0x75,0x2b,0x9, 0x75,0x2c,0x17,0x7b,0x1, 0x22,0x12,0x1, +0x4c,0xff,0xe5,0x2d,0xc3,0x9f,0x22,0x90,0xa, 0xe1,0xf0,0xa3,0x74,0x64,0xf0,0x22, +0x90,0x0, 0x2d,0x75,0xf0,0x2, 0xe5,0x2b,0x22,0xe5,0x35,0x24,0x10,0xf9,0xe4,0x35, +0x34,0x22,0xfe,0xa3,0xe0,0xff,0x12,0x0, 0x6, 0xd3,0x22,0x90,0x0, 0x37,0x75,0xf0, +0x2, 0xe5,0x2a,0x22,0xfe,0xa3,0xe0,0xff,0xc3,0xed,0x9f,0xee,0x22,0x12,0x1, 0x4c, +0xff,0xe5,0x2a,0xc3,0x9f,0x22,0xe5,0x26,0x24,0xa, 0xf9,0xe4,0x35,0x25,0x22,0xe5, +0x29,0x24,0x26,0xf9,0xe4,0x35,0x28,0x22,0x24,0x46,0xf5,0x82,0xe4,0x34,0xa, 0x22, +0xfd,0xe5,0x29,0x24,0x28,0xf9,0xe4,0x22,0x90,0x0, 0x80,0x12,0x1, 0x65,0xfd,0x22, +0xe5,0x3a,0x25,0xe0,0xff,0xe5,0x39,0x22,0x7a,0x0, 0x2f,0xff,0xea,0x35,0xf0,0x22, +0xe5,0x40,0x2f,0xf5,0x82,0xe5,0x3f,0x22,0x8f,0x82,0xf5,0x83,0x2, 0x1, 0x65,0x3e, +0xf5,0x83,0xed,0xf0,0xe5,0x42,0x22,0xe5,0x3e,0x24,0x1, 0xff,0xe4,0x33,0x22,0xe5, +0x30,0x25,0xe0,0xff,0xe5,0x2f,0x22,0xfd,0x12,0x0, 0x1e,0xe4,0xf5,0x2c,0x22,0x12, +0x1, 0x65,0xc3,0x13,0xf5,0x41,0x22,0x8b,0x27,0x8a,0x28,0x89,0x29,0xe4,0x22,0x5, +0x2e,0xe5,0x2e,0xc3,0x94,0x5, 0x22,0xf5,0x82,0xe4,0x34,0xb, 0xf5,0x83,0x22,0x74, +0x21,0xf0,0xa3,0x74,0x34,0xf0,0x22,0x74,0x32,0x25,0x2a,0xf8,0x76,0x1, 0x22,0xf9, +0xe4,0x35,0x22,0xfa,0xe5,0x2b,0x22,0xe4,0x90,0x0, 0x52,0xf0,0xa3,0xf0,0x22,0x6c, +0xcf,0x93,0x30,0xf6,0x9, 0x17,0xe8, \ No newline at end of file diff --git a/drivers/input/touchscreen/atmel_config.c b/drivers/input/touchscreen/atmel_config.c index 740acae1..5565b51a 100644 --- a/drivers/input/touchscreen/atmel_config.c +++ b/drivers/input/touchscreen/atmel_config.c @@ -1,4 +1,14 @@ +/* ======================================================================================== +when who what, where, why comment tag +-------- ---- ------------------------------------- -------------------------- +2011-04-25 zfj add P732A touchscreen config ZTE_TS_ZFJ_20110425 +2011-02-21 zfj add P725A touchscreen config ZTE_TS_ZFJ_20110221 +2010-12-14 wly v9默认竖屏 ZTE_WLY_CRDB00586327 +2010-12-13 wly v9+默认竖屏 ZTE_WLY_CRDB00586327 +2010-11-24 wly 解决手掌在屏上,睡眠唤醒后数据乱报问题 ZTE_WLY_CRDB00577718 +========================================================================================*/ + #include #include #include @@ -19,6 +29,7 @@ static int atmel_platform_power(int on) { int rc = -EINVAL; + /*ZTE_TS_ZFJ_20110221 begin*/ #if defined (CONFIG_MACH_TURIES)||defined (CONFIG_MACH_SAILBOAT) rc = gpio_request(89, "touch voltage"); if (rc) { @@ -31,6 +42,8 @@ static int atmel_platform_power(int on) else gpio_direction_output(89, 0); gpio_free(89); + /*ZTE_TS_ZFJ_20110221 end*/ + //ZTE_TS_HJY_20110223 BEGIN #elif defined (CONFIG_MACH_MOONCAKE) rc = gpio_request(30, "touch voltage"); if (rc) { @@ -43,7 +56,7 @@ else else gpio_direction_output(30, 0); gpio_free(30); - #elif defined(CONFIG_MACH_SKATE) || defined(CONFIG_MACH_NOVA)||defined(CONFIG_MACH_BLADE2) + #elif defined(CONFIG_MACH_SKATE) || defined(CONFIG_MACH_NOVA)||defined(CONFIG_MACH_BLADE2)||defined(CONFIG_MACH_ROAMER)||defined(CONFIG_MACH_BLUETICK) rc = gpio_request(31, "touch voltage"); if (rc) { pr_err("%s: unable to request gpio 89 (%d)\n", @@ -56,6 +69,7 @@ else gpio_direction_output(31, 0); gpio_free(31); #else + //ZTE_TS_HJY_20110223 END rc = gpio_request(109, "touch voltage"); if (rc) { pr_err("%s: unable to request gpio 109 (%d)\n", @@ -74,6 +88,7 @@ else struct atmel_i2c_platform_data atmel_data = { + /*ZTE_TS_ZFJ_20110221 begin*/ #if defined(CONFIG_MACH_TURIES) .version = 0x16, .source = 1, @@ -92,8 +107,8 @@ struct atmel_i2c_platform_data atmel_data = { .config_T7[2] = 25, .config_T8[0] = 6, .config_T8[1] = 0, - .config_T8[2] = 20, - .config_T8[3] = 20, + .config_T8[2] = 10, + .config_T8[3] = 10, .config_T8[4] = 0, .config_T8[5] = 0, .config_T8[6] = 10, @@ -109,8 +124,8 @@ struct atmel_i2c_platform_data atmel_data = { .config_T9[6] = 17, .config_T9[7] = 30, .config_T9[8] = 3, - //.config_T9[9] = 6, - .config_T9[9] = 4, + //.config_T9[9] = 6,//横屏 + .config_T9[9] = 4, //竖屏 .config_T9[10] = 10, .config_T9[11] = 3, .config_T9[12] = 3, @@ -131,9 +146,9 @@ struct atmel_i2c_platform_data atmel_data = { .config_T9[27] = 16, .config_T9[28] = 80, .config_T9[29] = 32, - .config_T9[30] = 15, + .config_T9[30] = 15, //jump limit .config_T9[31] = 0, - .config_T15[0] = 0, + .config_T15[0] = 0, //virtual key .config_T15[1] = 0, .config_T15[2] = 0, .config_T15[3] = 0, @@ -182,7 +197,7 @@ struct atmel_i2c_platform_data atmel_data = { .config_T22[5] = 0xe7, .config_T22[6] = 0xff, .config_T22[7] = 8, - .config_T22[8] = 20, + .config_T22[8] = 20, //50 to 20 .config_T22[9] = 0, .config_T22[10] = 1, .config_T22[11] = 5, @@ -271,6 +286,215 @@ struct atmel_i2c_platform_data atmel_data = { .filter_level[3] = 100, .display_width = 1024, /* display width in pixel */ .display_height = 1024, /* display height in pixel */ + +#elif defined(CONFIG_MACH_BLUETICK) + .version = 0x16, + .source = 1, + .abs_x_min = 0, + .abs_x_max = 479, + .abs_y_min = 0, + .abs_y_max = 799, + .abs_pressure_min = 0, + .abs_pressure_max = 255, + .abs_width_min = 0, + .abs_width_max = 15, + .gpio_irq = 29, + .power = atmel_platform_power, + .config_T7[0] = 50, + .config_T7[1] = 255, + .config_T7[2] = 25, + .config_T8[0] = 10, + .config_T8[1] = 0, + .config_T8[2] = 10, + .config_T8[3] = 10, + .config_T8[4] = 0, + .config_T8[5] = 0, + .config_T8[6] = 10, + .config_T8[7] = 10, + .config_T8[8] = 0, + .config_T8[9] = 0, + .config_T9[0] = 131, + .config_T9[1] = 0, + .config_T9[2] = 2, + .config_T9[3] = 15, + .config_T9[4] = 9, + .config_T9[5] = 0, + .config_T9[6] = 16, + .config_T9[7] = 45, + .config_T9[8] = 2, + //.config_T9[9] = 6,//横屏 + .config_T9[9] = 7, //竖屏 + .config_T9[10] = 0, + .config_T9[11] = 6, + .config_T9[12] = 6, + .config_T9[13] = 79, + .config_T9[14] = 2, + .config_T9[15] = 10, + .config_T9[16] = 30, + .config_T9[17] = 30, + .config_T9[18] = 0x83, + .config_T9[19] = 3, + .config_T9[20] = 0xdf, + .config_T9[21] = 1, + .config_T9[22] = 5, + .config_T9[23] = 5, + .config_T9[24] = 28, + .config_T9[25] = 28, + .config_T9[26] = 208, + .config_T9[27] = 64, + .config_T9[28] = 208, + .config_T9[29] = 85, + + .config_T9[30] = 15, //jump limit + .config_T9[31] = 12, + .config_T15[0] = 0, //virtual key + .config_T15[1] = 0, + .config_T15[2] = 0, + .config_T15[3] = 0, + .config_T15[4] = 0, + .config_T15[5] = 0, + .config_T15[6] = 0, + .config_T15[7] = 250, + .config_T15[8] = 0, + .config_T15[9] = 0, + .config_T15[10] = 0, + .config_T18[0] = 0, + .config_T18[1] = 0, + .config_T19[0] = 0, + .config_T19[1] = 0, + .config_T19[2] = 0, + .config_T19[3] = 0, + .config_T19[4] = 52, + .config_T19[5] = 0, + .config_T19[6] = 0, + .config_T19[7] = 0, + .config_T19[8] = 0, + .config_T19[9] = 0, + .config_T19[10] = 0, + .config_T19[11] = 0, + .config_T19[12] = 0, + .config_T19[13] = 0, + .config_T19[14] = 0, + .config_T19[15] = 0, + .config_T20[0] = 25, + .config_T20[1] = 0, + .config_T20[2] = 0, + .config_T20[3] = 1, + .config_T20[4] = 1, + .config_T20[5] = 8, + .config_T20[6] = 0, + .config_T20[7] = 10, + .config_T20[8] = 30, + .config_T20[9] = 4, + .config_T20[10] = 15, + .config_T20[11] = 0, + .config_T22[0] = 0x0d, + .config_T22[1] = 0, + .config_T22[2] = 0, + .config_T22[3] = 0x19, + .config_T22[4] = 0x00, + .config_T22[5] = 0xe7, + .config_T22[6] = 0xff, + .config_T22[7] = 8, + .config_T22[8] = 25, //50 to 20 + .config_T22[9] = 0, + .config_T22[10] = 1, + .config_T22[11] = 19, + .config_T22[12] = 0, + .config_T22[13] = 25, + .config_T22[14] = 45, + .config_T22[15] = 0, + .config_T22[16] = 8, + .config_T23[0] = 0, + .config_T23[1] = 0, + .config_T23[2] = 0, + .config_T23[3] = 0, + .config_T23[4] = 0, + .config_T23[5] = 0, + .config_T23[6] = 0, + .config_T23[7] = 0, + .config_T23[8] = 0, + .config_T23[9] = 0, + .config_T23[10] = 0, + .config_T23[11] = 0, + .config_T23[12] = 0, + .config_T23[13] = 0, + .config_T23[14] = 0, + .config_T24[0] = 0, + .config_T24[1] = 0, + .config_T24[2] = 0, + .config_T24[3] = 0, + .config_T24[4] = 0, + .config_T24[5] = 0, + .config_T24[6] = 0, + .config_T24[7] = 0, + .config_T24[8] = 0, + .config_T24[9] = 0, + .config_T24[10] = 0, + .config_T24[11] = 0, + .config_T24[12] = 0, + .config_T24[13] = 0, + .config_T24[14] = 0, + .config_T24[15] = 0, + .config_T24[16] = 0, + .config_T24[17] = 0, + .config_T24[18] = 0, + .config_T25[0] = 3, + .config_T25[1] = 0, + .config_T25[2] = 0xe0, + .config_T25[3] = 0x2e, + .config_T25[4] = 0x38, + .config_T25[5] = 0x13, + .config_T25[6] = 0xe0, + .config_T25[7] = 0x27, + .config_T25[8] = 0x70, + .config_T25[9] = 0x17, +#if 0 + .config_T27[0] = 0, + .config_T27[1] = 1, + .config_T27[2] = 0, + .config_T27[3] = 0, + .config_T27[4] = 0, + .config_T27[5] = 0, + .config_T27[6] = 0, +#endif + .config_T28[0] = 0, + .config_T28[1] = 0, + .config_T28[2] = 2, + .config_T28[3] = 16, + .config_T28[4] = 16, + .config_T28[5] = 0x1e, +#ifdef CONFIG_TS_NOTIFIER + .config_T9_charge[0] = 70,//10 //t9[7] + .config_T9_charge[1] = 0,//10 //t9[31] + .config_T9_charge[2] = 10,//10 //t9[11] + .config_T9_charge[3] = 10,//10 //t9[12] + .config_T28_charge[0] = 32,//0x0a + .config_T28_charge[1] = 32,//0x0a +#endif + + .object_crc[0] = 117, + .object_crc[1] = 8, + .object_crc[2] = 119, + /*.cable_config[0] = config_T9[7], + .cable_config[1] = config_T22[8], + .cable_config[2] = config_T28[3], + .cable_config[3] = config_T28[4],*/ + .cable_config[0] = 30, + .cable_config[1] = 20, + .cable_config[2] = 4, + .cable_config[3] = 8, + .GCAF_level[0] = 4, + .GCAF_level[1] = 16, + .GCAF_level[2] = 0, + .GCAF_level[3] = 0, + .filter_level[0] = 100, + .filter_level[1] = 100, + .filter_level[2] = 100, + .filter_level[3] = 100, + .display_width = 1024, /* display width in pixel */ + .display_height = 1024, /* display height in pixel */ + #elif defined(CONFIG_MACH_SAILBOAT) .version = 0x16, .source = 1, @@ -289,8 +513,8 @@ struct atmel_i2c_platform_data atmel_data = { .config_T7[2] = 25, .config_T8[0] = 6, .config_T8[1] = 0, -.config_T8[2] = 20, -.config_T8[3] = 20, +.config_T8[2] = 10, +.config_T8[3] = 10, .config_T8[4] = 190, .config_T8[5] = 0, .config_T8[6] = 10, @@ -304,18 +528,18 @@ struct atmel_i2c_platform_data atmel_data = { .config_T9[4] = 9, .config_T9[5] = 0, .config_T9[6] = 16, -.config_T9[7] = 35, +.config_T9[7] = 45, .config_T9[8] = 2, -//.config_T9[9] = 6, -.config_T9[9] = 3, +//.config_T9[9] = 6,//横屏 +.config_T9[9] = 3, //竖屏 .config_T9[10] = 0, -.config_T9[11] = 5, -.config_T9[12] = 3, -.config_T9[13] = 32, +.config_T9[11] = 6, +.config_T9[12] = 6, +.config_T9[13] = 79, .config_T9[14] = 2, .config_T9[15] = 10, .config_T9[16] = 30, -.config_T9[17] = 50, +.config_T9[17] = 30, .config_T9[18] = 0xfe, .config_T9[19] = 1, .config_T9[20] = 0x3f, @@ -324,20 +548,20 @@ struct atmel_i2c_platform_data atmel_data = { .config_T9[23] = 0, .config_T9[24] = 10, .config_T9[25] = 10, -.config_T9[26] = 0, +.config_T9[26] = 0x40, .config_T9[27] = 0, .config_T9[28] = 0, .config_T9[29] = 0, -.config_T9[30] = 15, -.config_T9[31] = 0, -.config_T15[0] = 0, +.config_T9[30] = 15, //jump limit +.config_T9[31] = 5, +.config_T15[0] = 0, //virtual key .config_T15[1] = 0, .config_T15[2] = 0, .config_T15[3] = 0, .config_T15[4] = 0, .config_T15[5] = 0, .config_T15[6] = 0, -.config_T15[7] = 250, +.config_T15[7] = 0, .config_T15[8] = 0, .config_T15[9] = 0, .config_T15[10] = 0, @@ -347,7 +571,7 @@ struct atmel_i2c_platform_data atmel_data = { .config_T19[1] = 0, .config_T19[2] = 0, .config_T19[3] = 0, -.config_T19[4] = 52, +.config_T19[4] = 0, .config_T19[5] = 0, .config_T19[6] = 0, .config_T19[7] = 0, @@ -360,16 +584,16 @@ struct atmel_i2c_platform_data atmel_data = { .config_T19[14] = 0, .config_T19[15] = 0, .config_T20[0] = 25, -.config_T20[1] = 0, -.config_T20[2] = 0, +.config_T20[1] = 1, +.config_T20[2] = 1, .config_T20[3] = 1, .config_T20[4] = 1, -.config_T20[5] = 8, +.config_T20[5] = 0, .config_T20[6] = 0, -.config_T20[7] = 10, -.config_T20[8] = 30, -.config_T20[9] = 4, -.config_T20[10] = 15, +.config_T20[7] = 0, +.config_T20[8] = 0, +.config_T20[9] = 0, +.config_T20[10] = 0, .config_T20[11] = 0, .config_T22[0] = 0x0d, .config_T22[1] = 0, @@ -379,14 +603,14 @@ struct atmel_i2c_platform_data atmel_data = { .config_T22[5] = 0xe7, .config_T22[6] = 0xff, .config_T22[7] = 8, -.config_T22[8] = 25, +.config_T22[8] = 25, //50 to 20 .config_T22[9] = 0, .config_T22[10] = 1, -.config_T22[11] = 3, -.config_T22[12] = 8, -.config_T22[13] = 13, -.config_T22[14] = 18, -.config_T22[15] = 28, +.config_T22[11] = 17, +.config_T22[12] = 31, +.config_T22[13] = 37, +.config_T22[14] = 57, +.config_T22[15] = 69, .config_T22[16] = 8, .config_T23[0] = 0, .config_T23[1] = 0, @@ -422,7 +646,7 @@ struct atmel_i2c_platform_data atmel_data = { .config_T24[16] = 0, .config_T24[17] = 0, .config_T24[18] = 0, -.config_T25[0] = 3, +.config_T25[0] = 0, .config_T25[1] = 0, .config_T25[2] = 0xe0, .config_T25[3] = 0x2e, @@ -444,9 +668,18 @@ struct atmel_i2c_platform_data atmel_data = { .config_T28[0] = 0, .config_T28[1] = 0, .config_T28[2] = 1, -.config_T28[3] = 24, -.config_T28[4] = 24, +.config_T28[3] = 16, +.config_T28[4] = 16, .config_T28[5] = 0x1e, +#ifdef CONFIG_TS_NOTIFIER + .config_T9_charge[0] = 70,//10 //t9[7] + .config_T9_charge[1] = 0,//10 //t9[31] + .config_T9_charge[2] = 10,//10 //t9[11] + .config_T9_charge[3] = 10,//10 //t9[12] + .config_T28_charge[0] = 32,//0x0a + .config_T28_charge[1] = 32,//0x0a +#endif + .object_crc[0] = 117, .object_crc[1] = 8, .object_crc[2] = 119, @@ -475,11 +708,11 @@ struct atmel_i2c_platform_data atmel_data = { //.abs_x_min = 0, //.abs_x_max = 239, //.abs_y_min = 0, - //.abs_y_max = 379, + //.abs_y_max = 379,//320+60 for v-key .abs_x_min = 0, .abs_x_max = 239, .abs_y_min = 0, - .abs_y_max = 319, + .abs_y_max = 319,//320+60 for v-key .abs_pressure_min = 0, .abs_pressure_max = 255, .abs_width_min = 0, @@ -491,8 +724,8 @@ struct atmel_i2c_platform_data atmel_data = { .config_T7[2] = 25, .config_T8[0] = 6, .config_T8[1] = 0, - .config_T8[2] = 20, - .config_T8[3] = 20, + .config_T8[2] = 10, + .config_T8[3] = 10, .config_T8[4] = 0, .config_T8[5] = 0, .config_T8[6] = 10, @@ -504,13 +737,13 @@ struct atmel_i2c_platform_data atmel_data = { .config_T9[2] = 3, .config_T9[3] = 11, .config_T9[4] = 9, - .config_T9[5] = 0, + .config_T9[5] = 0,//??????????????????????????????1 0 .config_T9[6] = 16, .config_T9[7] = 35, .config_T9[8] = 2, - .config_T9[9] = 7, - //.config_T9[9] = 6, - //.config_T9[9] = 4, + .config_T9[9] = 7,//全部转一遍 + //.config_T9[9] = 6,//横屏 + //.config_T9[9] = 4, //竖屏 .config_T9[10] = 0, .config_T9[11] = 5, .config_T9[12] = 2, @@ -531,13 +764,13 @@ struct atmel_i2c_platform_data atmel_data = { .config_T9[23] = 0, .config_T9[24] = 0, .config_T9[25] = 0, - .config_T9[26] = 0, + .config_T9[26] = 0x40, .config_T9[27] = 0, .config_T9[28] = 0, .config_T9[29] = 0, - .config_T9[30] = 30, + .config_T9[30] = 30, //jump limit .config_T9[31] = 0, - .config_T15[0] = 131, + .config_T15[0] = 131, //virtual key .config_T15[1] = 0, .config_T15[2] = 2, .config_T15[3] = 2, @@ -586,7 +819,7 @@ struct atmel_i2c_platform_data atmel_data = { .config_T22[5] = 0xe7, .config_T22[6] = 0xff, .config_T22[7] = 8, - .config_T22[8] = 20, + .config_T22[8] = 20, //50 to 20 .config_T22[9] = 0, .config_T22[10] = 1, .config_T22[11] = 5, @@ -708,8 +941,8 @@ struct atmel_i2c_platform_data atmel_data = { .config_T9[6] = 1, .config_T9[7] = 35, .config_T9[8] = 3, - //.config_T9[9] = 6, - .config_T9[9] = 3, + //.config_T9[9] = 6,//横屏 + .config_T9[9] = 3, //竖屏 .config_T9[10] = 10, .config_T9[11] = 10, .config_T9[12] = 2, @@ -861,6 +1094,7 @@ struct atmel_i2c_platform_data atmel_data = { .display_height = 1024, /* display height in pixel */ #elif defined(CONFIG_MACH_SKATE) +#if defined(CONFIG_TOUCHSCREEN_MXT224_P743F) .version = 0x16, .source = 1, .abs_x_min = 0, @@ -874,34 +1108,34 @@ struct atmel_i2c_platform_data atmel_data = { .gpio_irq = 29, .power = atmel_platform_power, .config_T7[0] = 0x40, -.config_T7[1] = 255, +.config_T7[1] = 255,//255, .config_T7[2] = 25, .config_T8[0] = 8, .config_T8[1] = 0, -.config_T8[2] = 20, -.config_T8[3] = 20, +.config_T8[2] = 10, +.config_T8[3] = 10, .config_T8[4] = 0, .config_T8[5] = 0, -.config_T8[6] = 5, -.config_T8[7] = 15, +.config_T8[6] = 5,//9, +.config_T8[7] = 15,//0x0f, .config_T8[8] = 0, .config_T8[9] = 0, -.config_T9[0] = 0x8b, +.config_T9[0] = 0x8b,//0x8f .config_T9[1] = 0, .config_T9[2] = 0, -.config_T9[3] = 0x12, -.config_T9[4] = 0x0c, +.config_T9[3] = 0x12,//hwrev>5 +.config_T9[4] = 0x0b,//hwrev>5 .config_T9[5] = 1, .config_T9[6] = 33, -.config_T9[7] = 45, +.config_T9[7] = 40, .config_T9[8] = 2, -//.config_T9[9] = 6, -.config_T9[9] = 7, +//.config_T9[9] = 6,//横屏 +.config_T9[9] = 7, //竖屏 .config_T9[10] = 0, -.config_T9[11] = 6, -.config_T9[12] = 3, -.config_T9[13] = 0x3e, -.config_T9[14] = 5, +.config_T9[11] = 6,//move init +.config_T9[12] = 3,//move next +.config_T9[13] = 0x3e,//5 +.config_T9[14] = 5,//2->5 20110613 .config_T9[15] = 10, .config_T9[16] = 50, .config_T9[17] = 30, @@ -913,28 +1147,28 @@ struct atmel_i2c_platform_data atmel_data = { .config_T9[19] = 3, .config_T9[20] = 223, .config_T9[21] = 1, -//.config_T9[18] = 223, -//.config_T9[19] = 1, -//.config_T9[20] = 31, -//.config_T9[21] = 3, +//.config_T9[18] = 223,//31, +//.config_T9[19] = 1,//3, +//.config_T9[20] = 31,//223, +//.config_T9[21] = 3,//1, .config_T9[22] = 13, .config_T9[23] = 16, -.config_T9[24] = 33, +.config_T9[24] = 34, .config_T9[25] = 33, .config_T9[26] = 0xd0, .config_T9[27] = 42, .config_T9[28] = 0x90, .config_T9[29] = 63, -.config_T9[30] = 20, +.config_T9[30] = 20,//10 .config_T9[31] = 12, .config_T15[0] = 0, .config_T15[1] = 0, .config_T15[2] = 0, -.config_T15[3] = 0, +.config_T15[3] = 0,//4 .config_T15[4] = 0, .config_T15[5] = 0, .config_T15[6] = 0, -.config_T15[7] = 0, +.config_T15[7] = 0,//25 .config_T15[8] = 0, .config_T18[0] = 0, .config_T18[1] = 0, @@ -950,12 +1184,12 @@ struct atmel_i2c_platform_data atmel_data = { .config_T19[9] = 0, .config_T19[10] = 0, .config_T19[11] = 0, -.config_T20[0] = 25, +.config_T20[0] = 25,//0x13, .config_T20[1] = 2, .config_T20[2] = 2, .config_T20[3] = 2, .config_T20[4] = 2, -.config_T20[5] = 0, +.config_T20[5] = 0,//max finger number disable this for fix a bug .config_T20[6] = 0, .config_T20[7] = 0, .config_T20[8] = 0, @@ -1033,8 +1267,16 @@ struct atmel_i2c_platform_data atmel_data = { .config_T28[1] = 0, .config_T28[2] = 2, .config_T28[3] = 16, -.config_T28[4] = 16, -.config_T28[5] = 30, +.config_T28[4] = 16,//32, +.config_T28[5] = 30,//0x0a +#ifdef CONFIG_TS_NOTIFIER + .config_T9_charge[0] = 70,//10 //t9[7] + .config_T9_charge[1] = 0,//10 + .config_T9_charge[2] = 10,//10 + .config_T9_charge[3] = 10,//10 + .config_T28_charge[0] = 32,//0x0a + .config_T28_charge[1] = 32,//0x0a +#endif .object_crc[0] = 117, .object_crc[1] = 8, .object_crc[2] = 119, @@ -1056,86 +1298,89 @@ struct atmel_i2c_platform_data atmel_data = { .filter_level[3] = 100, .display_width = 1024, /* display width in pixel */ .display_height = 1024, /* display height in pixel */ - /*ZTE_TS_ZFJ_20110425 begin*/ -#elif defined(CONFIG_MACH_NOVA) -.version = 0x16, + +#else + .version = 0x16, .source = 1, .abs_x_min = 0, -.abs_x_max = 479, -.abs_y_min = 0, -.abs_y_max = 319, -.abs_pressure_min = 0, -.abs_pressure_max = 255, -.abs_width_min = 0, -.abs_width_max = 15, -.gpio_irq = 29, + .abs_x_max = 479, + .abs_y_min = 0, + .abs_y_max = 799, + .abs_pressure_min = 0, + .abs_pressure_max = 255, + .abs_width_min = 0, + .abs_width_max = 15, + .gpio_irq = 29, .power = atmel_platform_power, -.config_T7[0] = 0x32, -.config_T7[1] = 255, +.config_T7[0] = 0x40, +.config_T7[1] = 255,//255, .config_T7[2] = 25, -.config_T8[0] = 6, +.config_T8[0] = 8, .config_T8[1] = 0, -.config_T8[2] = 20, -.config_T8[3] = 20, +.config_T8[2] = 10, +.config_T8[3] = 10, .config_T8[4] = 0, .config_T8[5] = 0, -.config_T8[6] = 5, -.config_T8[7] = 0x0a, -.config_T9[0] = 0x83, +.config_T8[6] = 5,//9, +.config_T8[7] = 15,//0x0f, +.config_T8[8] = 0, +.config_T8[9] = 0, +.config_T9[0] = 0x8b,//0x8f .config_T9[1] = 0, -.config_T9[2] = 2, -.config_T9[3] = 0xD, -.config_T9[4] = 9, -.config_T9[5] = 0x01, -.config_T9[6] = 16, -.config_T9[7] = 35, -.config_T9[8] = 3, -//.config_T9[9] = 6, -.config_T9[9] = 3, +.config_T9[2] = 0, +.config_T9[3] = 0x12,//hwrev>5 +.config_T9[4] = 0x0c,//hwrev>5 +.config_T9[5] = 1, +.config_T9[6] = 33, +.config_T9[7] = 40, +.config_T9[8] = 2, +//.config_T9[9] = 6,//横屏 +.config_T9[9] = 7, //竖屏 .config_T9[10] = 0, -.config_T9[11] = 6, -.config_T9[12] = 3, -.config_T9[13] = 0x30, -.config_T9[14] = 2, +.config_T9[11] = 6,//move init +.config_T9[12] = 3,//move next +.config_T9[13] = 0x3e,//5 +.config_T9[14] = 5,//2->5 20110613 .config_T9[15] = 10, -.config_T9[16] = 30, -.config_T9[17] = 10, +.config_T9[16] = 50, +.config_T9[17] = 30, //.config_T9[18] = 0xff, //.config_T9[19] = 3, //.config_T9[20] = 0x57, //.config_T9[21] = 2, -.config_T9[18] = 0x40, -.config_T9[19] = 0x01, -.config_T9[20] = 0xdf, -.config_T9[21] = 0x01, -//.config_T9[18] = 223, -//.config_T9[19] = 1, -//.config_T9[20] = 31, -//.config_T9[21] = 3, -.config_T9[22] = 1, -.config_T9[23] = 1, -.config_T9[24] = 20, -.config_T9[25] = 20, -.config_T9[26] = 0x40, -.config_T9[27] = 0, -.config_T9[28] = 0, -.config_T9[29] = 0, -.config_T9[30] = 20, -.config_T15[0] = 131, +.config_T9[18] = 31, +.config_T9[19] = 3, +.config_T9[20] = 223, +.config_T9[21] = 1, +//.config_T9[18] = 223,//31, +//.config_T9[19] = 1,//3, +//.config_T9[20] = 31,//223, +//.config_T9[21] = 3,//1, +.config_T9[22] = 13, +.config_T9[23] = 16, +.config_T9[24] = 33, +.config_T9[25] = 33, +.config_T9[26] = 0xd0, +.config_T9[27] = 42, +.config_T9[28] = 0x90, +.config_T9[29] = 63, +.config_T9[30] = 20,//10 + .config_T9[31] = 12, +.config_T15[0] = 0, .config_T15[1] = 0, -.config_T15[2] = 11, -.config_T15[3] = 4, -.config_T15[4] = 1, -.config_T15[5] = 1, +.config_T15[2] = 0, +.config_T15[3] = 0,//4 +.config_T15[4] = 0, +.config_T15[5] = 0, .config_T15[6] = 0, -.config_T15[7] = 35, +.config_T15[7] = 0,//25 .config_T15[8] = 0, .config_T18[0] = 0, .config_T18[1] = 0, .config_T19[0] = 0, .config_T19[1] = 0, .config_T19[2] = 0, -.config_T19[3] = 52, +.config_T19[3] = 0, .config_T19[4] = 0, .config_T19[5] = 0, .config_T19[6] = 0, @@ -1144,12 +1389,12 @@ struct atmel_i2c_platform_data atmel_data = { .config_T19[9] = 0, .config_T19[10] = 0, .config_T19[11] = 0, -.config_T20[0] = 25, +.config_T20[0] = 25,//0x13, .config_T20[1] = 2, .config_T20[2] = 2, .config_T20[3] = 2, .config_T20[4] = 2, -.config_T20[5] = 5, +.config_T20[5] = 0,//max finger number disable this for fix a bug .config_T20[6] = 0, .config_T20[7] = 0, .config_T20[8] = 0, @@ -1159,19 +1404,20 @@ struct atmel_i2c_platform_data atmel_data = { .config_T22[0] = 0x0d, .config_T22[1] = 0, .config_T22[2] = 0, -.config_T22[3] = 0x19, -.config_T22[4] = 0x0, -.config_T22[5] = 0xE7, -.config_T22[6] = 0xFF, -.config_T22[7] = 8, + .config_T22[3] = 0x19, + .config_T22[4] = 0x00, + .config_T22[5] = 0xe7, + .config_T22[6] = 0xff, + +.config_T22[7] = 16, .config_T22[8] = 25, .config_T22[9] = 0, -.config_T22[10] = 1, -.config_T22[11] = 11, -.config_T22[12] = 15, -.config_T22[13] = 36, -.config_T22[14] = 45, -.config_T22[15] = 55, +.config_T22[10] = 2, +.config_T22[11] = 25, +.config_T22[12] = 53, +.config_T22[13] = 21, +.config_T22[14] = 8, +.config_T22[15] = 63, .config_T22[16] = 3, .config_T23[0] = 0, .config_T23[1] = 0, @@ -1207,28 +1453,223 @@ struct atmel_i2c_platform_data atmel_data = { .config_T24[18] = 0, .config_T25[0] = 0, .config_T25[1] = 0, -.config_T25[2] = 0, -.config_T25[3] = 0, -.config_T25[4] = 0, -.config_T25[5] = 0, -.config_T25[5] = 0, -.config_T25[6] = 0, -.config_T25[7] = 0, -.config_T25[8] = 0, -.config_T25[9] = 0, -.config_T27[0] = 0, -.config_T27[1] = 1, -.config_T27[2] = 0, -.config_T27[3] = 0, -.config_T27[4] = 0, -.config_T27[5] = 0, -.config_T27[6] = 0, +.config_T25[2] = 0xe0, +.config_T25[3] = 0x2e, +.config_T25[4] = 0x58, +.config_T25[5] = 0x1b, +.config_T25[6] = 0xe0, +.config_T25[7] = 0x2e, +.config_T25[8] = 0x58, +.config_T25[9] = 0x1b, +.config_T27[0] = 0, +.config_T27[1] = 1, +.config_T27[2] = 0, +.config_T27[3] = 0, +.config_T27[4] = 0, +.config_T27[5] = 0, +.config_T27[6] = 0, +.config_T28[0] = 0, +.config_T28[1] = 0, +.config_T28[2] = 2, +.config_T28[3] = 16, +.config_T28[4] = 16,//32, +.config_T28[5] = 30,//0x0a +#ifdef CONFIG_TS_NOTIFIER + .config_T9_charge[0] = 70,//10 //t9[7] + .config_T9_charge[1] = 0,//10 + .config_T9_charge[2] = 10,//10 + .config_T9_charge[3] = 10,//10 + .config_T28_charge[0] = 32,//0x0a + .config_T28_charge[1] = 32,//0x0a +#endif +.object_crc[0] = 117, +.object_crc[1] = 8, +.object_crc[2] = 119, +/*.cable_config[0] = config_T9[7], +.cable_config[1] = config_T22[8], +.cable_config[2] = config_T28[3], +.cable_config[3] = config_T28[4],*/ +.cable_config[0] = 30, +.cable_config[1] = 20, +.cable_config[2] = 4, +.cable_config[3] = 8, +.GCAF_level[0] = 4, +.GCAF_level[1] = 16, +.GCAF_level[2] = 0, +.GCAF_level[3] = 0, +.filter_level[0] = 100, +.filter_level[1] = 100, +.filter_level[2] = 100, +.filter_level[3] = 100, + .display_width = 1024, /* display width in pixel */ + .display_height = 1024, /* display height in pixel */ + #endif + /*ZTE_TS_ZFJ_20110425 begin*/ +#elif defined(CONFIG_MACH_NOVA) +.version = 0x16, +.source = 1, +.abs_x_min = 0, +.abs_x_max = 319, +.abs_y_min = 0, +.abs_y_max = 479, +.abs_pressure_min = 0, +.abs_pressure_max = 255, +.abs_width_min = 0, +.abs_width_max = 15, +.gpio_irq = 29, +.power = atmel_platform_power, +.config_T7[0] = 0x32, +.config_T7[1] = 12, +.config_T7[2] = 25, +.config_T8[0] = 8, +.config_T8[1] = 0, +.config_T8[2] = 10, +.config_T8[3] = 10, +.config_T8[4] = 0, +.config_T8[5] = 0, +.config_T8[6] = 10,//9, +.config_T8[7] = 0x0a,//0x0f, +.config_T9[0] = 0x83,//0x8f +.config_T9[1] = 0, +.config_T9[2] = 2, +.config_T9[3] = 0xD,//hwrev>5 +.config_T9[4] = 9,//hwrev>5 +.config_T9[5] = 0x01,//AKSCFG +.config_T9[6] = 16, +.config_T9[7] = 35, +.config_T9[8] = 3, //2 touch detect integration 05-19 +//.config_T9[9] = 6,//横屏 +.config_T9[9] = 3, //竖屏 +.config_T9[10] = 0, +.config_T9[11] = 6, //3 05-19 +.config_T9[12] = 3, //1 05-19 +.config_T9[13] = 0x30,//5 +.config_T9[14] = 2, +.config_T9[15] = 10, +.config_T9[16] = 35, //20 05-19 +.config_T9[17] = 20, +.config_T9[18] = 0xdf,//480 low 16bits +.config_T9[19] = 0x01,// 480 high 16bits +.config_T9[20] = 0x3f, +.config_T9[21] = 0x01, + .config_T9[22] = 17, + .config_T9[23] = 15, + .config_T9[24] = 10, + .config_T9[25] = 10, + .config_T9[26] = 208, + .config_T9[27] = 63, + .config_T9[28] = 0x40, + .config_T9[29] = 0, + .config_T9[30] = 20,//10 + .config_T9[31] = 9, +.config_T15[0] = 131, +.config_T15[1] = 0, +.config_T15[2] = 11, +.config_T15[3] = 4,//4 +.config_T15[4] = 1, +.config_T15[5] = 1, +.config_T15[6] = 0, +.config_T15[7] = 35,//25 +.config_T15[8] = 0, +.config_T18[0] = 0, +.config_T18[1] = 0, +.config_T19[0] = 0, +.config_T19[1] = 0, +.config_T19[2] = 0, +.config_T19[3] = 52, +.config_T19[4] = 0, +.config_T19[5] = 0, +.config_T19[6] = 0, +.config_T19[7] = 0, +.config_T19[8] = 0, +.config_T19[9] = 0, +.config_T19[10] = 0, +.config_T19[11] = 0, +.config_T20[0] = 25,//0x13, +.config_T20[1] = 1, +.config_T20[2] = 1, +.config_T20[3] = 1, +.config_T20[4] = 1, +.config_T20[5] = 0,//max finger number +.config_T20[6] = 0, +.config_T20[7] = 0, +.config_T20[8] = 0, +.config_T20[9] = 0, +.config_T20[10] = 0, +.config_T20[11] = 0, +.config_T22[0] = 0x0d, +.config_T22[1] = 0, +.config_T22[2] = 0, +.config_T22[3] = 0x19,//?? +.config_T22[4] = 0x0,//?? +.config_T22[5] = 0xE7,//?? +.config_T22[6] = 0xFF,//?? +.config_T22[7] = 8, +.config_T22[8] = 25, +.config_T22[9] = 0, +.config_T22[10] = 1, + .config_T22[11] = 24, + .config_T22[12] = 51, + .config_T22[13] = 13, + .config_T22[14] = 25, + .config_T22[15] = 0, +.config_T22[16] = 3, +.config_T23[0] = 0, +.config_T23[1] = 0, +.config_T23[2] = 0, +.config_T23[3] = 0, +.config_T23[4] = 0, +.config_T23[5] = 0, +.config_T23[6] = 0, +.config_T23[7] = 0, +.config_T23[8] = 0, +.config_T23[9] = 0, +.config_T23[10] = 0, +.config_T23[11] = 0, +.config_T23[12] = 0, +.config_T24[0] = 0, +.config_T24[1] = 0, +.config_T24[2] = 0, +.config_T24[3] = 0, +.config_T24[4] = 0, +.config_T24[5] = 0, +.config_T24[6] = 0, +.config_T24[7] = 0, +.config_T24[8] = 0, +.config_T24[9] = 0, +.config_T24[10] = 0, +.config_T24[11] = 0, +.config_T24[12] = 0, +.config_T24[13] = 0, +.config_T24[14] = 0, +.config_T24[15] = 0, +.config_T24[16] = 0, +.config_T24[17] = 0, +.config_T24[18] = 0, +.config_T25[0] = 0, +.config_T25[1] = 0, +.config_T25[2] = 0, +.config_T25[3] = 0, +.config_T25[4] = 0, +.config_T25[5] = 0, +.config_T25[5] = 0, +.config_T25[6] = 0, +.config_T25[7] = 0, +.config_T25[8] = 0, +.config_T25[9] = 0, +.config_T27[0] = 0, +.config_T27[1] = 1, +.config_T27[2] = 0, +.config_T27[3] = 0, +.config_T27[4] = 0, +.config_T27[5] = 0, +.config_T27[6] = 0, .config_T28[0] = 0, .config_T28[1] = 0, .config_T28[2] = 0, -.config_T28[3] = 32, -.config_T28[4] = 32, -.config_T28[5] = 0, +.config_T28[3] = 16, +.config_T28[4] = 16,//32, +.config_T28[5] = 0,//0x0a .object_crc[0] = 117, .object_crc[1] = 8, .object_crc[2] = 119, @@ -1252,6 +1693,7 @@ struct atmel_i2c_platform_data atmel_data = { .display_height = 1024, /* display height in pixel */ /*ZTE_TS_ZFJ_20110425 end*/ #elif defined(CONFIG_MACH_BLADE2) +#ifdef CONFIG_TOUCHSCREEN_MXT224_P736V .version = 0x16, .source = 1, .abs_x_min = 0, @@ -1267,67 +1709,278 @@ struct atmel_i2c_platform_data atmel_data = { .config_T7[0] = 0x32, .config_T7[1] = 12, .config_T7[2] = 25, + .config_T8[0] = 6, + .config_T8[1] = 5, + .config_T8[2] = 10, + .config_T8[3] = 10, + .config_T8[4] = 0, + .config_T8[5] = 0, + .config_T8[6] = 10,//9, + .config_T8[7] = 6,//0x0f, + .config_T8[8] = 0,//9, + .config_T8[9] = 0,//0x0f, + + .config_T9[0] = 0x83,//0x8f + .config_T9[1] = 0, + .config_T9[2] = 2, + .config_T9[3] = 14,//hwrev>5 + .config_T9[4] = 9,//hwrev>5 + .config_T9[5] = 0,//AKSCFG + .config_T9[6] = 16, + .config_T9[7] = 45, + .config_T9[8] = 3, //2 touch detect integration 05-19 + //.config_T9[9] = 6,//横屏 + .config_T9[9] = 1, //竖屏 + .config_T9[10] = 10, + .config_T9[11] = 6, //3 05-19 + .config_T9[12] = 6, //1 05-19 + .config_T9[13] = 0x20,//5 + .config_T9[14] = 2, + .config_T9[15] = 10, + .config_T9[16] = 30, //20 05-19 + .config_T9[17] = 30, + .config_T9[18] = 0x1f, + .config_T9[19] = 3, + .config_T9[20] = 0xdf, + .config_T9[21] = 1, + //.config_T9[18] = 0x40,//320 low 16bits + //.config_T9[19] = 0x01,// 320 high 16bits + //.config_T9[20] = 0xdf, + //.config_T9[21] = 0x01, + //.config_T9[18] = 223,//31, + //.config_T9[19] = 1,//3, + //.config_T9[20] = 31,//223, + //.config_T9[21] = 3,//1, + .config_T9[22] = 15, + .config_T9[23] = 13, + .config_T9[24] = 25, + .config_T9[25] = 23, + .config_T9[26] = 208, + .config_T9[27] = 63, + .config_T9[28] = 208, + .config_T9[29] = 90, + + .config_T9[30] = 15,//10 + .config_T9[31] = 5,//10 + + .config_T15[0] = 0, + .config_T15[1] = 0, + .config_T15[2] = 0, + .config_T15[3] = 0,//4 + .config_T15[4] = 0, + .config_T15[5] = 0, + .config_T15[6] = 0, + .config_T15[7] = 0,//25 + .config_T15[8] = 0, + .config_T18[0] = 0, + .config_T18[1] = 0, + .config_T19[0] = 0, + .config_T19[1] = 0, + .config_T19[2] = 0, + .config_T19[3] = 0, + .config_T19[4] = 0, + .config_T19[5] = 0, + .config_T19[6] = 0, + .config_T19[7] = 0, + .config_T19[8] = 0, + .config_T19[9] = 0, + .config_T19[10] = 0, + .config_T19[11] = 0, + .config_T20[0] = 25,//0x13, + .config_T20[1] = 1, + .config_T20[2] = 1, + .config_T20[3] = 1, + .config_T20[4] = 1, + .config_T20[5] = 0,//max finger number + .config_T20[6] = 0, + .config_T20[7] = 0, + .config_T20[8] = 0, + .config_T20[9] = 0, + .config_T20[10] = 0, + .config_T20[11] = 0, + .config_T22[0] = 0x0d, + .config_T22[1] = 0, + .config_T22[2] = 0, + .config_T22[3] = 0x19,//?? + .config_T22[4] = 0x0,//?? + .config_T22[5] = 0xE7,//?? + .config_T22[6] = 0xFF,//?? + .config_T22[7] = 8, + .config_T22[8] = 25, + .config_T22[9] = 0, + .config_T22[10] = 1, + .config_T22[11] = 0, + .config_T22[12] = 17, + .config_T22[13] = 31, + .config_T22[14] = 57, + .config_T22[15] = 65, + .config_T22[16] = 8, + .config_T23[0] = 0, + .config_T23[1] = 0, + .config_T23[2] = 0, + .config_T23[3] = 0, + .config_T23[4] = 0, + .config_T23[5] = 0, + .config_T23[6] = 0, + .config_T23[7] = 0, + .config_T23[8] = 0, + .config_T23[9] = 0, + .config_T23[10] = 0, + .config_T23[11] = 0, + .config_T23[12] = 0, + .config_T24[0] = 0, + .config_T24[1] = 0, + .config_T24[2] = 0, + .config_T24[3] = 0, + .config_T24[4] = 0, + .config_T24[5] = 0, + .config_T24[6] = 0, + .config_T24[7] = 0, + .config_T24[8] = 0, + .config_T24[9] = 0, + .config_T24[10] = 0, + .config_T24[11] = 0, + .config_T24[12] = 0, + .config_T24[13] = 0, + .config_T24[14] = 0, + .config_T24[15] = 0, + .config_T24[16] = 0, + .config_T24[17] = 0, + .config_T24[18] = 0, + .config_T25[0] = 0, + .config_T25[1] = 0, + .config_T25[2] = 0, + .config_T25[3] = 0, + .config_T25[4] = 0, + .config_T25[5] = 0, + .config_T25[5] = 0, + .config_T25[6] = 0, + .config_T25[7] = 0, + .config_T25[8] = 0, + .config_T25[9] = 0, + .config_T27[0] = 0, + .config_T27[1] = 1, + .config_T27[2] = 0, + .config_T27[3] = 0, + .config_T27[4] = 0, + .config_T27[5] = 0, + .config_T27[6] = 0, + .config_T28[0] = 0, + .config_T28[1] = 0, + .config_T28[2] = 2, + .config_T28[3] = 16, + .config_T28[4] = 16,//32, + .config_T28[5] = 0,//0x0a +#ifdef CONFIG_TS_NOTIFIER + .config_T9_charge[0] = 70,//10 //t9[7] + .config_T9_charge[1] = 0,//10 //t9[31] + .config_T9_charge[2] = 10,//10 //t9[11] + .config_T9_charge[3] = 10,//10 //t9[12] + .config_T28_charge[0] = 32,//0x0a + .config_T28_charge[1] = 32,//0x0a +#endif + + .object_crc[0] = 117, + .object_crc[1] = 8, + .object_crc[2] = 119, +/*.cable_config[0] = config_T9[7], +.cable_config[1] = config_T22[8], +.cable_config[2] = config_T28[3], +.cable_config[3] = config_T28[4],*/ + .cable_config[0] = 30, + .cable_config[1] = 20, + .cable_config[2] = 4, + .cable_config[3] = 8, + .GCAF_level[0] = 4, + .GCAF_level[1] = 16, + .GCAF_level[2] = 0, + .GCAF_level[3] = 0, + .filter_level[0] = 100, + .filter_level[1] = 100, + .filter_level[2] = 100, + .filter_level[3] = 100, + .display_width = 1024, /* display width in pixel */ + .display_height = 1024, /* display height in pixel */ +/*ZTE_TS_ZFJ_20110425 end*/ +#else + .version = 0x16, + .source = 1, + .abs_x_min = 0, + .abs_x_max = 479, + .abs_y_min = 0, + .abs_y_max = 799, + .abs_pressure_min = 0, + .abs_pressure_max = 255, + .abs_width_min = 0, + .abs_width_max = 15, + .gpio_irq = 29, + .power = atmel_platform_power, + .config_T7[0] = 0x32, + .config_T7[1] = 255, + .config_T7[2] = 25, .config_T8[0] = 8, .config_T8[1] = 5, - .config_T8[2] = 20, - .config_T8[3] = 20, + .config_T8[2] = 10, + .config_T8[3] = 10, .config_T8[4] = 0, .config_T8[5] = 0, - .config_T8[6] = 10, - .config_T8[7] = 6, - .config_T8[8] = 0, - .config_T8[9] = 0, + .config_T8[6] = 10,//9, + .config_T8[7] = 6,//0x0f, + .config_T8[8] = 0,//9, + .config_T8[9] = 0,//0x0f, + + - .config_T9[0] = 0x83, + .config_T9[0] = 0x83,//0x8f .config_T9[1] = 0, .config_T9[2] = 2, - .config_T9[3] = 15, - .config_T9[4] = 8, - .config_T9[5] = 0, + .config_T9[3] = 15,//hwrev>5 + .config_T9[4] = 8,//hwrev>5 + .config_T9[5] = 0,//AKSCFG .config_T9[6] = 16, - .config_T9[7] = 35, - .config_T9[8] = 3, - //.config_T9[9] = 6, - .config_T9[9] = 1, + .config_T9[7] = 45, + .config_T9[8] = 3, //2 touch detect integration 05-19 + //.config_T9[9] = 6,//横屏 + .config_T9[9] = 1, //竖屏 .config_T9[10] = 10, - .config_T9[11] = 6, - .config_T9[12] = 6, - .config_T9[13] = 0x40, + .config_T9[11] = 6, //3 05-19 + .config_T9[12] = 6, //1 05-19 + .config_T9[13] = 0x20,//5 .config_T9[14] = 2, .config_T9[15] = 10, - .config_T9[16] = 30, + .config_T9[16] = 30, //20 05-19 .config_T9[17] = 30, .config_T9[18] = 0x5b, .config_T9[19] = 3, .config_T9[20] = 0xdf, .config_T9[21] = 1, - //.config_T9[18] = 0x40, - //.config_T9[19] = 0x01, + //.config_T9[18] = 0x40,//320 low 16bits + //.config_T9[19] = 0x01,// 320 high 16bits //.config_T9[20] = 0xdf, //.config_T9[21] = 0x01, - //.config_T9[18] = 223, - //.config_T9[19] = 1, - //.config_T9[20] = 31, - //.config_T9[21] = 3, + //.config_T9[18] = 223,//31, + //.config_T9[19] = 1,//3, + //.config_T9[20] = 31,//223, + //.config_T9[21] = 3,//1, .config_T9[22] = 0, .config_T9[23] = 0, - .config_T9[24] = 0, - .config_T9[25] = 0, - .config_T9[26] = 0, + .config_T9[24] = 6, + .config_T9[25] = -2, + .config_T9[26] = 0x40, .config_T9[27] = 0, .config_T9[28] = 0, .config_T9[29] = 0, - .config_T9[30] = 15, - .config_T9[31] = 9, + .config_T9[30] = 15,//10 + .config_T9[31] = 5,//10 .config_T15[0] = 0, .config_T15[1] = 0, .config_T15[2] = 0, - .config_T15[3] = 0, + .config_T15[3] = 0,//4 .config_T15[4] = 0, .config_T15[5] = 0, .config_T15[6] = 0, - .config_T15[7] = 0, + .config_T15[7] = 0,//25 .config_T15[8] = 0, .config_T18[0] = 0, .config_T18[1] = 0, @@ -1343,25 +1996,26 @@ struct atmel_i2c_platform_data atmel_data = { .config_T19[9] = 0, .config_T19[10] = 0, .config_T19[11] = 0, - .config_T20[0] = 25, + .config_T20[0] = 25,//0x13, .config_T20[1] = 1, .config_T20[2] = 1, .config_T20[3] = 1, .config_T20[4] = 1, - .config_T20[5] = 0, + .config_T20[5] = 0,//max finger number .config_T20[6] = 0, .config_T20[7] = 0, .config_T20[8] = 0, .config_T20[9] = 0, .config_T20[10] = 0, + .config_T20[11] = 0, .config_T22[0] = 0x0d, .config_T22[1] = 0, .config_T22[2] = 0, - .config_T22[3] = 0x19, - .config_T22[4] = 0x0, - .config_T22[5] = 0xE7, - .config_T22[6] = 0xFF, + .config_T22[3] = 0x19,//?? + .config_T22[4] = 0x0,//?? + .config_T22[5] = 0xE7,//?? + .config_T22[6] = 0xFF,//?? .config_T22[7] = 8, .config_T22[8] = 25, .config_T22[9] = 0, @@ -1426,8 +2080,17 @@ struct atmel_i2c_platform_data atmel_data = { .config_T28[1] = 0, .config_T28[2] = 2, .config_T28[3] = 16, - .config_T28[4] = 16, - .config_T28[5] = 0, + .config_T28[4] = 16,//32, + .config_T28[5] = 0,//0x0a +#ifdef CONFIG_TS_NOTIFIER + .config_T9_charge[0] = 70,//10 //t9[7] + .config_T9_charge[1] = 0,//10 //t9[31] + .config_T9_charge[2] = 10,//10 //t9[11] + .config_T9_charge[3] = 10,//10 //t9[12] + .config_T28_charge[0] = 32,//0x0a + .config_T28_charge[1] = 32,//0x0a +#endif + .object_crc[0] = 117, .object_crc[1] = 8, .object_crc[2] = 119, @@ -1451,7 +2114,224 @@ struct atmel_i2c_platform_data atmel_data = { .display_height = 1024, /* display height in pixel */ /*ZTE_TS_ZFJ_20110425 end*/ +#endif #elif defined(CONFIG_MACH_ROAMER) +#if defined(CONFIG_TOUCHSCREEN_MXT224_N760) + .version = 0x16, + .source = 1, + .abs_x_min = 0, + .abs_x_max = 319, + .abs_y_min = 0, + .abs_y_max = 479, + .abs_pressure_min = 0, + .abs_pressure_max = 255, + .abs_width_min = 0, + .abs_width_max = 15, + .gpio_irq = 29, + .power = atmel_platform_power, + .config_T7[0] = 50, + .config_T7[1] = 255, + .config_T7[2] = 25, + .config_T8[0] = 6, + .config_T8[1] = 0, + .config_T8[2] = 10, + .config_T8[3] = 10, + .config_T8[4] = 0, + .config_T8[5] = 0, + .config_T8[6] = 0, + .config_T8[7] = 0, + .config_T8[8] = 15, + .config_T8[9] = 0xc0, + .config_T9[0] = 131, + .config_T9[1] = 0, + .config_T9[2] = 2, + .config_T9[3] = 14, + .config_T9[4] = 9, + .config_T9[5] = 0, + .config_T9[6] = 16, + .config_T9[7] = 45, + .config_T9[8] = 3, + //.config_T9[9] = 6,//横屏 + .config_T9[9] = 1, //竖屏 + .config_T9[10] = 20, + .config_T9[11] = 6, + .config_T9[12] = 6, + .config_T9[13] = 79, + .config_T9[14] = 5, + .config_T9[15] = 10, + .config_T9[16] = 20, + .config_T9[17] = 30, + .config_T9[18] = 0xDF, + .config_T9[19] = 1, + .config_T9[20] = 0x3F, + .config_T9[21] = 1, + .config_T9[22] = 15, + .config_T9[23] = 13, + .config_T9[24] = 24, + .config_T9[25] = 21, + .config_T9[26] = 208, + .config_T9[27] = 63, + .config_T9[28] = 208, + .config_T9[29] = 90, + .config_T9[30] = 15, //jump limit + .config_T9[31] = 8, + //.config_T9[31] = 0, + .config_T15[0] = 0, //virtual key + .config_T15[1] = 0, + .config_T15[2] = 0, + .config_T15[3] = 0, + .config_T15[4] = 0, + .config_T15[5] = 0, + .config_T15[6] = 0, + .config_T15[7] = 0, + .config_T15[8] = 0, + .config_T15[9] = 0, + .config_T15[10] = 0, + .config_T18[0] = 0, + .config_T18[1] = 0, + .config_T19[0] = 0, + .config_T19[1] = 0, + .config_T19[2] = 0, + .config_T19[3] = 0, + .config_T19[4] = 0, + .config_T19[5] = 0, + .config_T19[6] = 0, + .config_T19[7] = 0, + .config_T19[8] = 0, + .config_T19[9] = 0, + .config_T19[10] = 0, + .config_T19[11] = 0, + .config_T19[12] = 0, + .config_T19[13] = 0, + .config_T19[14] = 0, + .config_T19[15] = 0, + .config_T20[0] = 0x13, + .config_T20[1] = 1, + .config_T20[2] = 1, + .config_T20[3] = 1, + .config_T20[4] = 1, + .config_T20[5] = 8, + .config_T20[6] = 0, + .config_T20[7] = 25, + .config_T20[8] = 40, + .config_T20[9] = 4, + .config_T20[10] = 15, + .config_T20[11] = 0, + .config_T22[0] = 0x0d, + .config_T22[1] = 0, + .config_T22[2] = 0, + .config_T22[3] = 0x19, + .config_T22[4] = 0x00, + .config_T22[5] = 0xe7, + .config_T22[6] = 0xff, + .config_T22[7] = 8, + .config_T22[8] = 25, //50 to 20 + .config_T22[9] = 0, + .config_T22[10] = 1, + .config_T22[11] = 16, + .config_T22[12] = 31, + .config_T22[13] = 57, + .config_T22[14] = 65, + .config_T22[15] = 0, + .config_T22[16] = 8, + .config_T23[0] = 0, + .config_T23[1] = 0, + .config_T23[2] = 0, + .config_T23[3] = 0, + .config_T23[4] = 0, + .config_T23[5] = 0, + .config_T23[6] = 0, + .config_T23[7] = 0, + .config_T23[8] = 0, + .config_T23[9] = 0, + .config_T23[10] = 0, + .config_T23[11] = 0, + .config_T23[12] = 0, + .config_T23[13] = 0, + .config_T23[14] = 0, + .config_T24[0] = 0, + .config_T24[1] = 0, + .config_T24[2] = 0, + .config_T24[3] = 0, + .config_T24[4] = 0, + .config_T24[5] = 0, + .config_T24[6] = 0, + .config_T24[7] = 0, + .config_T24[8] = 0, + .config_T24[9] = 0, + .config_T24[10] = 0, + .config_T24[11] = 0, + .config_T24[12] = 0, + .config_T24[13] = 0, + .config_T24[14] = 0, + .config_T24[15] = 0, + .config_T24[16] = 0, + .config_T24[17] = 0, + .config_T24[18] = 0, + .config_T25[0] = 0, + .config_T25[1] = 0, + .config_T25[2] = 0xe0, + .config_T25[3] = 0x2e, + .config_T25[4] = 0x58, + .config_T25[5] = 0x1b, + .config_T25[6] = 0xe0, + .config_T25[7] = 0x2e, + .config_T25[8] = 0x58, + .config_T25[9] = 0x1b, + #if 0 + .config_T27[0] = 0, + .config_T27[1] = 1, + .config_T27[2] = 0, + .config_T27[3] = 0, + .config_T27[4] = 0, + .config_T27[5] = 0, + .config_T27[6] = 0, + #endif + .config_T28[0] = 0, + .config_T28[1] = 0, + .config_T28[2] = 1, + .config_T28[3] = 8, + .config_T28[4] = 8, + .config_T28[5] = 0x1e, + .config_T59[0] = 7, + .config_T59[1] = 36, + .config_T59[2] = 255, + .config_T59[3] = 10, + .config_T59[4] = 1, + .config_T59[5] = 15, + + + #ifdef CONFIG_TS_NOTIFIER + .config_T9_charge[0] = 70,//10 //t9[7] + .config_T9_charge[1] = 0,//10 //t9[31] + .config_T9_charge[2] = 10,//10 //t9[11] + .config_T9_charge[3] = 10,//10 //t9[12] + .config_T28_charge[0] = 32,//0x0a + .config_T28_charge[1] = 32,//0x0a + #endif + .object_crc[0] = 117, + .object_crc[1] = 8, + .object_crc[2] = 119, + /*.cable_config[0] = config_T9[7], + .cable_config[1] = config_T22[8], + .cable_config[2] = config_T28[3], + .cable_config[3] = config_T28[4],*/ + .cable_config[0] = 30, + .cable_config[1] = 20, + .cable_config[2] = 4, + .cable_config[3] = 8, + .GCAF_level[0] = 4, + .GCAF_level[1] = 16, + .GCAF_level[2] = 0, + .GCAF_level[3] = 0, + .filter_level[0] = 100, + .filter_level[1] = 100, + .filter_level[2] = 100, + .filter_level[3] = 100, + .display_width = 1024, /* display width in pixel */ + .display_height = 1024, /* display height in pixel */ + +#else .version = 0x16, .source = 1, .abs_x_min = 0, @@ -1469,8 +2349,8 @@ struct atmel_i2c_platform_data atmel_data = { .config_T7[2] = 25, .config_T8[0] = 10, .config_T8[1] = 0, - .config_T8[2] = 20, - .config_T8[3] = 20, + .config_T8[2] = 10, + .config_T8[3] = 10, .config_T8[4] = 0, .config_T8[5] = 0, .config_T8[6] = 10, @@ -1486,8 +2366,8 @@ struct atmel_i2c_platform_data atmel_data = { .config_T9[6] = 16, .config_T9[7] = 30, .config_T9[8] = 3, - //.config_T9[9] = 6, - .config_T9[9] = 1, + //.config_T9[9] = 6,//横屏 + .config_T9[9] = 1, //竖屏 .config_T9[10] = 20, .config_T9[11] = 6, .config_T9[12] = 6, @@ -1508,10 +2388,10 @@ struct atmel_i2c_platform_data atmel_data = { .config_T9[27] = 63, .config_T9[28] = 208, .config_T9[29] = 90, - .config_T9[30] = 15, + .config_T9[30] = 15, //jump limit .config_T9[31] = 8, //.config_T9[31] = 0, - .config_T15[0] = 0, + .config_T15[0] = 0, //virtual key .config_T15[1] = 0, .config_T15[2] = 0, .config_T15[3] = 0, @@ -1560,7 +2440,7 @@ struct atmel_i2c_platform_data atmel_data = { .config_T22[5] = 0xe7, .config_T22[6] = 0xff, .config_T22[7] = 8, - .config_T22[8] = 25, + .config_T22[8] = 25, //50 to 20 .config_T22[9] = 0, .config_T22[10] = 1, .config_T22[11] = 17, @@ -1628,6 +2508,14 @@ struct atmel_i2c_platform_data atmel_data = { .config_T28[3] = 8, .config_T28[4] = 8, .config_T28[5] = 0x1e, + #ifdef CONFIG_TS_NOTIFIER + .config_T9_charge[0] = 50,//10 //t9[7] + .config_T9_charge[1] = 0,//10 //t9[31] + .config_T9_charge[2] = 10,//10 //t9[11] + .config_T9_charge[3] = 10,//10 //t9[12] + .config_T28_charge[0] = 32,//0x0a + .config_T28_charge[1] = 32,//0x0a + #endif .object_crc[0] = 117, .object_crc[1] = 8, .object_crc[2] = 119, @@ -1649,6 +2537,7 @@ struct atmel_i2c_platform_data atmel_data = { .filter_level[3] = 100, .display_width = 1024, /* display width in pixel */ .display_height = 1024, /* display height in pixel */ +#endif #else .version = 0x16, .source = 1, @@ -1667,23 +2556,23 @@ struct atmel_i2c_platform_data atmel_data = { .config_T7[2] = 0x32, .config_T8[0] = 8, .config_T8[1] = 0, - .config_T8[2] = 1, - .config_T8[3] = 1, + .config_T8[2] = 10, + .config_T8[3] = 10, .config_T8[4] = 0, .config_T8[5] = 0, - .config_T8[6] = 5, - .config_T8[7] = 35, - .config_T9[0] = 0x8b, + .config_T8[6] = 5,//9, + .config_T8[7] = 35,//0x0f, + .config_T9[0] = 0x8b,//0x8f .config_T9[1] = 0, .config_T9[2] = 0, - .config_T9[3] = 0x12, - .config_T9[4] = 0x0b, + .config_T9[3] = 0x12,//hwrev>5 + .config_T9[4] = 0x0b,//hwrev>5 .config_T9[5] = 1, .config_T9[6] = 0, .config_T9[7] = 28, .config_T9[8] = 2, - //.config_T9[9] = 6, - .config_T9[9] = 3, + //.config_T9[9] = 6,//横屏 + .config_T9[9] = 3, //竖屏 .config_T9[10] = 0, .config_T9[11] = 10, .config_T9[12] = 10, @@ -1700,10 +2589,10 @@ struct atmel_i2c_platform_data atmel_data = { .config_T9[19] = 3, .config_T9[20] = 223, .config_T9[21] = 1, - //.config_T9[18] = 223, - //.config_T9[19] = 1, - //.config_T9[20] = 31, - //.config_T9[21] = 3, + //.config_T9[18] = 223,//31, + //.config_T9[19] = 1,//3, + //.config_T9[20] = 31,//223, + //.config_T9[21] = 3,//1, .config_T9[22] = 0, .config_T9[23] = 0, .config_T9[24] = -5, @@ -1712,15 +2601,15 @@ struct atmel_i2c_platform_data atmel_data = { .config_T9[27] = 0, .config_T9[28] = 0, .config_T9[29] = 0, - .config_T9[30] = 18, + .config_T9[30] = 18,//10 .config_T15[0] = 3, .config_T15[1] = 0, .config_T15[2] = 11, - .config_T15[3] = 3, + .config_T15[3] = 3,//4 .config_T15[4] = 1, .config_T15[5] = 0, .config_T15[6] = 0, - .config_T15[7] = 35, + .config_T15[7] = 35,//25 .config_T15[8] = 3, .config_T18[0] = 0, .config_T18[1] = 0, @@ -1736,7 +2625,7 @@ struct atmel_i2c_platform_data atmel_data = { .config_T19[9] = 0, .config_T19[10] = 0, .config_T19[11] = 0, - .config_T20[0] = 0x11, + .config_T20[0] = 0x11,//0x13, .config_T20[1] = 5, .config_T20[2] = 5, .config_T20[3] = 5, @@ -1818,8 +2707,8 @@ struct atmel_i2c_platform_data atmel_data = { .config_T28[1] = 0, .config_T28[2] = 2, .config_T28[3] = 0x8, - .config_T28[4] = 32, - .config_T28[5] = 0x0, + .config_T28[4] = 32,//32, + .config_T28[5] = 0x0,//0x0a .object_crc[0] = 117, .object_crc[1] = 8, .object_crc[2] = 119, diff --git a/drivers/input/touchscreen/ft5x0x_ts.c b/drivers/input/touchscreen/ft5x0x_ts.c index 34a2fac8..eff5ba0e 100755 --- a/drivers/input/touchscreen/ft5x0x_ts.c +++ b/drivers/input/touchscreen/ft5x0x_ts.c @@ -23,6 +23,8 @@ When Who What,Where,Why Comment Tag #include #include "ft5x0x_ts.h" #include +#include + #if defined(CONFIG_MACH_BLADE)//P729B touchscreen enable #define GPIO_TOUCH_EN_OUT 31 @@ -118,49 +120,59 @@ struct Fts_ts_data #define CONFIG_SUPPORT_FTS_CTP_UPG #endif +static u8 fwVer=0;//ZTE_TS_XYM_20110830 #if defined(CONFIG_SUPPORT_FTS_CTP_UPG) - static struct i2c_client *update_client; static int update_result_flag=0; #endif -static int Fts_i2c_read(struct i2c_client *client, int reg, u8 * buf, int count) +static int Fts_i2c_read(struct i2c_client *client, uint8_t reg, u8 * buf, int count) { - int rc; - int ret = 0; - - buf[0] = reg; - rc = i2c_master_send(client, buf, 1); - if (rc != 1) - { - dev_err(&client->dev, "Fts_i2c_read FAILED: read of register %d\n", reg); - ret = -1; - goto tp_i2c_rd_exit; + int ret; + struct i2c_msg msg[] = { + { + .addr = client->addr, + .flags = 0, + .len = 1, + .buf = ®, + }, + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = count, + .buf = buf, } - rc = i2c_master_recv(client, buf, count); - if (rc != count) + }; + + ret = i2c_transfer(client->adapter, msg, 2); + if ( ret != 2 ) { - dev_err(&client->dev, "Fts_i2c_read FAILED: read %d bytes from reg %d\n", count, reg); - ret = -1; + dev_err(&client->dev, "Fts_i2c_read FAILED: read %d bytes from reg %d\n", count, reg); + return -1; } - - tp_i2c_rd_exit: - return ret; + return 0; } + + static int Fts_i2c_write(struct i2c_client *client, int reg, u8 data) { - u8 buf[2]; - int rc; - int ret = 0; - - buf[0] = reg; - buf[1] = data; - rc = i2c_master_send(client, buf, 2); - if (rc != 2) + int ret; + struct i2c_msg msg; + u8 buf[2]; + buf[0] = reg; + buf[1] = data; + msg.addr = client->addr; + msg.flags = client->flags & I2C_M_TEN; + msg.len = 2; + msg.buf = (char *)buf; + + ret = i2c_transfer(client->adapter, &msg, 1); + if ( ret != 1 ) { dev_err(&client->dev, "Fts_i2c_write FAILED: writing to reg %d\n", reg); - ret = -1; + return -1; } - return ret; + + return 0; } #ifdef CONFIG_SUPPORT_FTS_CTP_UPG @@ -424,6 +436,24 @@ unsigned char fts_ctpm_get_upg_ver(void) #endif +static int get_screeninfo(uint *xres, uint *yres) +{ + struct fb_info *info; + + info = registered_fb[0]; + if (!info) { + pr_err("%s: Can not access lcd info \n",__func__); + return -ENODEV; + } + + *xres = info->var.xres; + *yres = info->var.yres; + printk("xres=%d, yres=%d \n",*xres,*yres); + + return 1; +} + + static int proc_read_val(char *page, char **start, off_t off, int count, int *eof, void *data) @@ -431,16 +461,18 @@ proc_read_val(char *page, char **start, off_t off, int count, int *eof, int len = 0; len += sprintf(page + len, "%s\n", "touchscreen module"); len += sprintf(page + len, "name : %s\n", "FocalTech"); - #if defined(CONFIG_MACH_R750) +#if defined(CONFIG_MACH_R750) len += sprintf(page + len, "i2c address : %x\n", 0x3E); - #else +#else len += sprintf(page + len, "i2c address : 0x%x\n", 0x3E); - #endif +#endif len += sprintf(page + len, "IC type : %s\n", "FT5X06"); len += sprintf(page + len, "module : %s\n", "FocalTech FT5x06"); - #ifdef CONFIG_SUPPORT_FTS_CTP_UPG - len += sprintf(page + len, "update flag : 0x%x\n", update_result_flag); - #endif + + len += sprintf(page + len, "firmware : 0x%x\n", fwVer );//ZTE_TS_XYM_20110830 +#ifdef CONFIG_SUPPORT_FTS_CTP_UPG + len += sprintf(page + len, "update flag : 0x%x\n", update_result_flag); +#endif if (off + count >= len) *eof = 1; if (len < off) @@ -452,6 +484,9 @@ proc_read_val(char *page, char **start, off_t off, int count, int *eof, static int proc_write_val(struct file *file, const char *buffer, unsigned long count, void *data) { +#ifdef CONFIG_SUPPORT_FTS_CTP_UPG + int ret = 0;//ZTE_TS_XYM_20110830 +#endif unsigned long val; sscanf(buffer, "%lu", &val); @@ -466,6 +501,10 @@ static int proc_write_val(struct file *file, const char *buffer, update_result_flag=2; } + + ret = Fts_i2c_read(update_client, FT5X0X_REG_FIRMID, &fwVer,1) ;//ZTE_TS_XYM_20110830 + printk("%s: New Fts FW ID read ID = 0x%x, ret = 0x%x\n", __FUNCTION__, fwVer, ret);//ZTE_TS_XYM_20110830 + #endif return -EINVAL; } @@ -551,8 +590,8 @@ static int Fts_ts_suspend(struct i2c_client *client, pm_message_t mesg) //flush_workqueue(ts->work); // ==set mode ==, //ft5x0x_set_reg(FT5X0X_REG_PMODE, PMODE_HIBERNATE); - Fts_i2c_write(client, FT5X0X_REG_PMODE, PMODE_HIBERNATE); gpio_direction_output(GPIO_TOUCH_INT_WAKEUP,1); + Fts_i2c_write(client, FT5X0X_REG_PMODE, PMODE_HIBERNATE); return 0; } @@ -572,7 +611,7 @@ static int Fts_ts_resume(struct i2c_client *client) if ( Fts_i2c_read(client, FT5X0X_REG_FIRMID, &buf,1) < 0) {//I2C error read firmware ID - printk("Fts FW ID read Error: retry=%x\n",retry); + printk("Fts FW ID read Error: retry = 0x%x\n",retry); if ( ++retry < 3 ) goto Fts_resume_start; } @@ -604,9 +643,9 @@ static int Fts_ts_probe( { struct Fts_ts_data *ts; int ret = 0; - u8 fwVer; + //u8 fwVer; struct proc_dir_entry *dir, *refresh; - u8 buf; + int xres, yres; // lcd xy resolusion ret = gpio_request(GPIO_TOUCH_EN_OUT, "touch voltage"); if (ret) @@ -642,9 +681,9 @@ static int Fts_ts_probe( } /*ZTE_TS_ZFJ_20110302 end */ ts->client = client; - #ifdef CONFIG_SUPPORT_FTS_CTP_UPG +#ifdef CONFIG_SUPPORT_FTS_CTP_UPG update_client=client; - #endif +#endif i2c_set_clientdata(client, ts); client->driver = &Fts_ts_driver; @@ -652,8 +691,8 @@ static int Fts_ts_probe( int retry = 3; while (retry-- > 0) { - ret = Fts_i2c_read(client, FT5X0X_REG_FIRMID, &buf,1); - pr_info("wly: Fts_i2c_read, FT5X0X_REG_FIRMID = %d.\n", buf); + ret = Fts_i2c_read(client, FT5X0X_REG_FIRMID, &fwVer,1); + pr_info("wly: Fts_i2c_read, FT5X0X_REG_FIRMID = 0x%x.\n", fwVer); if (0 == ret) break; msleep(10); @@ -677,6 +716,9 @@ static int Fts_ts_probe( ts->input_dev->name = "Fts-touchscreen"; //ts->input_dev->phys = "Fts-touchscreen/input0"; + + get_screeninfo( &xres, &yres ); + #if 0 set_bit(EV_SYN, ts->input_dev->evbit); set_bit(EV_KEY, ts->input_dev->evbit); @@ -710,8 +752,8 @@ static int Fts_ts_probe( set_bit(KEY_SEARCH, ts->input_dev->keybit); input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0); - input_set_abs_params(ts->input_dev, ABS_MT_POSITION_X, 0, SCREEN_MAX_X, 0, 0); - input_set_abs_params(ts->input_dev, ABS_MT_POSITION_Y, 0, SCREEN_MAX_Y, 0, 0); + input_set_abs_params(ts->input_dev, ABS_MT_POSITION_X, 0, xres, 0, 0); + input_set_abs_params(ts->input_dev, ABS_MT_POSITION_Y, 0, yres, 0, 0); input_set_abs_params(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0, 255, 0, 0); input_set_abs_params(ts->input_dev, ABS_SINGLE_TAP, 0, 5, 0, 0); input_set_abs_params(ts->input_dev, ABS_TAP_HOLD, 0, 5, 0, 0); @@ -756,8 +798,7 @@ static int Fts_ts_probe( //Firmware Upgrade handle Start ret = Fts_i2c_read(ts->client, FT5X0X_REG_FIRMID, &fwVer,1) ; - - printk("Fts FW ID read ID = %x,ret = %x\n",fwVer,ret); + printk("%s: Fts FW ID read ID = 0x%x, ret = 0x%x\n", __FUNCTION__, fwVer,ret); #if 0//def CONFIG_SUPPORT_FTS_CTP_UPG if ( fts_ctpm_get_upg_ver() > fwVer ) { @@ -766,6 +807,8 @@ static int Fts_ts_probe( fts_ctpm_fw_upgrade(ts->client,CTPM_FW, sizeof(CTPM_FW)); //fts_ctpm_fw_upgrade_with_i_file(ts->client);//Update the CTPM firmware if need } + ret = Fts_i2c_read(ts->client, FT5X0X_REG_FIRMID, &fwVer,1) ; + printk("%s: Fts NEW FW ID read ID = 0x%x, ret = 0x%x\n", __FUNCTION__, fwVer,ret); #endif //Firmware Upgrade handle End #if defined(CONFIG_TOUCHSCREEN_VIRTUAL_KEYS) diff --git a/drivers/input/touchscreen/ft5x0x_ts.h b/drivers/input/touchscreen/ft5x0x_ts.h index d1f38fd7..36c7ae02 100755 --- a/drivers/input/touchscreen/ft5x0x_ts.h +++ b/drivers/input/touchscreen/ft5x0x_ts.h @@ -1,6 +1,6 @@ #ifndef __LINUX_FT5X0X_TS_H__ #define __LINUX_FT5X0X_TS_H__ - +/* #if defined(CONFIG_MACH_ROAMER) #define SCREEN_MAX_X 320 #define SCREEN_MAX_Y 480 @@ -15,7 +15,7 @@ #define SCREEN_MAX_Y 800 #endif #define PRESS_MAX 255 - +*/ #define FT5X0X_NAME "ft5x0x_ts" struct ft5x0x_ts_platform_data{ diff --git a/drivers/input/touchscreen/ft5x0x_ts_fwup.c b/drivers/input/touchscreen/ft5x0x_ts_fwup.c new file mode 100644 index 00000000..93d5fa88 --- /dev/null +++ b/drivers/input/touchscreen/ft5x0x_ts_fwup.c @@ -0,0 +1,748 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "ft5x0x_ts_new.h" +#include +#include +#include + +static struct i2c_client *ftc_i2c_client; + +static unsigned char CTPM_FW[]= +{ +#if defined ( CONFIG_MACH_ROAMER) +#if defined (CONFIG_TOUCHSCREEN_MXT224_N760) +#include "ft_Ver10_20110705_036_9475_app_roamer.i" //ZTE_TS_XYM_20110711 + +#else +#include "Ver11_20110802_036_9475_Only4P736T_app.i" + +#endif +#elif defined (CONFIG_MACH_RACER2) +#include "Ver17_20110721_028_P728T_app.i" +#elif defined (CONFIG_MACH_SKATE) +#include "Ver11_20110808_043_9485_skate_app.i" +#else +#endif +}; + + +//#ifdef CONFIG_SUPPORT_FTS_CTP_UPG +typedef enum +{ + ERR_OK, + ERR_MODE, + ERR_READID, + ERR_ERASE, + ERR_STATUS, + ERR_ECC, + ERR_DL_ERASE_FAIL, + ERR_DL_PROGRAM_FAIL, + ERR_DL_VERIFY_FAIL +}E_UPGRADE_ERR_TYPE; + +typedef unsigned char FTS_BYTE; //8 bit +typedef unsigned short FTS_WORD; //16 bit +typedef unsigned int FTS_DWRD; //16 bit +typedef unsigned char FTS_BOOL; //8 bit + + + + +//#define FTS_NULL x0 +//#define FTS_TRUE x01 +//#define FTS_FALSE 0x0 +/* +void msleep(FTS_WORD w_ms) +{ + //platform related, please implement this function + msleep( w_ms ); +} +*/ +/* +[function]: + send a command to ctpm. +[parameters]: + btcmd[in] :command code; + btPara1[in] :parameter 1; + btPara2[in] :parameter 2; + btPara3[in] :parameter 3; + num[in] :the valid input parameter numbers, if only command code needed and no parameters followed,then the num is 1; +[return]: + FTS_TRUE :success; + FTS_FALSE :io fail; +*/ +FTS_BOOL cmd_write(struct i2c_client *client,FTS_BYTE btcmd,FTS_BYTE btPara1,FTS_BYTE btPara2,FTS_BYTE btPara3,FTS_BYTE num) +{ + FTS_BYTE write_cmd[4] = {0}; + + write_cmd[0] = btcmd; + write_cmd[1] = btPara1; + write_cmd[2] = btPara2; + write_cmd[3] = btPara3; + return i2c_master_send(client, write_cmd, num); +} + +/* +[function]: + write data to ctpm , the destination address is 0. +[parameters]: + pbt_buf[in] :point to data buffer; + bt_len[in] :the data numbers; +[return]: + FTS_TRUE :success; + FTS_FALSE :io fail; +*/ +FTS_BOOL byte_write(struct i2c_client *client,FTS_BYTE* pbt_buf, FTS_DWRD dw_len) +{ + + return i2c_master_send(client, pbt_buf, dw_len); +} + +/* +[function]: + read out data from ctpm,the destination address is 0. +[parameters]: + pbt_buf[out] :point to data buffer; + bt_len[in] :the data numbers; +[return]: + FTS_TRUE :success; + FTS_FALSE :io fail; +*/ +FTS_BOOL byte_read(struct i2c_client *client,FTS_BYTE* pbt_buf, FTS_BYTE bt_len) +{ + return i2c_master_recv(client, pbt_buf, bt_len); +} + + +static int Fts_i2c_read(struct i2c_client *client, uint8_t reg, u8 * buf, int count) +{ + int ret; + struct i2c_msg msg[] = { + { + .addr = client->addr, + .flags = 0, + .len = 1, + .buf = ®, + }, + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = count, + .buf = buf, + } + }; + + ret = i2c_transfer(client->adapter, msg, 2); + if ( ret != 2 ) + { + dev_err(&client->dev, "Fts_i2c_read FAILED: read %d bytes from reg %d\n", count, reg); + return -1; + } + return 0; +} + + +static int Fts_i2c_write(struct i2c_client *client, int reg, u8 data) +{ + int ret; + struct i2c_msg msg; + u8 buf[2]; + buf[0] = reg; + buf[1] = data; + msg.addr = client->addr; + msg.flags = client->flags & I2C_M_TEN; + msg.len = 2; + msg.buf = (char *)buf; + + ret = i2c_transfer(client->adapter, &msg, 1); + if ( ret != 1 ) + { + dev_err(&client->dev, "Fts_i2c_write FAILED: writing to reg %d\n", reg); + return -1; + } + + return 0; +} + + +/* +[function]: + burn the FW to ctpm. +[parameters]:(ref. SPEC) + pbt_buf[in] :point to Head+FW ; + dw_lenth[in]:the length of the FW + 6(the Head length); + bt_ecc[in] :the ECC of the FW +[return]: + ERR_OK :no error; + ERR_MODE :fail to switch to UPDATE mode; + ERR_READID :read id fail; + ERR_ERASE :erase chip fail; + ERR_STATUS :status error; + ERR_ECC :ecc error. +*/ + + +#define FTS_PACKET_LENGTH 122//250//122//26/10/2 +#define FTS_SETTING_BUF_LEN 128 + +static int ft5x0x_GetFwSize(char * firmware_name) +{ + struct file* pfile = NULL; + struct inode *inode; + unsigned long magic; + off_t fsize = 0; + char filepath[128]; + + memset(filepath, 0, sizeof(filepath)); + sprintf(filepath, "/sdcard/%s", firmware_name); + pr_info("filepath=%s\n", filepath); + if(NULL == pfile){ + pfile = filp_open(filepath, O_RDONLY, 0); + } + if(IS_ERR(pfile)){ + pr_err("error occured while opening file %s.\n", filepath); + return -1; + } + + inode=pfile->f_dentry->d_inode; + magic=inode->i_sb->s_magic; + fsize=inode->i_size; + + filp_close(pfile, NULL); + + return fsize; +} +static int ft5x0x_ReadFw(char * firmware_name, unsigned char * firmware_buf) +{ + struct file* pfile = NULL; + struct inode *inode; + unsigned long magic; + off_t fsize; + char filepath[128]; + loff_t pos; + mm_segment_t old_fs; + + memset(filepath, 0, sizeof(filepath)); + sprintf(filepath, "/sdcard/%s", firmware_name); + pr_info("filepath=%s\n", filepath); + if(NULL == pfile){ + pfile = filp_open(filepath, O_RDONLY, 0); + } + if(IS_ERR(pfile)){ + pr_err("error occured while opening file %s.\n", filepath); + return -1; + } + inode=pfile->f_dentry->d_inode; + magic=inode->i_sb->s_magic; + fsize=inode->i_size; + //char * buf; + old_fs = get_fs(); + set_fs(KERNEL_DS); + pos = 0; + + vfs_read(pfile, firmware_buf, fsize, &pos); + + filp_close(pfile, NULL); + set_fs(old_fs); + return 0; +} + +static unsigned char fts_ctpm_get_boot_vid(struct i2c_client *client) +{ + FTS_BYTE reg_val[2] = {0}; + unsigned char buf[FTS_SETTING_BUF_LEN]; + FTS_BYTE auc_i2c_write_buf[10]; + int i=0; + + /*********Step 1:Reset CTPM *****/ + printk("Step 1: Reset CTPM test\n"); + Fts_i2c_write(client,0xfc,0xaa); + msleep(50); + Fts_i2c_write(client,0xfc,0x55); + msleep(40); + + /*********Step 2:Enter upgrade mode *****/ + printk("Step 2: Enter update mode. \n"); + auc_i2c_write_buf[0] = 0x55; + auc_i2c_write_buf[1] = 0xaa; + i2c_master_send(client, auc_i2c_write_buf, 2); + + /*********Step 3:check READ-ID***********************/ + //send the opration head + do{ + if(i > 3) + return 0; + cmd_write(client,0x90,0x00,0x00,0x00,4);//get the CTPM ID + byte_read(client,reg_val,2); + i++; + printk("Step 3: CTPM ID,ID1 = 0x%x,ID2 = 0x%x\n",reg_val[0],reg_val[1]); + }while(reg_val[0] != 0x79 || reg_val[1] != 0x03); + + // read BootLoader Version + cmd_write(client,0xcd,0x0,0x00,0x00,1); + byte_read(client,reg_val,1); + printk("bootloader version = 0x%x\n", reg_val[0]); + if ( reg_val[0] == 0xcd ) + { + printk("The bootloader version is Old"); + buf[4] = 0x57; // Invalid Vid,Just support Goworld's TP + } + else + { /* --------- read current project setting ---------- */ + //set read start address + buf[0] = 0x3; + buf[1] = 0x0; + buf[2] = 0x78; + buf[3] = 0x0; + byte_write(client,buf, 4); + byte_read(client,buf, FTS_SETTING_BUF_LEN); + + printk("[FTS] old setting: uc_i2c_addr = 0x%x, uc_io_voltage = %d, uc_panel_factory_id = 0x%x\n", + buf[0], buf[2], buf[4]); + if ( buf[4] == 0xFF ) + buf[4] = 0x57; // Old Boot,Invalid Vid,Just support Goworld's TP + } + + /********* reset the new FW***********************/ + cmd_write(client,0x07,0x00,0x00,0x00,1); + + msleep(200); + + return buf[4]; +} + + +static unsigned char fts_ctpm_get_fw_vid(FTS_BYTE* pbt_buf, FTS_DWRD dw_lenth) +{ + unsigned char ui_sz; + + if (dw_lenth > 2) + { + ui_sz = pbt_buf[dw_lenth - 2] + pbt_buf[dw_lenth - 1]; + if ( ui_sz == 0xFF ) + return 0x57; // Old Version *.i file,Just support GoWorld's TP + else + return pbt_buf[dw_lenth - 1]; + } + else + { + //TBD, error handling? + return 0xff; //default value + } +} + + +static unsigned char fts_ctpm_get_fw_ver(FTS_BYTE* pbt_buf, FTS_DWRD dw_lenth) +{ + if (dw_lenth > 2) + { + return pbt_buf[dw_lenth - 2]; + } + else + { + //TBD, error handling? + return 0xff; //default value + } +} + +static int fts_ctpm_selfcal(struct i2c_client *client) +{ + //adjust begin + u8 buf; + int ret = 0, retry = 0; + + msleep(2000); + Fts_i2c_write(client, 0x00, 0x40); + msleep(20); + ret = Fts_i2c_read(client, 0x00, &buf, 1); + retry = 3; + while(retry-- >0) + { + if(0x40 == buf) + break; + if(0x40 != buf) + { + pr_info("%s: Enter test mode failed, retry = %d!\n", __func__, retry); + Fts_i2c_write(client, 0x00, 0x40); + msleep(20); + ret = Fts_i2c_read(client, 0x00, &buf, 1); + } + } + + msleep(3000); + Fts_i2c_write(client, 0x4D, 0x4); + msleep(10000); + Fts_i2c_read(client, 0x4D, &buf, 1); + retry=5; + while(retry-- >0) + { + if(0x50 == buf) + break; + if(0x50 != buf) + { + pr_info("%s value of register 0x4D is %d.\n", __func__, buf); + Fts_i2c_read(client, 0x4D, &buf, 1); + if(buf == 0x30) + pr_info("%s: Calibration failed! Retry!\n", __func__); + msleep(2000); + } + + } + + pr_info("%s value of register 0x4D is %d\n", __func__, buf); + + Fts_i2c_write(client, 0x00, 0x0); + //adjust end + return 0; +} + +static E_UPGRADE_ERR_TYPE fts_ctpm_write_fw(struct i2c_client *client,FTS_BYTE* pbt_buf, FTS_DWRD dw_lenth) +{ +// FTS_BYTE cmd_len = 0; + FTS_BYTE reg_val[2] = {0}; + FTS_DWRD i = 0; +// FTS_BYTE ecc = 0; + + FTS_DWRD packet_number; + FTS_DWRD j; + FTS_DWRD temp; + FTS_DWRD lenght; + FTS_BYTE packet_buf[FTS_PACKET_LENGTH + 6]; + FTS_BYTE auc_i2c_write_buf[10]; + FTS_BYTE bt_ecc; + + /*********Step 1:Reset CTPM *****/ + Fts_i2c_write(client,0xfc,0xaa); + msleep(50); + Fts_i2c_write(client,0xfc,0x55); + printk("Step 1: Reset CTPM test\n"); + + msleep(40); + + /*********Step 2:Enter upgrade mode *****/ + auc_i2c_write_buf[0] = 0x55; + auc_i2c_write_buf[1] = 0xaa; + i2c_master_send(client, auc_i2c_write_buf, 2); + printk("Step 2: Enter update mode. \n"); + + /*********Step 3:check READ-ID***********************/ + /*send the opration head*/ + do{ + if(i > 3) + { + return ERR_READID; + } + /*read out the CTPM ID*/ + + cmd_write(client,0x90,0x00,0x00,0x00,4); + byte_read(client,reg_val,2); + i++; + printk("Step 3: CTPM ID,ID1 = 0x%x,ID2 = 0x%x\n",reg_val[0],reg_val[1]); + }while(reg_val[0] != 0x79 || reg_val[1] != 0x03); + + /*********Step 4:erase app*******************************/ + cmd_write(client,0x61,0x00,0x00,0x00,1); + msleep(1500); + printk("Step 4: erase. \n"); + + /*********Step 5:write firmware(FW) to ctpm flash*********/ + bt_ecc = 0; + printk("Step 5: start upgrade. \n"); + dw_lenth = dw_lenth - 8; + packet_number = (dw_lenth) / FTS_PACKET_LENGTH; + packet_buf[0] = 0xbf; + packet_buf[1] = 0x00; + for (j=0;j>8); + packet_buf[3] = (FTS_BYTE)temp; + lenght = FTS_PACKET_LENGTH; + packet_buf[4] = (FTS_BYTE)(lenght>>8); + packet_buf[5] = (FTS_BYTE)lenght; + + for (i=0;i 0) + { + temp = packet_number * FTS_PACKET_LENGTH; + packet_buf[2] = (FTS_BYTE)(temp>>8); + packet_buf[3] = (FTS_BYTE)temp; + + temp = (dw_lenth) % FTS_PACKET_LENGTH; + packet_buf[4] = (FTS_BYTE)(temp>>8); + packet_buf[5] = (FTS_BYTE)temp; + + for (i=0;i>8); + packet_buf[3] = (FTS_BYTE)temp; + temp =1; + packet_buf[4] = (FTS_BYTE)(temp>>8); + packet_buf[5] = (FTS_BYTE)temp; + packet_buf[6] = pbt_buf[ dw_lenth + i]; + bt_ecc ^= packet_buf[6]; + + byte_write(client,&packet_buf[0],7); + msleep(20); + } + + /*********Step 6: read out checksum***********************/ + /*send the opration head*/ + cmd_write(client,0xcc,0x00,0x00,0x00,1); + byte_read(client,reg_val,1); + printk("Step 6: ecc read 0x%x, new firmware 0x%x. \n", reg_val[0], bt_ecc); + if(reg_val[0] != bt_ecc) + { + return ERR_ECC; + } + + /*********Step 7: reset the new FW***********************/ + cmd_write(client,0x07,0x00,0x00,0x00,1); + + return ERR_OK; +} + + + +int fts_ctpm_update_fw(struct i2c_client *client,FTS_BYTE* pbt_buf, FTS_DWRD dw_lenth) +{ + int ret; + char crtfwVer; + char crtfwVid; + + printk("********Fts Upgrade Start********\n"); + + // 1. check vid + ret = Fts_i2c_read(client, FT5X0X_REG_FT5201ID, &crtfwVid,1); + if ( crtfwVid == FT5X0X_REG_FT5201ID ) + { + printk("CTPM fw is corruptted!\n"); + crtfwVid = fts_ctpm_get_boot_vid(client); + printk("vid from boot = 0x%x\n",crtfwVid); + // Old Bootloader(<0x14) can't get the correct Vid. + // So,must be Upgrade by manually if fw is corruptted. + if ( crtfwVid < 0x42/* || crtfwVid == 0xFF*/ ){ + printk("Invalid vid!\n"); + return -1; + } + } + printk("Current fw vid=0x%x\n",crtfwVid); + ret = fts_ctpm_get_fw_vid(pbt_buf,dw_lenth); + printk("fw vid from fw file = 0x%x\n", ret); + if ( ret != crtfwVid ){ + printk("vid dismatch !\n"); + return 0; + } + + // 2. check fw ver + ret = Fts_i2c_read(client, FT5X0X_REG_FIRMID, &crtfwVer,1); + pr_info("Current fw verion = 0x%x.\n", crtfwVer); + ret = fts_ctpm_get_fw_ver(pbt_buf,dw_lenth); + printk("fw ver from fw file = 0x%x\n", ret); +// if ( (ret <= crtfwVer) && (crtfwVer != FT5X0X_REG_FIRMID) ) +// return 0; + + // 3. update + fts_ctpm_write_fw(client,pbt_buf, dw_lenth); + //fts_ctpm_write_fw_with_i_file(ts->client);//Update the CTPM firmware if need + + // 4. self calibration + ret = fts_ctpm_selfcal(client); + + // ret = Fts_i2c_read(update_client, FT5X0X_REG_FIRMID, &fwVer,1) ;//ZTE_TS_XYM_20110830 + // printk("%s: New Fts FW ID read ID = 0x%x,ret = 0x%x\n", __FUNCTION__, fwVer, ret);//ZTE_TS_XYM_20110830 + + return 0; +} + + +static int fts_ctpm_write_fw_with_app_file(struct i2c_client *client,char * firmware_name) +{ + FTS_BYTE* pbt_buf = 0;//FTS_NULL; + int i_ret; //u8 fwver; + int fwsize; + + + fwsize = ft5x0x_GetFwSize(firmware_name); + if(fwsize <= 0) + { + pr_err("%s ERROR:Get firmware size failed\n", __FUNCTION__); + return -1; + } + + // FW upgrade begin + pbt_buf = (unsigned char *) kmalloc(fwsize+1,GFP_ATOMIC); + if(ft5x0x_ReadFw(firmware_name, pbt_buf)) + { + pr_err("%s() - ERROR: request_firmware failed\n", __FUNCTION__); + kfree(pbt_buf); + return -1; + } + + i_ret = fts_ctpm_update_fw(client, pbt_buf, fwsize); + if (i_ret != 0) { + pr_err("%s() - ERROR:[FTS] upgrade failed i_ret = %d.\n",__FUNCTION__, i_ret); + //error handling ... + //TBD + } else { + pr_info("[FTS] upgrade successfully.\n"); +// if(Fts_i2c_read(update_client, FT5X0X_REG_FIRMID, &fwver,1)>=0) + // pr_info("the new fw ver is 0x%02x\n", fwver); +// fts_ctpm_selfcal(); //start auto CLB + } + kfree(pbt_buf); + return i_ret; +} + + +static ssize_t ft5x0x_fwupgradeapp_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + /* place holder for future use */ + return -EPERM; +} + +//upgrade from app.bin +static ssize_t ft5x0x_fwupgradeapp_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + //struct Fts_ts_data *data = NULL; + + //struct i2c_client *client = container_of(dev, struct i2c_client, dev); + //data = (struct Fts_ts_data *) i2c_get_clientdata( client ); +// ssize_t num_read_chars = 0; + char fwname[128]; + struct i2c_client *client = ftc_i2c_client; + //struct i2c_client *client2 = container_of(dev, struct i2c_client, dev); +// printk("xiayc: client=%p, client2=%p\n", client, client2); + + memset(fwname, 0, sizeof(fwname)); + sprintf(fwname, "%s", buf); + fwname[count-1] = '\0'; + + //mutex_lock(&data->device_mode_mutex); + disable_irq(client->irq); + + printk("xiayc~~~2.client =%p\n",client); + fts_ctpm_write_fw_with_app_file(client,fwname); + + enable_irq(client->irq); + +//error_return: + //mutex_unlock(&data->device_mode_mutex); + + return count; +} + +/* sysfs */ +//static DEVICE_ATTR(rawbase, S_IRUGO|S_IWUSR, ft5x0x_rawbase_show, ft5x0x_rawbase_store); +//static DEVICE_ATTR(ftstpfwver, S_IRUGO|S_IWUSR, ft5x0x_tpfwver_show, ft5x0x_tpfwver_store); +//upgrade from *.i +//static DEVICE_ATTR(ftsfwupdate, S_IRUGO|S_IWUSR, ft5x0x_fwupdate_show, ft5x0x_fwupdate_store); +//static DEVICE_ATTR(ftstprwreg, S_IRUGO|S_IWUSR, ft5x0x_tprwreg_show, ft5x0x_tprwreg_store); +//upgrade from app.bin +static DEVICE_ATTR(ftsfwupgradeapp, S_IRUGO|S_IWUSR, ft5x0x_fwupgradeapp_show, ft5x0x_fwupgradeapp_store); +//static DEVICE_ATTR(ftsrawdatashow, S_IRUGO|S_IWUSR, ft5x0x_rawdata_show, ft5x0x_rawdata_store); + +/* +static struct attribute *ft5x0x_attributes[] = { + //&dev_attr_ftstpfwver.attr, + //&dev_attr_ftsfwupdate.attr, + //&dev_attr_ftstprwreg.attr, + &dev_attr_ftsfwupgradeapp.attr, + //ev_attr_ftsrawdatashow.attr, + NULL +}; + +static struct attribute_group ft5x0x_attribute_group = { + .attrs = ft5x0x_attributes +}; +*/ + +extern struct kobject *firmware_kobj; + +int Ft5x0x_fwupdate(struct i2c_client *client) +{ + return fts_ctpm_update_fw(client,CTPM_FW,sizeof(CTPM_FW)); +} + +int Ft5x0x_fwupdate_init(struct i2c_client *client) +{ + int ret; + struct kobject * fts_fw_kobj=NULL; + + fts_fw_kobj = kobject_get(firmware_kobj); + if (fts_fw_kobj == NULL) { + fts_fw_kobj = kobject_create_and_add("firmware", NULL); + if (fts_fw_kobj == NULL) { + pr_err("%s: subsystem_register failed\n", __func__); + ret = -ENOMEM; + return ret; + } + } + + ret=sysfs_create_file(fts_fw_kobj, &dev_attr_ftsfwupgradeapp.attr); + if (ret) { + pr_err("%s: sysfs_create_file failed\n", __func__); + return ret; + } + ftc_i2c_client = client; + printk("%s, xiayc: client=%p ftc_i2c_client=%p\n",__func__,client,ftc_i2c_client); + + pr_info("%s:fts firmware update init succeed!\n", __func__); + return 0; + + +} + +int Ft5x0x_fwupdate_deinit(struct i2c_client *client) +{ + struct kobject * fts_fw_kobj=NULL; + + fts_fw_kobj = kobject_get(firmware_kobj); + if ( !firmware_kobj ){ + printk("%s: error get kobject\n", __func__); + return -1; + } + + sysfs_remove_file(firmware_kobj, &dev_attr_ftsfwupgradeapp.attr); + // kobject_del(virtual_key_kobj); + + return 0; +} + +//#endif + diff --git a/drivers/input/touchscreen/ft5x0x_ts_new.c b/drivers/input/touchscreen/ft5x0x_ts_new.c index 7d07c6de..db7b9b3e 100755 --- a/drivers/input/touchscreen/ft5x0x_ts_new.c +++ b/drivers/input/touchscreen/ft5x0x_ts_new.c @@ -3,7 +3,14 @@ * */ - +/* +======================================================================================================= +When Who What,Where,Why Comment Tag +2011-07-11 xym update ft driver ZTE_TS_XYM_20110711 +2011-04-20 zfj add virtual key for P732A ZFJ_TS_ZFJ_20110420 +2011-03-02 zfj use create_singlethread_workqueue instead ZTE_TS_ZFJ_20110302 +2011-01-08 zfj Create file +*/ #include #include #include @@ -17,24 +24,43 @@ #include #include "ft5x0x_ts_new.h"//ZTE_TS_XYM_20110711 #include +#include +#include +#include + + +static struct i2c_client *update_client; +static int update_result_flag=0; +#if defined(CONFIG_SUPPORT_FTS_CTP_UPG) +//#if defined(CONFIG_SUPPORT_FTS_CTP_UPG) ||defined(CONFIG_FTS_USB_NOTIFY) +//static struct i2c_client *update_client; +//#endif +int Ft5x0x_fwupdate(struct i2c_client *client); +int Ft5x0x_fwupdate_init(struct i2c_client *client); +int Ft5x0x_fwupdate_deinit(struct i2c_client *client); +#endif +#if defined(CONFIG_FTS_USB_NOTIFY) +static int usb_plug_status=0; +#endif + #if defined(CONFIG_MACH_BLADE)//P729B touchscreen enable #define GPIO_TOUCH_EN_OUT 31 #elif defined(CONFIG_MACH_R750)//R750 touchscreen enable #define GPIO_TOUCH_EN_OUT 33 -#elif defined(CONFIG_MACH_TURIES) +#elif defined(CONFIG_MACH_TURIES)||defined(CONFIG_MACH_SAILBOAT) #define GPIO_TOUCH_EN_OUT 89 - #else #define GPIO_TOUCH_EN_OUT 31 #endif -#if defined(CONFIG_MACH_TURIES) +/*ZTE_TS_ZFJ_20110215 begin*/ +#if defined(CONFIG_MACH_TURIES)||defined(CONFIG_MACH_SAILBOAT) #define GPIO_TOUCH_INT_WAKEUP 18 #else #define GPIO_TOUCH_INT_WAKEUP 29 #endif - +/*ZTE_TS_ZFJ_20110215 end*/ #define ABS_SINGLE_TAP 0x21 /* Major axis of touching ellipse */ #define ABS_TAP_HOLD 0x22 /* Minor axis (omit if circular) */ @@ -44,10 +70,96 @@ #define ABS_PRESS 0x26 /* Major axis of touching ellipse */ #define ABS_PINCH 0x27 /* Minor axis (omit if circular) */ + + +static struct workqueue_struct *Fts_wq; +static struct i2c_driver Fts_ts_driver; + +struct Fts_ts_data +{ + uint16_t addr; + struct i2c_client *client; + struct input_dev *input_dev; + struct Fts_finger_data finger_data[5];//ZTE_TS_XYM_20110711 + int touch_number; + int touch_event; + int use_irq; + struct hrtimer timer; + struct work_struct work; + uint16_t max[2]; + struct early_suspend early_suspend; +}; + + +//static u8 fwVer=0;//ZTE_TS_XYM_20110830 + + + +#if defined (CONFIG_FTS_USB_NOTIFY) +static int Ft5x0x_ts_event(struct notifier_block *this, unsigned long event,void *ptr) +{ + int ret; + + switch(event) + { + case 0: + //offline + if(usb_plug_status!=0){ + usb_plug_status=0; + //printk("ts config change to offline status\n"); + i2c_smbus_write_byte_data( update_client, 0x86,0x1); + } + break; + case 1: + //online + if(usb_plug_status!=1){ + usb_plug_status=1; + //printk("ts config change to online status\n"); + i2c_smbus_write_byte_data( update_client, 0x86,0x3); + } + break; + default: + break; + } + + ret = NOTIFY_DONE; + + return ret; +} + +static struct notifier_block ts_notifier = { + .notifier_call = Ft5x0x_ts_event, +}; + + +static BLOCKING_NOTIFIER_HEAD(ts_chain_head); + +int Ft5x0x_register_ts_notifier(struct notifier_block *nb) +{ + return blocking_notifier_chain_register(&ts_chain_head, nb); +} +EXPORT_SYMBOL_GPL(Ft5x0x_register_ts_notifier); + +int Ft5x0x_unregister_ts_notifier(struct notifier_block *nb) +{ + return blocking_notifier_chain_unregister(&ts_chain_head, nb); +} +EXPORT_SYMBOL_GPL(Ft5x0x_unregister_ts_notifier); + +int Ft5x0x_ts_notifier_call_chain(unsigned long val) +{ + return (blocking_notifier_call_chain(&ts_chain_head, val, NULL) + == NOTIFY_BAD) ? -EINVAL : 0; +} + +#endif + #if defined(CONFIG_TOUCHSCREEN_VIRTUAL_KEYS) #define virtualkeys virtualkeys.Fts-touchscreen #if defined (CONFIG_MACH_RACER2) static const char ts_keys_size[] = "0x01:217:40:340:60:34:0x01:139:120:340:60:34:0x01:158:200:340:60:34"; +#elif defined(CONFIG_MACH_SAILBOAT) +static const char ts_keys_size[] = "0x01:102:40:500:80:10:0x01:139:160:500:80:10:0x01:158:280:500:80:10"; #else //static const char ts_keys_size[] = "0x01:139:40:920:60:40:0x01:102:165:920:60:40:0x01:158:280:920:60:40:0x01:217:440:920:60:40"; static const char ts_keys_size[] = "0x01:139:30:520:50:80:0x01:102:110:520:60:80:0x01:158:200:520:60:80:0x01:217:300:520:60:80"; @@ -63,6 +175,9 @@ static ssize_t virtualkeys_show(struct device *dev, static DEVICE_ATTR(virtualkeys, 0444, virtualkeys_show, NULL); extern struct kobject *android_touch_kobj; static struct kobject * virtual_key_kobj; + +//static struct kobject * fts_binfile_kobj; + static int ts_key_report_init(void) { int ret; @@ -81,6 +196,7 @@ static int ts_key_report_init(void) pr_err("%s: sysfs_create_file failed\n", __func__); return ret; } + pr_info("%s:virtual key init succeed!\n", __func__); return 0; } @@ -92,312 +208,70 @@ static void ts_key_report_deinit(void) #endif - -static struct workqueue_struct *Fts_wq; -static struct i2c_driver Fts_ts_driver; - -struct Fts_ts_data -{ - uint16_t addr; - struct i2c_client *client; - struct input_dev *input_dev; - struct Fts_finger_data finger_data[5]; - int touch_number; - int touch_event; - int use_irq; - struct hrtimer timer; - struct work_struct work; - uint16_t max[2]; - struct early_suspend early_suspend; -}; - -#ifdef CONFIG_MACH_ROAMER -#define CONFIG_SUPPORT_FTS_CTP_UPG -#endif - -#if defined(CONFIG_SUPPORT_FTS_CTP_UPG) - -static struct i2c_client *update_client; -static int update_result_flag=0; -#endif -static int Fts_i2c_read(struct i2c_client *client, int reg, u8 * buf, int count) -{ - int rc; - int ret = 0; - - buf[0] = reg; - rc = i2c_master_send(client, buf, 1); - if (rc != 1) - { - dev_err(&client->dev, "Fts_i2c_read FAILED: read of register %d\n", reg); - ret = -1; - goto tp_i2c_rd_exit; - } - rc = i2c_master_recv(client, buf, count); - if (rc != count) - { - dev_err(&client->dev, "Fts_i2c_read FAILED: read %d bytes from reg %d\n", count, reg); - ret = -1; - } - - tp_i2c_rd_exit: - return ret; -} -static int Fts_i2c_write(struct i2c_client *client, int reg, u8 data) -{ - u8 buf[2]; - int rc; - int ret = 0; - - buf[0] = reg; - buf[1] = data; - rc = i2c_master_send(client, buf, 2); - if (rc != 2) - { - dev_err(&client->dev, "Fts_i2c_write FAILED: writing to reg %d\n", reg); - ret = -1; - } - return ret; -} - -#ifdef CONFIG_SUPPORT_FTS_CTP_UPG - -typedef enum -{ - ERR_OK, - ERR_MODE, - ERR_READID, - ERR_ERASE, - ERR_STATUS, - ERR_ECC, - ERR_DL_ERASE_FAIL, - ERR_DL_PROGRAM_FAIL, - ERR_DL_VERIFY_FAIL -}E_UPGRADE_ERR_TYPE; - -typedef unsigned char FTS_BYTE; //8 bit -typedef unsigned short FTS_WORD; //16 bit -typedef unsigned int FTS_DWRD; //16 bit -typedef unsigned char FTS_BOOL; //8 bit - -#define FTS_NULL 0x0 -#define FTS_TRUE 0x01 -#define FTS_FALSE 0x0 - -void delay_ms(FTS_WORD w_ms) -{ - //platform related, please implement this function - msleep( w_ms ); -} - - -FTS_BOOL cmd_write(struct i2c_client *client,FTS_BYTE btcmd,FTS_BYTE btPara1,FTS_BYTE btPara2,FTS_BYTE btPara3,FTS_BYTE num) -{ - FTS_BYTE write_cmd[4] = {0}; - - write_cmd[0] = btcmd; - write_cmd[1] = btPara1; - write_cmd[2] = btPara2; - write_cmd[3] = btPara3; - return i2c_master_send(client, write_cmd, num); -} - - -FTS_BOOL byte_write(struct i2c_client *client,FTS_BYTE* pbt_buf, FTS_DWRD dw_len) -{ - - return i2c_master_send(client, pbt_buf, dw_len); -} - - -FTS_BOOL byte_read(struct i2c_client *client,FTS_BYTE* pbt_buf, FTS_BYTE bt_len) +bool validate_fts_ctpm(struct i2c_client *client) { - return i2c_master_recv(client, pbt_buf, bt_len); + int retry;//ret; + signed int buf; + + retry = 3; + while (retry-- > 0) + { + buf = i2c_smbus_read_byte_data(client, FT5X0X_REG_FIRMID); + if ( buf >= 0 ){ + pr_info("wly: i2c_smbus_read_byte_data, FT5X0X_REG_FIRMID = 0x%x.\n", buf); + return true; + } + msleep(10); + } + printk("wly: focaltech touch is not exsit.\n"); + return false; } - - - -#define FTS_PACKET_LENGTH 122//250//122//26/10/2 - -static unsigned char CTPM_FW[]= +static int get_screeninfo(uint *xres, uint *yres) { -#ifdef CONFIG_MACH_ROAMER -#include "ft_Ver10_20110705_036_9475_app_roamer.i" //ZTE_TS_XYM_20110711 -#else + struct fb_info *info; -#endif -//#include "ft_app1.i" -}; - -E_UPGRADE_ERR_TYPE fts_ctpm_fw_upgrade(struct i2c_client *client,FTS_BYTE* pbt_buf, FTS_DWRD dw_lenth) -{ -// FTS_BYTE cmd_len = 0; - FTS_BYTE reg_val[2] = {0}; - FTS_DWRD i = 0; -// FTS_BYTE ecc = 0; - - FTS_DWRD packet_number; - FTS_DWRD j; - FTS_DWRD temp; - FTS_DWRD lenght; - FTS_BYTE packet_buf[FTS_PACKET_LENGTH + 6]; - FTS_BYTE auc_i2c_write_buf[10]; - FTS_BYTE bt_ecc; - - /*********Step 1:Reset CTPM *****/ - /*write 0xaa to register 0xfc*/ - Fts_i2c_write(client,0xfc,0xaa); - delay_ms(50); - /*write 0x55 to register 0xfc*/ - Fts_i2c_write(client,0xfc,0x55); - printk("Step 1: Reset CTPM test\n"); - - delay_ms(40); - - /*********Step 2:Enter upgrade mode *****/ - auc_i2c_write_buf[0] = 0x55; - auc_i2c_write_buf[1] = 0xaa; - i2c_master_send(client, auc_i2c_write_buf, 2); - printk("Step 2: Enter update mode. \n"); - - /*********Step 3:check READ-ID***********************/ - /*send the opration head*/ - do{ - if(i > 3) - { - return ERR_READID; - } - /*read out the CTPM ID*/ - - cmd_write(client,0x90,0x00,0x00,0x00,4); - byte_read(client,reg_val,2); - i++; - printk("Step 3: CTPM ID,ID1 = 0x%x,ID2 = 0x%x\n",reg_val[0],reg_val[1]); - }while(reg_val[0] != 0x79 || reg_val[1] != 0x03); - - /*********Step 4:erase app*******************************/ - cmd_write(client,0x61,0x00,0x00,0x00,1); - delay_ms(1500); - printk("Step 4: erase. \n"); - - /*********Step 5:write firmware(FW) to ctpm flash*********/ - bt_ecc = 0; - printk("Step 5: start upgrade. \n"); - dw_lenth = dw_lenth - 8; - packet_number = (dw_lenth) / FTS_PACKET_LENGTH; - packet_buf[0] = 0xbf; - packet_buf[1] = 0x00; - for (j=0;j>8); - packet_buf[3] = (FTS_BYTE)temp; - lenght = FTS_PACKET_LENGTH; - packet_buf[4] = (FTS_BYTE)(lenght>>8); - packet_buf[5] = (FTS_BYTE)lenght; - - for (i=0;i 0) - { - temp = packet_number * FTS_PACKET_LENGTH; - packet_buf[2] = (FTS_BYTE)(temp>>8); - packet_buf[3] = (FTS_BYTE)temp; - - temp = (dw_lenth) % FTS_PACKET_LENGTH; - packet_buf[4] = (FTS_BYTE)(temp>>8); - packet_buf[5] = (FTS_BYTE)temp; - - for (i=0;i>8); - packet_buf[3] = (FTS_BYTE)temp; - temp =1; - packet_buf[4] = (FTS_BYTE)(temp>>8); - packet_buf[5] = (FTS_BYTE)temp; - packet_buf[6] = pbt_buf[ dw_lenth + i]; - bt_ecc ^= packet_buf[6]; - - byte_write(client,&packet_buf[0],7); - delay_ms(20); - } - - /*********Step 6: read out checksum***********************/ - /*send the opration head*/ - cmd_write(client,0xcc,0x00,0x00,0x00,1); - byte_read(client,reg_val,1); - printk("Step 6: ecc read 0x%x, new firmware 0x%x. \n", reg_val[0], bt_ecc); - if(reg_val[0] != bt_ecc) - { - return ERR_ECC; - } - - /*********Step 7: reset the new FW***********************/ - cmd_write(client,0x07,0x00,0x00,0x00,1); + info = registered_fb[0]; + if (!info) { + pr_err("%s: Can not access lcd info \n",__func__); + return -ENODEV; + } - return ERR_OK; -} + *xres = info->var.xres; + *yres = info->var.yres; + printk("xres=%d, yres=%d \n",*xres,*yres); -unsigned char fts_ctpm_get_upg_ver(void) -{ - unsigned int ui_sz; - ui_sz = sizeof(CTPM_FW); - if (ui_sz > 2) - { - return CTPM_FW[ui_sz - 2]; - } - else - { - //TBD, error handling? - return 0xff; //default value - } + return 1; } -#endif - static int proc_read_val(char *page, char **start, off_t off, int count, int *eof, void *data) { int len = 0; + char buf; + len += sprintf(page + len, "%s\n", "touchscreen module"); len += sprintf(page + len, "name : %s\n", "FocalTech"); - #if defined(CONFIG_MACH_R750) - len += sprintf(page + len, "i2c address : %x\n", 0x3E); - #else +#if defined(CONFIG_MACH_R750) len += sprintf(page + len, "i2c address : 0x%x\n", 0x3E); - #endif +#else + len += sprintf(page + len, "i2c address : 0x%x\n", 0x3E); +#endif len += sprintf(page + len, "IC type : %s\n", "FT5X06"); - len += sprintf(page + len, "module : %s\n", "FocalTech FT5x06"); - #ifdef CONFIG_SUPPORT_FTS_CTP_UPG - len += sprintf(page + len, "update flag : 0x%x\n", update_result_flag); - #endif +#if defined(CONFIG_MACH_RACER2) + len += sprintf(page + len, "module : %s\n", "FocalTech FT5x06 + lcetron"); +#else + len += sprintf(page + len, "module : %s\n", "FocalTech FT5x06 + Goworld"); +#endif + + buf = i2c_smbus_read_byte_data(update_client, FT5X0X_REG_FIRMID); + len += sprintf(page + len, "firmware : 0x%x\n", buf );//ZTE_TS_XYM_20110830 +#ifdef CONFIG_SUPPORT_FTS_CTP_UPG + len += sprintf(page + len, "update flag : 0x%x\n", update_result_flag); +#endif + if (off + count >= len) *eof = 1; if (len < off) @@ -409,63 +283,27 @@ proc_read_val(char *page, char **start, off_t off, int count, int *eof, static int proc_write_val(struct file *file, const char *buffer, unsigned long count, void *data) { +#ifdef CONFIG_SUPPORT_FTS_CTP_UPG + int ret = 0;//ZTE_TS_XYM_20110830 +#endif + unsigned long val; - sscanf(buffer, "%lu", &val); #ifdef CONFIG_SUPPORT_FTS_CTP_UPG - printk("Fts Upgrade Start\n"); - update_result_flag=0; - - fts_ctpm_fw_upgrade(update_client,CTPM_FW, sizeof(CTPM_FW)); - { - u8 buf; - int ret = 0, retry = 0; - msleep(2000); - Fts_i2c_write(update_client, 0x00, 0x40); - msleep(20); - ret = Fts_i2c_read(update_client, 0x00, &buf, 1); - retry = 3; - while(retry-- >0) - { - if(0x40 == buf) - break; - if(0x40 != buf) - { - pr_info("%s: Enter test mode failed, retry = %d!\n", __func__, retry); - Fts_i2c_write(update_client, 0x00, 0x40); - msleep(20); - ret = Fts_i2c_read(update_client, 0x00, &buf, 1); - } - } - - msleep(3000); - Fts_i2c_write(update_client, 0x4D, 0x4); - msleep(10000); - Fts_i2c_read(update_client, 0x4D, &buf, 1); - retry=5; - while(retry-- >0) - { - if(0x50 == buf) - break; - if(0x50 != buf) - { - pr_info("%s value of register 0x4D is %d.\n", __func__, buf); - Fts_i2c_read(update_client, 0x4D, &buf, 1); - if(buf == 0x30) - pr_info("%s: Calibration failed! Retry!\n", __func__); - msleep(2000); - } - - } - - pr_info("%s value of register 0x4D is %d\n", __func__, buf); - - Fts_i2c_write(update_client, 0x00, 0x0); - } - update_result_flag=2; -#endif - return -EINVAL; + update_result_flag=0; + //ret = fts_ctpm_update(CTPM_FW,sizeof(CTPM_FW)); + ret = Ft5x0x_fwupdate(update_client); + update_result_flag=2; + if (ret < 0){ + printk("fts fw update failed!\n"); + return -EINVAL; + }else{ + printk("fts fw update successfully!\n"); + return 0; + } +#endif + return 0; } static void Fts_ts_work_func(struct work_struct *work) @@ -475,9 +313,10 @@ static void Fts_ts_work_func(struct work_struct *work) struct Fts_ts_data *ts = container_of(work, struct Fts_ts_data, work); - ret = Fts_i2c_read(ts->client, 0x00, buf, 33); + //buf = i2c_smbus_read_byte_data(ts->client, 0x00, 33); + ret = i2c_smbus_read_i2c_block_data(ts->client, 0x00, 33, buf); if (ret < 0){ - printk(KERN_ERR "Fts_ts_work_func: Fts_i2c_write failed, go to poweroff.\n"); + printk(KERN_ERR "Fts_ts_work_func: i2c_smbus_write_byte_data failed, go to poweroff.\n"); gpio_direction_output(GPIO_TOUCH_EN_OUT, 0); msleep(200); gpio_direction_output(GPIO_TOUCH_EN_OUT, 1); @@ -485,8 +324,6 @@ static void Fts_ts_work_func(struct work_struct *work) } else { - - ts->touch_number = buf[2]&0x0f; ts->touch_event = buf[2] >> 4; for (i = 0; i< 5; i++) @@ -507,6 +344,8 @@ static void Fts_ts_work_func(struct work_struct *work) input_report_abs(ts->input_dev, ABS_MT_POSITION_X, ts->finger_data[i].x ); input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, ts->finger_data[i].y ); input_mt_sync(ts->input_dev); + //printk("finger=%d, z=%d, event_flag=%d, touch_id=%d\n", i, + //ts->finger_data[i].z, ts->finger_data[i].event_flag,ts->finger_data[i].touch_id); } input_sync(ts->input_dev); } @@ -529,13 +368,17 @@ static int Fts_ts_suspend(struct i2c_client *client, pm_message_t mesg) int ret = 0; struct Fts_ts_data *ts; + //ts = container_of(client, struct Fts_ts_data , client); ts = i2c_get_clientdata(client); disable_irq(client->irq); ret = cancel_work_sync(&ts->work); if(ret & ts->use_irq) enable_irq(client->irq); - Fts_i2c_write(client, FT5X0X_REG_PMODE, PMODE_HIBERNATE); + //flush_workqueue(ts->work); + // ==set mode ==, + //ft5x0x_set_reg(FT5X0X_REG_PMODE, PMODE_HIBERNATE); gpio_direction_output(GPIO_TOUCH_INT_WAKEUP,1); + i2c_smbus_write_byte_data(client, FT5X0X_REG_PMODE, PMODE_HIBERNATE); return 0; } @@ -544,15 +387,26 @@ static int Fts_ts_resume(struct i2c_client *client) uint8_t buf,retry=0; Fts_resume_start: - + //gpio_direction_output(GPIO_TOUCH_EN_OUT,1); + //gpio_direction_output(GPIO_TOUCH_INT_WAKEUP,1); + //msleep(250); gpio_set_value(GPIO_TOUCH_INT_WAKEUP,0); msleep(5); gpio_set_value(GPIO_TOUCH_INT_WAKEUP,1); msleep(5); gpio_direction_input(GPIO_TOUCH_INT_WAKEUP); - if ( Fts_i2c_read(client, FT5X0X_REG_FIRMID, &buf,1) < 0) - { + //fix bug: fts failed set reg when usb plug in under suspend mode +#if defined(CONFIG_FTS_USB_NOTIFY) + if(usb_plug_status==1) + i2c_smbus_write_byte_data( update_client, 0x86,0x3); + else + i2c_smbus_write_byte_data( update_client, 0x86,0x1); +#endif + + buf = i2c_smbus_read_byte_data(client, FT5X0X_REG_FIRMID ); + if ( !buf ) + {//I2C error read firmware ID printk("Fts FW ID read Error: retry=%x\n",retry); if ( ++retry < 3 ) goto Fts_resume_start; @@ -584,10 +438,12 @@ static int Fts_ts_probe( struct i2c_client *client, const struct i2c_device_id *id) { struct Fts_ts_data *ts; - int ret = 0, retry = 0; - u8 fwVer; + int ret = 0;//, retry = 0; + //u8 fwVer; struct proc_dir_entry *dir, *refresh; - u8 buf; + //u8 buf; + int xres, yres; // lcd x,y resolution + ret = gpio_request(GPIO_TOUCH_EN_OUT, "touch voltage"); if (ret) @@ -595,7 +451,6 @@ static int Fts_ts_probe( printk("gpio 31 request is error!\n"); goto err_check_functionality_failed; } - gpio_direction_output(GPIO_TOUCH_EN_OUT, 1); msleep(250); @@ -612,124 +467,39 @@ static int Fts_ts_probe( goto err_alloc_data_failed; } - INIT_WORK(&ts->work, Fts_ts_work_func); - + if (!validate_fts_ctpm(client)) + goto err_detect_failed; + Fts_wq= create_singlethread_workqueue("Fts_wq"); if(!Fts_wq) { ret = -ESRCH; pr_err("%s creare single thread workqueue failed!\n", __func__); - goto err_create_singlethread; + goto err_detect_failed; } + INIT_WORK(&ts->work, Fts_ts_work_func); + ts->client = client; -#ifdef CONFIG_SUPPORT_FTS_CTP_UPG - update_client=client; -#endif i2c_set_clientdata(client, ts); client->driver = &Fts_ts_driver; - - { - retry = 3; - while (retry-- > 0) - { - ret = Fts_i2c_read(client, FT5X0X_REG_FIRMID, &buf,1); - pr_info("wly: Fts_i2c_read, FT5X0X_REG_FIRMID = %x.\n", buf); - fwVer = buf; - if (0 == ret) - break; - msleep(10); - } - - if (retry < 0) - { - ret = -1; - goto err_detect_failed; - } - - } - - #ifdef CONFIG_SUPPORT_FTS_CTP_UPG - if ( fts_ctpm_get_upg_ver() > fwVer ) - { - printk("Fts Upgrade Start\n"); - fts_ctpm_fw_upgrade(ts->client,CTPM_FW, sizeof(CTPM_FW)); - { - //adjust begin - msleep(2000); - Fts_i2c_write(ts->client, 0x00, 0x40); - msleep(20); - ret = Fts_i2c_read(ts->client, 0x00, &buf, 1); - retry = 3; - while(retry-- >0) - { - if(0x40 == buf) - break; - if(0x40 != buf) - { - pr_info("%s: Enter test mode failed, retry = %d!\n", __func__, retry); - Fts_i2c_write(ts->client, 0x00, 0x40); - msleep(20); - ret = Fts_i2c_read(ts->client, 0x00, &buf, 1); - } - } - - msleep(3000); - Fts_i2c_write(ts->client, 0x4D, 0x4); - msleep(10000); - Fts_i2c_read(ts->client, 0x4D, &buf, 1); - retry=5; - while(retry-- >0) - { - if(0x50 == buf) - break; - if(0x50 != buf) - { - pr_info("%s value of register 0x4D is %d.\n", __func__, buf); - Fts_i2c_read(ts->client, 0x4D, &buf, 1); - if(buf == 0x30) - pr_info("%s: Calibration failed! Retry!\n", __func__); - msleep(2000); - } - } - - pr_info("%s value of register 0x4D is %d\n", __func__, buf); - - Fts_i2c_write(ts->client, 0x00, 0x0); - //adjust end - } - } - ret = Fts_i2c_read(ts->client, FT5X0X_REG_FIRMID, &fwVer,1) ; - printk("New Fts FW ID read ID = %x,ret = %x\n",fwVer,ret); - #endif +//#if defined(CONFIG_SUPPORT_FTS_CTP_UPG) || defined(CONFIG_FTS_USB_NOTIFY) + update_client = client; + update_result_flag = 0; +//#endif + ts->input_dev = input_allocate_device(); if (ts->input_dev == NULL) { ret = -ENOMEM; printk(KERN_ERR "Fts_ts_probe: Failed to allocate input device\n"); goto err_input_dev_alloc_failed; } - ts->input_dev->name = "Fts-touchscreen"; //ts->input_dev->phys = "Fts-touchscreen/input0"; -#if 0 - set_bit(EV_SYN, ts->input_dev->evbit); - set_bit(EV_KEY, ts->input_dev->evbit); - set_bit(BTN_TOUCH, ts->input_dev->keybit); - set_bit(EV_ABS, ts->input_dev->evbit); - set_bit(ABS_EARLY_TAP, ts->input_dev->absbit); - set_bit(ABS_FLICK, ts->input_dev->absbit); - set_bit(ABS_PRESS, ts->input_dev->absbit); - set_bit(ABS_PINCH, ts->input_dev->absbit); - set_bit(ABS_MT_TOUCH_MAJOR, ts->input_dev->absbit); - set_bit(ABS_MT_POSITION_X, ts->input_dev->absbit); - set_bit(ABS_MT_POSITION_Y, ts->input_dev->absbit); - set_bit(ABS_MT_WIDTH_MAJOR, ts->input_dev->absbit); - set_bit(KEY_MENU, ts->input_dev->keybit); - set_bit(KEY_BACK, ts->input_dev->keybit); - set_bit(KEY_HOME, ts->input_dev->keybit); - set_bit(KEY_SEARCH, ts->input_dev->keybit); -#endif + + get_screeninfo(&xres, &yres); + set_bit(ABS_MT_TRACKING_ID, ts->input_dev->absbit); set_bit(EV_SYN, ts->input_dev->evbit); set_bit(EV_KEY, ts->input_dev->evbit); @@ -742,8 +512,8 @@ static int Fts_ts_probe( set_bit(KEY_SEARCH, ts->input_dev->keybit); input_set_abs_params(ts->input_dev, ABS_MT_TRACKING_ID, 0, 10, 0, 0); input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0); - input_set_abs_params(ts->input_dev, ABS_MT_POSITION_X, 0, SCREEN_MAX_X, 0, 0); - input_set_abs_params(ts->input_dev, ABS_MT_POSITION_Y, 0, SCREEN_MAX_Y, 0, 0); + input_set_abs_params(ts->input_dev, ABS_MT_POSITION_X, 0, xres, 0, 0); + input_set_abs_params(ts->input_dev, ABS_MT_POSITION_Y, 0, yres, 0, 0); input_set_abs_params(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0, 255, 0, 0); input_set_abs_params(ts->input_dev, ABS_SINGLE_TAP, 0, 5, 0, 0); input_set_abs_params(ts->input_dev, ABS_TAP_HOLD, 0, 5, 0, 0); @@ -760,23 +530,25 @@ static int Fts_ts_probe( goto err_input_register_device_failed; } - if (client->irq) + if (client->irq) + { + ret = request_irq(client->irq, Fts_ts_irq_handler, IRQF_TRIGGER_FALLING, "ft5x0x_ts", ts); + if (ret == 0) + ts->use_irq = 1; + else { - ret = request_irq(client->irq, Fts_ts_irq_handler, IRQF_TRIGGER_FALLING, "ft5x0x_ts", ts); - if (ret == 0) - ts->use_irq = 1; - else - { - dev_err(&client->dev, "request_irq failed\n"); - goto err_input_request_irq_failed; - } + dev_err(&client->dev, "request_irq failed\n"); + goto err_input_request_irq_failed; } + } + #ifdef CONFIG_HAS_EARLYSUSPEND ts->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1; ts->early_suspend.suspend = Fts_ts_early_suspend; ts->early_suspend.resume = Fts_ts_late_resume; register_early_suspend(&ts->early_suspend); #endif + dir = proc_mkdir("touchscreen", NULL); refresh = create_proc_entry("ts_information", 0777, dir); if (refresh) { @@ -789,17 +561,26 @@ static int Fts_ts_probe( #if defined(CONFIG_TOUCHSCREEN_VIRTUAL_KEYS) ts_key_report_init(); #endif + printk("xiayc~-1\n"); +#if defined(CONFIG_SUPPORT_FTS_CTP_UPG) + printk("xiayc~-2\n"); + ret = Ft5x0x_fwupdate_init(client); + if ( ret < 0 ) + printk("%s: firmware update initialization failed!\n ",__func__); +#endif +#if defined(CONFIG_FTS_USB_NOTIFY) + Ft5x0x_register_ts_notifier(&ts_notifier); +#endif + return 0; err_input_request_irq_failed: err_input_register_device_failed: input_free_device(ts->input_dev); - err_input_dev_alloc_failed: + destroy_workqueue(Fts_wq); err_detect_failed: kfree(ts); - destroy_workqueue(Fts_wq); -err_create_singlethread: err_alloc_data_failed: err_check_functionality_failed: gpio_free(GPIO_TOUCH_EN_OUT); @@ -812,6 +593,10 @@ static int Fts_ts_remove(struct i2c_client *client) #if defined(CONFIG_TOUCHSCREEN_VIRTUAL_KEYS) ts_key_report_deinit(); #endif +#if defined(CONFIG_SUPPORT_FTS_CTP_UPG) + Ft5x0x_fwupdate_deinit(client); +#endif + unregister_early_suspend(&ts->early_suspend); if (ts->use_irq) free_irq(client->irq, ts); @@ -846,11 +631,13 @@ static struct i2c_driver Fts_ts_driver = { static int __devinit Fts_ts_init(void) { + /*ZTE_TS_ZFJ_20110302 begin*/ #if 0 Fts_wq = create_rt_workqueue("Fts_wq"); if (!Fts_wq) return -ENOMEM; #endif + /*ZTE_TS_ZFJ_20110302 end*/ return i2c_add_driver(&Fts_ts_driver); } diff --git a/drivers/input/touchscreen/ft5x0x_ts_new.h b/drivers/input/touchscreen/ft5x0x_ts_new.h index cc5a0554..7a9e429b 100755 --- a/drivers/input/touchscreen/ft5x0x_ts_new.h +++ b/drivers/input/touchscreen/ft5x0x_ts_new.h @@ -1,6 +1,6 @@ #ifndef __LINUX_FT5X0X_TS_NEW_H__ #define __LINUX_FT5X0X_TS_NEW_H__ - +/* #if defined(CONFIG_MACH_ROAMER) #define SCREEN_MAX_X 320 #define SCREEN_MAX_Y 480 @@ -15,7 +15,7 @@ #define SCREEN_MAX_Y 800 #endif #define PRESS_MAX 255 - +*/ #define FT5X0X_NAME "ft5x0x_ts" struct Fts_finger_data { int x; diff --git a/drivers/input/touchscreen/mXT224_atmel.c b/drivers/input/touchscreen/mXT224_atmel.c index 79b36492..912cdb63 100644 --- a/drivers/input/touchscreen/mXT224_atmel.c +++ b/drivers/input/touchscreen/mXT224_atmel.c @@ -12,7 +12,17 @@ * GNU General Public License for more details. * */ - +/* ======================================================================================== +when who what, where, why comment tag +-------- ---- ------------------------------------- -------------------------- +2011-08-30 hjy add the TOUCH_LONG_SLIDE function TOUCH_LONG_SLIDE +2011-04-25 zfj add P732A driver code ZTE_TS_ZFJ_20110425 +2011-02-23 hjy ATMEL 140 用在P727A20上 ZTE_HJY_CRDB00000000 +2010-12-14 wly v9默认竖屏 ZTE_WLY_CRDB00586327 +2010-12-13 wly v9+默认竖屏 ZTE_WLY_CRDB00586327 +2010-11-24 wly 解决手掌在屏上,睡眠唤醒后数据乱报问题 ZTE_WLY_CRDB00577718 +2010-10-25 wly update report data format ZTE_WLY_CRDB00517999 +========================================================================================*/ #include #include #include @@ -34,9 +44,9 @@ #define ATMEL_I2C_RETRY_TIMES 10 #define ENABLE_IME_IMPROVEMENT -#if defined (CONFIG_MACH_SKATE) +#if 0//defined (CONFIG_MACH_SAILBOAT) //WHEN UNLOCK THE SCREEN THEN turn the atch off -//#define FUNCTION_UNLOCK_ATCH_OFF +#define FUNCTION_UNLOCK_ATCH_OFF #endif #if defined(CONFIG_TOUCHSCREEN_VIRTUAL_KEYS) @@ -72,6 +82,8 @@ struct atmel_ts_data { uint16_t *filter_level; uint8_t calibration_confirm; uint64_t timestamp; + + uint64_t timestamp1; struct atmel_config_data config_setting[2]; uint8_t status; uint8_t GCAF_sample; @@ -224,21 +236,23 @@ uint8_t get_report_ids_size(struct atmel_ts_data *ts, uint8_t object_type) } #ifdef ATMEL_EN_SYSFS - +//huangjinyu ZTE_TS_HUANGJINYU_20110223 BEGIN #if defined(CONFIG_MACH_MOONCAKE) static const char ts_keys_size[] = "0x01:102:40:350:50:15:0x01:158:200:350:50:15"; - +/*ZTE_TS_ZFJ_20110425 begin*/ #elif defined(CONFIG_MACH_NOVA) static const char ts_keys_size[] = "0x01:139:30:520:50:80:0x01:102:110:520:60:80:0x01:158:200:520:60:80:0x01:217:300:520:60:80"; - +/*ZTE_TS_ZFJ_20110425 end */ #elif defined(CONFIG_MACH_SAILBOAT) -static const char ts_keys_size[] = "0x01:102:40:506:80:14:0x01:139:160:506:80:14:0x01:158:280:506:80:14"; +static const char ts_keys_size[] = "0x01:102:40:506:80:12:0x01:139:160:506:80:12:0x01:158:280:506:80:12"; +#elif defined(CONFIG_MACH_BLUETICK) +static const char ts_keys_size[] = "0x01:139:60:880:80:40:0x01:102:170:880:80:40:0x01:158:310:880:80:40:0x01:217:410:880:80:40"; #elif defined(CONFIG_MACH_BLADE2) static const char ts_keys_size[] = "0x01:139:60:844:100:40:0x01:102:180:844:100:40:0x01:158:300:844:100:40:0x01:217:420:844:100:40"; #else static const char ts_keys_size[] = "0x01:102:80:810:100:10:0x01:139:240:810:100:10:0x01:158:400:810:100:10"; #endif - +//huangjinyu ZTE_TS_HUANGJINYU_20110223 END static ssize_t atmel_virtualkeys_show(struct device *dev, struct device_attribute *attr, char *buf) { @@ -555,8 +569,8 @@ static int ime_report_filter(struct atmel_ts_data *ts, uint8_t *data) discard = 1; } if (discard) { - - ts->finger_data[report_type].z = z; + /* if finger's movement < threshold , discard it. */ + ts->finger_data[report_type].z = z;//add by huangjinyu 20110523 return 1; } ts->finger_data[report_type].x = x; @@ -713,6 +727,170 @@ static void release_all_fingers(struct atmel_ts_data*ts) static int unlock=1; static int check_ok=0; #endif +#define TOUCH_LONG_SLIDE +#ifdef TOUCH_LONG_SLIDE +static int x_value; +static int y_value; +//是否取了起点的标志位 +// 0 no +// 1 yes +// 2 ok +static uint8_t temp_flag=0; +//是否滑动完成的标志位 +// 0 no +// 1 yes +static uint8_t temp_flag2=0; +#endif + +static struct atmel_ts_data *ts_temp; + +//#if defined(CONFIG_MACH_BLUETICK)||defined(CONFIG_MACH_BLADE2)||defined(CONFIG_MACH_ROAMER)||defined(CONFIG_MACH_SAILBOAT) +#define TCH_CALIBRATION + +#ifdef TCH_CALIBRATION +static int8_t temp_t9_7=0; + #if defined(CONFIG_MACH_BLUETICK) + #define temp_t9_7_def1 80 + #elif defined(CONFIG_MACH_BLADE2) + //#if defined(CONFIG_TOUCHSCREEN_MXT224_P736V) + #define temp_t9_7_def1 60 + //#endif + #elif defined(CONFIG_MACH_ROAMER) + //#if defined(CONFIG_TOUCHSCREEN_MXT224_N760) + #define temp_t9_7_def1 70 + //#endif + #elif defined(CONFIG_MACH_V9) + #define temp_t9_7_def1 50 + #else + #define temp_t9_7_def1 70 + #endif +static uint8_t temp_release=0; + +#endif + +//#endif + +#if defined CONFIG_TS_NOTIFIER +static int usb_status=0; + +static int ts_event(struct notifier_block *this, unsigned long event, + void *ptr) +{ + int ret; + + switch(event) + { + case 0: + //offline + if(usb_status!=0){ + usb_status=0; + printk("ts config change to offline status\n"); + if(ts_temp->id->version!=0x16){ + i2c_atmel_write_byte_data(ts_temp->client, + get_object_address(ts_temp, TOUCH_MULTITOUCHSCREEN_T9) + 31, + ts_temp->config_setting[0].config_T9[31]); + } + #if defined(TCH_CALIBRATION) + //在拔出USB的时候,也是缓慢的漂回默认值,避免拔USB的时候出问题 + //P736V在桌子上的时候不能将门限提到70 所以只能先直接降低一些 + + temp_t9_7=ts_temp->config_setting[0].config_T9_charge[0]; + if(temp_t9_7>=temp_t9_7_def1) + temp_t9_7=temp_t9_7_def1; + //在这里不需要重新算手指的抬起,只要更新了时间就可以了 + //temp_release=0; + ts_temp->timestamp1=jiffies; + + #else + i2c_atmel_write_byte_data(ts_temp->client, + get_object_address(ts_temp, TOUCH_MULTITOUCHSCREEN_T9) + 7, + ts_temp->config_setting[0].config_T9[7]); + #endif + i2c_atmel_write_byte_data(ts_temp->client, + get_object_address(ts_temp, TOUCH_MULTITOUCHSCREEN_T9) + 11, + ts_temp->config_setting[0].config_T9[11]); + + i2c_atmel_write_byte_data(ts_temp->client, + get_object_address(ts_temp, TOUCH_MULTITOUCHSCREEN_T9) + 12, + ts_temp->config_setting[0].config_T9[12]); + i2c_atmel_write_byte_data(ts_temp->client, + get_object_address(ts_temp, SPT_CTECONFIG_T28) + 3, + ts_temp->config_setting[0].config_T28[3]); + i2c_atmel_write_byte_data(ts_temp->client, + get_object_address(ts_temp, SPT_CTECONFIG_T28) + 4, + ts_temp->config_setting[0].config_T28[4]); + } + + break; + case 1: + //online + if(usb_status!=1){ + usb_status=1; + printk("ts config change to online status\n"); + if(ts_temp->id->version!=0x16){ + i2c_atmel_write_byte_data(ts_temp->client, + get_object_address(ts_temp, TOUCH_MULTITOUCHSCREEN_T9) + 31, + ts_temp->config_setting[0].config_T9_charge[1]); + } + i2c_atmel_write_byte_data(ts_temp->client, + get_object_address(ts_temp, TOUCH_MULTITOUCHSCREEN_T9) + 7, + ts_temp->config_setting[0].config_T9_charge[0]); + + i2c_atmel_write_byte_data(ts_temp->client, + get_object_address(ts_temp, TOUCH_MULTITOUCHSCREEN_T9) + 11, + ts_temp->config_setting[0].config_T9_charge[2]); + + i2c_atmel_write_byte_data(ts_temp->client, + get_object_address(ts_temp, TOUCH_MULTITOUCHSCREEN_T9) + 12, + ts_temp->config_setting[0].config_T9_charge[3]); + #if 0 + i2c_atmel_write_byte_data(ts_temp->client, + get_object_address(ts_temp, SPT_CTECONFIG_T28) + 3, + ts_temp->config_setting[0].config_T28_charge[0]); + i2c_atmel_write_byte_data(ts_temp->client, + get_object_address(ts_temp, SPT_CTECONFIG_T28) + 4, + ts_temp->config_setting[0].config_T28_charge[1]); + #endif + } + break; + default: + break; + } + + ret = NOTIFY_DONE; + + return ret; +} + +static struct notifier_block ts_notifier = { + .notifier_call = ts_event, +}; + + +static BLOCKING_NOTIFIER_HEAD(ts_chain_head); + +int register_ts_notifier(struct notifier_block *nb) +{ + return blocking_notifier_chain_register(&ts_chain_head, nb); +} +EXPORT_SYMBOL_GPL(register_ts_notifier); + +int unregister_ts_notifier(struct notifier_block *nb) +{ + return blocking_notifier_chain_unregister(&ts_chain_head, nb); +} +EXPORT_SYMBOL_GPL(unregister_ts_notifier); + +int ts_notifier_call_chain(unsigned long val) +{ + return (blocking_notifier_call_chain(&ts_chain_head, val, NULL) + == NOTIFY_BAD) ? -EINVAL : 0; +} + +#endif + + + static void check_calibration(struct atmel_ts_data*ts) { uint8_t data[82]; @@ -739,7 +917,7 @@ static void check_calibration(struct atmel_ts_data*ts) } i2c_atmel_read(ts->client, get_object_address(ts, DIAGNOSTIC_T37), data, 82); - + //printk("huangjinyu data[0]=%d data[1]=%d\n",data[0],data[1]); if (data[0] == 0xF3 && data[1] == 0x00) { x_limit = 16 + ts->config_setting[0].config_T28[2]; x_limit = x_limit << 1; @@ -762,7 +940,47 @@ static void check_calibration(struct atmel_ts_data*ts) atch_ch++; } } +#elif defined(CONFIG_MACH_BLUETICK) + x_limit = 15<<1; + for (loop_i = 0; loop_i < x_limit; loop_i += 2) { + for (loop_j = 3; loop_j < 8; loop_j++) { + check_mask = 1 << loop_j; + if (data[2 + loop_i] & check_mask) + tch_ch++; + if (data[32 + loop_i] & check_mask) + atch_ch++; + + } + for (loop_j = 0; loop_j < 4; loop_j++) { + check_mask = 1 << loop_j; + if (data[3 + loop_i] & check_mask) + tch_ch++; + if (data[33 + loop_i] & check_mask) + atch_ch++; + } + } + #elif defined(CONFIG_MACH_ROAMER) + #ifdef CONFIG_TOUCHSCREEN_MXT224_N760 + x_limit = 14<<1; + for (loop_i = 0; loop_i < x_limit; loop_i += 2) { + for (loop_j = 2; loop_j < 8; loop_j++) { + check_mask = 1 << loop_j; + if (data[2 + loop_i] & check_mask) + tch_ch++; + if (data[32 + loop_i] & check_mask) + atch_ch++; + + } + for (loop_j = 0; loop_j < 3; loop_j++) { + check_mask = 1 << loop_j; + if (data[3 + loop_i] & check_mask) + tch_ch++; + if (data[33 + loop_i] & check_mask) + atch_ch++; + } + } + #else x_limit = 14<<1; for (loop_i = 0; loop_i < x_limit; loop_i += 2) { for (loop_j = 2; loop_j < 8; loop_j++) { @@ -781,7 +999,29 @@ static void check_calibration(struct atmel_ts_data*ts) atch_ch++; } } + #endif #elif defined(CONFIG_MACH_BLADE2) +#ifdef CONFIG_TOUCHSCREEN_MXT224_P736V + x_limit = 14<<1; + for (loop_i = 0; loop_i < x_limit; loop_i += 2) { + for (loop_j = 2; loop_j < 8; loop_j++) { + check_mask = 1 << loop_j; + if (data[2 + loop_i] & check_mask) + tch_ch++; + if (data[32 + loop_i] & check_mask) + atch_ch++; + + } + for (loop_j = 0; loop_j < 3; loop_j++) { + check_mask = 1 << loop_j; + if (data[3 + loop_i] & check_mask) + tch_ch++; + if (data[33 + loop_i] & check_mask) + atch_ch++; + } + } + +#else x_limit = 15<<1; for (loop_i = 0; loop_i < x_limit; loop_i += 2) { for (loop_j = 2; loop_j < 8; loop_j++) { @@ -800,7 +1040,7 @@ static void check_calibration(struct atmel_ts_data*ts) atch_ch++; } } - +#endif #else for (loop_i = 0; loop_i < x_limit; loop_i += 2) { for (loop_j = 0; loop_j < 8; loop_j++) { @@ -816,7 +1056,13 @@ static void check_calibration(struct atmel_ts_data*ts) } } #endif + +#ifdef TOUCH_LONG_SLIDE + printk("***********: check_calibration, tch_ch=%d, atch_ch=%d temp_flag:%d temp_flag2:%d\n", tch_ch, atch_ch,temp_flag,temp_flag2); +#else printk("***********: check_calibration, tch_ch=%d, atch_ch=%d\n", tch_ch, atch_ch); + +#endif } i2c_atmel_write_byte_data(ts->client, get_object_address(ts, GEN_COMMANDPROCESSOR_T6) + 5, 0x01); @@ -829,63 +1075,108 @@ static void check_calibration(struct atmel_ts_data*ts) //影响了校准OK的时间,从而影响了RELEASE ALL FINGERS的时间,导致错误的释放 //所以需要知道这个计时到底从什么时候开始 //if ((tch_ch>=0) && (atch_ch == 0)&&(tch_ch <10)) - if ((tch_ch>=0) && (atch_ch == 0)&&(tch_ch <80)) + if ((tch_ch>=0) && (atch_ch == 0)&&(tch_ch <40)) { + //if((tch_ch==0) && (atch_ch == 0)&&(ts->calibration_confirm == 1)) + //release_all_fingers(ts); + #ifdef TOUCH_LONG_SLIDE + if ((jiffies > (ts->timestamp + HZ/2)||(jiffiestimestamp && jiffies>HZ/2)) + && (ts->calibration_confirm == 1)&&(temp_flag2==1)) + { + ts->calibration_confirm = 2; + + #if defined(FUNCTION_UNLOCK_ATCH_OFF) + check_ok=1; + i2c_atmel_write_byte_data(ts->client, + get_object_address(ts, GEN_ACQUISITIONCONFIG_T8) + 7, + 10); + #else + i2c_atmel_write_byte_data(ts->client, + get_object_address(ts, GEN_ACQUISITIONCONFIG_T8) + 6, + 255/*ts->config_setting[0].config_T8[6]*/); + + i2c_atmel_write_byte_data(ts->client, + get_object_address(ts, GEN_ACQUISITIONCONFIG_T8) + 7, + 1); + + if((ts->id->version!=0x16)) + i2c_atmel_write_byte_data(ts->client, + get_object_address(ts, GEN_ACQUISITIONCONFIG_T8) + 8, ts->config_setting[0].config_T8[8]); + + #endif + + //temp_flag=0; + temp_flag2=0; + + printk("***********: calibration is ok\n"); + } + #else if (jiffies > (ts->timestamp + HZ/2) && (ts->calibration_confirm == 1)) { ts->calibration_confirm = 2; - #if !defined(CONFIG_MACH_SAILBOAT) - release_all_fingers(ts); - #endif + //should added huangjinyu + //but if the calibration is slow,it will wrong release one time + //#if !defined(CONFIG_MACH_SAILBOAT) + //release_all_fingers(ts); + //#endif + + #if defined(FUNCTION_UNLOCK_ATCH_OFF) check_ok=1; i2c_atmel_write_byte_data(ts->client, get_object_address(ts, GEN_ACQUISITIONCONFIG_T8) + 7, 10); #else - #if defined(CONFIG_MACH_SKATE)||defined(CONFIG_MACH_ROAMER) i2c_atmel_write_byte_data(ts->client, get_object_address(ts, GEN_ACQUISITIONCONFIG_T8) + 6, - ts->config_setting[0].config_T8[6]); + 255/*ts->config_setting[0].config_T8[6]*/); i2c_atmel_write_byte_data(ts->client, get_object_address(ts, GEN_ACQUISITIONCONFIG_T8) + 7, 1); - #else + + if((ts->id->version!=0x16)) i2c_atmel_write_byte_data(ts->client, - get_object_address(ts, GEN_ACQUISITIONCONFIG_T8) + 6, - ts->config_setting[0].config_T8[6]); + get_object_address(ts, GEN_ACQUISITIONCONFIG_T8) + 8, ts->config_setting[0].config_T8[8]); + - i2c_atmel_write_byte_data(ts->client, - get_object_address(ts, GEN_ACQUISITIONCONFIG_T8) + 7, - ts->config_setting[0].config_T8[7]); - #endif #endif printk("***********: calibration is ok\n"); } + #endif if (ts->calibration_confirm == 0) { ts->calibration_confirm = 1; ts->timestamp = jiffies; } - + //printk("***********: timer reset, jiffies=%lu, Hz=%d", jiffies, HZ); } else { - if (((atch_ch> tch_ch)&&(tch_ch+ atch_ch >20))||(tch_ch> atch_ch + 30)||(tch_ch+ atch_ch >60)) { - + //if (((atch_ch> tch_ch)&&(tch_ch+ atch_ch >20))||(tch_ch> atch_ch + 30)||(tch_ch+ atch_ch >60)) { + if((atch_ch>0)||(tch_ch>10)){ + //if (((atch_ch> tch_ch))||(tch_ch> atch_ch + 10)||(tch_ch+ atch_ch >15)) { + printk("huangjinyu : check_calibration, tch_ch=%d, atch_ch=%d\n", tch_ch, atch_ch); + //printk("***********: calibration begin\n"); ts->calibration_confirm = 0; - release_all_fingers(ts); - + //release_all_fingers(ts); + //printk("huangjinyu calibration begin*************************************************************\n"); i2c_atmel_write_byte_data(ts->client, get_object_address(ts, GEN_COMMANDPROCESSOR_T6) + 2, 0x55); + #ifdef TOUCH_LONG_SLIDE + temp_flag=0; + temp_flag2=0; + #endif ts->timestamp = jiffies; count = 0; }else { count++; - + //del 20110531 huangjinyu for fix the bug + //that hard to cailbration ok because the time always reflash here + //and i don't think that it need to reflash the time here + //ts->timestamp = jiffies; } if (count >=50) @@ -893,26 +1184,32 @@ static void check_calibration(struct atmel_ts_data*ts) count = 0; ts->calibration_confirm = 0; + //reset i2c_atmel_write_byte_data(ts->client, get_object_address(ts, GEN_COMMANDPROCESSOR_T6), 0x1); msleep(100); i2c_atmel_write_byte_data(ts->client, get_object_address(ts, GEN_COMMANDPROCESSOR_T6) + 2, 0x55); + #ifdef TOUCH_LONG_SLIDE + temp_flag=0; + temp_flag2=0; + #endif } + //printk("***********: timer reset\n"); } } -#if defined(CONFIG_MACH_SAILBOAT) -static int cali_flag=0; -#endif +//#if defined(CONFIG_MACH_SAILBOAT) +//static int cali_flag=0; +//#endif void get_finger_position(struct atmel_ts_data *ts, uint8_t report_type,uint8_t *data){ - + //int ret; report_type = data[0] - ts->finger_type; if (report_type >= 0 && report_type < ts->finger_support) { - + /* for issue debug only */ if ((data[ 1] & 0x60) == 0x60) { printk(KERN_INFO"x60 ISSUE happened: %x, %x, %x, %x, %x, %x, %x, %x\n", @@ -948,8 +1245,8 @@ void command_process(struct atmel_ts_data *ts, uint8_t *data){ int ret, loop_i; struct atmel_i2c_platform_data *pdata; pdata = ts->client->dev.platform_data; - /*printk(KERN_INFO"command_process: %x, %x, %x, %x, %x, %x, %x, %x\n", - data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]);*/ + printk(KERN_INFO"command_process: %x, %x, %x, %x, %x, %x, %x, %x\n", + data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]); if ((data[1] & 0x08) == 0x08) { i2c_atmel_write(ts->client, get_object_address(ts, GEN_POWERCONFIG_T7), @@ -992,19 +1289,23 @@ void command_process(struct atmel_ts_data *ts, uint8_t *data){ } else if (data[1] & 0x10) { + #ifdef TOUCH_LONG_SLIDE + temp_flag=0; + temp_flag2=0; + #endif ts->calibration_confirm = 0; printk("wly: command calibration set\n"); } else if (!(data[1]&0x10)) { - #if defined(CONFIG_MACH_SAILBOAT) - if(cali_flag==1) - cali_flag=0; - #endif + //#if defined(CONFIG_MACH_SAILBOAT) + //if(cali_flag==1) + //cali_flag=0; + //#endif if (ts->calibration_confirm == 0) { - + release_all_fingers(ts); check_calibration(ts); } } @@ -1016,10 +1317,10 @@ void command_process(struct atmel_ts_data *ts, uint8_t *data){ } void virtual_keys(struct atmel_ts_data *ts, uint8_t key_code, uint8_t key_state,uint8_t *data){ - + //printk("huangjinyu v-key coming data[2] = %d \n",data[2]); if(!ts->finger_count){ key_state = !!(data[1]& 0x80); - + //huangjinyu ZTE_TS_HUANGJINYU_20110223 BEGIN #if defined(CONFIG_MACH_MOONCAKE) switch(data[2]) { @@ -1047,30 +1348,30 @@ if(!ts->finger_count){ ts->finger_data[0].x = 200; } #endif - + /*ZTE_TS_ZFJ_20110425 begin*/ #elif defined(CONFIG_MACH_NOVA) switch(data[2]) { case 1: key_code = KEY_MENU; - ts->finger_data[0].x = 50; + ts->finger_data[0].x = 30; break; case 2: key_code = KEY_HOME; - ts->finger_data[0].x = 160; + ts->finger_data[0].x = 110; break; case 4: key_code = KEY_BACK; - ts->finger_data[0].x = 300; + ts->finger_data[0].x = 200; break; case 8: key_code = KEY_SEARCH; - ts->finger_data[0].x = 450; + ts->finger_data[0].x = 300; break; default: break; } - + /*ZTE_TS_ZFJ_20110425 end*/ #else switch(data[2]) { @@ -1108,7 +1409,7 @@ if(!ts->finger_count){ } #endif #endif - + //huangjinyu ZTE_TS_HUANGJINYU_20110223 end if (!key_state) { ts->finger_data[0].w = 0; @@ -1119,49 +1420,83 @@ if(!ts->finger_count){ ts->finger_data[0].w = 10; ts->finger_data[0].z = 255; } - + //huangjinyu ZTE_TS_HUANGJINYU_20110223 BEGIN #if defined(CONFIG_MACH_MOONCAKE) ts->finger_data[0].y = 350; - + /*ZTE_TS_ZFJ_20110425 begin*/ #elif defined(CONFIG_MACH_NOVA) - ts->finger_data[0].y = 345; - + ts->finger_data[0].y = 520; + /*ZTE_TS_ZFJ_20110425 end*/ #else ts->finger_data[0].y = 810; #endif - + //huangjinyu ZTE_TS_HUANGJINYU_20110223 end input_report_key(ts->input_dev, BTN_TOUCH, !!key_state); input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR,ts->finger_data[0].z); input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR,ts->finger_data[0].w); input_report_abs(ts->input_dev, ABS_MT_POSITION_X,ts->finger_data[0].x); input_report_abs(ts->input_dev, ABS_MT_POSITION_Y,ts->finger_data[0].y); - + //pr_err("huangjinyu report touch v-key major= %d ,width major = %d ,x = %d ,y = %d \n",ts->finger_data[0].z,ts->finger_data[0].w,ts->finger_data[0].x,ts->finger_data[0].y); + input_mt_sync(ts->input_dev); input_sync(ts->input_dev); } } + static void atmel_ts_work_func(struct work_struct *work) { int ret; struct atmel_ts_data *ts = container_of(work, struct atmel_ts_data, work); uint8_t data[9]; +#ifdef TCH_CALIBRATION + uint32_t temp; +#endif //int16_t data1[8]; int i; uint8_t loop_i =0, report_type =0, key_state = 0,max_finger_report_type=0; static uint8_t key_code = 0; ret = i2c_atmel_read(ts->client, get_object_address(ts,GEN_MESSAGEPROCESSOR_T5), data, 9); report_type = data[0]; + //printk("huangjinyu11111 *******************************************\n"); - - if ((ts->calibration_confirm < 2 && (data[1] & 0xc0) )) + if (ts->calibration_confirm < 2 && (data[1] & 0x80) ) { - check_calibration(ts); } + +#ifdef TCH_CALIBRATION + //printk("huangjinyu temp_t9_7:%d,calibration_confirm:%d,temp_release:%d\n",temp_t9_7,ts->calibration_confirm,temp_release); + //插上USB后就不用漂了,以插USB时设置的为准 + #if defined CONFIG_TS_NOTIFIER + if(usb_status==1) + temp_t9_7=ts->config_setting[0].config_T9[7]; + #endif + if((ts->calibration_confirm==2)&&(temp_t9_7>ts->config_setting[0].config_T9[7])&&(temp_release==1)) + { + temp= ((uint32_t) (jiffies-ts->timestamp1)/HZ); + temp_release=0; + if(temp>ts->config_setting[0].config_T8[2]/5) + temp_t9_7=(temp_t9_7-( temp-ts->config_setting[0].config_T8[2]/5)/(ts->config_setting[0].config_T8[3]/5)); + if(temp_t9_7config_setting[0].config_T9[7]+1) + temp_t9_7=ts->config_setting[0].config_T9[7]; + if(temp_t9_7>temp_t9_7_def1) + temp_t9_7=temp_t9_7_def1; + + //HUANGJINYU ADD 减少不必要的打印消息 + if(temp>=(ts->config_setting[0].config_T8[2]/5+ts->config_setting[0].config_T8[3]/5)) + printk("huangjinyu temp_t9_7:%d,time:%d\n",temp_t9_7, temp); + + i2c_atmel_write_byte_data(ts->client, + get_object_address(ts, TOUCH_MULTITOUCHSCREEN_T9) + 7, + temp_t9_7); + + } + +#endif #ifdef FUNCTION_UNLOCK_ATCH_OFF if((unlock==1)&&(check_ok==1)) { @@ -1169,48 +1504,56 @@ static void atmel_ts_work_func(struct work_struct *work) check_ok=0; printk("atmel screen unlock and check calibration ok!\n"); i2c_atmel_write_byte_data(ts->client, - get_object_address(ts, GEN_ACQUISITIONCONFIG_T8) + 6, - ts->config_setting[0].config_T8[6]); + get_object_address(ts, GEN_ACQUISITIONCONFIG_T8) + 6, + 255/*ts->config_setting[0].config_T8[6]*/); i2c_atmel_write_byte_data(ts->client, get_object_address(ts, GEN_ACQUISITIONCONFIG_T8) + 7, 1); + } #endif #if 0 i2c_atmel_write_byte_data(ts->client, get_object_address(ts, GEN_COMMANDPROCESSOR_T6) + 5, 0x10); - + printk("get the data1 begin****************************************\n"); i2c_atmel_read_word(ts->client, get_object_address(ts, DIAGNOSTIC_T37), data1,5); - + printk("huangjinyu data1[0]=%d data1[1]=%d data1[2]=%d data1[3]=%d data1[4]=%d\n",data1[0],data1[1],data1[2],data1[3],data1[4]); i2c_atmel_read_word(ts->client, get_object_address(ts, DIAGNOSTIC_T37)+24, data1,5); - + printk("huangjinyu data1[0]=%d data1[1]=%d data1[2]=%d data1[3]=%d data1[4]=%d\n",data1[0],data1[1],data1[2],data1[3],data1[4]); i2c_atmel_read_word(ts->client, get_object_address(ts, DIAGNOSTIC_T37)+48, data1,5); - + printk("huangjinyu data1[0]=%d data1[1]=%d data1[2]=%d data1[3]=%d data1[4]=%d\n",data1[0],data1[1],data1[2],data1[3],data1[4]); i2c_atmel_read_word(ts->client, get_object_address(ts, DIAGNOSTIC_T37)+72, data1,5); - + printk("huangjinyu data1[0]=%d data1[1]=%d data1[2]=%d data1[3]=%d data1[4]=%d\n",data1[0],data1[1],data1[2],data1[3],data1[4]); i2c_atmel_read_word(ts->client, get_object_address(ts, DIAGNOSTIC_T37)+96, data1,5); + printk("huangjinyu data1[0]=%d data1[1]=%d data1[2]=%d data1[3]=%d data1[4]=%d\n",data1[0],data1[1],data1[2],data1[3],data1[4]); + printk("get the data1 end****************************************\n"); + #endif + /*printk(KERN_INFO"atmel_ts_work_func: %x, %x, %x, %x, %x, %x, %x, %x,ts->finger_count:%d\n", + data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7],ts->finger_count);*/ + //printk("huangjinyu report_type = %d \n",report_type); + //printk("huangjinyu report_type = %d \n",report_type); #if defined(CONFIG_MACH_SAILBOAT) - if(cali_flag == 1) - { - #if defined(CONFIG_MACH_SAILBOAT) - if((report_type!=10)&&(report_type!=1)) - #else - if((report_type!=12)&&(report_type!=1)) - #endif - { - enable_irq(ts->client->irq); - return; - } - } + //if(cali_flag == 1) + //{ + //#if defined(CONFIG_MACH_SAILBOAT) + // if((report_type!=10)&&(report_type!=1)) + //#else + // if((report_type!=12)&&(report_type!=1)) + //#endif + // { + // enable_irq(ts->client->irq); + // return; + // } + //} #endif if(ts->id->version==0x21){ switch(report_type) @@ -1253,6 +1596,7 @@ else{ switch (report_type) { case 2: + case 3: case 4: case 5: @@ -1288,7 +1632,7 @@ else{ default:break; } } - + //printk("x: %d\ny: %d\n",ts->finger_data[report_type].x,ts->finger_data[report_type].y); if(ts->id->version==0x21) { max_finger_report_type=9; @@ -1314,54 +1658,82 @@ else{ input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR,ts->finger_data[loop_i].w); input_report_abs(ts->input_dev, ABS_MT_POSITION_X,ts->finger_data[loop_i].x); input_report_abs(ts->input_dev, ABS_MT_POSITION_Y,ts->finger_data[loop_i].y); - + //pr_err("huangjinyu report touch major= %d ,width major = %d ,x = %d ,y = %d \n",ts->finger_data[loop_i].z,ts->finger_data[loop_i].w,ts->finger_data[loop_i].x,ts->finger_data[loop_i].y); input_mt_sync(ts->input_dev); }break; default:break; } } - input_sync(ts->input_dev); +#ifdef TCH_CALIBRATION + for(loop_i =0; loop_i< ts->finger_support; loop_i ++ ) + { + if(ts->finger_data[loop_i].report_enable!=0) + break; + } + if(loop_i==ts->finger_support) + { + ts->timestamp1=jiffies; + temp_release=1; + } +#endif + input_sync(ts->input_dev); + //input_report_key(ts->input_dev, BTN_TOUCH, !!ts->finger_count); + //input_sync(ts->input_dev); + } + #ifdef TOUCH_LONG_SLIDE + if(ts->calibration_confirm !=2){ + if((temp_flag==0)&&((ts->finger_data[0].report_enable==2))){ + x_value=ts->finger_data[0].x; + y_value=ts->finger_data[0].y; + temp_flag=1; + } + if(ts->finger_data[0].report_enable==0) + temp_flag=0; + + for(loop_i =1; loop_i< ts->finger_support; loop_i ++ ) + { + if (ts->finger_data[loop_i].report_enable!=0){ + temp_flag=0; + //temp_flag2=0; + break; + } + } + + if((temp_flag==1)&&((ts->finger_data[0].report_enable==2))){ + if(((x_value-ts->finger_data[0].x)>(ts->abs_x_max/4))|| + ((y_value-ts->finger_data[0].y)>(ts->abs_y_max/4))|| + ((ts->finger_data[0].x-x_value)>(ts->abs_x_max/4))|| + ((ts->finger_data[0].y-y_value)>(ts->abs_y_max/4))){ + temp_flag2=1; + temp_flag=2; + printk("huangjinyu long slide ok!***************************************\n"); + } } + } + #endif enable_irq(ts->client->irq); } static irqreturn_t atmel_ts_irq_handler(int irq, void *dev_id) { struct atmel_ts_data *ts = dev_id; - + //printk("wly: atmel_ts_irq_handler\n"); disable_irq_nosync(ts->client->irq); queue_work(ts->atmel_wq, &ts->work); return IRQ_HANDLED; } - -static struct atmel_ts_data *ts_temp; +//ZTE_WLY_CRDB00509514,BEGIN static int proc_read_val(char *page, char **start, off_t off, int count, int *eof, void *data) { int len = 0; - len += sprintf(page + len, "%s\n", "touchscreen module"); len += sprintf(page + len, "name : %s\n", "atmel"); len += sprintf(page + len, "i2c address : 0x%x\n", 0x4a); -#if 0 - len += sprintf(page + len, "IC type : %s\n", "301e"); - len += sprintf(page + len, "firmware version : 0x%x\n", firmware_version); - #if defined(CONFIG_MACH_JOE) - len += sprintf(page + len, "module : %s\n", "cypress + goworld-lcd"); - #else - len += sprintf(page + len, "module : %s\n", "cypress + winteck"); - #endif - len += sprintf(page + len, "update flag : 0x%x\n", update_result_flag);//ZTE_XUKE_CRDB00517999 - if (off + count >= len) - *eof = 1; - if (len < off) - return 0; - *start = page + off; -#endif if(ts_temp->id->version==0x21) len += sprintf(page + len, "IC type : %s\n", "atmel 140"); else @@ -1370,8 +1742,8 @@ proc_read_val(char *page, char **start, off_t off, int count, int *eof, len += sprintf(page + len, "family id : 0x%x\n", 0x80); len += sprintf(page + len, "variant id : 0x%x\n", 0x01); len += sprintf(page + len, "firmware version : 0x%x\n", ts_temp->id->version); - #if defined(CONFIG_MACH_SKATE) - len += sprintf(page + len, "module : %s\n", "atmel + WINTEK"); + #if defined(CONFIG_MACH_BLADE2)||defined(CONFIG_MACH_BLUETICK) + len += sprintf(page + len, "module : %s\n", "atmel + Truly"); #else len += sprintf(page + len, "module : %s\n", "atmel + WINTEK"); #endif @@ -1406,7 +1778,7 @@ static int atmel_ts_probe(struct i2c_client *client, uint8_t loop_i; uint8_t data[16]; uint8_t type_count = 0,CRC_check = 0; - struct proc_dir_entry *dir, *refresh; + struct proc_dir_entry *dir, *refresh;//ZTE_WLY_CRDB00509514 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { printk(KERN_ERR"%s: need I2C_FUNC_I2C\n", __func__); ret = -ENODEV; @@ -1431,7 +1803,7 @@ static int atmel_ts_probe(struct i2c_client *client, INIT_WORK(&ts->work, atmel_ts_work_func); ts->client = client; - ts->calibration_confirm = 2; + ts->calibration_confirm = 0; i2c_set_clientdata(client, ts); pdata = client->dev.platform_data; @@ -1439,12 +1811,12 @@ static int atmel_ts_probe(struct i2c_client *client, ts->power = pdata->power; intr = pdata->gpio_irq; } - + //huangjinyu ZTE_TS_HJY_20110223 BEGIN else { printk(KERN_WARNING"atmel ts:there is no platform_data!\n"); } - + //huangjinyu ZTE_TS_HJY_20110223 END if (ts->power) { ret = ts->power(1); msleep(200); @@ -1462,6 +1834,7 @@ static int atmel_ts_probe(struct i2c_client *client, for (loop_i = 0; loop_i < 10; loop_i++) { ret = gpio_get_value(intr); + printk("wly:gpio %d value = %d\n",intr,ret); if (!ret/*gpio_get_value(intr)*/) break; msleep(10); @@ -1588,7 +1961,10 @@ static int atmel_ts_probe(struct i2c_client *client, ts->config_setting[0].config_T9 = pdata->config_T9; ts->config_setting[0].config_T22 = pdata->config_T22; ts->config_setting[0].config_T28 = pdata->config_T28; - +#if defined(CONFIG_TS_NOTIFIER) + ts->config_setting[0].config_T9_charge = pdata->config_T9_charge; + ts->config_setting[0].config_T28_charge = pdata->config_T28_charge; +#endif if (pdata->cable_config[0]) { ts->config_setting[0].config[0] = pdata->config_T9[7]; ts->config_setting[0].config[1] = pdata->config_T22[8]; @@ -1691,12 +2067,33 @@ static int atmel_ts_probe(struct i2c_client *client, goto err_input_register_device_failed; } - ret = request_irq(client->irq, atmel_ts_irq_handler, IRQF_TRIGGER_LOW, + ret = request_irq(client->irq, atmel_ts_irq_handler, IRQF_TRIGGER_LOW,//IRQF_TRIGGER_FALLING, client->name, ts); if (ret) dev_err(&client->dev, "request_irq failed\n"); //enable_irq(client->irq); + + //ADD BY HUANGJINYU + printk("atmel probe set the calibration\n"); +#ifdef TCH_CALIBRATION + temp_t9_7=temp_t9_7_def1; + i2c_atmel_write_byte_data(client, + get_object_address(ts, TOUCH_MULTITOUCHSCREEN_T9) + 7, + temp_t9_7); +#endif + i2c_atmel_write_byte_data(client, + get_object_address(ts, GEN_COMMANDPROCESSOR_T6) + 2, 0x55); + i2c_atmel_write_byte_data(client, + get_object_address(ts, GEN_ACQUISITIONCONFIG_T8) + 6, 0x0); + i2c_atmel_write_byte_data(client, + get_object_address(ts, GEN_ACQUISITIONCONFIG_T8) + 7, 0x0); + + if((ts->id->version!=0x16)) + i2c_atmel_write_byte_data(client, + get_object_address(ts, GEN_ACQUISITIONCONFIG_T8) + 8, 10); + //ADD BY HUANGJINYU END + #ifdef ENABLE_IME_IMPROVEMENT ts->ime_threshold_pixel = 1; ts->ime_finger_report[0] = -1; @@ -1726,15 +2123,17 @@ static int atmel_ts_probe(struct i2c_client *client, private_ts = ts; +/*ZTE_TOUCH_WLY_008,@2010-01-19,begin*/ +//ZTE_WLY_CRDB00509514,BEGIN dir = proc_mkdir("touchscreen", NULL); refresh = create_proc_entry("ts_information", 0777, dir); - +//ZTE_WLY_CRDB00509514,END if (refresh) { refresh->data = NULL; refresh->read_proc = proc_read_val; refresh->write_proc = proc_write_val; } - +/*ZTE_TOUCH_WLY_008,@2010-01-19,end*/ #ifdef ATMEL_EN_SYSFS atmel_touch_sysfs_init(); @@ -1742,6 +2141,10 @@ static int atmel_ts_probe(struct i2c_client *client, dev_info(&client->dev, "Start touchscreen %s in interrupt mode\n", ts->input_dev->name); +#ifdef CONFIG_TS_NOTIFIER + register_ts_notifier(&ts_notifier); +#endif + return 0; err_input_register_device_failed: @@ -1817,27 +2220,384 @@ static int atmel_ts_suspend(struct i2c_client *client, pm_message_t mesg) static int atmel_ts_resume(struct i2c_client *client) { struct atmel_ts_data *ts = i2c_get_clientdata(client); +#ifdef TCH_CALIBRATION + uint8_t data[82]; + uint8_t data1[9]; + + uint8_t loop_i, loop_j, x_limit = 0, check_mask, tch_ch = 0, atch_ch = 0; + + memset(data, 0xFF, sizeof(data)); + i2c_atmel_write_byte_data(client, + get_object_address(ts, TOUCH_MULTITOUCHSCREEN_T9) + 7, + ts->config_setting[0].config_T9[7]); + + i2c_atmel_write(ts->client, get_object_address(ts, GEN_POWERCONFIG_T7), + ts->config_setting[0].config_T7, get_object_size(ts, GEN_POWERCONFIG_T7)); + + msleep(30); + i2c_atmel_write_byte_data(ts->client, + get_object_address(ts, GEN_COMMANDPROCESSOR_T6) + 5, 0xF3); + + for (loop_i = 0; !(data[0] == 0xF3 && data[1] == 0x00) && loop_i < 100; loop_i++) { + msleep(5); + i2c_atmel_read(ts->client, get_object_address(ts, DIAGNOSTIC_T37), data, 2); + } + + if (loop_i == 100){ + printk(KERN_ERR "%s: Diag data not ready\n", __func__); + + ts->calibration_confirm = 0; + //reset + i2c_atmel_write_byte_data(ts->client, + get_object_address(ts, GEN_COMMANDPROCESSOR_T6), 0x1); + + release_all_fingers(ts); + enable_irq(client->irq); + return 0; + } + i2c_atmel_read(ts->client, get_object_address(ts, DIAGNOSTIC_T37), data, 82); + //printk("huangjinyu data[0]=%d data[1]=%d\n",data[0],data[1]); + if (data[0] == 0xF3 && data[1] == 0x00) { + x_limit = 16 + ts->config_setting[0].config_T28[2]; + x_limit = x_limit << 1; + #if defined(CONFIG_MACH_SAILBOAT) + x_limit = 13<<1; + for (loop_i = 0; loop_i < x_limit; loop_i += 2) { + for (loop_j = 3; loop_j < 8; loop_j++) { + check_mask = 1 << loop_j; + if (data[2 + loop_i] & check_mask) + tch_ch++; + if (data[32 + loop_i] & check_mask) + atch_ch++; + + } + for (loop_j = 0; loop_j < 4; loop_j++) { + check_mask = 1 << loop_j; + if (data[3 + loop_i] & check_mask) + tch_ch++; + if (data[33 + loop_i] & check_mask) + atch_ch++; + } + } +#elif defined(CONFIG_MACH_BLUETICK) + x_limit = 15<<1; + for (loop_i = 0; loop_i < x_limit; loop_i += 2) { + for (loop_j = 3; loop_j < 8; loop_j++) { + check_mask = 1 << loop_j; + if (data[2 + loop_i] & check_mask) + tch_ch++; + if (data[32 + loop_i] & check_mask) + atch_ch++; + + } + for (loop_j = 0; loop_j < 4; loop_j++) { + check_mask = 1 << loop_j; + if (data[3 + loop_i] & check_mask) + tch_ch++; + if (data[33 + loop_i] & check_mask) + atch_ch++; + } + } + + #elif defined(CONFIG_MACH_ROAMER) + #ifdef CONFIG_TOUCHSCREEN_MXT224_N760 + x_limit = 14<<1; + for (loop_i = 0; loop_i < x_limit; loop_i += 2) { + for (loop_j = 2; loop_j < 8; loop_j++) { + check_mask = 1 << loop_j; + if (data[2 + loop_i] & check_mask) + tch_ch++; + if (data[32 + loop_i] & check_mask) + atch_ch++; + + } + for (loop_j = 0; loop_j < 3; loop_j++) { + check_mask = 1 << loop_j; + if (data[3 + loop_i] & check_mask) + tch_ch++; + if (data[33 + loop_i] & check_mask) + atch_ch++; + } + } + #else + x_limit = 14<<1; + for (loop_i = 0; loop_i < x_limit; loop_i += 2) { + for (loop_j = 2; loop_j < 8; loop_j++) { + check_mask = 1 << loop_j; + if (data[2 + loop_i] & check_mask) + tch_ch++; + if (data[32 + loop_i] & check_mask) + atch_ch++; + + } + for (loop_j = 0; loop_j < 4; loop_j++) { + check_mask = 1 << loop_j; + if (data[3 + loop_i] & check_mask) + tch_ch++; + if (data[33 + loop_i] & check_mask) + atch_ch++; + } + } + #endif +#elif defined(CONFIG_MACH_BLADE2) +#ifdef CONFIG_TOUCHSCREEN_MXT224_P736V + x_limit = 14<<1; + for (loop_i = 0; loop_i < x_limit; loop_i += 2) { + for (loop_j = 2; loop_j < 8; loop_j++) { + check_mask = 1 << loop_j; + if (data[2 + loop_i] & check_mask) + tch_ch++; + if (data[32 + loop_i] & check_mask) + atch_ch++; + + } + for (loop_j = 0; loop_j < 3; loop_j++) { + check_mask = 1 << loop_j; + if (data[3 + loop_i] & check_mask) + tch_ch++; + if (data[33 + loop_i] & check_mask) + atch_ch++; + } + } + +#else + x_limit = 15<<1; + for (loop_i = 0; loop_i < x_limit; loop_i += 2) { + for (loop_j = 2; loop_j < 8; loop_j++) { + check_mask = 1 << loop_j; + if (data[2 + loop_i] & check_mask) + tch_ch++; + if (data[32 + loop_i] & check_mask) + atch_ch++; + + } + for (loop_j = 0; loop_j < 2; loop_j++) { + check_mask = 1 << loop_j; + if (data[3 + loop_i] & check_mask) + tch_ch++; + if (data[33 + loop_i] & check_mask) + atch_ch++; + } + } +#endif +#else + for (loop_i = 0; loop_i < x_limit; loop_i += 2) { + for (loop_j = 0; loop_j < 8; loop_j++) { + check_mask = 1 << loop_j; + if (data[2 + loop_i] & check_mask) + tch_ch++; + if (data[3 + loop_i] & check_mask) + tch_ch++; + if (data[42 + loop_i] & check_mask) + atch_ch++; + if (data[43 + loop_i] & check_mask) + atch_ch++; + } + } + #endif + printk("***********: resume check_calibration, tch_ch=%d, atch_ch=%d\n", tch_ch, atch_ch); + } + i2c_atmel_write_byte_data(ts->client, + get_object_address(ts, GEN_COMMANDPROCESSOR_T6) + 5, 0x01); + +#endif //ts->power(1); //msleep(200); #if defined(CONFIG_MACH_SAILBOAT) - cali_flag = 1; + //cali_flag = 1; #endif + + +#ifdef TCH_CALIBRATION + #if defined CONFIG_TS_NOTIFIER + + release_all_fingers(ts); + if(tch_ch>0){ + + //清除上次的抬起痕迹,抬起信号在唤醒后重新置位 + temp_release=0; + + if(usb_status!=1){ + temp_t9_7=temp_t9_7_def1; + }else{ + temp_t9_7=ts->config_setting[0].config_T9_charge[0]; + } + i2c_atmel_write_byte_data(client, + get_object_address(ts, TOUCH_MULTITOUCHSCREEN_T9) + 7, + temp_t9_7); + + + ts->calibration_confirm = 0; + + printk("***********: go to check calibration\n"); + i2c_atmel_write_byte_data(client, + get_object_address(ts, GEN_COMMANDPROCESSOR_T6) + 2, 0x55); + #ifdef TOUCH_LONG_SLIDE + temp_flag=0; + temp_flag2=0; + #endif + #if 1 + i2c_atmel_write_byte_data(client, + get_object_address(ts, GEN_ACQUISITIONCONFIG_T8) + 6, 0x0); + i2c_atmel_write_byte_data(client, + get_object_address(ts, GEN_ACQUISITIONCONFIG_T8) + 7, 0x0); + + #endif + + if((ts->id->version!=0x16)) + i2c_atmel_write_byte_data(client, + get_object_address(ts, GEN_ACQUISITIONCONFIG_T8) + 8, 10); + + i2c_atmel_read(ts->client, get_object_address(ts,GEN_MESSAGEPROCESSOR_T5), data1, 9); + printk("atmel touch screen t5 data1:%d\n",data1[0]); + } + + if((tch_ch==0)&&(atch_ch>0)){ + //清除上次的抬起痕迹,抬起信号在唤醒后重新置位 + temp_release=0; + if(usb_status!=1){ + temp_t9_7=ts->config_setting[0].config_T9[7]+15; + }else{ + temp_t9_7=ts->config_setting[0].config_T9_charge[0]; + } + if(temp_t9_7>=temp_t9_7_def1) + temp_t9_7=temp_t9_7_def1; + i2c_atmel_write_byte_data(client, + get_object_address(ts, TOUCH_MULTITOUCHSCREEN_T9) + 7, + temp_t9_7); + printk("atmel touch screen set t9[7]:%d ************\n",temp_t9_7); + //ts->calibration_confirm = 2; + #ifdef TOUCH_LONG_SLIDE + temp_flag=0; + temp_flag2=0; + #endif + i2c_atmel_read(ts->client, get_object_address(ts,GEN_MESSAGEPROCESSOR_T5), data1, 9); + printk("atmel touch screen t5 data1:%d\n",data1[0]); + } + if((atch_ch==0)&&(tch_ch==0)) { + + //清除上次的抬起痕迹,抬起信号在唤醒后重新置位 + temp_release=0; + + if(usb_status!=1){ + temp_t9_7=ts->config_setting[0].config_T9[7]+10; + }else{ + temp_t9_7=ts->config_setting[0].config_T9_charge[0]; + } + + + i2c_atmel_write_byte_data(client, + get_object_address(ts, TOUCH_MULTITOUCHSCREEN_T9) + 7, + temp_t9_7); + + printk("atmel touch screen set t9[7]:%d ************\n",temp_t9_7); + i2c_atmel_read(ts->client, get_object_address(ts,GEN_MESSAGEPROCESSOR_T5), data1, 9); + printk("atmel touch screen t5 data1:%d\n",data1[0]); + //ts->calibration_confirm = 2; + #ifdef TOUCH_LONG_SLIDE + temp_flag=0; + temp_flag2=0; + #endif + } + #else + release_all_fingers(ts); + if(tch_ch>0){ + + //清除上次的抬起痕迹,抬起信号在唤醒后重新置位 + temp_release=0; + temp_t9_7=temp_t9_7_def1; + i2c_atmel_write_byte_data(client, + get_object_address(ts, TOUCH_MULTITOUCHSCREEN_T9) + 7, + temp_t9_7); + + + ts->calibration_confirm = 0; + + printk("***********: go to check calibration\n"); + i2c_atmel_write_byte_data(client, + get_object_address(ts, GEN_COMMANDPROCESSOR_T6) + 2, 0x55); + #ifdef TOUCH_LONG_SLIDE + temp_flag=0; + temp_flag2=0; + #endif + i2c_atmel_write_byte_data(client, + get_object_address(ts, GEN_ACQUISITIONCONFIG_T8) + 6, 0x0); + i2c_atmel_write_byte_data(client, + get_object_address(ts, GEN_ACQUISITIONCONFIG_T8) + 7, 0x0); + + if((ts->id->version!=0x16)) + i2c_atmel_write_byte_data(client, + get_object_address(ts, GEN_ACQUISITIONCONFIG_T8) + 8, 10); + i2c_atmel_read(ts->client, get_object_address(ts,GEN_MESSAGEPROCESSOR_T5), data1, 9); + printk("atmel touch screen t5 data1:%d\n",data1[0]); + } + + if((tch_ch==0)&&(atch_ch>0)){ + //清除上次的抬起痕迹,抬起信号在唤醒后重新置位 + temp_release=0; + temp_t9_7=ts->config_setting[0].config_T9[7]+15; + i2c_atmel_write_byte_data(client, + get_object_address(ts, TOUCH_MULTITOUCHSCREEN_T9) + 7, + temp_t9_7); + + printk("atmel touch screen set t9[7]:%d ************\n",temp_t9_7); + #ifdef TOUCH_LONG_SLIDE + temp_flag=0; + temp_flag2=0; + #endif + //ts->calibration_confirm = 2; + i2c_atmel_read(ts->client, get_object_address(ts,GEN_MESSAGEPROCESSOR_T5), data1, 9); + printk("atmel touch screen t5 data1:%d\n",data1[0]); + } + if((atch_ch==0)&&(tch_ch==0)) { + + //清除上次的抬起痕迹,抬起信号在唤醒后重新置位 + temp_release=0; + temp_t9_7=ts->config_setting[0].config_T9[7]+10; + i2c_atmel_write_byte_data(client, + get_object_address(ts, TOUCH_MULTITOUCHSCREEN_T9) + 7, + temp_t9_7); + + printk("atmel touch screen set t9[7]:%d ************\n",temp_t9_7); + #ifdef TOUCH_LONG_SLIDE + temp_flag=0; + temp_flag2=0; + #endif + //ts->calibration_confirm = 2; + i2c_atmel_read(ts->client, get_object_address(ts,GEN_MESSAGEPROCESSOR_T5), data1, 9); + printk("atmel touch screen t5 data1:%d\n",data1[0]); + } + + #endif + +#else i2c_atmel_write(ts->client, get_object_address(ts, GEN_POWERCONFIG_T7), ts->config_setting[0].config_T7, get_object_size(ts, GEN_POWERCONFIG_T7)); printk("***********: go to check calibration\n"); - msleep(10); ts->calibration_confirm = 0; release_all_fingers(ts); i2c_atmel_write_byte_data(client, get_object_address(ts, GEN_COMMANDPROCESSOR_T6) + 2, 0x55); + #ifdef TOUCH_LONG_SLIDE + temp_flag=0; + temp_flag2=0; + #endif #if 1 i2c_atmel_write_byte_data(client, get_object_address(ts, GEN_ACQUISITIONCONFIG_T8) + 6, 0x0); i2c_atmel_write_byte_data(client, get_object_address(ts, GEN_ACQUISITIONCONFIG_T8) + 7, 0x0); + #endif + + if((ts->id->version!=0x16)) + i2c_atmel_write_byte_data(client, + get_object_address(ts, GEN_ACQUISITIONCONFIG_T8) + 8, 10); + + +#endif enable_irq(client->irq); return 0; } diff --git a/drivers/input/touchscreen/mXT224_atmel_new.c b/drivers/input/touchscreen/mXT224_atmel_new.c new file mode 100644 index 00000000..5464b6a2 --- /dev/null +++ b/drivers/input/touchscreen/mXT224_atmel_new.c @@ -0,0 +1,2752 @@ +/* drivers/input/touchscreen/atmel.c - ATMEL Touch driver + * + * Copyright (C) 2009 + * + * 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. + * + */ +/* ======================================================================================== +when who what, where, why comment tag +-------- ---- ------------------------------------- -------------------------- +2011-08-30 hjy add the TOUCH_LONG_SLIDE function TOUCH_LONG_SLIDE +2011-04-25 zfj add P732A driver code ZTE_TS_ZFJ_20110425 +2011-02-23 hjy ATMEL 140 用在P727A20上 ZTE_HJY_CRDB00000000 +2010-12-14 wly v9默认竖屏 ZTE_WLY_CRDB00586327 +2010-12-13 wly v9+默认竖屏 ZTE_WLY_CRDB00586327 +2010-11-24 wly 解决手掌在屏上,睡眠唤醒后数据乱报问题 ZTE_WLY_CRDB00577718 +2010-10-25 wly update report data format ZTE_WLY_CRDB00517999 +========================================================================================*/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef CONFIG_ATMEL_FW_UPDATE +#include +#endif +#define ATMEL_EN_SYSFS +#define ATMEL_I2C_RETRY_TIMES 10 +#define ENABLE_IME_IMPROVEMENT + +enum atmel_chip +{ + ATMEL_140, + ATMEL_224, + ATMEL_UNKNOW=0XFF, +}; +uint8_t ATMEL_CHIP_TYPE; + +#define ATMEL_NEW_CAL +#ifdef ATMEL_NEW_CAL +/* +new_cal_state: +0: cal open +1: cal close +*/ +static int new_cal_state=0; +#endif +#if defined(CONFIG_TOUCHSCREEN_VIRTUAL_KEYS) +#define virtualkeys virtualkeys.atmel-touchscreen +#endif +#ifdef CONFIG_ATMEL_FW_UPDATE +static int update_result_flag=0; +#endif + +struct atmel_ts_data { + struct i2c_client *client; + struct input_dev *input_dev; + struct workqueue_struct *atmel_wq; + struct work_struct work; + + int (*power) (int on); + struct early_suspend early_suspend; + struct info_id_t *id; + struct object_t *object_table; + uint8_t finger_count; + uint16_t abs_x_min; + uint16_t abs_x_max; + uint16_t abs_y_min; + uint16_t abs_y_max; + uint8_t abs_pressure_min; + uint8_t abs_pressure_max; + uint8_t abs_width_min; + uint8_t abs_width_max; + //uint8_t first_pressed; + uint8_t debug_log_level; + struct atmel_finger_data finger_data[10]; + uint8_t finger_type; + uint8_t finger_support; + uint16_t finger_pressed; + //uint8_t face_suppression; + //uint8_t grip_suppression; + //uint8_t noise_status[2]; + uint16_t *filter_level; + uint8_t calibration_confirm; + uint64_t timestamp; + uint64_t timestamp1; + + struct atmel_config_data config_setting[2]; + uint8_t status; + uint8_t GCAF_sample; + uint8_t *GCAF_level; + uint8_t noisethr; +#ifdef ATMEL_EN_SYSFS + struct device dev; +#endif +#ifdef ENABLE_IME_IMPROVEMENT + int display_width; /* display width in pixel */ + int display_height; /* display height in pixel */ + int ime_threshold_pixel; /* threshold in pixel */ + int ime_threshold[2]; /* threshold X & Y in raw data */ + int ime_area_pixel[4]; /* ime area in pixel */ + int ime_area_pos[4]; /* ime area in raw data */ + int ime_finger_report[2]; + int ime_move; +#endif + +}; + +static struct atmel_ts_data *private_ts; + +#ifdef CONFIG_HAS_EARLYSUSPEND +static void atmel_ts_early_suspend(struct early_suspend *h); +static void atmel_ts_late_resume(struct early_suspend *h); +#endif + +int i2c_atmel_read(struct i2c_client *client, uint16_t address, uint8_t *data, uint8_t length) +{ + int retry; + uint8_t addr[2]; + struct i2c_msg msg[] = { + { + .addr = client->addr, + .flags = 0, + .len = 2, + .buf = addr, + }, + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = length, + .buf = data, + } + }; + addr[0] = address & 0xFF; + addr[1] = (address >> 8) & 0xFF; + + for (retry = 0; retry < ATMEL_I2C_RETRY_TIMES; retry++) { + if (i2c_transfer(client->adapter, msg, 2) == 2) + break; + mdelay(10); + } + if (retry == ATMEL_I2C_RETRY_TIMES) { + printk(KERN_ERR "i2c_read_block retry over %d\n", + ATMEL_I2C_RETRY_TIMES); + return -EIO; + } + return 0; +} + +int i2c_atmel_write(struct i2c_client *client, uint16_t address, uint8_t *data, uint8_t length) +{ + int retry, loop_i; + uint8_t buf[length + 2]; + + struct i2c_msg msg[] = { + { + .addr = client->addr, + .flags = 0, + .len = length + 2, + .buf = buf, + } + }; + + buf[0] = address & 0xFF; + buf[1] = (address >> 8) & 0xFF; + + for (loop_i = 0; loop_i < length; loop_i++) + buf[loop_i + 2] = data[loop_i]; + + for (retry = 0; retry < ATMEL_I2C_RETRY_TIMES; retry++) { + if (i2c_transfer(client->adapter, msg, 1) == 1) + break; + mdelay(10); + } + + if (retry == ATMEL_I2C_RETRY_TIMES) { + printk(KERN_ERR "i2c_write_block retry over %d\n", + ATMEL_I2C_RETRY_TIMES); + return -EIO; + } + return 0; +} + +int i2c_atmel_write_byte_data(struct i2c_client *client, uint16_t address, uint8_t value) +{ + i2c_atmel_write(client, address, &value, 1); + return 0; +} +int i2c_atmel_write_word(struct i2c_client *client, uint16_t address, int16_t *data, uint8_t length) +{ + int i,ret; + uint8_t buf[length*2]; + for(i =0;i> 8; + } + ret = i2c_atmel_write(client, address, buf, length*2); + return ret; + +} +int i2c_atmel_read_word(struct i2c_client *client, uint16_t address, int16_t *data, uint8_t length) +{ + uint8_t i,buf[length*2],ret; + ret = i2c_atmel_read(client, address, buf, length*2); + for(i=0;iid->num_declared_objects; loop_i++) { + if (ts->object_table[loop_i].object_type == object_type) + return ts->object_table[loop_i].i2c_address; + } + return 0; +} +uint8_t get_object_size(struct atmel_ts_data *ts, uint8_t object_type) +{ + uint8_t loop_i; + for (loop_i = 0; loop_i < ts->id->num_declared_objects; loop_i++) { + if (ts->object_table[loop_i].object_type == object_type) + return ts->object_table[loop_i].size; + } + return 0; +} + +uint8_t get_report_ids_size(struct atmel_ts_data *ts, uint8_t object_type) +{ + uint8_t loop_i; + for (loop_i = 0; loop_i < ts->id->num_declared_objects; loop_i++) { + if (ts->object_table[loop_i].object_type == object_type) + return ts->object_table[loop_i].report_ids; + } + return 0; +} + static uint8_t get_object_type_from_idnum(struct atmel_ts_data *ts, uint8_t id_num) +{ + uint8_t loop_i; + for (loop_i = 0; loop_i < ts->id->num_declared_objects; loop_i++) { + if ((id_num>=ts->object_table[loop_i].report_ids)&& + (id_num<=ts->object_table[loop_i].report_ids+ts->object_table[loop_i].num_report_ids-1)) + return ts->object_table[loop_i].object_type; + } + return 0; +} + +#ifdef ATMEL_EN_SYSFS +//huangjinyu ZTE_TS_HUANGJINYU_20110223 BEGIN +#if defined (CONFIG_MACH_MOONCAKE ) +static const char ts_keys_size[] = "0x01:102:40:350:50:15:0x01:158:200:350:50:15"; +#elif defined (CONFIG_MACH_V9PLUS) +static const char ts_keys_size[] = "0x01:102:100:1030:100:10:0x01:139:300:1030:100:10:0x01:158:500:1030:100:10"; +#elif defined(CONFIG_MACH_ARTHUR) +static const char ts_keys_size[] = +"0x01:102:60:850:80:30:0x01:139:180:850:80:30:0x01:158:300:850:80:30:0x01:217:420:850:80:30"; +#elif defined(CONFIG_MACH_SKATEPLUS) +static const char ts_keys_size[] = +"0x01:102:60:850:80:30:0x01:139:240:850:80:30:0x01:158:420:850:80:30"; + +#elif defined(CONFIG_MACH_SEAN) +static const char ts_keys_size[] = "0x01:102:40:500:60:20:0x01:139:120:500:60:20:0x01:158:200:500:60:20:0x01:217:280:500:60:20"; +#else +static const char ts_keys_size[] = "0x01:102:80:810:100:10:0x01:139:240:810:100:10:0x01:158:400:810:100:10"; +#endif +//huangjinyu ZTE_TS_HUANGJINYU_20110223 END +static ssize_t atmel_virtualkeys_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + sprintf(buf,"%s\n",ts_keys_size); + return strlen(ts_keys_size)+2; +} +static DEVICE_ATTR(virtualkeys, 0444, atmel_virtualkeys_show, NULL); + +static int lcd_flag = 0; +static ssize_t atmel_lcd_gpio_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int ret = 0; + struct atmel_ts_data *ts_data; + struct atmel_i2c_platform_data *pdata; + ts_data = private_ts; + pdata = ts_data->client->dev.platform_data; + + gpio_free(57); + ret = gpio_request(57, "lcd gpio"); + if (ret) { + pr_err("%s: unable to request gpio 57 (%d)\n", + __func__, ret); + } + + if (!lcd_flag) + { + gpio_direction_output(57, 0); + } + else + { + gpio_direction_output(57, 1); + } + lcd_flag = (!lcd_flag); + ret = gpio_get_value(57); + sprintf(buf, "lcd_gpio=%d\n", ret); + ret = strlen(buf) + 1; + return ret; +} +static DEVICE_ATTR(lcd_gpio, 0444, atmel_lcd_gpio_show, NULL); + + + +static ssize_t atmel_gpio_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int ret = 0; + struct atmel_ts_data *ts_data; + struct atmel_i2c_platform_data *pdata; + + ts_data = private_ts; + pdata = ts_data->client->dev.platform_data; + + ret = gpio_get_value(pdata->gpio_irq); + printk(KERN_DEBUG "GPIO_TP_INT_N=%d\n", pdata->gpio_irq); + sprintf(buf, "GPIO_TP_INT_N=%d\n", ret); + ret = strlen(buf) + 1; + return ret; +} +static DEVICE_ATTR(gpio, 0444, atmel_gpio_show, NULL); +static ssize_t atmel_vendor_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int ret = 0; + struct atmel_ts_data *ts_data; + ts_data = private_ts; + sprintf(buf, "%s_x%4.4X_x%4.4X\n", "ATMEL", + ts_data->id->family_id, ts_data->id->version); + ret = strlen(buf) + 1; + return ret; +} + +static DEVICE_ATTR(vendor, 0444, atmel_vendor_show, NULL); + +static uint16_t atmel_reg_addr; + +static ssize_t atmel_register_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int ret = 0; + uint8_t ptr[1]; + struct atmel_ts_data *ts_data; + ts_data = private_ts; + if (i2c_atmel_read(ts_data->client, atmel_reg_addr, ptr, 1) < 0) { + printk(KERN_WARNING "%s: read fail\n", __func__); + return ret; + } + ret += sprintf(buf, "addr: %d, data: %d\n", atmel_reg_addr, ptr[0]); + return ret; +} + +static ssize_t atmel_register_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + int ret = 0; + struct atmel_ts_data *ts_data; + char buf_tmp[4], buf_zero[200]; + uint8_t write_da; + + ts_data = private_ts; + memset(buf_tmp, 0x0, sizeof(buf_tmp)); + if ((buf[0] == 'r' || buf[0] == 'w') && buf[1] == ':' && + (buf[5] == ':' || buf[5] == '\n')) { + memcpy(buf_tmp, buf + 2, 3); + atmel_reg_addr = simple_strtol(buf_tmp, NULL, 10); + printk(KERN_DEBUG "read addr: 0x%X\n", atmel_reg_addr); + if (!atmel_reg_addr) { + printk(KERN_WARNING "%s: string to number fail\n", + __func__); + return count; + } + printk(KERN_DEBUG "%s: set atmel_reg_addr is: %d\n", + __func__, atmel_reg_addr); + if (buf[0] == 'w' && buf[5] == ':' && buf[9] == '\n') { + memcpy(buf_tmp, buf + 6, 3); + write_da = simple_strtol(buf_tmp, NULL, 10); + printk(KERN_DEBUG "write addr: 0x%X, data: 0x%X\n", + atmel_reg_addr, write_da); + ret = i2c_atmel_write_byte_data(ts_data->client, + atmel_reg_addr, write_da); + if (ret < 0) { + printk(KERN_ERR "%s: write fail(%d)\n", + __func__, ret); + } + } + } + if ((buf[0] == '0') && (buf[1] == ':') && (buf[5] == ':')) { + memcpy(buf_tmp, buf + 2, 3); + atmel_reg_addr = simple_strtol(buf_tmp, NULL, 10); + memcpy(buf_tmp, buf + 6, 3); + memset(buf_zero, 0x0, sizeof(buf_zero)); + ret = i2c_atmel_write(ts_data->client, atmel_reg_addr, + buf_zero, simple_strtol(buf_tmp, NULL, 10) - atmel_reg_addr + 1); + if (buf[9] == 'r') { + i2c_atmel_write_byte_data(ts_data->client, + get_object_address(ts_data, GEN_COMMANDPROCESSOR_T6) + 1, 0x55); + i2c_atmel_write_byte_data(ts_data->client, + get_object_address(ts_data, GEN_COMMANDPROCESSOR_T6), 0x11); + } + } + + return count; +} + +static DEVICE_ATTR(register, 0644, atmel_register_show, atmel_register_store); + +static ssize_t atmel_regdump_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int count = 0, ret_t = 0; + struct atmel_ts_data *ts_data; + uint16_t loop_i; + uint8_t ptr[1]; + ts_data = private_ts; + if (ts_data->id->version >= 0x14) { + for (loop_i = 230; loop_i <= 425; loop_i++) { + ret_t = i2c_atmel_read(ts_data->client, loop_i, ptr, 1); + if (ret_t < 0) { + printk(KERN_WARNING "dump fail, addr: %d\n", + loop_i); + } + count += sprintf(buf + count, "addr[%3d]: %3d, ", + loop_i , *ptr); + if (((loop_i - 230) % 4) == 3) + count += sprintf(buf + count, "\n"); + } + count += sprintf(buf + count, "\n"); + } + return count; +} + +static ssize_t atmel_regdump_dump(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + struct atmel_ts_data *ts_data; + ts_data = private_ts; + if (buf[0] >= '0' && buf[0] <= '9' && buf[1] == '\n') + ts_data->debug_log_level = buf[0] - 0x30; + + return count; + +} + +static DEVICE_ATTR(regdump, 0644, atmel_regdump_show, atmel_regdump_dump); + +static ssize_t atmel_debug_level_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct atmel_ts_data *ts_data; + size_t count = 0; + ts_data = private_ts; + + count += sprintf(buf, "%d\n", ts_data->debug_log_level); + + return count; +} + +static ssize_t atmel_debug_level_dump(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + struct atmel_ts_data *ts_data; + ts_data = private_ts; + if (buf[0] >= '0' && buf[0] <= '9' && buf[1] == '\n') + ts_data->debug_log_level = buf[0] - 0x30; + + return count; +} + +static DEVICE_ATTR(debug_level, 0644, atmel_debug_level_show, atmel_debug_level_dump); + +#ifdef ENABLE_IME_IMPROVEMENT +static ssize_t ime_threshold_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct atmel_ts_data *ts = private_ts; + + return sprintf(buf, "%d\n", ts->ime_threshold_pixel); +} + +static ssize_t ime_threshold_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct atmel_ts_data *ts = private_ts; + char *ptr_data = (char *)buf; + unsigned long val; + + val = simple_strtoul(ptr_data, NULL, 10); + + if (val >= 0 && val <= max(ts->display_width, ts->display_height)) + ts->ime_threshold_pixel = val; + else + ts->ime_threshold_pixel = 0; + + ts->ime_threshold[0] = ts->ime_threshold_pixel * (ts->abs_x_max - ts->abs_x_min) / ts->display_width; + ts->ime_threshold[1] = ts->ime_threshold_pixel * (ts->abs_y_max - ts->abs_y_min) / ts->display_height; + + return count; +} + +static ssize_t ime_work_area_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct atmel_ts_data *ts = private_ts; + + return sprintf(buf, "%d,%d,%d,%d\n", ts->ime_area_pixel[0], + ts->ime_area_pixel[1], ts->ime_area_pixel[2], ts->ime_area_pixel[3]); +} + +static ssize_t ime_work_area_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct atmel_ts_data *ts = private_ts; + char *ptr_data = (char *)buf; + char *p; + int pt_count = 0; + unsigned long val[4]; + + while ((p = strsep(&ptr_data, ","))) { + if (!*p) + break; + + if (pt_count >= 4) + break; + + val[pt_count] = simple_strtoul(p, NULL, 10); + + pt_count++; + } + + if (pt_count >= 4 && ts->display_width && ts->display_height) { + ts->ime_area_pixel[0] = val[0]; /* Left */ + ts->ime_area_pixel[1] = val[1]; /* Right */ + ts->ime_area_pixel[2] = val[2]; /* Top */ + ts->ime_area_pixel[3] = val[3]; /* Bottom */ + + if (val[0] < 0 || val[0] > ts->display_width) + ts->ime_area_pos[0] = 0; + else + ts->ime_area_pos[0] = val[0] * (ts->abs_x_max - ts->abs_x_min) / ts->display_width + ts->abs_x_min; + + if (val[1] < 0 || val[1] > ts->display_width) + ts->ime_area_pos[1] = ts->abs_x_max; + else + ts->ime_area_pos[1] = val[1] * (ts->abs_x_max - ts->abs_x_min) / ts->display_width + ts->abs_x_min; + + if (val[2] < 0 || val[2] > ts->display_height) + ts->ime_area_pos[2] = 0; + else + ts->ime_area_pos[2] = val[2] * (ts->abs_y_max - ts->abs_y_min) / ts->display_height + ts->abs_y_min; + + if (val[3] < 0 || val[3] > ts->display_height) + ts->ime_area_pos[3] = ts->abs_y_max; + else + ts->ime_area_pos[3] = val[3] * (ts->abs_y_max - ts->abs_y_min) / ts->display_height + ts->abs_y_min; + } + + return count; +} + +static int ime_report_filter(struct atmel_ts_data *ts, uint8_t *data) +{ + int drift_x,drift_y,x,y,w,z,report_type; + uint8_t discard = 0; + report_type = data[0] -2; + x = data[2] << 2 | data[4] >> 6; + y = data[3] << 2 | (data[4] & 0x0C) >> 2; + w = data[5]; + z = data[6]; + drift_x = abs(ts->finger_data[report_type].x - x); + drift_y = abs(ts->finger_data[report_type].y - y); + if (drift_x < ts->ime_threshold_pixel && drift_y < ts->ime_threshold_pixel && z != 0) { + discard = 1; + } + if (discard) { + /* if finger's movement < threshold , discard it. */ + ts->finger_data[report_type].z = z;//add by huangjinyu 20110523 + return 1; + } + ts->finger_data[report_type].x = x; + ts->finger_data[report_type].y = y; + ts->finger_data[report_type].w = w; + ts->finger_data[report_type].z = z; + return 0; +} + +/* sys/class/input/inputX/ime_threshold */ +static DEVICE_ATTR(ime_threshold, 0664, ime_threshold_show, + ime_threshold_store); +static DEVICE_ATTR(ime_work_area, 0664, ime_work_area_show, + ime_work_area_store); +#endif + + +#if defined(CONFIG_TOUCHSCREEN_VIRTUAL_KEYS) +extern struct kobject *android_touch_kobj; +#endif +static struct kobject * virtual_key_kobj; + +static int atmel_touch_sysfs_init(void) +{ + int ret; + + #if defined(CONFIG_TOUCHSCREEN_VIRTUAL_KEYS) + virtual_key_kobj = kobject_get(android_touch_kobj); + #endif + + if (virtual_key_kobj == NULL) { + virtual_key_kobj = kobject_create_and_add("board_properties", NULL); + if (virtual_key_kobj == NULL) { + printk(KERN_ERR "%s: subsystem_register failed\n", __func__); + ret = -ENOMEM; + return ret; + } + } + ret = sysfs_create_file(virtual_key_kobj, &dev_attr_virtualkeys.attr); + printk("xiayc, ret=%d\n",ret); + if (ret) { + printk(KERN_ERR "%s: sysfs_create_file failed\n", __func__); + return ret; + } + ret = sysfs_create_file(virtual_key_kobj, &dev_attr_lcd_gpio.attr); + if (ret) { + printk(KERN_ERR "%s: sysfs_create_file failed\n", __func__); + return ret; + } + + + ret = sysfs_create_file(virtual_key_kobj, &dev_attr_gpio.attr); + if (ret) { + printk(KERN_ERR "%s: sysfs_create_file failed\n", __func__); + return ret; + } + ret = sysfs_create_file(virtual_key_kobj, &dev_attr_vendor.attr); + if (ret) { + printk(KERN_ERR "%s: sysfs_create_file failed\n", __func__); + return ret; + } + atmel_reg_addr = 0; + ret = sysfs_create_file(virtual_key_kobj, &dev_attr_register.attr); + if (ret) { + printk(KERN_ERR "%s: sysfs_create_file failed\n", __func__); + return ret; + } + ret = sysfs_create_file(virtual_key_kobj, &dev_attr_regdump.attr); + if (ret) { + printk(KERN_ERR "%s: sysfs_create_file failed\n", __func__); + return ret; + } + ret = sysfs_create_file(virtual_key_kobj, &dev_attr_debug_level.attr); + if (ret) { + printk(KERN_ERR "%s: sysfs_create_file failed\n", __func__); + return ret; + } + return 0; +} + +static void atmel_touch_sysfs_deinit(void) +{ + sysfs_remove_file(virtual_key_kobj, &dev_attr_regdump.attr); + sysfs_remove_file(virtual_key_kobj, &dev_attr_register.attr); + sysfs_remove_file(virtual_key_kobj, &dev_attr_vendor.attr); + sysfs_remove_file(virtual_key_kobj, &dev_attr_gpio.attr); + sysfs_remove_file(virtual_key_kobj, &dev_attr_lcd_gpio.attr); + sysfs_remove_file(virtual_key_kobj, &dev_attr_virtualkeys.attr); + kobject_del(virtual_key_kobj); +} + +#endif + + + + +/*static int check_delta(struct atmel_ts_data*ts) +{ + int8_t data[128]; + uint8_t loop_i; + int16_t rawdata, count = 0; + + memset(data, 0xFF, sizeof(data)); + i2c_atmel_write_byte_data(ts->client, + get_object_address(ts, GEN_COMMANDPROCESSOR_T6) + 5, 0x10); + + for (loop_i = 0; !(data[0] == 0x10 && data[1] == 0x00) && loop_i < 10; loop_i++) { + msleep(5); + i2c_atmel_read(ts->client, get_object_address(ts, DIAGNOSTIC_T37), data, 2); + } + if (loop_i == 10) + printk(KERN_ERR "%s: Diag data not ready\n", __func__); + + i2c_atmel_read(ts->client, get_object_address(ts, DIAGNOSTIC_T37), data, 128); + if (data[0] == 0x10 && data[1] == 0x00) { + for (loop_i = 2; loop_i < 127; loop_i += 2) { + rawdata = data[loop_i+1] << 8 | data[loop_i]; + if (abs(rawdata) > 50) + count++; + } + printk("***********: check_delta , count =%d\n", count); + if (count > 32) + return 1; + } + return 0; +}*/ +#if 1 //wly add +static void release_all_fingers(struct atmel_ts_data*ts) +{ + int loop_i; + + for(loop_i =0; loop_i< ts->finger_support; loop_i ++ ) + { + if(ts->finger_data[loop_i].report_enable) + { + printk("release all fingers!\n"); + ts->finger_data[loop_i].z = 0; + ts->finger_data[loop_i].report_enable = 0; + input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR,ts->finger_data[loop_i].z); + input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR,ts->finger_data[loop_i].w); + input_report_abs(ts->input_dev, ABS_MT_POSITION_X,ts->finger_data[loop_i].x); + input_report_abs(ts->input_dev, ABS_MT_POSITION_Y,ts->finger_data[loop_i].y); + input_mt_sync(ts->input_dev); + } + + } + input_sync(ts->input_dev); + ts->finger_pressed = 0; + ts->finger_count = 0; +} +#endif + static uint8_t count=0; + +#define TOUCH_LONG_SLIDE +#ifdef TOUCH_LONG_SLIDE +static int x_value; +static int y_value; +//是否取了起点的标志位 +// 0 no +// 1 yes +// 2 ok +static uint8_t temp_flag=0; +//是否滑动完成的标志位 +// 0 no +// 1 yes +static uint8_t temp_flag2=0; +#endif +static struct atmel_ts_data *ts_temp; + + +//#endif + +#if defined CONFIG_TS_NOTIFIER +static int usb_status=0; + +static int atmel_ts_event(struct notifier_block *this, unsigned long event, + void *ptr) +{ + int ret; +#ifdef CONFIG_ATMEL_FW_UPDATE + if(update_result_flag==3)//updating + return 0; +#endif + + switch(event) + { + case 0: + //offline + if(usb_status!=0){ + usb_status=0; + printk("ts config change to offline status\n"); + if(ts_temp->id->version!=0x16){ + i2c_atmel_write_byte_data(ts_temp->client, + get_object_address(ts_temp, TOUCH_MULTITOUCHSCREEN_T9) + 31, + ts_temp->config_setting[0].config_T9[31]); + } + + i2c_atmel_write_byte_data(ts_temp->client, + get_object_address(ts_temp, TOUCH_MULTITOUCHSCREEN_T9) + 7, + ts_temp->config_setting[0].config_T9[7]); + i2c_atmel_write_byte_data(ts_temp->client, + get_object_address(ts_temp, TOUCH_MULTITOUCHSCREEN_T9) + 11, + ts_temp->config_setting[0].config_T9[11]); + + i2c_atmel_write_byte_data(ts_temp->client, + get_object_address(ts_temp, TOUCH_MULTITOUCHSCREEN_T9) + 12, + ts_temp->config_setting[0].config_T9[12]); + i2c_atmel_write_byte_data(ts_temp->client, + get_object_address(ts_temp, SPT_CTECONFIG_T28) + 3, + ts_temp->config_setting[0].config_T28[3]); + i2c_atmel_write_byte_data(ts_temp->client, + get_object_address(ts_temp, SPT_CTECONFIG_T28) + 4, + ts_temp->config_setting[0].config_T28[4]); + } + + break; + case 1: + //online + if(usb_status!=1){ + usb_status=1; + printk("ts config change to online status\n"); + if(ts_temp->id->version!=0x16){ + i2c_atmel_write_byte_data(ts_temp->client, + get_object_address(ts_temp, TOUCH_MULTITOUCHSCREEN_T9) + 31, + ts_temp->config_setting[0].config_T9_charge[1]); + } + i2c_atmel_write_byte_data(ts_temp->client, + get_object_address(ts_temp, TOUCH_MULTITOUCHSCREEN_T9) + 7, + ts_temp->config_setting[0].config_T9_charge[0]); + + i2c_atmel_write_byte_data(ts_temp->client, + get_object_address(ts_temp, TOUCH_MULTITOUCHSCREEN_T9) + 11, + ts_temp->config_setting[0].config_T9_charge[2]); + + i2c_atmel_write_byte_data(ts_temp->client, + get_object_address(ts_temp, TOUCH_MULTITOUCHSCREEN_T9) + 12, + ts_temp->config_setting[0].config_T9_charge[3]); + #if 0 + i2c_atmel_write_byte_data(ts_temp->client, + get_object_address(ts_temp, SPT_CTECONFIG_T28) + 3, + ts_temp->config_setting[0].config_T28_charge[0]); + i2c_atmel_write_byte_data(ts_temp->client, + get_object_address(ts_temp, SPT_CTECONFIG_T28) + 4, + ts_temp->config_setting[0].config_T28_charge[1]); + #endif + } + break; + default: + break; + } + + ret = NOTIFY_DONE; + + return ret; +} + +static struct notifier_block atmel_ts_notifier = { + .notifier_call = atmel_ts_event, +}; + + +static BLOCKING_NOTIFIER_HEAD(atmel_ts_chain_head); + +int register_atmel_ts_notifier(struct notifier_block *nb) +{ + return blocking_notifier_chain_register(&atmel_ts_chain_head, nb); +} +EXPORT_SYMBOL_GPL(register_atmel_ts_notifier); + +int unregister_atmel_ts_notifier(struct notifier_block *nb) +{ + return blocking_notifier_chain_unregister(&atmel_ts_chain_head, nb); +} +EXPORT_SYMBOL_GPL(unregister_atmel_ts_notifier); + +int ts_notifier_call_chain(unsigned long val) +{ + return (blocking_notifier_call_chain(&atmel_ts_chain_head, val, NULL) + == NOTIFY_BAD) ? -EINVAL : 0; +} + +#endif +static void auto_cal_set(struct atmel_ts_data*ts,int val) +{ + i2c_atmel_write_byte_data(ts->client, + get_object_address(ts, GEN_ACQUISITIONCONFIG_T8) + 4, + val); +} +/* +其实这个函数还控制了PALM校准 +*/ +static void atch_cal_control(struct atmel_ts_data*ts,int on) +{ + + printk(" atmel atch_cal_control:%d. 1:open 0:close\n",on); + if(on==1)//open + { + //原始值为打开负向校准 + i2c_atmel_write_byte_data(ts->client, + get_object_address(ts, GEN_ACQUISITIONCONFIG_T8) + 6, + ts->config_setting[0].config_T8[6]); + i2c_atmel_write_byte_data(ts->client, + get_object_address(ts, GEN_ACQUISITIONCONFIG_T8) + 7, + ts->config_setting[0].config_T8[7]); + + if((ts->id->version!=0x16)){ + i2c_atmel_write_byte_data(ts->client, + get_object_address(ts, GEN_ACQUISITIONCONFIG_T8) + 8, + ts->config_setting[0].config_T8[8]); + i2c_atmel_write_byte_data(ts->client, + get_object_address(ts, GEN_ACQUISITIONCONFIG_T8) + 9, + ts->config_setting[0].config_T8[9]); + + i2c_atmel_write_byte_data(ts->client, + get_object_address(ts, TOUCH_MULTITOUCHSCREEN_T9) + 31, + ts->config_setting[0].config_T9[31]); + } + + }else{ + i2c_atmel_write_byte_data(ts->client, + get_object_address(ts, GEN_ACQUISITIONCONFIG_T8) + 6, 255); + i2c_atmel_write_byte_data(ts->client, + get_object_address(ts, GEN_ACQUISITIONCONFIG_T8) + 7, 1); + + if((ts->id->version!=0x16)){ + i2c_atmel_write_byte_data(ts->client, + get_object_address(ts, GEN_ACQUISITIONCONFIG_T8) + 8, 0); + i2c_atmel_write_byte_data(ts->client, + get_object_address(ts, GEN_ACQUISITIONCONFIG_T8) + 9, 0); + //降低检查校准OK时候负向出现的概率 + i2c_atmel_write_byte_data(ts->client, + get_object_address(ts, TOUCH_MULTITOUCHSCREEN_T9) + 31,0); + + + } + } +} +/* +控制face和auto校准 +*/ +static void new_cal_control(struct atmel_ts_data*ts,int on) +{ + printk(" atmel new_cal_control:%d. 1:open 0:close\n",on); + if(on==1)//open + { + //原始值为打开各种校准 + i2c_atmel_write_byte_data(ts->client, + get_object_address(ts, PROCI_GRIPFACESUPPRESSION_T20), + ts->config_setting[0].config_T20[0]); + i2c_atmel_write_byte_data(ts->client, + get_object_address(ts, GEN_ACQUISITIONCONFIG_T8) + 4, + ts->config_setting[0].config_T8[4]); + //快漂开 + i2c_atmel_write_byte_data(ts->client, + get_object_address(ts, NEW_CAL_T59), + 7); + + }else{ + i2c_atmel_write_byte_data(ts->client, + get_object_address(ts, PROCI_GRIPFACESUPPRESSION_T20), + 0); + i2c_atmel_write_byte_data(ts->client, + get_object_address(ts, GEN_ACQUISITIONCONFIG_T8) + 4, + 0); + //快漂关 + i2c_atmel_write_byte_data(ts->client, + get_object_address(ts, NEW_CAL_T59), + 0); + + } +} +static void check_atch_and_tch(struct atmel_ts_data*ts,uint8_t*atch_and_tch) +{ + + uint8_t data[82]; + uint8_t x_limit,check_mask,loop_i,loop_j, tch_ch = 0, atch_ch = 0; + + i2c_atmel_write_byte_data(ts->client, + get_object_address(ts, GEN_COMMANDPROCESSOR_T6) + 5, 0xF3); + + for (loop_i = 0; !(data[0] == 0xF3 && data[1] == 0x00) && loop_i < 100; loop_i++) { + msleep(5); + i2c_atmel_read(ts->client, get_object_address(ts, DIAGNOSTIC_T37), data, 2); + } + + if (loop_i == 100){ + printk(KERN_ERR "%s: Diag data not ready\n", __func__); + + ts->calibration_confirm = 0; + //reset + i2c_atmel_write_byte_data(ts->client, + get_object_address(ts, GEN_COMMANDPROCESSOR_T6), 0x1); + return ; + } + i2c_atmel_read(ts->client, get_object_address(ts, DIAGNOSTIC_T37), data, 82); + if (data[0] == 0xF3 && data[1] == 0x00) { + x_limit = ts->config_setting[0].config_T9[3]+ts->config_setting[0].config_T9[1] + + ts->config_setting[0].config_T28[2]; + x_limit = x_limit << 1; + if(ATMEL_CHIP_TYPE==ATMEL_140) + { + for (loop_i = ts->config_setting[0].config_T9[1]; loop_i < x_limit; loop_i += 2) { + for (loop_j = ts->config_setting[0].config_T9[2]; loop_j < 8; loop_j++) { + check_mask = 1 << loop_j; + if (data[2 + loop_i] & check_mask) + tch_ch++; + if (data[32 + loop_i] & check_mask) + atch_ch++; + + } + for (loop_j = 0; + loop_j < ts->config_setting[0].config_T9[4]+ts->config_setting[0].config_T9[2]-8; + loop_j++) { + check_mask = 1 << loop_j; + if (data[3 + loop_i] & check_mask) + tch_ch++; + if (data[33 + loop_i] & check_mask) + atch_ch++; + } + } + }else if(ATMEL_CHIP_TYPE==ATMEL_224){ + for (loop_i = ts->config_setting[0].config_T9[1]; loop_i < x_limit; loop_i += 2) { + for (loop_j = ts->config_setting[0].config_T9[2]; loop_j < 8; loop_j++) { + check_mask = 1 << loop_j; + if (data[2 + loop_i] & check_mask) + tch_ch++; + if (data[42 + loop_i] & check_mask) + atch_ch++; + } + for (loop_j = 0; + loop_j < ts->config_setting[0].config_T9[4]+ts->config_setting[0].config_T9[2]-8; + loop_j++) { + check_mask = 1 << loop_j; + if (data[3 + loop_i] & check_mask) + tch_ch++; + if (data[43 + loop_i] & check_mask) + atch_ch++; + } + } + } + atch_and_tch[0]=atch_ch; + atch_and_tch[1]=tch_ch; + } +} +static int atmel_ts_get_build_info(struct atmel_ts_data*ts) +{ + uint8_t data[7]; + int ret; + printk("i2c address:0x%x",ts->client->addr); + ret = i2c_atmel_read(ts->client, 0x0000, data, 7); + + ts->id->family_id = data[0]; + ts->id->variant_id = data[1]; + ts->id->version = data[2]; + ts->id->build = data[3]; + ts->id->matrix_x_size = data[4]; + ts->id->matrix_y_size = data[5]; + ts->id->num_declared_objects = data[6]; + + printk(KERN_INFO "info block: 0x%2.2X 0x%2.2X 0x%2.2X 0x%2.2X 0x%2.2X 0x%2.2X 0x%2.2X\n", + ts->id->family_id, ts->id->variant_id, + ts->id->version, ts->id->build, + ts->id->matrix_x_size, ts->id->matrix_y_size, + ts->id->num_declared_objects); + + return 0; +} +static int atmel_ts_get_table_info(struct atmel_ts_data*ts) +{ + uint8_t data[6],type_count = 0; + int i,ret; + if (ts->object_table==NULL){ + printk("ts->object_table==NULL\n"); + return 0; + } + for (i = 0; i < ts->id->num_declared_objects; i++) { + ret = i2c_atmel_read(ts->client, i * 6 + 0x07, data, 6); + ts->object_table[i].object_type = data[0]; + ts->object_table[i].i2c_address = data[1] | data[2] << 8; + ts->object_table[i].size = data[3] + 1; + ts->object_table[i].instances = data[4]; + ts->object_table[i].num_report_ids = data[5]; + if (data[5]) { + ts->object_table[i].report_ids = type_count + 1; + type_count += data[5]; + } + if (data[0] == 9) + ts->finger_type = ts->object_table[i].report_ids; + printk(KERN_INFO "Type: %2d, Start: 0x%4.4X, Size: %2d, Instance: %2X, RD#: 0x%2X, %2d\n", + ts->object_table[i].object_type , ts->object_table[i].i2c_address, + ts->object_table[i].size, ts->object_table[i].instances, + ts->object_table[i].num_report_ids, ts->object_table[i].report_ids); + } + return 0; +} +static int atmel_ts_load_config(struct atmel_ts_data*ts) +{ + int ret,loop_i; + uint8_t data[9]; + struct atmel_i2c_platform_data *pdata; + pdata = ts->client->dev.platform_data; + + printk(KERN_INFO "Touch: Config load\n"); + i2c_atmel_write(ts->client, get_object_address(ts, GEN_POWERCONFIG_T7), + pdata->config_T7, get_object_size(ts, GEN_POWERCONFIG_T7)); + i2c_atmel_write(ts->client, get_object_address(ts, GEN_ACQUISITIONCONFIG_T8), + pdata->config_T8, get_object_size(ts, GEN_ACQUISITIONCONFIG_T8)); + i2c_atmel_write(ts->client, get_object_address(ts, TOUCH_MULTITOUCHSCREEN_T9), + pdata->config_T9, get_object_size(ts, TOUCH_MULTITOUCHSCREEN_T9)); + i2c_atmel_write(ts->client, get_object_address(ts, TOUCH_KEYARRAY_T15), + pdata->config_T15, get_object_size(ts, TOUCH_KEYARRAY_T15)); + i2c_atmel_write(ts->client, get_object_address(ts, SPT_GPIOPWM_T19), + pdata->config_T19, get_object_size(ts, SPT_GPIOPWM_T19)); + i2c_atmel_write(ts->client, get_object_address(ts, PROCI_GRIPFACESUPPRESSION_T20), + pdata->config_T20, get_object_size(ts, PROCI_GRIPFACESUPPRESSION_T20)); + i2c_atmel_write(ts->client, get_object_address(ts, PROCG_NOISESUPPRESSION_T22), + pdata->config_T22, get_object_size(ts, PROCG_NOISESUPPRESSION_T22)); + i2c_atmel_write(ts->client, get_object_address(ts, TOUCH_PROXIMITY_T23), + pdata->config_T23, get_object_size(ts, TOUCH_PROXIMITY_T23)); + i2c_atmel_write(ts->client, get_object_address(ts, PROCI_ONETOUCHGESTUREPROCESSOR_T24), + pdata->config_T24, get_object_size(ts, PROCI_ONETOUCHGESTUREPROCESSOR_T24)); + i2c_atmel_write(ts->client, get_object_address(ts, SPT_SELFTEST_T25), + pdata->config_T25, get_object_size(ts, SPT_SELFTEST_T25)); + i2c_atmel_write(ts->client, get_object_address(ts, PROCI_TWOTOUCHGESTUREPROCESSOR_T27), + pdata->config_T27, get_object_size(ts, PROCI_TWOTOUCHGESTUREPROCESSOR_T27)); + i2c_atmel_write(ts->client, get_object_address(ts, SPT_CTECONFIG_T28), + pdata->config_T28, get_object_size(ts, SPT_CTECONFIG_T28)); + i2c_atmel_write(ts->client, get_object_address(ts, NEW_CAL_T35), + pdata->config_T35, get_object_size(ts, NEW_CAL_T35)); + i2c_atmel_write(ts->client, get_object_address(ts, NEW_CAL_T59), + pdata->config_T59, get_object_size(ts, NEW_CAL_T59)); + + ret = i2c_atmel_write_byte_data(ts->client, get_object_address(ts, GEN_COMMANDPROCESSOR_T6) + 1, 0x55); + ret = i2c_atmel_write_byte_data(ts->client, get_object_address(ts, GEN_COMMANDPROCESSOR_T6), 0x11); + msleep(64); + for (loop_i = 0; loop_i < 10; loop_i++) { + if (!gpio_get_value(pdata->gpio_irq)) + break; + printk(KERN_INFO "Touch: wait for Message(%d)\n", loop_i + 1); + msleep(10); + } + + i2c_atmel_read(ts->client, get_object_address(ts, GEN_MESSAGEPROCESSOR_T5), data, 9); + printk(KERN_INFO "Touch: 0x%2.2X 0x%2.2X 0x%2.2X 0x%2.2X 0x%2.2X 0x%2.2X 0x%2.2X\n", + data[0], data[1], data[2], data[3], data[4], data[5], data[6]); + return 0; +} + + +static void check_calibration(struct atmel_ts_data*ts) + { + uint8_t data[2]; + uint8_t atch_and_tch[2]; + uint8_t tch_ch = 0, atch_ch = 0,loop_i; + + memset(data, 0xFF, sizeof(data)); + memset(atch_and_tch, 0, sizeof(atch_and_tch)); + + i2c_atmel_write_byte_data(ts->client, + get_object_address(ts, GEN_COMMANDPROCESSOR_T6) + 5, 0xF3); + + for (loop_i = 0; !(data[0] == 0xF3 && data[1] == 0x00) && loop_i < 100; loop_i++) { + msleep(5); + i2c_atmel_read(ts->client, get_object_address(ts, DIAGNOSTIC_T37), data, 2); + } + + if (loop_i == 100){ + printk(KERN_ERR "%s: Diag data not ready\n", __func__); + + ts->calibration_confirm = 0; + //reset + i2c_atmel_write_byte_data(ts->client, + get_object_address(ts, GEN_COMMANDPROCESSOR_T6), 0x1); + return ; + } + + check_atch_and_tch(ts,atch_and_tch); + atch_ch=atch_and_tch[0]; + tch_ch=atch_and_tch[1]; + +#ifdef TOUCH_LONG_SLIDE + printk("***********: check_calibration, tch_ch=%d, atch_ch=%d temp_flag:%d temp_flag2:%d\n", tch_ch, atch_ch,temp_flag,temp_flag2); +#else + printk("***********: check_calibration, tch_ch=%d, atch_ch=%d\n", tch_ch, atch_ch); + +#endif + + i2c_atmel_write_byte_data(ts->client, + get_object_address(ts, GEN_COMMANDPROCESSOR_T6) + 5, 0x01); + + //20110531 + //对于这个tch_ch=0的条件,还是有疑问的 + //henk说不要这个条件,但没有这个条件的话,不能在第一时间对计时进行设置 + //影响了校准OK的时间,从而影响了RELEASE ALL FINGERS的时间,导致错误的释放 + //所以需要知道这个计时到底从什么时候开始 + if ((tch_ch>=0) && (atch_ch == 0)&&(tch_ch <40)) + { + #ifdef TOUCH_LONG_SLIDE + if ((jiffies > (ts->timestamp + HZ/2)||(jiffiestimestamp && jiffies>HZ/2)) + && (ts->calibration_confirm == 1)&&(temp_flag2==1)) + { + ts->calibration_confirm = 2; + + atch_cal_control(ts,0); + + auto_cal_set(ts,15); + + temp_flag2=0; + #ifdef ATMEL_NEW_CAL + ts->timestamp1=jiffies; + #endif + printk("***********: calibration is ok\n"); + } + + #else + if (jiffies > (ts->timestamp + HZ/2) && (ts->calibration_confirm == 1)) + { + ts->calibration_confirm = 2; + atch_cal_control(ts,0); + printk("***********: calibration is ok\n"); + } + #endif + if (ts->calibration_confirm == 0) + { + ts->calibration_confirm = 1; + ts->timestamp = jiffies; + } + } else + { + if(((atch_ch>2)&&(tch_ch==0))||((tch_ch>0)&&(atch_ch>7))||(tch_ch>15)){ + ts->calibration_confirm = 0; + i2c_atmel_write_byte_data(ts->client, + get_object_address(ts, GEN_COMMANDPROCESSOR_T6) + 2, 0x55); + #ifdef TOUCH_LONG_SLIDE + temp_flag=0; + temp_flag2=0; + #endif + ts->timestamp = jiffies; + count = 0; + }else { + count++; + } + + if (count >=50) + { + count = 0; + ts->calibration_confirm = 0; + + //reset + i2c_atmel_write_byte_data(ts->client, + get_object_address(ts, GEN_COMMANDPROCESSOR_T6), 0x1); + msleep(100); + i2c_atmel_write_byte_data(ts->client, + get_object_address(ts, GEN_COMMANDPROCESSOR_T6) + 2, 0x55); + #ifdef TOUCH_LONG_SLIDE + temp_flag=0; + temp_flag2=0; + #endif + } + } + +} + + +void get_finger_position(struct atmel_ts_data *ts, uint8_t report_type,uint8_t *data){ + //int ret; + report_type = data[0] - ts->finger_type; + if (report_type >= 0 && report_type < ts->finger_support) { + /* for issue debug only */ + if ((data[ 1] & 0x60) == 0x60) + { + printk(KERN_INFO"x60 ISSUE happened: %x, %x, %x, %x, %x, %x, %x, %x\n", + data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]); + return; + } + if ((data[1] & 0x22) && (((ts->finger_pressed >> report_type) & 1) == 1)) { + ts->finger_count--; + ts->finger_pressed &= ~(1 << report_type); + } + else if ((data[1] & 0xC0) && (((ts->finger_pressed >> report_type) & 1) == 0)) { + ts->finger_count++; + ts->finger_pressed |= 1 << report_type; + } + #ifdef ENABLE_IME_IMPROVEMENT + if (ts->ime_threshold_pixel > 0) + ime_report_filter(ts, data); + #else + ts->finger_data[report_type].x = data[2] << 2 | data[4] >> 6; + ts->finger_data[report_type].y = data[3] << 2 | (data[4] & 0x0C) >> 2; + ts->finger_data[report_type].w = data[5]; + ts->finger_data[report_type].z = data[6]; + #endif + ts->finger_data[report_type].report_enable=2; + if((data[1]&0x80)==0) + { + ts->finger_data[report_type].report_enable=1;/*The finger is up.*/ + ts->finger_data[report_type].z = 0; + } + } +} +void command_process(struct atmel_ts_data *ts, uint8_t *data){ + + struct atmel_i2c_platform_data *pdata; + pdata = ts->client->dev.platform_data; + printk(KERN_INFO"command_process: %x, %x, %x, %x, %x, %x, %x, %x\n", + data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]); + if ((data[1] & 0x08) == 0x08) + { + atmel_ts_load_config(ts); + + } + else if (data[1] & 0x10) + { + #ifdef TOUCH_LONG_SLIDE + temp_flag=0; + temp_flag2=0; + #endif + ts->calibration_confirm = 0; + #ifdef ATMEL_NEW_CAL + new_cal_state=0; + atch_cal_control(ts,1); + new_cal_control(ts,1); + #endif + printk("wly: command calibration set\n"); + } + else if (!(data[1]&0x10)) + { + if (ts->calibration_confirm == 0) + { + release_all_fingers(ts); + check_calibration(ts); + } + } + + +} +void virtual_keys(struct atmel_ts_data *ts, uint8_t key_code, uint8_t key_state,uint8_t *data){ + //printk("huangjinyu v-key coming data[2] = %d \n",data[2]); +if(!ts->finger_count){ + key_state = !!(data[1]& 0x80); + //huangjinyu ZTE_TS_HUANGJINYU_20110223 BEGIN + #if defined(CONFIG_MACH_MOONCAKE) + switch(data[2]) + { + case 1: + key_code = KEY_BACK; + ts->finger_data[0].x = 200; + break; + case 2: + key_code = KEY_HOME; + ts->finger_data[0].x = 40; + break; + default: + break; + } + /*ZTE_TS_ZFJ_20110425 begin*/ + #elif defined(CONFIG_MACH_NOVA) + switch(data[2]) + { + case 1: + key_code = KEY_MENU; + ts->finger_data[0].x = 30; + break; + case 2: + key_code = KEY_HOME; + ts->finger_data[0].x = 110; + break; + case 4: + key_code = KEY_BACK; + ts->finger_data[0].x = 200; + break; + case 8: + key_code = KEY_SEARCH; + ts->finger_data[0].x = 300; + break; + default: + break; + } + /*ZTE_TS_ZFJ_20110425 end*/ + #else + switch(data[2]) + { + case 1: + key_code = KEY_HOME; + ts->finger_data[0].x = 80; + break; + case 2: + key_code = KEY_MENU; + ts->finger_data[0].x = 240; + break; + case 4: + key_code = KEY_BACK; + ts->finger_data[0].x = 400; + break; + default: + break; + } + #if 0 + if (1 == data[2]) + { + key_code = KEY_HOME; + ts->finger_data[0].x = 80; + + } + else if (2 == data[2]) + { + key_code = KEY_MENU; + ts->finger_data[0].x = 240; + } + else if(4 == data[2]) + { + key_code = KEY_BACK; + ts->finger_data[0].x = 400; + } + #endif + #endif + //huangjinyu ZTE_TS_HUANGJINYU_20110223 end + if (!key_state) + { + ts->finger_data[0].w = 0; + ts->finger_data[0].z = 0; + } + else + { + ts->finger_data[0].w = 10; + ts->finger_data[0].z = 255; + } + //huangjinyu ZTE_TS_HUANGJINYU_20110223 BEGIN + #if defined(CONFIG_MACH_MOONCAKE) + ts->finger_data[0].y = 350; + /*ZTE_TS_ZFJ_20110425 begin*/ + #elif defined(CONFIG_MACH_NOVA) + ts->finger_data[0].y = 520; + /*ZTE_TS_ZFJ_20110425 end*/ + #else + ts->finger_data[0].y = 810; + #endif + //huangjinyu ZTE_TS_HUANGJINYU_20110223 end + input_report_key(ts->input_dev, BTN_TOUCH, !!key_state); + input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR,ts->finger_data[0].z); + input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR,ts->finger_data[0].w); + input_report_abs(ts->input_dev, ABS_MT_POSITION_X,ts->finger_data[0].x); + input_report_abs(ts->input_dev, ABS_MT_POSITION_Y,ts->finger_data[0].y); + + //pr_err("huangjinyu report touch v-key major= %d ,width major = %d ,x = %d ,y = %d \n",ts->finger_data[0].z,ts->finger_data[0].w,ts->finger_data[0].x,ts->finger_data[0].y); + + input_mt_sync(ts->input_dev); + input_sync(ts->input_dev); + } +} + + +static void atmel_ts_work_func(struct work_struct *work) +{ + int ret; + + struct atmel_ts_data *ts = container_of(work, struct atmel_ts_data, work); + uint8_t data[9]; + //uint8_t atch_and_tch[2]; + + //int16_t data1[8]; + int i; + uint8_t loop_i =0, report_type =0, report_id=0,key_state = 0; + static uint8_t key_code = 0; + ret = i2c_atmel_read(ts->client, get_object_address(ts,GEN_MESSAGEPROCESSOR_T5), data, 9); + report_id = data[0]; + //printk("huangjinyu11111 *******************************************\n"); + + if (ts->calibration_confirm < 2 && (data[1] & 0x80) ) + { + check_calibration(ts); + + } + + //memset(atch_and_tch, 0, sizeof(atch_and_tch)); + //check_atch_and_tch(ts,atch_and_tch); + //printk("atch:%d,tch:%d\n",atch_and_tch[0],atch_and_tch[1]); + /*printk(KERN_INFO"atmel_ts_work_func: %x, %x, %x, %x, %x, %x, %x, %x,ts->finger_count:%d\n", + data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7],ts->finger_count);*/ + #ifdef ATMEL_NEW_CAL + if(ts->calibration_confirm ==2){ + if(new_cal_state==0){ + if(jiffies > (ts->timestamp1 + 20*HZ)||(jiffiestimestamp && jiffies>20*HZ)){ + new_cal_state=1; + new_cal_control(ts,0); + } + } + } + #endif + + report_type=get_object_type_from_idnum(ts,report_id); + switch(report_type) + { + case TOUCH_MULTITOUCHSCREEN_T9:{ + get_finger_position(ts, report_type,data); + for(i=0;ifinger_support+1;i++) + { + ret = i2c_atmel_read(ts->client, get_object_address(ts,GEN_MESSAGEPROCESSOR_T5), data, 9); + if(get_object_type_from_idnum(ts,data[0])==TOUCH_MULTITOUCHSCREEN_T9) + { + + report_id = data[0]; + get_finger_position(ts, data[0],data); + } + else + break; + } + }break; + case GEN_COMMANDPROCESSOR_T6:{command_process(ts, data);}break; + case TOUCH_KEYARRAY_T15:{virtual_keys(ts, key_code, key_state,data);}break; + case PROCI_GRIPFACESUPPRESSION_T20:{ + if((data[1]&0x01)==0x01){ + printk("face cal\n"); + i2c_atmel_write_byte_data(ts->client, + get_object_address(ts, GEN_COMMANDPROCESSOR_T6) + 2, 0x55); + } + break; + } + case PROCI_ONETOUCHGESTUREPROCESSOR_T24://T24,gesture and position + { + ts->finger_data[0].x = data[2] << 2 | data[4] >> 6; + ts->finger_data[0].y = data[3] << 2 | (data[4] & 0x0C) >> 2; + }break; + default:break; + + } + //printk("x: %d\ny: %d\n",ts->finger_data[report_type].x,ts->finger_data[report_type].y); + + if( report_type==TOUCH_MULTITOUCHSCREEN_T9 ) + { + for(loop_i =0; loop_i< ts->finger_support; loop_i ++ ) + { + switch(ts->finger_data[loop_i].report_enable) + { + case 1: + { + ts->finger_data[loop_i].report_enable=0; + }; + case 2: + { + input_report_abs(ts->input_dev, ABS_MT_TRACKING_ID,loop_i); + input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR,ts->finger_data[loop_i].z); + input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR,ts->finger_data[loop_i].w); + input_report_abs(ts->input_dev, ABS_MT_POSITION_X,ts->finger_data[loop_i].x); + input_report_abs(ts->input_dev, ABS_MT_POSITION_Y,ts->finger_data[loop_i].y); + //pr_err("huangjinyu report touch major= %d ,width major = %d ,x = %d ,y = %d \n",ts->finger_data[loop_i].z,ts->finger_data[loop_i].w,ts->finger_data[loop_i].x,ts->finger_data[loop_i].y); + input_mt_sync(ts->input_dev); + }break; + default:break; + } + + } + input_sync(ts->input_dev); + //input_report_key(ts->input_dev, BTN_TOUCH, !!ts->finger_count); + //input_sync(ts->input_dev); + } + #ifdef TOUCH_LONG_SLIDE + if(ts->calibration_confirm !=2){ + if((temp_flag==0)&&((ts->finger_data[0].report_enable==2))){ + x_value=ts->finger_data[0].x; + y_value=ts->finger_data[0].y; + temp_flag=1; + } + if(ts->finger_data[0].report_enable==0) + temp_flag=0; + + for(loop_i =1; loop_i< ts->finger_support; loop_i ++ ) + { + if (ts->finger_data[loop_i].report_enable!=0){ + temp_flag=0; + //temp_flag2=0; + break; + } + } + + if((temp_flag==1)&&((ts->finger_data[0].report_enable==2))){ + if(((x_value-ts->finger_data[0].x)>(ts->abs_x_max/4))|| + ((y_value-ts->finger_data[0].y)>(ts->abs_y_max/4))|| + ((ts->finger_data[0].x-x_value)>(ts->abs_x_max/4))|| + ((ts->finger_data[0].y-y_value)>(ts->abs_y_max/4))){ + temp_flag2=1; + temp_flag=2; + printk("huangjinyu long slide ok!***************************************\n"); + } + } + + } + #endif + enable_irq(ts->client->irq); +} +static irqreturn_t atmel_ts_irq_handler(int irq, void *dev_id) +{ + struct atmel_ts_data *ts = dev_id; + //printk("wly: atmel_ts_irq_handler\n"); + disable_irq_nosync(ts->client->irq); + queue_work(ts->atmel_wq, &ts->work); + return IRQ_HANDLED; +} + + +#if defined(CONFIG_ATMEL_FW_UPDATE) +/* Object types */ +#define QT602240_DEBUG_DIAGNOSTIC 37 +#define QT602240_GEN_MESSAGE 5 +#define QT602240_GEN_COMMAND 6 +#define QT602240_GEN_POWER 7 +#define QT602240_GEN_ACQUIRE 8 +#define QT602240_TOUCH_MULTI 9 +#define QT602240_TOUCH_KEYARRAY 15 +#define QT602240_TOUCH_PROXIMITY 23 +#define QT602240_PROCI_GRIPFACE 20 +#define QT602240_PROCG_NOISE 22 +#define QT602240_PROCI_ONETOUCH 24 +#define QT602240_PROCI_TWOTOUCH 27 +#define QT602240_SPT_COMMSCONFIG 18 /* firmware ver 21 over */ +#define QT602240_SPT_GPIOPWM 19 +#define QT602240_SPT_SELFTEST 25 +#define QT602240_SPT_CTECONFIG 28 +#define QT602240_SPT_USERDATA 38 /* firmware ver 21 over */ + + +/* QT602240_GEN_COMMAND field */ +#define QT602240_COMMAND_RESET 0 +#define QT602240_COMMAND_BACKUPNV 1 + +/* Define for QT602240_GEN_COMMAND */ +#define QT602240_BOOT_VALUE 0xa5 +#define QT602240_BACKUP_VALUE 0x55 +#define QT602240_BACKUP_TIME 25 /* msec */ +#define QT602240_RESET_TIME 65 /* msec */ +#define QT602240_FWRESET_TIME 175 /* msec */ + +/* Slave addresses */ +#define QT602240_APP_LOW 0x4a +#define QT602240_APP_HIGH 0x4b +#define QT602240_BOOT_LOW 0x24 +#define QT602240_BOOT_HIGH 0x25 +/* Bootloader mode status */ +#define QT602240_WAITING_BOOTLOAD_CMD 0xc0 /* valid 7 6 bit only */ +#define QT602240_WAITING_FRAME_DATA 0x80 /* valid 7 6 bit only */ +#define QT602240_FRAME_CRC_CHECK 0x02 +#define QT602240_FRAME_CRC_FAIL 0x03 +#define QT602240_FRAME_CRC_PASS 0x04 +#define QT602240_APP_CRC_FAIL 0x40 /* valid 7 8 bit only */ +#define QT602240_BOOT_STATUS_MASK 0x3f +/* Version */ +#define QT602240_VER_20 20 +#define QT602240_VER_21 21 +#define QT602240_VER_22 22 + +/* Firmware */ +//后续要区分224和140不同的FW 重要 +//7x30上暂时没有140的项目 7x30_4.1上n850为140的芯片 +//需要重点关注的是7X27和7X27A +#define QT602240_FW_NAME_224 "mXT224C23_v1.1.09.enc" +#define QT602240_FW_NAME_140 "mXT140C27_v1.0.01.enc" + +//#include QT602240_FW_NAME + +#define QT602240_UNLOCK_CMD_MSB 0xaa +#define QT602240_UNLOCK_CMD_LSB 0xdc + +/* Registers */ +#define QT602240_FAMILY_ID 0x00 +#define QT602240_VARIANT_ID 0x01 +#define QT602240_VERSION 0x02 +#define QT602240_BUILD 0x03 +#define QT602240_MATRIX_X_SIZE 0x04 +#define QT602240_MATRIX_Y_SIZE 0x05 +#define QT602240_OBJECT_NUM 0x06 +#define QT602240_OBJECT_START 0x07 + +#define QT602240_OBJECT_SIZE 6 + +#define QT602240_MAX_FINGER 10 + +static int qt602240_check_bootloader(struct i2c_client *client, + unsigned int state) +{ + u8 val; + int i=0,loop_i,ret; +recheck: + if (i2c_master_recv(client, &val, 1) != 1) { + dev_err(&client->dev, "%s: i2c recv failed\n", __func__); + i++; + if(i<10) + goto recheck; + return -EIO; + } + printk("huangjinyu state:0x%x,val:0x%x\n",state,val); + switch (state) { + case QT602240_WAITING_BOOTLOAD_CMD: + case QT602240_WAITING_FRAME_DATA: + val &= ~QT602240_BOOT_STATUS_MASK; + break; + case QT602240_FRAME_CRC_PASS: + if (val == QT602240_FRAME_CRC_CHECK){ + for (loop_i = 0; loop_i < 10; loop_i++) { + ret = gpio_get_value(55); + printk("wly:gpio 55 value = %d\n",ret); + if (!ret/*gpio_get_value(intr)*/) + break; + msleep(10); + } + goto recheck; + } + //if (val!=QT602240_FRAME_CRC_PASS){ + //printk("huangjinyu check crc again\n"); + //goto recheck; + //} + break; + default: + return -EINVAL; + } + if((state==0x4)&&(val==0x8a)) + return 0; + + if (val != state) { + dev_err(&client->dev, "Unvalid bootloader mode state\n"); + return -EINVAL; + } + + return 0; +} +static int qt602240_unlock_bootloader(struct i2c_client *client) +{ + u8 buf[2]; + + buf[0] = QT602240_UNLOCK_CMD_LSB; + buf[1] = QT602240_UNLOCK_CMD_MSB; + + if (i2c_master_send(client, buf, 2) != 2) { + dev_err(&client->dev, "%s: i2c send failed\n", __func__); + return -EIO; + } + + return 0; +} +static int qt602240_fw_write(struct i2c_client *client, + const u8 *data, unsigned int frame_size) +{ + //int i; + //for(i=0;i<=frame_size;i++) + //printk("huangjinyu i:%d\n",i); + if (i2c_master_send(client, data, frame_size) != frame_size) { + dev_err(&client->dev, "%s: i2c send failed \n", __func__); + return -EIO; + } + printk("huangjinyu qt602240_fw_write succeed!\n"); + return 0; +} + + + +static int qt602240_load_fw(struct device *dev, const char *fn) +{ + //struct qt602240_data *data = dev_get_drvdata(dev); + struct i2c_client *client = ts_temp->client; + const struct firmware *fw = NULL; + unsigned int frame_size; + unsigned int pos = 0; + int ret; + int j,loop_i; + u8 *data,data0,data1; + size_t size; + ret = request_firmware(&fw, fn, dev); + if (ret) { + dev_err(dev, "Unable to open firmware %s\n", fn); + return ret; + } + //change_firmware_asc2bin(&fw); + data=kzalloc((fw->size/2)*sizeof(*data), GFP_KERNEL); + for(j=0;jsize/2;j++){ + + if(fw->data[2*j]>=0x41) + data0=fw->data[2*j]-0x41+10; + else + data0=fw->data[2*j]-0x30; + + if(fw->data[2*j+1]>=0x41) + data1=fw->data[2*j+1]-0x41+10; + else + data1=fw->data[2*j+1]-0x30; + + data[j]=(data0<<4)|(data1); + + //printk("0x%x,",data[j]); + //if(j==10) + //printk("\n"); + } + //fw->data=data; + size=fw->size/2; + + + + /* Change to the bootloader mode */ + //qt602240_write_object(data, QT602240_GEN_COMMAND, + //QT602240_COMMAND_RESET, QT602240_BOOT_VALUE); + i2c_atmel_write_byte_data(client, + get_object_address(ts_temp, QT602240_GEN_COMMAND)+QT602240_COMMAND_RESET, + QT602240_BOOT_VALUE); + + msleep(QT602240_RESET_TIME*2); + + /* Change to slave address of bootloader */ + //if (client->addr == QT602240_APP_LOW) + client->addr = QT602240_BOOT_LOW; + //else + //client->addr = QT602240_BOOT_HIGH; + + ret = qt602240_check_bootloader(client, QT602240_WAITING_BOOTLOAD_CMD); + if (ret) + goto out; + + /* Unlock bootloader */ + qt602240_unlock_bootloader(client); + + while (pos < size) { + + for (loop_i = 0; loop_i < 10; loop_i++) { + ret = gpio_get_value(55); + printk("wly:gpio 55 value = %d\n",ret); + if (!ret/*gpio_get_value(intr)*/) + break; + msleep(10); + } + ret = qt602240_check_bootloader(client, + QT602240_WAITING_FRAME_DATA); + if (ret) + goto out; + + frame_size = ((*(data + pos) << 8) | *(data + pos + 1)); + printk("data[0]:0x%x,data[1]:0x%x\n",*(data + pos),*(data + pos + 1)); + /* We should add 2 at frame size as the the firmware data is not + * included the CRC bytes. + */ + frame_size += 2; + printk("frame data:\n"); + //for(i=0;isize:%d\n",frame_size,pos,size); + /* Write one frame to device */ + qt602240_fw_write(client, data + pos, frame_size); + + for (loop_i = 0; loop_i < 10; loop_i++) { + ret = gpio_get_value(55); + printk("wly:gpio 55 value = %d\n",ret); + if (!ret/*gpio_get_value(intr)*/) + break; + msleep(10); + } + + ret = qt602240_check_bootloader(client, + QT602240_FRAME_CRC_PASS); + if (ret) + goto out; + + + pos += frame_size; + + dev_dbg(dev, "Updated %d bytes / %zd bytes\n", pos, size); + } + + + +out: + release_firmware(fw); + + /* Change to slave address of application */ + if (client->addr == QT602240_BOOT_LOW) + client->addr = QT602240_APP_LOW; + else + client->addr = QT602240_APP_HIGH; + + return ret; +} +/* Each client has this additional data */ + +struct qt602240_finger { + int status; + int x; + int y; + int area; +}; + + +struct qt602240_object { + u8 type; + u16 start_address; + u8 size; + u8 instances; + u8 num_report_ids; + + /* to map object and message */ + u8 max_reportid; +}; + +static int qt602240_make_highchg(struct atmel_ts_data *data) +{ + struct device *dev = &data->client->dev; + int count = 10; + int error; + u8 val; + + /* Read dummy message to make high CHG pin */ + do { + //error = qt602240_read_object(data, QT602240_GEN_MESSAGE, 0, &val); + error=i2c_atmel_read(data->client, + get_object_address(data, QT602240_GEN_MESSAGE),&val,1); + if (error) + return error; + } while ((val != 0xff) && --count); + + if (!count) { + dev_err(dev, "CHG pin isn't cleared\n"); + return -EBUSY; + } + + return 0; +} + +static int qt602240_initialize(struct atmel_ts_data *data) +{ + int error; + //u8 val; + + atmel_ts_get_build_info(ts_temp); + atmel_ts_get_table_info(ts_temp); + + error = qt602240_make_highchg(data); + if (error) + return error; + + atmel_ts_load_config(ts_temp); + //qt602240_handle_pdata(data); + + /* Backup to memory */ + //qt602240_write_object(data, QT602240_GEN_COMMAND, + //QT602240_COMMAND_BACKUPNV, + //QT602240_BACKUP_VALUE); + i2c_atmel_write_byte_data(ts_temp->client, + get_object_address(ts_temp, QT602240_GEN_COMMAND) + QT602240_COMMAND_BACKUPNV, + QT602240_BACKUP_VALUE); + printk("qt602240_initialize QT602240_BACKUP_VALUE succeed\n"); + + msleep(QT602240_BACKUP_TIME); + + /* Soft reset */ + //qt602240_write_object(data, QT602240_GEN_COMMAND, + //QT602240_COMMAND_RESET, 1); + i2c_atmel_write_byte_data(ts_temp->client, + get_object_address(ts_temp, QT602240_GEN_COMMAND) + QT602240_COMMAND_RESET, 1); + + msleep(QT602240_RESET_TIME); + printk("qt602240_initialize reset succeed\n"); + + /* Update matrix size at info struct */ + //error = qt602240_read_reg(client, QT602240_MATRIX_X_SIZE, &val); + //if (error) + //return error; + //info->matrix_xsize = val; + + //error = qt602240_read_reg(client, QT602240_MATRIX_Y_SIZE, &val); + //if (error) + //return error; + //info->matrix_ysize = val; + + //dev_info(&client->dev, + //"Family ID: %d Variant ID: %d Version: %d Build: %d\n", + //info->family_id, info->variant_id, info->version, + //info->build); + + //dev_info(&client->dev, + //"Matrix X Size: %d Matrix Y Size: %d Object Num: %d\n", + //info->matrix_xsize, info->matrix_ysize, + //info->object_num); + + return 0; +} + +static uint8_t qt602240_update_fw(uint8_t vol) +{ + struct atmel_ts_data *data = ts_temp; + struct device *dev=&(ts_temp->client->dev); + //unsigned int version; + int error; + update_result_flag=3; + #if 0 //这个版本判断暂时不要 + if (sscanf(buf, "%u", &version) != 1) { + dev_err(dev, "Invalid values\n"); + return -EINVAL; + } + if (ts_temp->id->variant_id< QT602240_VER_21 || version < QT602240_VER_21) { + dev_err(dev, "FW update supported starting with version 21\n"); + return -EINVAL; + } + #endif + disable_irq(ts_temp->client->irq); + + if(ATMEL_CHIP_TYPE==ATMEL_224) + error = qt602240_load_fw(dev, QT602240_FW_NAME_224); + else if(ATMEL_CHIP_TYPE==ATMEL_140) + error = qt602240_load_fw(dev, QT602240_FW_NAME_140); + else + error = 1; + + if (error) { + printk("The firmware update failed(%d)\n", error); + //count = error; + } else { + printk("The firmware update succeeded\n"); + + /* Wait for reset */ + msleep(QT602240_FWRESET_TIME*2); + + //kfree(data->object_table); + //data->object_table = NULL; + + qt602240_initialize(data); + } + update_result_flag=0; + + enable_irq(ts_temp->client->irq); + + return 0; +} +#if 1 +static int qt602240_load_fw_probe(struct device *dev, const char *fn) +{ + //struct qt602240_data *data = dev_get_drvdata(dev); + struct i2c_client *client = ts_temp->client; + const struct firmware *fw = NULL; + unsigned int frame_size; + unsigned int pos = 0; + int ret; + int j,loop_i; + u8 *data,data0,data1; + size_t size; + ret = request_firmware(&fw, fn, dev); + if (ret) { + dev_err(dev, "Unable to open firmware %s\n", fn); + return ret; + } + //change_firmware_asc2bin(&fw); + data=kzalloc((fw->size/2)*sizeof(*data), GFP_KERNEL); + for(j=0;jsize/2;j++){ + + if(fw->data[2*j]>=0x41) + data0=fw->data[2*j]-0x41+10; + else + data0=fw->data[2*j]-0x30; + + if(fw->data[2*j+1]>=0x41) + data1=fw->data[2*j+1]-0x41+10; + else + data1=fw->data[2*j+1]-0x30; + + data[j]=(data0<<4)|(data1); + + //printk("0x%x,",data[j]); + //if(j==10) + //printk("\n"); + } + //fw->data=data; + size=fw->size/2; + + + + /* Change to the bootloader mode */ + //qt602240_write_object(data, QT602240_GEN_COMMAND, + //QT602240_COMMAND_RESET, QT602240_BOOT_VALUE); + //i2c_atmel_write_byte_data(client, + //get_object_address(ts_temp, QT602240_GEN_COMMAND)+QT602240_COMMAND_RESET, + //QT602240_BOOT_VALUE); + + msleep(QT602240_RESET_TIME); + + /* Change to slave address of bootloader */ + //if (client->addr == QT602240_APP_LOW) + client->addr = QT602240_BOOT_LOW; + //else + //client->addr = QT602240_BOOT_HIGH; + + ret = qt602240_check_bootloader(client, QT602240_WAITING_BOOTLOAD_CMD); + if (ret) + goto out; + + /* Unlock bootloader */ + qt602240_unlock_bootloader(client); + + while (pos < size) { + + for (loop_i = 0; loop_i < 10; loop_i++) { + ret = gpio_get_value(55); + printk("wly:gpio 55 value = %d\n",ret); + if (!ret/*gpio_get_value(intr)*/) + break; + msleep(10); + } + ret = qt602240_check_bootloader(client, + QT602240_WAITING_FRAME_DATA); + if (ret) + goto out; + + frame_size = ((*(data + pos) << 8) | *(data + pos + 1)); + printk("data[0]:0x%x,data[1]:0x%x\n",*(data + pos),*(data + pos + 1)); + /* We should add 2 at frame size as the the firmware data is not + * included the CRC bytes. + */ + frame_size += 2; + printk("frame data:\n"); + //for(i=0;isize:%d\n",frame_size,pos,size); + /* Write one frame to device */ + qt602240_fw_write(client, data + pos, frame_size); + + for (loop_i = 0; loop_i < 10; loop_i++) { + ret = gpio_get_value(55); + printk("wly:gpio 55 value = %d\n",ret); + if (!ret/*gpio_get_value(intr)*/) + break; + msleep(10); + } + + ret = qt602240_check_bootloader(client, + QT602240_FRAME_CRC_PASS); + if (ret) + goto out; + + + pos += frame_size; + + dev_dbg(dev, "Updated %d bytes / %zd bytes\n", pos, size); + } + + + +out: + release_firmware(fw); + + /* Change to slave address of application */ + if (client->addr == QT602240_BOOT_LOW) + client->addr = QT602240_APP_LOW; + else + client->addr = QT602240_APP_HIGH; + + return ret; +} + +static uint8_t qt602240_update_fw_probe(uint8_t vol) +{ + struct atmel_ts_data *data = ts_temp; + struct device *dev=&(ts_temp->client->dev); + //unsigned int version; + int error; + update_result_flag=3; + + #if 0 //这个版本判断暂时不要 + if (sscanf(buf, "%u", &version) != 1) { + dev_err(dev, "Invalid values\n"); + return -EINVAL; + } + if (ts_temp->id->variant_id< QT602240_VER_21 || version < QT602240_VER_21) { + dev_err(dev, "FW update supported starting with version 21\n"); + return -EINVAL; + } + #endif + disable_irq(ts_temp->client->irq); + if(ATMEL_CHIP_TYPE==ATMEL_224) + error = qt602240_load_fw_probe(dev, QT602240_FW_NAME_224); + else if(ATMEL_CHIP_TYPE==ATMEL_140) + error = qt602240_load_fw_probe(dev, QT602240_FW_NAME_140); + else + error = 1; + + if (error) { + dev_err(dev, "The firmware update failed(%d)\n", error); + //count = error; + } else { + dev_dbg(dev, "The firmware update succeeded\n"); + + /* Wait for reset */ + msleep(QT602240_FWRESET_TIME*2); + + //kfree(data->object_table); + //data->object_table = NULL; + + qt602240_initialize(data); + } + update_result_flag=0; + + enable_irq(ts_temp->client->irq); + + return 0; +} +#endif +#endif +static int +proc_read_val(char *page, char **start, off_t off, int count, int *eof, + void *data) +{ + int len = 0; + len += sprintf(page + len, "%s\n", "touchscreen module"); + len += sprintf(page + len, "name : %s\n", "atmel"); + len += sprintf(page + len, "i2c address : 0x%x\n", 0x4a); + if(ATMEL_CHIP_TYPE==ATMEL_140) + len += sprintf(page + len, "IC type : %s\n", "atmel 140"); + else if(ATMEL_CHIP_TYPE==ATMEL_224) + len += sprintf(page + len, "IC type : %s\n", "atmel 224"); + else + len += sprintf(page + len, "IC type : %s\n", "atmel unknow"); + + len += sprintf(page + len, "family id : 0x%x\n", ts_temp->id->family_id); + len += sprintf(page + len, "variant id : 0x%x\n", ts_temp->id->variant_id); + len += sprintf(page + len, "firmware version : 0x%x\n", ts_temp->id->version); + len += sprintf(page + len, "build id : 0x%x\n", ts_temp->id->build); + #if defined(CONFIG_MACH_BLADE2)||defined(CONFIG_MACH_BLUETICK) + len += sprintf(page + len, "module : %s\n", "atmel + Truly"); + #else + len += sprintf(page + len, "module : %s\n", "atmel + WINTEK"); + #endif +#if defined (CONFIG_ATMEL_FW_UPDATE) + len += sprintf(page + len, "update flag : 0x%x\n", update_result_flag); +#endif + + if (off + count >= len) + *eof = 1; + if (len < off) + return 0; + *start = page + off; + + return ((count < len - off) ? count : len - off); +} +static int proc_write_val(struct file *file, const char *buffer, + unsigned long count, void *data) +{ + unsigned long val; +#ifdef CONFIG_ATMEL_FW_UPDATE + printk("atmel fw update begin ******************************\n"); + update_result_flag=0; + qt602240_update_fw(1); + update_result_flag=2; + printk("atmel fw update end ******************************\n"); +#endif + + sscanf(buffer, "%lu", &val); + + return -EINVAL; +} + +static int atmel_ts_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct atmel_ts_data *ts; + struct atmel_i2c_platform_data *pdata; + int ret = 0, intr = 0; + uint8_t loop_i; + uint8_t data[16]; + uint8_t CRC_check = 0; + struct proc_dir_entry *dir, *refresh;//ZTE_WLY_CRDB00509514 + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + printk(KERN_ERR"%s: need I2C_FUNC_I2C\n", __func__); + ret = -ENODEV; + goto err_check_functionality_failed; + } + + ts = kzalloc(sizeof(struct atmel_ts_data), GFP_KERNEL); + if (ts == NULL) { + printk(KERN_ERR"%s: allocate atmel_ts_data failed\n", __func__); + ret = -ENOMEM; + goto err_alloc_data_failed; + } + + ts_temp=ts; + + ts->atmel_wq = create_singlethread_workqueue("atmel_wq"); + if (!ts->atmel_wq) { + printk(KERN_ERR"%s: create workqueue failed\n", __func__); + ret = -ENOMEM; + goto err_cread_wq_failed; + } + + INIT_WORK(&ts->work, atmel_ts_work_func); + ts->client = client; + ts->calibration_confirm = 0; + i2c_set_clientdata(client, ts); + pdata = client->dev.platform_data; + + if (pdata) { + ts->power = pdata->power; + intr = pdata->gpio_irq; + } + //huangjinyu ZTE_TS_HJY_20110223 BEGIN + else + { + printk(KERN_WARNING"atmel ts:there is no platform_data!\n"); + } + //huangjinyu ZTE_TS_HJY_20110223 END + if (ts->power) { + ret = ts->power(1); + msleep(200); + if (ret < 0) { + printk(KERN_ERR "%s:power on failed\n", __func__); + goto err_power_failed; + } + } + ret = gpio_request(intr, "gpio irq"); + if (ret) { + pr_err("%s: unable to request gpio %d (%d)\n", + __func__, intr,ret); + goto err_power_failed; + } + + for (loop_i = 0; loop_i < 10; loop_i++) { + ret = gpio_get_value(intr); + printk("wly:gpio %d value = %d\n",intr,ret); + if (!ret/*gpio_get_value(intr)*/) + break; + msleep(10); + } + + if (loop_i == 10) + printk(KERN_ERR "No Messages\n"); + + printk("wly: %s, ts->client->addr=%d\n", __FUNCTION__,ts->client->addr); +#if defined(CONFIG_ATMEL_FW_UPDATE) + //again: + /* read message*/ + ret = i2c_atmel_read(client, 0x0000, data, 7); + if (ret < 0) { + printk(KERN_INFO "No Atmel chip inside\n"); + goto i2c_addr_wrong; + } + + printk(KERN_INFO "Touch: 0x%2.2X 0x%2.2X 0x%2.2X 0x%2.2X 0x%2.2X 0x%2.2X 0x%2.2X\n", + data[0], data[1], data[2], data[3], data[4], data[5], data[6]); + goto i2c_addr_right; + i2c_addr_wrong: + client->addr=0x24; + ret = i2c_atmel_read(client, 0x0000, data, 1); + if (ret < 0) { + printk(KERN_INFO "No Atmel chip inside\n"); + goto err_detect_failed; + } + qt602240_update_fw_probe(1); + client->addr=0x4a; + i2c_addr_right: +#else + /* read message*/ + ret = i2c_atmel_read(client, 0x0000, data, 7); + if (ret < 0) { + printk(KERN_INFO "No Atmel chip inside\n"); + goto err_detect_failed; + } + printk(KERN_INFO "Touch: 0x%2.2X 0x%2.2X 0x%2.2X 0x%2.2X 0x%2.2X 0x%2.2X 0x%2.2X\n", + data[0], data[1], data[2], data[3], data[4], data[5], data[6]); +#endif + + ts->id = kzalloc(sizeof(struct info_id_t), GFP_KERNEL); + if (ts->id == NULL) { + printk(KERN_ERR"%s: allocate info_id_t failed\n", __func__); + goto err_alloc_failed; + } + + atmel_ts_get_build_info(ts); + + /* Read object table. */ + ts->object_table = kzalloc(sizeof(struct object_t)*ts->id->num_declared_objects, GFP_KERNEL); + if (ts->object_table == NULL) { + printk(KERN_ERR"%s: allocate object_table failed\n", __func__); + goto err_alloc_failed; + } + atmel_ts_get_table_info(ts); + //后续有新的芯片加入的时候,需要区分不同的芯片 + if((ts->id->family_id==0x80)&&(ts->id->variant_id==0x13)){ + ATMEL_CHIP_TYPE=ATMEL_224; + + #ifdef CONFIG_ATMEL_FW_UPDATE + if((ts->id->version!=0x11)||(ts->id->build!=0x09)){ + printk("atmel touch screen fw auto update!\n"); + qt602240_update_fw(1); + //不需要再回到前面去,要做的工作在固件升级结束后自动完成各个结构体的再填充 + //将CRC填写正确后后面的config也不会重复写入 + //goto again; + } + #endif + }else if((ts->id->family_id==0x80)&&((ts->id->variant_id==0x16)||(ts->id->variant_id==0x07))){ + ATMEL_CHIP_TYPE=ATMEL_140; +#ifdef CONFIG_ATMEL_FW_UPDATE + if((ts->id->version!=0x10)||(ts->id->build!=0x01)){ + printk("atmel touch screen fw auto update!\n"); + qt602240_update_fw(1); + } +#endif + } + + else + ATMEL_CHIP_TYPE=ATMEL_UNKNOW; + + if (pdata) { + ts->finger_support = pdata->config_T9[14]; + printk(KERN_INFO"finger_type: %d, max finger: %d\n", ts->finger_type, ts->finger_support); + + /*infoamtion block CRC check */ + if (pdata->object_crc[0]) { + ret = i2c_atmel_write_byte_data(client, + get_object_address(ts, GEN_COMMANDPROCESSOR_T6) + 1, 0x55); + msleep(64); + for (loop_i = 0; loop_i < 10; loop_i++) { + ret = i2c_atmel_read(ts->client, get_object_address(ts, + GEN_MESSAGEPROCESSOR_T5), data, 9); + printk(KERN_INFO "crc checksum: %2d, %2d, %2d\n",data[2],data[3],data[4]); + if (data[0] == get_report_ids_size(ts, GEN_COMMANDPROCESSOR_T6)) + break; + msleep(5); + } + for (loop_i = 0; loop_i < 3; loop_i++) { + if (pdata->object_crc[loop_i] != data[loop_i + 2]) { + printk(KERN_ERR"CRC Error: %x, %x\n", pdata->object_crc[loop_i], data[loop_i + 2]); + break; + } + } + if (loop_i == 3) { + printk(KERN_INFO "CRC passed: "); + for (loop_i = 0; loop_i < 3; loop_i++) + printk("0x%2.2X ", pdata->object_crc[loop_i]); + printk("\n"); + CRC_check = 1; + } + } + ts->abs_x_min = pdata->abs_x_min; + ts->abs_x_max = pdata->abs_x_max; + ts->abs_y_min = pdata->abs_y_min; + ts->abs_y_max = pdata->abs_y_max; + ts->abs_pressure_min = pdata->abs_pressure_min; + ts->abs_pressure_max = pdata->abs_pressure_max; + ts->abs_width_min = pdata->abs_width_min; + ts->abs_width_max = pdata->abs_width_max; + ts->GCAF_level = pdata->GCAF_level; + printk(KERN_INFO "GCAF_level: %d, %d, %d, %d\n", + ts->GCAF_level[0], ts->GCAF_level[1],ts->GCAF_level[2], ts->GCAF_level[3]); + ts->filter_level = pdata->filter_level; + printk(KERN_INFO "filter_level: %d, %d, %d, %d\n", + ts->filter_level[0], ts->filter_level[1], ts->filter_level[2], ts->filter_level[3]); +#ifdef ENABLE_IME_IMPROVEMENT + ts->display_width = pdata->display_width; + ts->display_height = pdata->display_height; + if (!ts->display_width || !ts->display_height) + ts->display_width = ts->display_height = 1; +#endif + ts->config_setting[0].config_T7 + = ts->config_setting[1].config_T7 + = pdata->config_T7; + ts->config_setting[0].config_T8 + = ts->config_setting[1].config_T8 + = pdata->config_T8; + ts->config_setting[0].config_T9 = pdata->config_T9; + ts->config_setting[0].config_T20 = pdata->config_T20; + ts->config_setting[0].config_T22 = pdata->config_T22; + ts->config_setting[0].config_T28 = pdata->config_T28; +#if defined(CONFIG_TS_NOTIFIER) + ts->config_setting[0].config_T9_charge = pdata->config_T9_charge; + ts->config_setting[0].config_T28_charge = pdata->config_T28_charge; +#endif + if (pdata->cable_config[0]) { + ts->config_setting[0].config[0] = pdata->config_T9[7]; + ts->config_setting[0].config[1] = pdata->config_T22[8]; + ts->config_setting[0].config[2] = pdata->config_T28[3]; + ts->config_setting[0].config[3] = pdata->config_T28[4]; + for (loop_i = 0; loop_i < 4; loop_i++) + ts->config_setting[1].config[loop_i] = pdata->cable_config[loop_i]; + ts->GCAF_sample = ts->config_setting[1].config[3]; + ts->noisethr = pdata->cable_config[1]; + } else { + if (pdata->cable_config_T7[0]) + ts->config_setting[1].config_T7 = pdata->cable_config_T7; + if (pdata->cable_config_T8[0]) + ts->config_setting[1].config_T8 = pdata->cable_config_T8; + if (pdata->cable_config_T9[0]) { + ts->config_setting[1].config_T9 = pdata->cable_config_T9; + ts->config_setting[1].config_T22 = pdata->cable_config_T22; + ts->config_setting[1].config_T28 = pdata->cable_config_T28; + ts->GCAF_sample = ts->config_setting[0].config_T28[4]; + } + } + if (!CRC_check) + { + atmel_ts_load_config(ts); + } + } + ts->input_dev = input_allocate_device(); + if (ts->input_dev == NULL) { + ret = -ENOMEM; + dev_err(&client->dev, "Failed to allocate input device\n"); + goto err_input_dev_alloc_failed; + } + ts->input_dev->name = "atmel-touchscreen"; + set_bit(EV_SYN, ts->input_dev->evbit); + set_bit(EV_KEY, ts->input_dev->evbit); + set_bit(BTN_TOUCH, ts->input_dev->keybit); + set_bit(BTN_2, ts->input_dev->keybit); + set_bit(EV_ABS, ts->input_dev->evbit); + + + set_bit(KEY_HOME, ts->input_dev->keybit); + set_bit(KEY_MENU, ts->input_dev->keybit); + set_bit(KEY_BACK, ts->input_dev->keybit); + set_bit(KEY_SEARCH, ts->input_dev->keybit); + + input_set_abs_params(ts->input_dev, ABS_MT_TRACKING_ID, + 0, 10, 0, 0); + input_set_abs_params(ts->input_dev, ABS_MT_POSITION_X, + ts->abs_x_min, ts->abs_x_max, 0, 0); + input_set_abs_params(ts->input_dev, ABS_MT_POSITION_Y, + ts->abs_y_min, ts->abs_y_max, 0, 0); + input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR, + ts->abs_pressure_min, ts->abs_pressure_max, + 0, 0); + input_set_abs_params(ts->input_dev, ABS_MT_WIDTH_MAJOR, + ts->abs_width_min, ts->abs_width_max, 0, 0); + ret = input_register_device(ts->input_dev); + if (ret) { + dev_err(&client->dev, + "atmel_ts_probe: Unable to register %s input device\n", + ts->input_dev->name); + goto err_input_register_device_failed; + } + + ret = request_irq(client->irq, atmel_ts_irq_handler, IRQF_TRIGGER_LOW,//IRQF_TRIGGER_FALLING, + client->name, ts); + if (ret) + dev_err(&client->dev, "request_irq failed\n"); + + //enable_irq(client->irq); + + //ADD BY HUANGJINYU + printk("atmel probe set the calibration\n"); + + i2c_atmel_write_byte_data(client, + get_object_address(ts, GEN_COMMANDPROCESSOR_T6) + 2, 0x55); + atch_cal_control(ts,1); + //ADD BY HUANGJINYU END + +#ifdef ENABLE_IME_IMPROVEMENT + ts->ime_threshold_pixel = 1; + ts->ime_finger_report[0] = -1; + ts->ime_finger_report[1] = -1; + ret = device_create_file(&ts->input_dev->dev, &dev_attr_ime_threshold); + if (ret) { + printk(KERN_ERR "ENABLE_IME_IMPROVEMENT: " + "Error to create ime_threshold\n"); + goto err_input_register_device_failed; + } + ret = device_create_file(&ts->input_dev->dev, &dev_attr_ime_work_area); + if (ret) { + printk(KERN_ERR "ENABLE_IME_IMPROVEMENT: " + "Error to create ime_work_area\n"); + device_remove_file(&ts->input_dev->dev, + &dev_attr_ime_threshold); + goto err_input_register_device_failed; + } +#endif + +#ifdef CONFIG_HAS_EARLYSUSPEND + ts->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1; + ts->early_suspend.suspend = atmel_ts_early_suspend; + ts->early_suspend.resume = atmel_ts_late_resume; + register_early_suspend(&ts->early_suspend); +#endif + + private_ts = ts; + +/*ZTE_TOUCH_WLY_008,@2010-01-19,begin*/ +//ZTE_WLY_CRDB00509514,BEGIN + dir = proc_mkdir("touchscreen", NULL); + refresh = create_proc_entry("ts_information", 0777, dir); +//ZTE_WLY_CRDB00509514,END + if (refresh) { + refresh->data = NULL; + refresh->read_proc = proc_read_val; + refresh->write_proc = proc_write_val; + } +/*ZTE_TOUCH_WLY_008,@2010-01-19,end*/ + +#ifdef ATMEL_EN_SYSFS + atmel_touch_sysfs_init(); +#endif + + dev_info(&client->dev, "Start touchscreen %s in interrupt mode\n", + ts->input_dev->name); +#ifdef CONFIG_TS_NOTIFIER + register_atmel_ts_notifier(&atmel_ts_notifier); +#endif + + return 0; + +err_input_register_device_failed: + input_free_device(ts->input_dev); + +err_input_dev_alloc_failed: +err_alloc_failed: +err_detect_failed: +err_power_failed: + destroy_workqueue(ts->atmel_wq); + gpio_free(intr); + +err_cread_wq_failed: + kfree(ts); + +err_alloc_data_failed: +err_check_functionality_failed: + + return ret; +} + +static int atmel_ts_remove(struct i2c_client *client) +{ + struct atmel_ts_data *ts = i2c_get_clientdata(client); + +#ifdef ATMEL_EN_SYSFS + atmel_touch_sysfs_deinit(); +#endif +#ifdef ENABLE_IME_IMPROVEMENT + device_remove_file(&ts->input_dev->dev, &dev_attr_ime_threshold); + device_remove_file(&ts->input_dev->dev, &dev_attr_ime_work_area); +#endif + + unregister_early_suspend(&ts->early_suspend); + free_irq(client->irq, ts); + + destroy_workqueue(ts->atmel_wq); + input_unregister_device(ts->input_dev); + kfree(ts); + + return 0; +} + +static int atmel_ts_suspend(struct i2c_client *client, pm_message_t mesg) +{ + int ret; + struct atmel_ts_data *ts = i2c_get_clientdata(client); + + printk(KERN_INFO "%s: enter\n", __func__); + + disable_irq(ts->client->irq); + + ret = cancel_work_sync(&ts->work); + if (ret) + enable_irq(ts->client->irq); + count=0; + + ts->finger_pressed = 0; + ts->finger_count = 0; + + i2c_atmel_write_byte_data(client, + get_object_address(ts, GEN_POWERCONFIG_T7), 0x0); + i2c_atmel_write_byte_data(client, + get_object_address(ts, GEN_POWERCONFIG_T7) + 1, 0x0); + //ts->power(0); + //release_all_fingers(ts); + return 0; +} + +static int atmel_ts_resume(struct i2c_client *client) +{ + struct atmel_ts_data *ts = i2c_get_clientdata(client); + //ts->power(1); + //msleep(200); + + i2c_atmel_write(ts->client, get_object_address(ts, GEN_POWERCONFIG_T7), + ts->config_setting[0].config_T7, get_object_size(ts, GEN_POWERCONFIG_T7)); + printk("***********: go to check calibration\n"); + ts->calibration_confirm = 0; + release_all_fingers(ts); + + i2c_atmel_write_byte_data(client, + get_object_address(ts, GEN_COMMANDPROCESSOR_T6) + 2, 0x55); + #ifdef TOUCH_LONG_SLIDE + temp_flag=0; + temp_flag2=0; + #endif + atch_cal_control(ts,1); + + #ifdef ATMEL_NEW_CAL + new_cal_control(ts,1); + auto_cal_set(ts,10); + #endif + enable_irq(client->irq); + return 0; +} + +#ifdef CONFIG_HAS_EARLYSUSPEND +static void atmel_ts_early_suspend(struct early_suspend *h) +{ + struct atmel_ts_data *ts; + ts = container_of(h, struct atmel_ts_data, early_suspend); + atmel_ts_suspend(ts->client, PMSG_SUSPEND); +} + +static void atmel_ts_late_resume(struct early_suspend *h) +{ + struct atmel_ts_data *ts; + ts = container_of(h, struct atmel_ts_data, early_suspend); + atmel_ts_resume(ts->client); +} +#endif + +static const struct i2c_device_id atml_ts_i2c_id[] = { + { ATMEL_QT602240_NAME, 0 }, + { } +}; + +static struct i2c_driver atmel_ts_driver = { + .id_table = atml_ts_i2c_id, + .probe = atmel_ts_probe, + .remove = atmel_ts_remove, +#ifndef CONFIG_HAS_EARLYSUSPEND + .suspend = atmel_ts_suspend, + .resume = atmel_ts_resume, +#endif + .driver = { + .name = ATMEL_QT602240_NAME, + }, +}; + +static int __devinit atmel_ts_init(void) +{ + printk(KERN_INFO "atmel_ts_init():\n"); + return i2c_add_driver(&atmel_ts_driver); +} + +static void __exit atmel_ts_exit(void) +{ + i2c_del_driver(&atmel_ts_driver); +} + +module_init(atmel_ts_init); +module_exit(atmel_ts_exit); + +MODULE_DESCRIPTION("ATMEL Touch driver"); +MODULE_LICENSE("GPL"); + diff --git a/drivers/input/touchscreen/synaptics_3k.c b/drivers/input/touchscreen/synaptics_3k.c index 8b935ae0..f85a3acc 100644 --- a/drivers/input/touchscreen/synaptics_3k.c +++ b/drivers/input/touchscreen/synaptics_3k.c @@ -35,18 +35,37 @@ #include #include #include +#include + static struct workqueue_struct *synaptics_wq; +static struct synaptics_rmi4_data *pgtsdata; + + +#define NR_FINGERS 10 +DECLARE_BITMAP(pre_fingers, NR_FINGERS); +typedef struct _report_data { + int z; + int w; + int x; + int y; +} report_data; +report_data old_report_data[NR_FINGERS]; +report_data new_report_data[NR_FINGERS]; + + +#if defined(CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI_UPDATE) +int update_result_flag_syna=0; +extern void syna_fwupdate(void); +extern void syna_fwupdate_init(struct i2c_client *client); +extern int syna_fwupdate_deinit(struct i2c_client *client); +#endif #ifdef CONFIG_HAS_EARLYSUSPEND static void synaptics_rmi4_early_suspend(struct early_suspend *h); static void synaptics_rmi4_late_resume(struct early_suspend *h); #endif -#if defined(CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI_UPDATE) -extern void ioctol(struct i2c_client *client); -static struct i2c_client *update_client; -#endif #if defined(CONFIG_TOUCHSCREEN_VIRTUAL_KEYS) #define virtualkeys virtualkeys.synaptics-rmi4-ts @@ -54,6 +73,10 @@ static struct i2c_client *update_client; static const char ts_keys_size[] = "0x01:102:100:1061:200:74:0x01:139:300:1061:200:74:0x01:158:500:1061:200:74"; #elif defined(CONFIG_MACH_SKATE) static const char ts_keys_size[] = "0x01:102:43:850:60:50:0x01:139:235:850:60:50:0x01:158:436:850:60:50"; +#elif defined(CONFIG_MACH_BLADE2) +static const char ts_keys_size[] = "0x01:139:45:842:90:74:0x01:102:180:842:90:74:0x01:158:307:842:90:74:0x01:217:435:842:90:74"; +#elif defined(CONFIG_MACH_BLUETICK) +static const char ts_keys_size[] = "0x01:139:60:880:100:100:0x01:102:170:880:100:100:0x01:158:310:880:100:100:0x01:217:410:880:100:100"; #else static const char ts_keys_size[] = "0x01:102:51:503:102:1007:0x01:139:158:503:102:1007:0x01:158:266:503:102:1007"; #endif @@ -96,136 +119,132 @@ static void ts_key_report_deinit(void) } #endif - +#define TOUCHSCREEN_DUPLICATED_FILTER #ifdef TOUCHSCREEN_DUPLICATED_FILTER -static int duplicated_filter(struct synaptics_ts_data *ts, int x,int y,int x2,int y2, - const int finger2, const int z) -{ - int drift_x[2]; - int drift_y[2]; - static int ref_x[2], ref_y[2]; - uint8_t discard[2] = {0, 0}; - - drift_x[0] = abs(ref_x[0] - x); - drift_y[0] = abs(ref_y[0] - y); - if (finger2) { - drift_x[1] = abs(ref_x[1] - x2); - drift_y[1] = abs(ref_y[1] - y2); - } - /* pr_info("ref_x :%d, ref_y: %d, x: %d, y: %d\n", ref_x, ref_y, pos[0][0], pos[0][1]); */ - if (drift_x[0] < ts->dup_threshold && drift_y[0] < ts->dup_threshold && z != 0) { - /* pr_info("ref_x :%d, ref_y: %d, x: %d, y: %d\n", ref_x[0], ref_y[0], pos[0][0], pos[0][1]); */ - discard[0] = 1; - } - if (!finger2 || (drift_x[1] < ts->dup_threshold && drift_y[1] < ts->dup_threshold)) { - discard[1] = 1; - } - if (discard[0] && discard[1]) { - /* if finger 0 and finger 1's movement < threshold , discard it. */ - return 1; - } - ref_x[0] = x; - ref_y[0] = y; - if (finger2) { - ref_x[1] = x2; - ref_y[1] = y2; - } - if (z == 0) { - ref_x[0] = ref_y[0] = 0; - ref_x[1] = ref_y[1] = 0; - } - - return 0; -} -#endif /* TOUCHSCREEN_DUPLICATED_FILTER */ -/* -static void dump_regs(struct synaptics_rmi4_data *ts) +#define LCD_UNIT_PATH "dev/graphics/fb0" + +static int get_screeninfo(uint *xres, uint *yres) { - int ret=0; - int i; - int buf_len=32; - uint8_t buf[buf_len]; + struct fb_info *info; - ret = i2c_smbus_read_i2c_block_data(ts->client, - ts->data_base, buf_len,buf); - if (ret < 0){ - pr_err("ts dump_regs: failed to get ts intr state\n"); - }else{ - for (i=0;idata_base+i,buf[i]); + info = registered_fb[0]; + if (!info) { + pr_err("%s: Can not access lcd info \n",__func__); + return -ENODEV; } + + *xres = info->var.xres; + *yres = info->var.yres; + printk("xres=%d, yres=%d \n",*xres,*yres); + + return 1; +} + +static inline int duplicated_filter(struct synaptics_rmi4_data *ts, + int i, int z, int w, int x, int y) +{ + int drift_x, drift_y; + + /* up pointer, report anyway and clean the entry */ + if (z == 0) { + memset((void *)&old_report_data[i], 0, sizeof(old_report_data[0])); + return 0; + } + + /* drift small enough, don't report */ + drift_x = abs(old_report_data[i].x - x); + drift_y = abs(old_report_data[i].y - y); + if (drift_x < ts->dup_threshold && drift_y < ts->dup_threshold) + return 1; + + /* normal case, report it and cache the new data */ + old_report_data[i].z = z; + old_report_data[i].w = w; + old_report_data[i].x = x; + old_report_data[i].y = y; + + return 0; } -*/ -#if defined (CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI_UPDATE) -int update_result_flag=0; -struct synaptics_rmi4_data *ts_temp; -#endif + +#endif /* TOUCHSCREEN_DUPLICATED_FILTER */ static int proc_read_val(char *page, char **start, off_t off, int count, int *eof, void *data) { - int len = 0; - len += sprintf(page + len, "%s\n", "touchscreen module"); - len += sprintf(page + len, "name : %s\n", "synaptics"); - #if defined(CONFIG_MACH_R750) - len += sprintf(page + len, "i2c address : %x\n", 0x23); - #else - len += sprintf(page + len, "i2c address : 0x%x\n", 0x22); - #endif - #if defined(CONFIG_TOUCHSCREEN_SYNAPTICS_3K) - len += sprintf(page + len, "IC type : %s\n", "3000 series"); - #else - len += sprintf(page + len, "IC type : %s\n", "2000 series"); - #endif - #if defined(CONFIG_MACH_R750) - len += sprintf(page + len, "firmware version : %s\n", "TM1551"); - #elif defined(CONFIG_MACH_JOE) - len += sprintf(page + len, "firmware version : %s\n", "TM1419-001"); - #elif defined(CONFIG_MACH_BLADE) - len += sprintf(page + len, "firmware version : %s\n", "TM1541"); - #elif defined(CONFIG_MACH_SKATE) - len += sprintf(page + len, "firmware version : %s\n", "TM1792"); - #endif - len += sprintf(page + len, "module : %s\n", "synaptics + TPK"); - #ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI_UPDATE - len += sprintf(page + len, "update flag : 0x%x\n", update_result_flag); - #endif - if (off + count >= len) - *eof = 1; - if (len < off) - return 0; - *start = page + off; - return ((count < len - off) ? count : len - off); - } - //ZTE_WLY_CRDB00509514,END + int ret=0; + int len = 0; + int buf_len=32; //f01.query len = 21. + char buf[buf_len]; + struct synaptics_rmi4_data *ts = pgtsdata; + + if ( ts == NULL ){ + pr_err("%s: invalid device!\n",__func__); + return -1; + } + + ret = i2c_smbus_read_i2c_block_data( + ts->client, ts->f01.query_base, buf_len, buf); + if (ret < 0){ + pr_err("%s: failed to get ts if01 query base\n",__func__); + return ret; + }else{ + //len += sprintf(page + len, "I2c address : %x\n", ts->client->addr ); + //len += sprintf(page + len, "Manufacturer ID : %x\n", buf[0]); + //len += sprintf(page + len, "Serial Number : 0x%x%x\n", buf[9],buf[10]); + len += sprintf(page + len, "Manufacturer : %s\n", "Synaptics"); + len += sprintf(page + len, "Product ID : %c%c%c%c%c%c%c%c%c%c\n", + buf[11], buf[12], buf[13], buf[14], buf[15], buf[16], + buf[17], buf[18], buf[19], buf[20]); + len += sprintf(page + len, "Firmware Revision : %x\n", buf[3]); +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI_UPDATE + len += sprintf(page + len, "Update flag : 0x%x\n", update_result_flag_syna); +#endif + + if (off + count >= len) + *eof = 1; + + if (len < off) + return 0; + + *start = page + off; + return ((count < len - off) ? count : len - off); + } + +} static int proc_write_val(struct file *file, const char *buffer, unsigned long count, void *data) { unsigned long val; - #if defined(CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI_UPDATE) +#if defined(CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI_UPDATE) int ret=0; - update_result_flag=0; - disable_irq(update_client->irq); - ioctol(update_client); + update_result_flag_syna=0; + + disable_irq(pgtsdata->client->irq); + //ioctol(pgtsdata->client); + syna_fwupdate(); msleep(500); - enable_irq(update_client->irq); + enable_irq(pgtsdata->client->irq); - ret = i2c_smbus_write_byte_data(update_client, ts_temp->f11.ctrl_base+2, 0x9); + //升级完成后需要对一些参数再做配置 + //尤其是坐标系最大值的配置,否则会导致升级后触摸屏不可用 + //后续需要添加其他机型的配置 + ret = i2c_smbus_write_byte_data(pgtsdata->client, pgtsdata->f11.ctrl_base+2, 0x9); if (ret<0) pr_err("i2c_smbus_write_byte_data failed\n"); - ret = i2c_smbus_write_byte_data(update_client, ts_temp->f11.ctrl_base+3, 0x9); + ret = i2c_smbus_write_byte_data(pgtsdata->client, pgtsdata->f11.ctrl_base+3, 0x9); if (ret<0) pr_err("i2c_smbus_write_byte_data failed\n"); - update_result_flag=2; - #endif + update_result_flag_syna=2; +#endif + sscanf(buffer, "%lu", &val); - printk("ts_key_report_synaptics_show\n"); + printk("%s: ts_key_report_synaptics_show\n", __func__); return -EINVAL; } + static int synaptics_rmi4_get_pdt(struct synaptics_rmi4_data *ts) { int ret=0; @@ -240,12 +259,23 @@ static int synaptics_rmi4_get_pdt(struct synaptics_rmi4_data *ts) ts->data_base= 0xff; ts->data_len = 0; + //pr_info("synaptics_ts: synaptics_rmi4_read_pdt\n"); do { - + //now we do nothing to pages other than PAGE 0. + /* + if (page_select!=0){ + ret = i2c_smbus_write_byte_data(ts->client, PDT_PAGE_SELECT, page_select); + if (ret<0) + pr_err("i2c_smbus_write_byte_data failed\n"); + } + */ + //pr_info("--------------------------------------\n"); pdt_addr_base=PDT_ADDR_BASE; ret = i2c_smbus_read_i2c_block_data(ts->client, pdt_addr_base-PDT_BYTE_COUNT*nFd+1, sizeof(struct rmi4_function_descriptor),(uint8_t *)&fd); + //pr_info("synaptics_ts: page=%d,pdt_addr_base=0x%x,nfd=%d,addr=0x%x\n", + // page_select,pdt_addr_base,nFd,PDT_ADDR_BASE-PDT_BYTE_COUNT*nFd+1); pr_info("function_number=0x%x, query_base=0x%x, cmd_base=0x%x, "\ "ctrl_base=0x%x, data_base=0x%x, intr_src_count=0x%x\n", fd.function_number,fd.query_base,fd.cmd_base, @@ -270,6 +300,7 @@ static int synaptics_rmi4_get_pdt(struct synaptics_rmi4_data *ts) switch(fd.function_number){ case 0x01: ts->f01.flag = fd.function_number; + ts->f01.query_base = fd.query_base; ts->f01.ctrl_base = fd.ctrl_base; ts->f01.data_offset = fd.data_base; //intr status ts->f01.intr_offset = intr_count/8; @@ -280,31 +311,55 @@ static int synaptics_rmi4_get_pdt(struct synaptics_rmi4_data *ts) break; case 0x11: ts->f11.flag = fd.function_number; + ts->f11.query_base = fd.query_base; ts->f11.ctrl_base = fd.ctrl_base; ts->f11.data_offset = fd.data_base; ts->f11.intr_offset = intr_count/8; ts->f11.intr_mask = ((1<<(fd.intr_src_count &0x7))-1)<<(intr_count%8); + //pr_info("synaptics_ts:intr_offset=0x%x, intr_mask=0x%x\n", + // ts->f11.intr_offset,ts->f11.intr_mask); + //i2c_smbus_write_word_data(ts->client, fd.ctrl_base+6,480); + //i2c_smbus_write_word_data(ts->client, fd.ctrl_base+8,800); ts->max[0]=i2c_smbus_read_word_data(ts->client, fd.ctrl_base+6)-12; ts->max[1]=i2c_smbus_read_word_data(ts->client, fd.ctrl_base+8)-12; - pr_info("synaptics_ts:max_x=%d, max_y=%d\n",ts->max[0],ts->max[1]); + pr_info("%s: max_x=%d, max_y=%d\n",__func__,ts->max[0],ts->max[1]); + + //ts->f11_fingers = kcalloc(ts->f11.points_supported, + // sizeof(*ts->f11_fingers), 0); ret=i2c_smbus_read_word_data(ts->client, fd.query_base); ret = i2c_smbus_read_i2c_block_data(ts->client, fd.query_base,sizeof(query),query); if (ret < 0){ - pr_err("i2c_smbus_read_byte_data failed\n"); + pr_err("%s: i2c_smbus_read_byte_data failed\n",__func__); return ret; } + /*{ + int i; + for (i=0;i<=11;i++) + pr_info("query[%d]=0x%x\n",i,query[i]); + }*/ ts->f11.points_supported=(query[1]&0x7)+1; if (ts->f11.points_supported >5) ts->points_supported=10; else ts->points_supported=ts->f11.points_supported; + //if ( ts->points_needed > ts->points_supported ) + //ts->points_needed = ts->points_supported; + //ts->points_needed=SYNAPTICS_RMI4_MAXP_NEEDED; pr_info("synaptics_ts:%d, points_supported=%d\n", ts->f11.points_supported,ts->points_supported); + /* + // We now consider only ONE sensor situation. + if (query[0]&0x7 !=1){ + pr_err("i2c_smbus_read_byte_data failed\n"); + return -1;//synaptics_ts: need a better error code + } + pr_info("synaptics_ts: sensor=%d\n",query[0]&0x7); + */ ts->f11.data_len = data_len = // DATA0 : finger status, four fingers per register (ts->f11.points_supported/4+1) @@ -350,22 +405,42 @@ static int synaptics_rmi4_get_pdt(struct synaptics_rmi4_data *ts) intr_count+=fd.intr_src_count; + //pr_info("1 data_base =0x%x, len=%d\n", ts->data_base,ts->data_len); if ( fd.data_base && (ts->data_base > fd.data_base) ) ts->data_base = fd.data_base; ts->data_len += data_len; + //pr_info("data_len=%d\n",data_len); + //pr_info("3 data_base =0x%x, len=%d\n", ts->data_base,ts->data_len); nFd++; }while( page_select<1); ts->f01.data_len = 1+ (intr_count+7)/8; + //pr_info("synaptics_ts: f01 data len =%d\n",ts->f01.data_len); + //check data base & data len ts->data_len += ts->f01.data_len; - pr_info("synaptics_ts: data_base=0x%x, data_len=%d\n",ts->data_base,ts->data_len); + pr_info("%s: data_base=0x%x, data_len=%d\n",__func__,ts->data_base,ts->data_len); ts->f01.data_offset -= ts->data_base; ts->f11.data_offset -= ts->data_base; + //pr_info("synaptics_ts: f01 offset =%d, f11 offset=%d\n",ts->f01.data_offset, ts->f11.data_offset); + + + // display touchpanel info + { + int buf_len=32; //f01.query len = 21. + char buf[buf_len]; + ret = i2c_smbus_read_i2c_block_data( + ts->client, ts->f01.query_base, buf_len, buf); + pr_info("%s: Manufacturer : %s\n", "Synaptics",__func__); + pr_info("%s: Product ID : %c%c%c%c%c%c%c%c%c%c\n",__func__, + buf[11], buf[12], buf[13], buf[14], buf[15], buf[16], + buf[17], buf[18], buf[19], buf[20]); + pr_info("%s: Firmware Revision : 0x%x\n",__func__, buf[3]); + } return ret; } @@ -395,33 +470,40 @@ static int synaptics_rmi4_set_panel_state( * the interrupt is asserted whenever the change in finger * position exceeds either DeltaXPosThreshold or DeltaYPosThreshold. */ - ret = i2c_smbus_write_byte_data(ts->client, ts->f11.ctrl_base+2, 0x9); - if (ret<0) pr_err("i2c_smbus_write_byte_data failed\n"); - ret = i2c_smbus_write_byte_data(ts->client, ts->f11.ctrl_base+3, 0x9); - if (ret<0) pr_err("i2c_smbus_write_byte_data failed\n"); + ret = i2c_smbus_write_byte_data(ts->client, ts->f11.ctrl_base+2, 0x2); + if (ret<0) pr_err("%s: i2c_smbus_write_byte_data failed\n",__func__); + ret = i2c_smbus_write_byte_data(ts->client, ts->f11.ctrl_base+3, 0x2); + if (ret<0) pr_err("%s: i2c_smbus_write_byte_data failed\n",__func__); mode = i2c_smbus_read_byte_data(ts->client, ts->f11.ctrl_base); mode &=~0x7; mode |=0x01; ret = i2c_smbus_write_byte_data(ts->client, ts->f11.ctrl_base, mode); - if (ret<0) pr_err("i2c_smbus_write_byte_data failed\n"); + if (ret<0) pr_err("%s: i2c_smbus_write_byte_data failed\n",__func__); case TS_RESUME: // set nomal mode mode = i2c_smbus_read_byte_data(ts->client, ts->f01.ctrl_base); mode &=~0x3; ret = i2c_smbus_write_byte_data(ts->client, ts->f01.ctrl_base, mode); - if (ret<0) pr_err("i2c_smbus_write_byte_data failed\n"); + if (ret<0) pr_err("%s: i2c_smbus_write_byte_data failed\n",__func__); + //i2c_smbus_write_word_data(ts->client, ts->f11.ctrl_base+6,480); + //i2c_smbus_write_word_data(ts->client, ts->f11.ctrl_base+8,800); + //i2c_smbus_write_byte_data(ts->client, ts->f11.ctrl_base+2,0x10); + //i2c_smbus_write_byte_data(ts->client, ts->f11.ctrl_base+3,0x10); + //enable irq ret = i2c_smbus_write_byte_data(ts->client,ts->f01.ctrl_base+1, 0x7); break; case TS_SUSPEND: + // disable irq ret = i2c_smbus_write_byte_data(ts->client, ts->f01.ctrl_base+1, 0); - if (ret <0) pr_err("i2c_smbus_write_byte_data failed\n"); + if (ret <0) pr_err("%s: i2c_smbus_write_byte_data failed\n",__func__); + // deep sleep mode = i2c_smbus_read_byte_data(ts->client, ts->f01.ctrl_base); mode &=~0x3; mode |=0x01; ret = i2c_smbus_write_byte_data(ts->client, ts->f01.ctrl_base, mode); - if (ret<0) pr_err("i2c_smbus_write_byte_data failed\n"); + if (ret<0) pr_err("%s: i2c_smbus_write_byte_data failed\n",__func__); break; default: break; @@ -437,60 +519,78 @@ static void synaptics_rmi4_work_func(struct work_struct *work) int buf_len = ts->data_len; __u8 buf[buf_len]; struct f11_2d_point_data *point_data=NULL; - int i,x,y,w,z,finger; - static uint finger_pre[10]; + int i,x,y,w,z,finger,will_report; + DECLARE_BITMAP(pointers_to_report, NR_FINGERS); ret = i2c_smbus_read_i2c_block_data(ts->client,ts->data_base, buf_len, buf); - +/* for (i=0;idata_base+i,i,buf[i]); +*/ + // now only consider interrupt=buf[1]; - + //pr_info("synaptics_ts, intr=0x%x\n",interrupt); if ( ts->f11.flag && (interrupt & ts->f11.intr_mask) ) { - - for (i=0; ipoints_supported; i++) + // Gesture:google likes to compute guestures itself instead of hw reports. + /* Figure out which pointer(s) should be reported */ + bitmap_zero(pointers_to_report, NR_FINGERS); + will_report = 0; + for (i=0; ipoints_supported;i++) { finger = 0x3 &(buf[ts->f11.data_offset+i/4] >> ((i%4)*2)); - if (1 == finger)finger_pre[i] =2; - if ((0 == finger)&&(0!=finger_pre[i]))finger_pre[i] =1; + if (finger) {/* active or down pointers, should report */ + __set_bit(i, pre_fingers); + __set_bit(i, pointers_to_report); + } else if (test_bit(i, pre_fingers)) { /* finger == 0, but previous finger == 1, up pointers, should report */ + __clear_bit(i, pre_fingers); + __set_bit(i, pointers_to_report); + } else /* inactive pointers, do nothing */ + continue; point_data = (struct f11_2d_point_data *) - ( buf - + ts->f11.data_offset - + (1 + ts->points_supported/4) - + i * sizeof(struct f11_2d_point_data) - ); + ( buf + + ts->f11.data_offset + + (1 + ts->points_supported/4) + + i * sizeof(struct f11_2d_point_data) + ); x =((__u16)((point_data->xh<<0x4)|(point_data->xyl &0xF)))-6; y =((__u16)((point_data->yh<<0x4)|(point_data->xyl &0xF0)>>0x4))-6; w = ( point_data->wxy & 0x0F ) + ( point_data->wxy >>4 & 0x0F ); z = point_data->z; - if (x < 0) x =0; - else if (x >ts->max[0])x = ts->max[0]; - if (y < 0) y =0; - else if (y >ts->max[1])y = ts->max[1]; - - switch(finger_pre[i]) - { - case 1: - { - finger_pre[i]=0; - }; - case 2: - { - input_report_abs(ts->input_dev, ABS_MT_TRACKING_ID, i); - input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, z); - input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, w);//default 10 - input_report_abs(ts->input_dev, ABS_MT_POSITION_X, x); - input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, y); - input_mt_sync(ts->input_dev); - }break; - default:break; + x = ( x < 0 ) ? 0 : x ; + x = ( x > ts->max[0] ) ? ts->max[0] : x ; + y = ( y < 0 ) ? 0 : y ; + y = ( y > ts->max[1] ) ? ts->max[1] : y ; + + new_report_data[i].w = w; + new_report_data[i].z = z; + new_report_data[i].x = x; + new_report_data[i].y = y; + +#ifdef TOUCHSCREEN_DUPLICATED_FILTER + if (duplicated_filter(ts, i, z, w, x, y)) + continue; +#endif + will_report = 1; + } + + if (will_report) { + for_each_set_bit(i, pointers_to_report, NR_FINGERS) { + input_report_abs(ts->input_dev, ABS_MT_TRACKING_ID, i); + input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, new_report_data[i].z); + input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, new_report_data[i].w);//default 10 + input_report_abs(ts->input_dev, ABS_MT_POSITION_X, new_report_data[i].x); + input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, new_report_data[i].y); + input_mt_sync(ts->input_dev); } + input_sync(ts->input_dev); } - input_sync(ts->input_dev); } + if (ts->use_irq) enable_irq(ts->client->irq); + } @@ -516,12 +616,12 @@ static int synaptics_rmi4_probe( { struct synaptics_rmi4_data *ts; struct synaptics_rmi4_data *pdata; + struct proc_dir_entry *dir, *refresh; int ret = 0; uint max_x,max_y; - struct proc_dir_entry *dir, *refresh; if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { - pr_err("synaptics_ts_probe: need I2C_FUNC_I2C\n"); + pr_err("%s: need I2C_FUNC_I2C\n", __func__); ret = -ENODEV; goto err_check_functionality_failed; } @@ -533,26 +633,24 @@ static int synaptics_rmi4_probe( } INIT_WORK(&ts->work, synaptics_rmi4_work_func); ts->client = client; -#if defined(CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI_UPDATE) - update_client=client; -#endif - i2c_set_clientdata(client, ts); pdata = client->dev.platform_data; if (pdata){ + //ts->power = client->dev.platform_data; ts->power = pdata->power; ts->orientation = pdata->orientation; + //ts->points_needed = pdata->points_needed; ts->gpio_irq = pdata->gpio_irq; }else{ - pr_err("%s error!\n",__func__); + pr_err("%s: error!\n",__func__); goto err_detect_failed; } if (ts->power) { ret = ts->power(1); if (ret < 0) { - pr_err("%s power on failed\n",__func__); + pr_err("%s: power on failed\n",__func__); goto err_power_failed; } msleep(250); @@ -563,16 +661,20 @@ static int synaptics_rmi4_probe( __func__, ts->gpio_irq,ret); goto err_power_failed; } -#if defined (CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI_UPDATE) - ts_temp=ts; -#endif ret = synaptics_rmi4_get_pdt(ts); if (ret <= 0) { - pr_err("Error identifying device (%d)\n", ret); + pr_err("%s: Error identifying device (%d)\n", __func__, ret); ret = -ENODEV; goto err_detect_failed; } + synaptics_wq = create_singlethread_workqueue("synaptics_wq"); + if (!synaptics_wq){ + pr_err("Could not create work queue synaptics_wq: no memory"); + return -ENOMEM; + } + pgtsdata=ts; + max_x=ts->max[0]; #if defined(CONFIG_MACH_R750) max_y= 2739-6; @@ -580,15 +682,23 @@ static int synaptics_rmi4_probe( max_y=3092-6; #elif defined(CONFIG_MACH_SKATE) max_y=1869-6; +#elif defined(CONFIG_MACH_BLADE2) + max_y = 1518 -6; +#elif defined(CONFIG_MACH_BLUETICK) + max_y = 1518 -6; + #else max_y=ts->max[1]; #endif + printk("synaptics_rmi4_probe: max_x=%d max_y=%d\n",max_x,max_y);//ZTE_TS_XYM_20110720 + //ret = synaptics_rmi4_init_panel(ts); ret = synaptics_rmi4_set_panel_state(ts, TS_POWER_ON); if (ret < 0) { - pr_err("synaptics_rmi4_set_panel_state failed\n"); + pr_err("%s: synaptics_rmi4_set_panel_state failed\n",__func__); goto err_detect_failed; } +// dump_regs(ts); ts->input_dev = input_allocate_device(); if (ts->input_dev == NULL) { @@ -601,8 +711,13 @@ static int synaptics_rmi4_probe( ts->input_dev->phys = client->name; #ifdef TOUCHSCREEN_DUPLICATED_FILTER - ts->dup_threshold=(max_y*10/LCD_MAX_Y+5)/10; - pr_info("dup_threshold %d\n", ts->dup_threshold); +{ + uint xres,yres=0; + get_screeninfo(&xres, &yres); + ts->dup_threshold= (2*max_y)/yres; + //ts->dup_threshold=(max_y*10/LCD_MAX_Y+5)/10; + //pr_info("dup_threshold %d\n", ts->dup_threshold); +} #endif set_bit(EV_SYN, ts->input_dev->evbit); @@ -611,7 +726,9 @@ static int synaptics_rmi4_probe( set_bit(EV_ABS, ts->input_dev->evbit); set_bit(KEY_HOME, ts->input_dev->keybit); set_bit(KEY_MENU, ts->input_dev->keybit); - set_bit(KEY_BACK, ts->input_dev->keybit); + set_bit(KEY_BACK, ts->input_dev->keybit); + //set_bit(ABS_X, ts->input_dev->absbit); + //set_bit(ABS_Y, ts->input_dev->absbit); set_bit(ABS_SINGLE_TAP, ts->input_dev->absbit); set_bit(ABS_TAP_HOLD, ts->input_dev->absbit); set_bit(ABS_EARLY_TAP, ts->input_dev->absbit); @@ -626,8 +743,11 @@ static int synaptics_rmi4_probe( set_bit(ABS_MT_WIDTH_MAJOR, ts->input_dev->absbit); set_bit(ABS_MT_ORIENTATION, ts->input_dev->absbit); + //input_set_abs_params(ts->input_dev, ABS_X, 0, max_x, 0, 0); + //input_set_abs_params(ts->input_dev, ABS_Y, 0, max_y, 0, 0); input_set_abs_params(ts->input_dev, ABS_MT_ORIENTATION, 0, ts->orientation, 0, 0); input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0, 0xFF, 0, 0); + //input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MINOR, 0, 0xF, 0, 0); input_set_abs_params(ts->input_dev, ABS_MT_POSITION_X, 0, max_x+1, 0, 0); input_set_abs_params(ts->input_dev, ABS_MT_POSITION_Y, 0, max_y+1, 0, 0); input_set_abs_params(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0, 30, 0, 0); @@ -639,6 +759,7 @@ static int synaptics_rmi4_probe( input_set_abs_params(ts->input_dev, ABS_PRESS, 0, 5, 0, 0); input_set_abs_params(ts->input_dev, ABS_DOUBLE_TAP, 0, 5, 0, 0); input_set_abs_params(ts->input_dev, ABS_PINCH, -0xFF, 0xFF, 0, 0); + //input_set_abs_params(ts->input_dev, ABS_PRESSURE, 0, 255, 0, 0); ret = input_register_device(ts->input_dev); if (ret) { @@ -646,7 +767,8 @@ static int synaptics_rmi4_probe( __func__, ts->input_dev->name); goto err_input_register_device_failed; } - + + ts->use_irq = 1; if (client->irq) { if (request_irq(client->irq, synaptics_rmi4_irq_handler, @@ -655,6 +777,7 @@ static int synaptics_rmi4_probe( pr_info("Received IRQ!\n"); ts->use_irq = 1; }else{ + ts->use_irq = 0; dev_err(&client->dev, "request_irq failed\n"); } } @@ -679,10 +802,19 @@ static int synaptics_rmi4_probe( refresh->read_proc = proc_read_val; refresh->write_proc = proc_write_val; } + #if defined(CONFIG_TOUCHSCREEN_VIRTUAL_KEYS) ts_key_report_init(); +#endif + +#if defined(CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI_UPDATE) + syna_fwupdate_init(client); #endif + bitmap_zero(pre_fingers, NR_FINGERS); + memset((void *)old_report_data, 0, sizeof(old_report_data)); + memset((void *)new_report_data, 0, sizeof(old_report_data)); + pr_info("%s: Start ts %s in %s mode\n", __func__,ts->input_dev->name, ts->use_irq ? "interrupt" : "polling"); return 0; @@ -708,12 +840,16 @@ static int synaptics_rmi4_remove(struct i2c_client *client) #if defined(CONFIG_TOUCHSCREEN_VIRTUAL_KEYS) ts_key_report_deinit(); #endif +#if defined(CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI_UPDATE) + syna_fwupdate_deinit(client); +#endif + // power off if (ts->power) { ret = ts->power(0); if (ret < 0) - pr_err("%s power off failed\n",__func__); + pr_err("%s: power off failed\n",__func__); } unregister_early_suspend(&ts->early_suspend); @@ -741,11 +877,18 @@ static int synaptics_rmi4_suspend(struct i2c_client *client, pm_message_t mesg) hrtimer_cancel(&ts->timer); ret = cancel_work_sync(&ts->work); + /* if work was pending disable-count is now 2 */ if (ret && ts->use_irq) enable_irq(client->irq); synaptics_rmi4_set_panel_state(ts, TS_SUSPEND); - +/* + if (ts->power) { + ret = ts->power(0); + if (ret < 0) + pr_err("synaptics_rmi4_suspend power off failed\n"); + } +*/ return 0; } @@ -753,7 +896,14 @@ static int synaptics_rmi4_resume(struct i2c_client *client) { // int ret; struct synaptics_rmi4_data *ts = i2c_get_clientdata(client); - +/* + if (ts->power){ + ret=ts->power(1); + if (ret < 0) + pr_err("synaptics_rmi4_resume power on failed\n"); + } +*/ + //synaptics_rmi4_init_panel(ts); synaptics_rmi4_set_panel_state(ts, TS_RESUME); if (ts->use_irq){ @@ -800,11 +950,6 @@ static struct i2c_driver synaptics_rmi4_driver = { static int __devinit synaptics_rmi4_init(void) { - synaptics_wq = create_singlethread_workqueue("synaptics_wq"); - if (!synaptics_wq){ - pr_err("Could not create work queue synaptics_wq: no memory"); - return -ENOMEM; - } return i2c_add_driver(&synaptics_rmi4_driver); } diff --git a/drivers/input/touchscreen/synaptics_i2c_rmi.c b/drivers/input/touchscreen/synaptics_i2c_rmi.c index ce05fab2..cea3084f 100644 --- a/drivers/input/touchscreen/synaptics_i2c_rmi.c +++ b/drivers/input/touchscreen/synaptics_i2c_rmi.c @@ -55,6 +55,8 @@ when who what, where, why comment tag #define GPIO_TOUCH_EN_OUT 31 #elif defined(CONFIG_MACH_R750)//R750 touchscreen enable #define GPIO_TOUCH_EN_OUT 33 +#elif defined(CONFIG_MACH_TURIES) +#define GPIO_TOUCH_EN_OUT 89 //ZTE_TS_ZFJ_20110315 #else//other projects #define GPIO_TOUCH_EN_OUT 31 #endif diff --git a/drivers/media/video/msm/Kconfig b/drivers/media/video/msm/Kconfig index 3820769f..f705771a 100644 --- a/drivers/media/video/msm/Kconfig +++ b/drivers/media/video/msm/Kconfig @@ -94,7 +94,7 @@ if MT9T11X config MT9T11X_QTECH_MCNEX_FPC bool "Sensor mt9t111 or mt9t112 (YUV 3.1M) of FPC, Module QTECHGLOBAL or MCNEX" depends on MSM_CAMERA - depends on MACH_BLADE || MACH_SMOOTH || MACH_RAISE || MACH_V9 || MACH_ROAMER || MACH_NOVA || MACH_SAILBOAT + depends on MACH_BLADE || MACH_SMOOTH || MACH_RAISE || MACH_V9 || MACH_ROAMER || MACH_NOVA || MACH_SAILBOAT|| MACH_TURIES default y ---help--- APTINA 3.1M YUV Sensor @@ -139,6 +139,23 @@ config OV5640_GLOBALOPTICS ---help--- OmniVision 5.0M YUV Sensor, Module GLOBALOPTICS endif # OV5640 + +config OVM7690 + bool "Sensor ovm7690 (YUV 0.3M)" + depends on MSM_CAMERA && !ARCH_MSM8X60 + default n + ---help--- + OmniVision 0.3M YUV Sensor + +if OVM7690 +config OVM7690_GLOBALOPTICS + bool "Sensor ovm7690 (YUV 0.3M), Module GLOBALOPTICS" + depends on MSM_CAMERA + default y + ---help--- + OmniVision 0.3M YUV Sensor, Module GLOBALOPTICS +endif # OVM7690 + config HI704 bool "Sensor hi704(YUV 0.3M)" depends on MSM_CAMERA diff --git a/drivers/media/video/msm/Makefile b/drivers/media/video/msm/Makefile index fae8d12b..859e9039 100644 --- a/drivers/media/video/msm/Makefile +++ b/drivers/media/video/msm/Makefile @@ -16,6 +16,7 @@ obj-$(CONFIG_SN12M0PZ) += sn12m0pz.o sn12m0pz_reg.o obj-$(CONFIG_MT9P111_MCNEX) += mt9p111_mcnex.o mt9p111_reg_mcnex.o obj-$(CONFIG_MT9P111_SAMSUNG_FPC) += mt9p111_samsung_fpc.o mt9p111_reg_samsung_fpc.o obj-$(CONFIG_MT9P111_SAMSUNG_SOCKET) += mt9p111_samsung_socket.o mt9p111_reg_samsung_socket.o +obj-$(CONFIG_OVM7690_GLOBALOPTICS) += ovm7690_fpc.o ovm7690_reg_fpc.o obj-$(CONFIG_MT9V113) += mt9v113.o mt9v113_reg.o obj-$(CONFIG_MT9T11X_QTECH_MCNEX_FPC) += mt9t11x_qtech_mcnex_fpc.o mt9t112_reg_qtech_mcnex_fpc.o mt9t111_reg_qtech_mcnex_fpc.o obj-$(CONFIG_MT9T11X_QTECH_MCNEX_SOCKET) += mt9t11x_qtech_mcnex_socket.o mt9t111_reg_qtech_mcnex_socket.o mt9t112_reg_qtech_mcnex_socket.o diff --git a/drivers/media/video/msm/flash.c b/drivers/media/video/msm/flash.c index 03e2338f..6cdac665 100644 --- a/drivers/media/video/msm/flash.c +++ b/drivers/media/video/msm/flash.c @@ -19,6 +19,7 @@ /*----------------------------------------------------------------------------------------- when who what, where, why comment tag -------- ---- ------------------------------------- ---------------------- + 2010-06-05 ye.ganlin add process for flash LED YGL_CAM_20100605 ------------------------------------------------------------------------------------------*/ #include #include @@ -30,7 +31,11 @@ #include #include - +/* + * Commented by YGL_CAM_20100605 + * Add process for flash LED + * and for CONFIG_MACH_JOE ONLY + */ #if defined(CONFIG_MSM_CAMERA_FLASH) /* diff --git a/drivers/media/video/msm/hi704.h b/drivers/media/video/msm/hi704.h index b606e01b..b7a9f5f9 100644 --- a/drivers/media/video/msm/hi704.h +++ b/drivers/media/video/msm/hi704.h @@ -20,6 +20,8 @@ /*----------------------------------------------------------------------------------------- when who what, where, why comment tag -------- ---- ------------------------------------- ---------------------- + 2011-04-15 lijing add setting array ZTE_CAM_LJ_20100415 + 2009-10-24 jia.jia Merged from kernel-v4515 ZTE_MSM_CAMERA_JIA_001 ------------------------------------------------------------------------------------------*/ #ifndef FI704_H @@ -54,7 +56,10 @@ struct hi704_reg_t { struct hi704_i2c_reg_conf const *rftbl; uint16_t rftbl_size; - + /* + * ZTE_CAM_LJ_20100415 + * add antibanding array + */ struct hi704_i2c_reg_conf const *antibanding_auto_tbl; uint16_t antibanding_auto_tbl_size; diff --git a/drivers/media/video/msm/hi704_kerr_fpc.c b/drivers/media/video/msm/hi704_kerr_fpc.c index ca5bae59..759f7698 100644 --- a/drivers/media/video/msm/hi704_kerr_fpc.c +++ b/drivers/media/video/msm/hi704_kerr_fpc.c @@ -20,7 +20,10 @@ /*----------------------------------------------------------------------------------------- when who what, where, why comment tag -------- ---- ------------------------------------- ---------------------- - + 2011-04-16 lijing add param setting ZTE_CAM_LJ_20110416 + 2011-04-14 lijing modify sensor angle from 90 to 180, else ZTE_CAM_LJ_20110414_01 + snapshot angle is 90 rotated + 2009-10-24 jia.jia Merged from kernel-v4515 ZTE_MSM_CAMERA_JIA_001 ------------------------------------------------------------------------------------------*/ #include @@ -387,7 +390,7 @@ static long hi704_set_effect(int32_t mode, int32_t effect) { return rc; } - rc = hi704_i2c_write(hi704_client->addr,0x11,0x03,BYTE_LEN); + rc = hi704_i2c_write(hi704_client->addr,0x11,0x43,BYTE_LEN); if (rc < 0) { return rc; @@ -443,7 +446,7 @@ static long hi704_set_effect(int32_t mode, int32_t effect) { return rc; } - rc = hi704_i2c_write(hi704_client->addr,0x11,0x03,BYTE_LEN); + rc = hi704_i2c_write(hi704_client->addr,0x11,0x43,BYTE_LEN); if (rc < 0) { return rc; @@ -498,7 +501,7 @@ static long hi704_set_effect(int32_t mode, int32_t effect) { return rc; } - rc = hi704_i2c_write(hi704_client->addr,0x11,0x03,BYTE_LEN); + rc = hi704_i2c_write(hi704_client->addr,0x11,0x43,BYTE_LEN); if (rc < 0) { return rc; @@ -559,7 +562,7 @@ static long hi704_set_effect(int32_t mode, int32_t effect) { return rc; } - rc = hi704_i2c_write(hi704_client->addr,0x11,0x03,BYTE_LEN); + rc = hi704_i2c_write(hi704_client->addr,0x11,0x43,BYTE_LEN); if (rc < 0) { return rc; @@ -920,7 +923,12 @@ static int32_t hi704_set_contrast(int8_t contrast) { return rc; } - rc = hi704_i2c_write(hi704_client->addr,0x48,0x54,BYTE_LEN); + rc = hi704_i2c_write(hi704_client->addr,0x11,0x43,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = hi704_i2c_write(hi704_client->addr,0x48,0x20,BYTE_LEN); if (rc < 0) { return rc; @@ -935,11 +943,17 @@ static int32_t hi704_set_contrast(int8_t contrast) { return rc; } - rc = hi704_i2c_write(hi704_client->addr,0x48,0x74,BYTE_LEN); + rc = hi704_i2c_write(hi704_client->addr,0x11,0x43,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = hi704_i2c_write(hi704_client->addr,0x48,0x60,BYTE_LEN); if (rc < 0) { return rc; } + } break; @@ -950,6 +964,11 @@ static int32_t hi704_set_contrast(int8_t contrast) { return rc; } + rc = hi704_i2c_write(hi704_client->addr,0x11,0x43,BYTE_LEN); + if (rc < 0) + { + return rc; + } rc = hi704_i2c_write(hi704_client->addr,0x48,0x84,BYTE_LEN); if (rc < 0) { @@ -965,11 +984,17 @@ static int32_t hi704_set_contrast(int8_t contrast) { return rc; } - rc = hi704_i2c_write(hi704_client->addr,0x48,0x94,BYTE_LEN); + rc = hi704_i2c_write(hi704_client->addr,0x11,0x43,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = hi704_i2c_write(hi704_client->addr,0x48,0xa0,BYTE_LEN); if (rc < 0) { return rc; } + } break; @@ -980,11 +1005,17 @@ static int32_t hi704_set_contrast(int8_t contrast) { return rc; } - rc = hi704_i2c_write(hi704_client->addr,0x48,0xb4,BYTE_LEN); + rc = hi704_i2c_write(hi704_client->addr,0x11,0x43,BYTE_LEN); if (rc < 0) { return rc; } + rc = hi704_i2c_write(hi704_client->addr,0x48,0xf4,BYTE_LEN); + if (rc < 0) + { + return rc; + } + } break; @@ -1348,6 +1379,11 @@ static int32_t hi704_set_sharpness(int8_t sharpness) { return rc; } + rc = hi704_i2c_write(hi704_client->addr,0x10,0x01,BYTE_LEN); + if (rc < 0) + { + return rc; + } rc = hi704_i2c_write(hi704_client->addr,0x90,0x04,BYTE_LEN); if (rc < 0) { @@ -1368,6 +1404,11 @@ static int32_t hi704_set_sharpness(int8_t sharpness) { return rc; } + rc = hi704_i2c_write(hi704_client->addr,0x10,0x01,BYTE_LEN); + if (rc < 0) + { + return rc; + } rc = hi704_i2c_write(hi704_client->addr,0x90,0x04,BYTE_LEN); if (rc < 0) { @@ -1388,6 +1429,11 @@ static int32_t hi704_set_sharpness(int8_t sharpness) { return rc; } + rc = hi704_i2c_write(hi704_client->addr,0x10,0x01,BYTE_LEN); + if (rc < 0) + { + return rc; + } rc = hi704_i2c_write(hi704_client->addr,0x90,0x04,BYTE_LEN); if (rc < 0) { @@ -1408,6 +1454,11 @@ static int32_t hi704_set_sharpness(int8_t sharpness) { return rc; } + rc = hi704_i2c_write(hi704_client->addr,0x10,0x01,BYTE_LEN); + if (rc < 0) + { + return rc; + } rc = hi704_i2c_write(hi704_client->addr,0x90,0x04,BYTE_LEN); if (rc < 0) { @@ -1428,6 +1479,11 @@ static int32_t hi704_set_sharpness(int8_t sharpness) { return rc; } + rc = hi704_i2c_write(hi704_client->addr,0x10,0x01,BYTE_LEN); + if (rc < 0) + { + return rc; + } rc = hi704_i2c_write(hi704_client->addr,0x90,0x04,BYTE_LEN); if (rc < 0) { @@ -2511,7 +2567,10 @@ int hi704_sensor_probe(const struct msm_camera_sensor_info *info, goto probe_failed; } - + /* + * modify sensor angle from 90 to 180, else snapshot angle is 90 rotated + * ZTE_CAM_LJ_20110414_01 + */ s->s_mount_angle = 0; s->s_camera_type = FRONT_CAMERA_2D; diff --git a/drivers/media/video/msm/hi704_reg_kerr_fpc.c b/drivers/media/video/msm/hi704_reg_kerr_fpc.c index dc160592..0bc7f00e 100644 --- a/drivers/media/video/msm/hi704_reg_kerr_fpc.c +++ b/drivers/media/video/msm/hi704_reg_kerr_fpc.c @@ -20,6 +20,8 @@ /*----------------------------------------------------------------------------------------- when who what, where, why comment tag -------- ---- ------------------------------------- ---------------------- + 2011-04-15 lijing add settings ZTE_CAM_LJ_20100415 + 2009-10-24 jia.jia Merged from kernel-v4515 ZTE_MSM_CAMERA_JIA_001 ------------------------------------------------------------------------------------------*/ #include "hi704.h" @@ -483,7 +485,10 @@ static struct hi704_i2c_reg_conf const sequencer_tbl[] = { {0x0000, 0x0000, WORD_LEN, 0}, }; - +/* + * ZTE_CAM_LJ_20100415 + * add antibanding settings + */ static struct hi704_i2c_reg_conf const antibanding_auto_tbl[] = { {0x03, 0x20, BYTE_LEN, 0}, {0x10, 0x0c, BYTE_LEN, 0}, diff --git a/drivers/media/video/msm/msm_axi_qos.c b/drivers/media/video/msm/msm_axi_qos.c index 03862f81..9a6bdaad 100644 --- a/drivers/media/video/msm/msm_axi_qos.c +++ b/drivers/media/video/msm/msm_axi_qos.c @@ -48,4 +48,7 @@ void release_axi_qos(void) clk_disable(ebi1_clk); clk_put(ebi1_clk); + + //lijing modify for high current,merged from patch CRs-Fixed: 280060,ZTE_CAM_20110810 + ebi1_clk = NULL; } diff --git a/drivers/media/video/msm/msm_camera.c b/drivers/media/video/msm/msm_camera.c index f396930e..2562d35f 100644 --- a/drivers/media/video/msm/msm_camera.c +++ b/drivers/media/video/msm/msm_camera.c @@ -22,7 +22,22 @@ /* FIXME: does region->active mean free */ /* FIXME: check limits on command lenghts passed from userspace */ /* FIXME: __msm_release: which queues should we flush when opencnt != 0 */ - +/*----------------------------------------------------------------------------------------- + when who what, where, why comment tag + -------- ---- ------------------------------------- ---------------------- + 2011-08-10 yeganlin modify for high current,merged from ZTE_CAM_20110810 + patch CRs-Fixed: 280060 + 2011-05-19 lijing add two camera support ZTE_CAM_LJ_20110519 + 2011-02-21 wt enabel flash function ZTE_CAM_WT_20110221 + 2010-08-23 lijing fix bug of NULL pointer issue for ZTE_CAM_LIJING_20100823 + CONFIG_SENSOR_ADAPTER + 2010-06-08 jia redefine "msm_camera_dev_start" JIA_CAM_20100608 + 2010-06-05 ye.ganlin add process for flash LED YGL_CAM_20100605 + 2009-05-20 ye.ganlin add wake lock for suspend, YGL_CAM_20100520 + replace "kmalloc" with "kzalloc" + add exception process + 2009-04-30 lijing add for mt9t11x and ov5642 adapter LIJING_CAM_20100430 + ------------------------------------------------------------------------------------------*/ #include #include @@ -46,9 +61,6 @@ spinlock_t pp_prev_spinlock; spinlock_t pp_snap_spinlock; spinlock_t pp_thumb_spinlock; -#define MSM_MAX_CAMERA_SENSORS 5 -#define CAMERA_STOP_SNAPSHOT 42 - #define ERR_USER_COPY(to) pr_err("%s(%d): copy %s user\n", \ __func__, __LINE__, ((to) ? "to" : "from")) #define ERR_COPY_FROM_USER() ERR_USER_COPY(0) @@ -62,53 +74,9 @@ int g_v4l2_opencnt; static int camera_node; static enum msm_camera_type camera_type[MSM_MAX_CAMERA_SENSORS]; -char * vfe_config_cmd[] = { - "CMD_GENERAL", - "CMD_AXI_CFG_OUT1", - "CMD_AXI_CFG_SNAP_O1_AND_O2", - "CMD_AXI_CFG_OUT2", - "CMD_PICT_T_AXI_CFG", - "CMD_PICT_M_AXI_CFG", - "CMD_RAW_PICT_AXI_CFG", - "CMD_FRAME_BUF_RELEASE", - "CMD_PREV_BUF_CFG", - "CMD_SNAP_BUF_RELEASE", - "CMD_SNAP_BUF_CFG", - "CMD_STATS_DISABLE", - "CMD_STATS_AEC_AWB_ENABLE", - "CMD_STATS_AF_ENABLE", - "CMD_STATS_AEC_ENABLE", - "CMD_STATS_AWB_ENABLE", - "CMD_STATS_ENABLE", - "CMD_STATS_AXI_CFG", - "CMD_STATS_AEC_AXI_CFG", - "CMD_STATS_AF_AXI_CFG", - "CMD_STATS_AWB_AXI_CFG", - "CMD_STATS_RS_AXI_CFG", - "CMD_STATS_CS_AXI_CFG", - "CMD_STATS_IHIST_AXI_CFG", - "CMD_STATS_SKIN_AXI_CFG", - "CMD_STATS_BUF_RELEASE", - "CMD_STATS_AEC_BUF_RELEASE", - "CMD_STATS_AF_BUF_RELEASE", - "CMD_STATS_AWB_BUF_RELEASE", - "CMD_STATS_RS_BUF_RELEASE", - "CMD_STATS_CS_BUF_RELEASE", - "CMD_STATS_IHIST_BUF_RELEASE", - "CMD_STATS_SKIN_BUF_RELEASE", - "UPDATE_STATS_INVALID", - "CMD_AXI_CFG_SNAP_GEMINI", - "CMD_AXI_CFG_SNAP", - "CMD_AXI_CFG_PREVIEW", - "CMD_AXI_CFG_VIDEO", - "CMD_STATS_IHIST_ENABLE", - "CMD_STATS_RS_ENABLE", - "CMD_STATS_CS_ENABLE", - "CMD_VPE", - "CMD_AXI_CFG_VPE", - NULL -}; - +/* + * add two camera support ZTE_CAM_LJ_20110519 + */ static uint32_t sensor_mount_angle[MSM_MAX_CAMERA_SENSORS]; #define __CONTAINS(r, v, l, field) ({ \ @@ -202,7 +170,10 @@ static void msm_enqueue_vpe(struct msm_device_queue *queue, spin_unlock_irqrestore(&queue->lock, flags); } - +/* + * YGL_CAM_20100520 + * Fix bug of "spin_unlock_irqrestore" + */ #if 0 #define msm_dequeue(queue, member) ({ \ unsigned long flags; \ @@ -254,7 +225,10 @@ static void msm_enqueue_vpe(struct msm_device_queue *queue, }) #endif - +/* + * YGL_CAM_20100520 + * Fix bug of "__q->len" + */ #if 0 #define msm_queue_drain(queue, member) do { \ unsigned long flags; \ @@ -372,7 +346,10 @@ static int msm_pmem_table_add(struct hlist_head *ptype, spin_unlock_irqrestore(pmem_spinlock, flags); - + /* + * YGL_CAM_20100520 + * Fix bug of "kmalloc" + */ #if 0 region = kmalloc(sizeof(struct msm_pmem_region), GFP_KERNEL); #else @@ -885,7 +862,10 @@ static struct msm_queue_cmd *__msm_control_nb(struct msm_sync *sync, struct msm_ctrl_cmd *udata; struct msm_ctrl_cmd *udata_to_copy = qcmd_to_copy->command; - + /* + * YGL_CAM_20100520 + * Fix bug of "kmalloc" + */ #if 0 struct msm_queue_cmd *qcmd = kmalloc(sizeof(*qcmd_to_copy) + @@ -1640,7 +1620,9 @@ static int msm_get_camera_info(void __user *arg) info.has_3d_support[i] = 0; info.is_internal_cam[i] = 0; - + /* + * add two camera support ZTE_CAM_LJ_20110519 + */ info.s_mount_angle[i] = sensor_mount_angle[i]; switch (camera_type[i]) { @@ -1939,13 +1921,19 @@ static int __msm_get_pic(struct msm_sync *sync, struct msm_ctrl_cmd *ctrl) qcmd = msm_dequeue(&sync->pict_q, list_pict); BUG_ON(!qcmd); - + /* + * YGL_CAM_20100520 + * Add process for NULL ptr + */ if (!qcmd) { rc = -EFAULT; pr_err("%s: qcmd is NULL, rc %d\n", __func__, rc); return rc; } - + /* + * YGL_CAM_20100520 + * Add process for NULL ptr + */ if (!qcmd) { rc = -EFAULT; pr_err("%s: qcmd is NULL, rc %d\n", __func__, rc); @@ -2029,7 +2017,10 @@ static int msm_set_crop(struct msm_sync *sync, void __user *arg) } if (!sync->croplen) { - + /* + * YGL_CAM_20100520 + * Fix bug of "kmalloc" + */ #if 0 sync->cropinfo = kmalloc(crop.len, GFP_KERNEL); #else @@ -2065,6 +2056,13 @@ static int msm_error_config(struct msm_sync *sync, void __user *arg) struct msm_queue_cmd *qcmd = kmalloc(sizeof(struct msm_queue_cmd), GFP_KERNEL); +/* + * YGL_CAM_20110803 + * set command to NULL, otherwise there will be NULL pointer when received err_config. + * merged from 6150 + */ + qcmd->command = NULL; + if (qcmd) atomic_set(&(qcmd->on_heap), 1); @@ -2336,7 +2334,7 @@ static long msm_ioctl_config(struct file *filep, unsigned int cmd, rc = -EFAULT; } else { CDBG("msm_strobe_flash_init enter"); - //rc = msm_strobe_flash_init(pmsm->sync, flash_type); + //rc = msm_strobe_flash_init(pmsm->sync, flash_type); ZTE_CAM_WT_20110221 } break; } @@ -2388,7 +2386,11 @@ static long msm_ioctl_config(struct file *filep, unsigned int cmd, break; } - + /* + * Commented by YGL_CAM_20100605 ZTE_CAM_WT_20110221 + * Added for turning on/off flash LED, + * called by vfe_process_QDSP_VFETASK_MSG_VFE_RESET_ACK in HAL + */ case MSM_CAM_IOCTL_FLASH_LED_ON_OFF_CFG: { uint32_t flashled_switch; if (copy_from_user(&flashled_switch, argp, sizeof(flashled_switch))) { @@ -2531,7 +2533,10 @@ static int __msm_release(struct msm_sync *sync) } msm_queue_drain(&sync->pict_q, list_pict); - + /* + * YGL_CAM_20100520 + * Add wake lock for suspend + */ wake_unlock(&sync->wake_suspend_lock); wake_unlock(&sync->wake_lock); sync->apps_id = NULL; @@ -2635,7 +2640,10 @@ static void *msm_vfe_sync_alloc(int size, void *syncdata __attribute__((unused)), gfp_t gfp) { - + /* + * YGL_CAM_20100520 + * Fix bug of "kmalloc" + */ #if 0 struct msm_queue_cmd *qcmd = kmalloc(sizeof(struct msm_queue_cmd) + size, gfp); @@ -2936,7 +2944,10 @@ static void msm_vpe_sync(struct msm_vpe_resp *vdata, return; } - + /* + * YGL_CAM_20100520 + * Add process for "opencnt" + */ if (!sync->opencnt) { pr_err("%s: SPURIOUS INTERRUPT\n", __func__); return; @@ -3018,7 +3029,10 @@ static int __msm_open(struct msm_sync *sync, const char *const apps_id) sync->apps_id = apps_id; if (!sync->opencnt) { - + /* + * YGL_CAM_20100520 + * Add wake lock for suspend + */ wake_lock(&sync->wake_suspend_lock); wake_lock(&sync->wake_lock); @@ -3036,7 +3050,10 @@ static int __msm_open(struct msm_sync *sync, const char *const apps_id) if (rc < 0) { pr_err("%s: sensor init failed: %d\n", __func__, rc); - + /* + * YGL_CAM_20100520 + * Add process of "vfe_release" + */ sync->vfefn.vfe_release(sync->pdev); goto msm_open_done; } @@ -3108,7 +3125,10 @@ static int msm_open_control(struct inode *inode, struct file *filep) { int rc; - + /* + * YGL_CAM_20100520 + * Add process of "kmalloc" + */ #if 0 struct msm_control_device *ctrl_pmsm = kmalloc(sizeof(struct msm_control_device), GFP_KERNEL); @@ -3120,7 +3140,10 @@ static int msm_open_control(struct inode *inode, struct file *filep) return -ENOMEM; rc = msm_open_common(inode, filep, 0); - + /* + * YGL_CAM_20100520 + * Add process of "kfree" + */ #if 0 if (rc < 0) return rc; @@ -3153,7 +3176,10 @@ static int __msm_v4l2_control(struct msm_sync *sync, struct msm_device_queue *v4l2_ctrl_q = &g_v4l2_control_device->ctrl_q; /* wake up config thread, 4 is for V4L2 application */ - + /* + * YGL_CAM_20100520 + * Add process of "kmalloc" + */ #if 0 qcmd = kmalloc(sizeof(struct msm_queue_cmd), GFP_KERNEL); #else @@ -3296,7 +3322,10 @@ static int msm_sync_init(struct msm_sync *sync, msm_queue_init(&sync->pict_q, "pict"); msm_queue_init(&sync->vpe_q, "vpe"); - + /* + * YGL_CAM_20100520 + * Add wake lock for suspend + */ wake_lock_init(&sync->wake_suspend_lock, WAKE_LOCK_SUSPEND, "msm_camera_wake"); wake_lock_init(&sync->wake_lock, WAKE_LOCK_IDLE, "msm_camera"); @@ -3315,7 +3344,10 @@ static int msm_sync_init(struct msm_sync *sync, pr_err("%s: failed to initialize %s\n", __func__, sync->sdata->sensor_name); - + /* + * YGL_CAM_20100520 + * Add wake lock for suspend + */ wake_lock_destroy(&sync->wake_suspend_lock); wake_lock_destroy(&sync->wake_lock); return rc; @@ -3333,7 +3365,10 @@ static int msm_sync_init(struct msm_sync *sync, static int msm_sync_destroy(struct msm_sync *sync) { - + /* + * YGL_CAM_20100520 + * Add wake lock for suspend + */ wake_lock_destroy(&sync->wake_suspend_lock); wake_lock_destroy(&sync->wake_lock); return 0; @@ -3385,7 +3420,10 @@ static int msm_device_init(struct msm_cam_device *pmsm, return rc; } - +/* + * modify for two cameras + * ZTE_CAM_LJ_20110324 ZTE_CAM_LJ_20110519 + */ DECLARE_MUTEX(msm_camera_sensor_init_sem); int msm_camera_drv_start(struct platform_device *dev, int (*sensor_probe)(const struct msm_camera_sensor_info *, @@ -3444,7 +3482,6 @@ int msm_camera_drv_start(struct platform_device *dev, CDBG("%s: setting camera node %d\n", __func__, camera_node); rc = msm_device_init(pmsm, sync, camera_node); if (rc < 0) { - CDBG("%s: failed setting camera node", __func__); msm_sync_destroy(sync); kfree(pmsm); goto drv_start_failed; @@ -3454,15 +3491,16 @@ int msm_camera_drv_start(struct platform_device *dev, camera_type[camera_node] = sync->sctrl.s_camera_type; sensor_mount_angle[camera_node] = sync->sctrl.s_mount_angle; camera_node++; - if (camera_node == 1) { + + //lijing modify for high current,merged from patch CRs-Fixed: 280060,ZTE_CAM_20110810 + /*if (camera_node == 1) { rc = add_axi_qos(); if (rc < 0) { - CDBG("%s: failed add_axi_qos. rc=%d", __func__, rc); msm_sync_destroy(sync); kfree(pmsm); return rc; } - } + }*/ list_add(&sync->list, &msm_sensors); drv_start_failed: @@ -3471,7 +3509,10 @@ int msm_camera_drv_start(struct platform_device *dev, return rc; } EXPORT_SYMBOL(msm_camera_drv_start); - +/* + * LIJING_CAM_20100430 + * modified for sensor adapter(mt9t11x-socket, mt9p111-socket, and ov5642) + */ #define ENOINIT 100 /*have not power up,so don't need to power down*/ @@ -3502,7 +3543,11 @@ int msm_camera_dev_start(struct platform_device *dev, { CCRT("%s: i2c_dev_probe_on failed!\n", __func__); - + /* + * ZTE_CAM_LIJING_20100823 + * before return,release msm_camera_sensor_dev_sem, + * or it will cause dead lock. + */ up(&msm_camera_sensor_dev_sem); return -ENOINIT; @@ -3548,6 +3593,7 @@ int msm_camera_dev_start(struct platform_device *dev, up(&msm_camera_sensor_dev_sem); /* + * ZTE_CAM_LIJING_20100823 * rc < 0 :failed * rc >= 0:success */ diff --git a/drivers/media/video/msm/msm_sensorinfo.c b/drivers/media/video/msm/msm_sensorinfo.c index 109e9049..7998028d 100644 --- a/drivers/media/video/msm/msm_sensorinfo.c +++ b/drivers/media/video/msm/msm_sensorinfo.c @@ -18,7 +18,17 @@ */ /*----------------------------------------------------------------------------------------- when who what, where, why comment tag - -------- ---- ------------------------------------- --------------------------- + -------- ---- ------------------------------------- --------------------------- + 2011-02-16 wt set OV5640_MODEL_NAME ZTE_CAMERA_JIA_20100818 + 2010-09-03 jia modify MT9D113_MODEL_ID ZTE_CAMERA_JIA_20100903 + and MT9D115_MODEL_ID + 2010-09-02 jia set MT9D113_MODEL_ID ZTE_CAMERA_JIA_20100902 + and MT9D115_MODEL_ID + 2010-08-18 jia set OV5642_MODEL_ID ZTE_CAMERA_JIA_20100818 + 2010-07-06 li.jing set MT9D115_MODEL_ID ZTE_CAMERA_LIJING_20100706 + 2010-06-29 li.jing add config for MT9D115-2.0Mp-FF-Socket ZTE_CAMERA_LIJING_20100629 + 2010-06-13 lijing modify file permission LIJING_CAM_20100613 + 2010-06-10 lijing create file ------------------------------------------------------------------------------------------*/ #include @@ -118,7 +128,10 @@ static ssize_t sensorinfo_show_name(struct sys_device *dev, return snprintf(buf, PAGE_SIZE, "%s\n", sensor_name); } - +/* + * LIJING_CAM_20100613 + * modify file permission from 0400->0404 + */ static struct sysdev_attribute sensorinfo_files[] = { _SYSDEV_ATTR(id, 0404, sensorinfo_show_id, NULL), _SYSDEV_ATTR(name, 0404, sensorinfo_show_name, NULL), diff --git a/drivers/media/video/msm/msm_vfe7x.c b/drivers/media/video/msm/msm_vfe7x.c index 7c75ffb7..35ce3268 100644 --- a/drivers/media/video/msm/msm_vfe7x.c +++ b/drivers/media/video/msm/msm_vfe7x.c @@ -60,6 +60,9 @@ struct mutex vfe_lock; static void *vfe_syncdata; static uint8_t vfestopped; +//lijing modify for high current,merged from patch CRs-Fixed: 280060,ZTE_CAM_20110810 +static int cnt; + static struct stop_event stopevent; static void vfe_7x_convert(struct msm_vfe_phy_info *pinfo, @@ -196,6 +199,11 @@ static int vfe_7x_enable(struct camera_enable_cmd *enable) else if (!strcmp(enable->name, "VFETASK")) rc = msm_adsp_enable(vfe_mod); + //lijing modify for high current,merged from patch CRs-Fixed: 280060,ZTE_CAM_20110810 + if (!cnt) { + add_axi_qos(); + cnt++; + } return rc; } @@ -254,8 +262,10 @@ static void vfe_7x_release(struct platform_device *pdev) kfree(extdata); extlen = 0; - /* set back the AXI frequency to default */ - update_axi_qos(PM_QOS_DEFAULT_VALUE); + //lijing modify for high current,merged from patch CRs-Fixed: 280060,ZTE_CAM_20110810 + /* Release AXI */ + release_axi_qos(); + cnt = 0; } static int vfe_7x_init(struct msm_vfe_callback *presp, diff --git a/drivers/media/video/msm/mt9d113.h b/drivers/media/video/msm/mt9d113.h index 56b7776e..974cc37d 100644 --- a/drivers/media/video/msm/mt9d113.h +++ b/drivers/media/video/msm/mt9d113.h @@ -20,7 +20,11 @@ /*----------------------------------------------------------------------------------------- when who what, where, why comment tag -------- ---- ------------------------------------- ---------------------- - + 2011-08-09 ygl add the configurations of exposure & ZTE_YGL_CAM_20110809 + brightness + merged from mt9d115 + 2010-09-02 jia created ZTE_CAMERA_LIJING_20100902 + merged from mt9d115.h ------------------------------------------------------------------------------------------*/ #ifndef MT9D113_H @@ -88,6 +92,9 @@ struct mt9d113_reg_t { struct mt9d113_i2c_reg_conf const *lens_for_indoor_tbl; uint16_t const lens_for_indoor_tbl_sz; + + struct mt9d113_i2c_reg_conf const **brightness_exposure_tbl; + uint16_t const *brightness_exposure_tbl_sz; }; #endif /* MT9D113_H */ diff --git a/drivers/media/video/msm/mt9d113_qtech_sunny_socket.c b/drivers/media/video/msm/mt9d113_qtech_sunny_socket.c index f1d469e0..0632f02b 100644 --- a/drivers/media/video/msm/mt9d113_qtech_sunny_socket.c +++ b/drivers/media/video/msm/mt9d113_qtech_sunny_socket.c @@ -21,7 +21,24 @@ /*----------------------------------------------------------------------------------------- when who what, where, why comment tag -------- ---- ------------------------------------- ---------------------- - + 2011-08-09 ygl Adjust the configurations according ZTE_YGL_CAM_20110809 + to the value of expusure & brightness + merged from mt9d115 + 2010-12-09 jia add failure process to avoid standby ZTE_JIA_CAM_20101209 + current exception problem + 2010-12-06 jia add support for exposure compensation ZTE_CAM_JIA_20101206 + 2010-09-08 jia add exception process of i2c_del_driver ZTE_JIA_CAM_20100908 + 2010-09-07 lijing modify ISO_AUTO setting to correct ZTE_LJ_CAM_20100907 + yellowish effect; + modify process of switch between + preview and snapshot mode + 2010-09-04 lijing add support for MT9D115 and MT9D113 ZTE_LJ_CAM_20100904 + adapter + 2010-09-02 jia modify device sub ID from 0x0003 to ZTE_CAMERA_LIJING_20100902 + 0x0075 + 2010-09-02 jia add device sub ID ZTE_CAMERA_LIJING_20100902 + 2010-09-02 jia created ZTE_CAMERA_LIJING_20100902 + merged from mt9d115_qtech_sunny_socket.c ------------------------------------------------------------------------------------------*/ #include @@ -145,6 +162,11 @@ static struct mt9d113_ctrl_t *mt9d113_ctrl = NULL; * For coexistence of MT9T111, MT9T112 and MT9D113 */ static uint16_t model_id; +/* ZTE_ZT_CAM_20110107,ZTE_YGL_CAM_20110809 + * Set the global value of exposure & brightness + */ +static int8_t current_brightness = CAMERA_BRIGHTNESS_3; +static int8_t current_exposure = CAMERA_EXPOSURE_2; DECLARE_MUTEX(mt9d113_sem); @@ -523,6 +545,20 @@ static int32_t __attribute__((unused)) mt9d113_af_trigger(void) return 0; } +/* ZTE_ZT_CAM_20110107,ZTE_YGL_CAM_20110809 + * Adjust the configurations according to the value of expusure & brightness + */ +static int32_t mt9d113_set_exposure_brightness(int8_t exposure, int8_t brightness) +{ + int32_t rc = 0; + + CDBG("%s: entry: exposure=%d, brightness=%d\n", __func__, exposure, brightness); + + rc = mt9d113_i2c_write_table(mt9d113_regs.brightness_exposure_tbl[exposure*CAMERA_BRIGHTNESS_MAX+brightness], + mt9d113_regs.brightness_exposure_tbl_sz[exposure*CAMERA_BRIGHTNESS_MAX+brightness]); + + return rc; +} /* * White Balance Setting */ @@ -657,7 +693,14 @@ static int32_t mt9d113_set_brightness(int8_t brightness) int32_t rc = 0; CCRT("%s: entry: brightness=%d\n", __func__, brightness); + /* ZTE_ZT_CAM_20110107,ZTE_YGL_CAM_20110809 + * Set the global value of exposure & brightness + */ + current_brightness = brightness; + rc = mt9d113_set_exposure_brightness(current_exposure, + current_brightness); +#if 0 switch (brightness) { case CAMERA_BRIGHTNESS_0: @@ -715,7 +758,7 @@ static int32_t mt9d113_set_brightness(int8_t brightness) rc = -EFAULT; } } - +#endif return rc; } @@ -1336,45 +1379,13 @@ static long mt9d113_set_exposure_compensation(int8_t exposure) CDBG("%s: entry: exposure=%d\n", __func__, exposure); - switch(exposure) - { - case CAMERA_EXPOSURE_0: - { - //add code here - } - break; - - case CAMERA_EXPOSURE_1: - { - //add code here - } - break; - - case CAMERA_EXPOSURE_2: - { - //add code here - } - break; - - case CAMERA_EXPOSURE_3: - { - //add code here - } - break; - - case CAMERA_EXPOSURE_4: - { - //add code here - } - break; - - default: - { - CCRT("%s: parameter error!\n", __func__); - return -EFAULT; - } - } + /* ZTE_ZT_CAM_20110107,ZTE_YGL_CAM_20110809 + * Set the global value of exposure & brightness + */ + current_exposure = exposure; + rc = (int32_t)mt9d113_set_exposure_brightness(current_exposure, + current_brightness); return rc; } @@ -2601,6 +2612,13 @@ int mt9d113_sensor_probe(const struct msm_camera_sensor_info *info, */ mt9d113_init_suspend(); + /* + * add sensor configuration + * ZTE_CAM_LJ_20110413 + */ + s->s_mount_angle = 0; + s->s_camera_type = BACK_CAMERA_2D; + s->s_init = mt9d113_sensor_init; s->s_config = mt9d113_sensor_config; s->s_release = mt9d113_sensor_release; @@ -2668,7 +2686,12 @@ static void mt9d113_workqueue(struct work_struct *work) probe_failed: CCRT("%s: rc = %d, failed!\n", __func__, rc); - + /* + * ZTE_JIA_CAM_20101209 + * to avoid standby current exception problem + * + * ignore "rc" + */ msm_camera_power_backend(MSM_CAMERA_PWRDWN_MODE); return; #endif diff --git a/drivers/media/video/msm/mt9d113_reg_qtech_sunny_socket.c b/drivers/media/video/msm/mt9d113_reg_qtech_sunny_socket.c index ab70d4e9..dd8f715e 100644 --- a/drivers/media/video/msm/mt9d113_reg_qtech_sunny_socket.c +++ b/drivers/media/video/msm/mt9d113_reg_qtech_sunny_socket.c @@ -20,7 +20,19 @@ /*----------------------------------------------------------------------------------------- when who what, where, why comment tag -------- ---- ------------------------------------- ---------------------- - + 2011-07-21 lijing add rotation for racer2 ZTE_CAM_LJ_20110721 + 2010-09-21 lijing modify sensor settings for lab test ZTE_LJ_CAM_20100921 + failed for saturation + 2010-09-09 lijing update contrast,sharpness and ZTE_LJ_CAM_20100909 + saturation settings + 2010-09-07 lijing modify init, wb, and contrast and ZTE_LJ_CAM_20100907 + settings; + modify default value of brightness, + saturation, and sharpness to pass + lab test + 2010-09-04 lijing update sensor settings ZTE_LJ_CAM_20100904 + 2010-09-02 li.jing created ZTE_CAMERA_LIJING_20100902 + merged from mt9d115_reg_qtech_sunny_socket.c ------------------------------------------------------------------------------------------*/ #include "mt9d113.h" @@ -408,8 +420,15 @@ static struct mt9d113_i2c_reg_conf const prev_snap_tbl[] = { {0x0990, 0x064D, WORD_LEN, 0}, // = 1613 {0x098C, 0x2715, WORD_LEN, 0}, //Row Speed (A) {0x0990, 0x0111, WORD_LEN, 0}, // = 273 + +#if defined (CONFIG_MACH_RACER2) + {0x098C, 0x2717, WORD_LEN,0 }, // MCU_ADDRESS [MODE_SENSOR_READ_MODE_A] + {0x0990, 0x046C, WORD_LEN,0 }, // MCU_DATA_0 for vertical orientation +#else {0x098C, 0x2717, WORD_LEN, 0}, //Read Mode (A) - {0x0990, 0x046f, WORD_LEN, 0}, // = 1132 + {0x0990, 0x046F, WORD_LEN, 0}, // = 1135 +#endif + {0x098C, 0x2719, WORD_LEN, 0}, //sensor_fine_correction (A) {0x0990, 0x005A, WORD_LEN, 0}, // = 90 {0x098C, 0x271B, WORD_LEN, 0}, //sensor_fine_IT_min (A) @@ -430,8 +449,15 @@ static struct mt9d113_i2c_reg_conf const prev_snap_tbl[] = { {0x0990, 0x064B, WORD_LEN, 0}, // = 1611 {0x098C, 0x272B, WORD_LEN, 0}, //Row Speed (B) {0x0990, 0x0111, WORD_LEN, 0}, // = 273 + +#if defined (CONFIG_MACH_RACER2) + {0x098C, 0x272D, WORD_LEN,0 }, // MCU_ADDRESS [MODE_SENSOR_READ_MODE_B] + {0x0990, 0x0024, WORD_LEN,0 }, // MCU_DATA_0 for vertical orientation +#else {0x098C, 0x272D, WORD_LEN, 0}, //Read Mode (B) - {0x0990, 0x0027, WORD_LEN, 0}, // = 36 + {0x0990, 0x0027, WORD_LEN, 0}, // = 39 +#endif + {0x098C, 0x272F, WORD_LEN, 0}, //sensor_fine_correction (B) {0x0990, 0x003A, WORD_LEN, 0}, // = 58 {0x098C, 0x2731, WORD_LEN, 0}, //sensor_fine_IT_min (B) @@ -1249,6 +1275,522 @@ static uint16_t const sharpness_tbl_sz[] = { ARRAY_SIZE(sharpness_tbl_4), }; +/* ZTE_ZT_CAM_20110107,ZTE_YGL_CAM_20110511 + * The settings of exposure and brightness could be influenced by each other. + * So we should modify the configurations when the setting of exposure or + * brightness is changed. + * We can find the right configuration in the following tables if we know the + * values of exposure and brightness. + */ +//[exposure_tbl_0] +/* + * ZTE_CAM_WXL_20111008 + * fix bug of exposure invalidation + */ +static struct mt9d113_i2c_reg_conf const exposure0_brightness0_tbl[] = { + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, + {0x0990, 0x0006, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 +}; + +static struct mt9d113_i2c_reg_conf const exposure0_brightness1_tbl[] = { + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, + {0x0990, 0x0010, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 +}; + +static struct mt9d113_i2c_reg_conf const exposure0_brightness2_tbl[] = { + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, + {0x0990, 0x001A, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 +}; + +static struct mt9d113_i2c_reg_conf const exposure0_brightness3_tbl[] = { + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, + {0x0990, 0x0023, WORD_LEN, 0}, + + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 +}; + +static struct mt9d113_i2c_reg_conf const exposure0_brightness4_tbl[] = { + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, + {0x0990, 0x002B, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 +}; + +static struct mt9d113_i2c_reg_conf const exposure0_brightness5_tbl[] = { + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, + {0x0990, 0x0038, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 +}; + +static struct mt9d113_i2c_reg_conf const exposure0_brightness6_tbl[] = { + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, + {0x0990, 0x0048, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 +}; + +//[exposure_tbl_1] +static struct mt9d113_i2c_reg_conf const exposure1_brightness0_tbl[] = { + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, + {0x0990, 0x000A, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 +}; + +static struct mt9d113_i2c_reg_conf const exposure1_brightness1_tbl[] = { + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, + {0x0990, 0x0019, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 +}; + +static struct mt9d113_i2c_reg_conf const exposure1_brightness2_tbl[] = { + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, + {0x0990, 0x0028, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 +}; + +static struct mt9d113_i2c_reg_conf const exposure1_brightness3_tbl[] = { + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, + {0x0990, 0x0034, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 +}; + +static struct mt9d113_i2c_reg_conf const exposure1_brightness4_tbl[] = { + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, + {0x0990, 0x0040, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 +}; + +static struct mt9d113_i2c_reg_conf const exposure1_brightness5_tbl[] = { + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, + {0x0990, 0x0054, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 +}; + +static struct mt9d113_i2c_reg_conf const exposure1_brightness6_tbl[] = { + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, + {0x0990, 0x006C, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 +}; + +//[exposure_tbl_2] +static struct mt9d113_i2c_reg_conf const exposure2_brightness0_tbl[] = { + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, + {0x0990, 0x0010, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 +}; + +static struct mt9d113_i2c_reg_conf const exposure2_brightness1_tbl[] = { + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, + {0x0990, 0x0022, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 +}; + +static struct mt9d113_i2c_reg_conf const exposure2_brightness2_tbl[] = { + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, + {0x0990, 0x0036, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 +}; + +static struct mt9d113_i2c_reg_conf const exposure2_brightness3_tbl[] = { + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, + {0x0990, 0x0046, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 +}; + +static struct mt9d113_i2c_reg_conf const exposure2_brightness4_tbl[] = { + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, + {0x0990, 0x0056, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 +}; + +static struct mt9d113_i2c_reg_conf const exposure2_brightness5_tbl[] = { + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, + {0x0990, 0x0070, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 +}; + +static struct mt9d113_i2c_reg_conf const exposure2_brightness6_tbl[] = { + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, + {0x0990, 0x0090, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 +}; + +//[exposure_tbl_3] +static struct mt9d113_i2c_reg_conf const exposure3_brightness0_tbl[] = { + //{0x337E, 0x1800, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0018, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0018, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, + {0x0990, 0x0010, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 +}; + +static struct mt9d113_i2c_reg_conf const exposure3_brightness1_tbl[] = { + //{0x337E, 0x1800, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0018, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0018, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, + {0x0990, 0x0022, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 +}; + +static struct mt9d113_i2c_reg_conf const exposure3_brightness2_tbl[] = { + //{0x337E, 0x1800, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0018, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0018, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, + {0x0990, 0x0036, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 +}; + +static struct mt9d113_i2c_reg_conf const exposure3_brightness3_tbl[] = { + //{0x337E, 0x1800, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0018, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0018, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, + {0x0990, 0x0046, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 +}; + +static struct mt9d113_i2c_reg_conf const exposure3_brightness4_tbl[] = { + //{0x337E, 0x1800, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0018, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0018, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, + {0x0990, 0x0056, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 +}; + +static struct mt9d113_i2c_reg_conf const exposure3_brightness5_tbl[] = { + //{0x337E, 0x1800, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0018, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0018, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, + {0x0990, 0x0070, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 +}; + +static struct mt9d113_i2c_reg_conf const exposure3_brightness6_tbl[] = { + //{0x337E, 0x1800, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0018, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0018, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, + {0x0990, 0x0090, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 +}; + +//[exposure_tbl_4] +static struct mt9d113_i2c_reg_conf const exposure4_brightness0_tbl[] = { + //{0x337E, 0x3000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0030, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0030, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, + {0x0990, 0x0010, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 +}; + +static struct mt9d113_i2c_reg_conf const exposure4_brightness1_tbl[] = { + //{0x337E, 0x3000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0030, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0030, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, + {0x0990, 0x0022, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 +}; + +static struct mt9d113_i2c_reg_conf const exposure4_brightness2_tbl[] = { + //{0x337E, 0x3000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0030, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0030, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, + {0x0990, 0x0036, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 +}; + +static struct mt9d113_i2c_reg_conf const exposure4_brightness3_tbl[] = { + //{0x337E, 0x3000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0030, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0030, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, + {0x0990, 0x0046, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 +}; + +static struct mt9d113_i2c_reg_conf const exposure4_brightness4_tbl[] = { + //{0x337E, 0x3000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0030, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0030, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, + {0x0990, 0x0056, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 +}; + +static struct mt9d113_i2c_reg_conf const exposure4_brightness5_tbl[] = { + //{0x337E, 0x3000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0030, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0030, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, + {0x0990, 0x0070, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 +}; + +static struct mt9d113_i2c_reg_conf const exposure4_brightness6_tbl[] = { + //{0x337E, 0x3000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0030, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0030, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, + {0x0990, 0x0090, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 +}; + +static struct mt9d113_i2c_reg_conf const *brightness_exposure_tbl[] = { + exposure0_brightness0_tbl, + exposure0_brightness1_tbl, + exposure0_brightness2_tbl, + exposure0_brightness3_tbl, + exposure0_brightness4_tbl, + exposure0_brightness5_tbl, + exposure0_brightness6_tbl, + + exposure1_brightness0_tbl, + exposure1_brightness1_tbl, + exposure1_brightness2_tbl, + exposure1_brightness3_tbl, + exposure1_brightness4_tbl, + exposure1_brightness5_tbl, + exposure1_brightness6_tbl, + + exposure2_brightness0_tbl, + exposure2_brightness1_tbl, + exposure2_brightness2_tbl, + exposure2_brightness3_tbl, + exposure2_brightness4_tbl, + exposure2_brightness5_tbl, + exposure2_brightness6_tbl, + + exposure3_brightness0_tbl, + exposure3_brightness1_tbl, + exposure3_brightness2_tbl, + exposure3_brightness3_tbl, + exposure3_brightness4_tbl, + exposure3_brightness5_tbl, + exposure3_brightness6_tbl, + + exposure4_brightness0_tbl, + exposure4_brightness1_tbl, + exposure4_brightness2_tbl, + exposure4_brightness3_tbl, + exposure4_brightness4_tbl, + exposure4_brightness5_tbl, + exposure4_brightness6_tbl, +}; + +static uint16_t const brightness_exposure_tbl_sz[] = { + ARRAY_SIZE(exposure0_brightness0_tbl), + ARRAY_SIZE(exposure0_brightness1_tbl), + ARRAY_SIZE(exposure0_brightness2_tbl), + ARRAY_SIZE(exposure0_brightness3_tbl), + ARRAY_SIZE(exposure0_brightness4_tbl), + ARRAY_SIZE(exposure0_brightness5_tbl), + ARRAY_SIZE(exposure0_brightness6_tbl), + ARRAY_SIZE(exposure1_brightness0_tbl), + ARRAY_SIZE(exposure1_brightness1_tbl), + ARRAY_SIZE(exposure1_brightness2_tbl), + ARRAY_SIZE(exposure1_brightness3_tbl), + ARRAY_SIZE(exposure1_brightness4_tbl), + ARRAY_SIZE(exposure1_brightness5_tbl), + ARRAY_SIZE(exposure1_brightness6_tbl), + ARRAY_SIZE(exposure2_brightness0_tbl), + ARRAY_SIZE(exposure2_brightness1_tbl), + ARRAY_SIZE(exposure2_brightness2_tbl), + ARRAY_SIZE(exposure2_brightness3_tbl), + ARRAY_SIZE(exposure2_brightness4_tbl), + ARRAY_SIZE(exposure2_brightness5_tbl), + ARRAY_SIZE(exposure2_brightness6_tbl), + ARRAY_SIZE(exposure3_brightness0_tbl), + ARRAY_SIZE(exposure3_brightness1_tbl), + ARRAY_SIZE(exposure3_brightness2_tbl), + ARRAY_SIZE(exposure3_brightness3_tbl), + ARRAY_SIZE(exposure3_brightness4_tbl), + ARRAY_SIZE(exposure3_brightness5_tbl), + ARRAY_SIZE(exposure3_brightness6_tbl), + ARRAY_SIZE(exposure4_brightness0_tbl), + ARRAY_SIZE(exposure4_brightness1_tbl), + ARRAY_SIZE(exposure4_brightness2_tbl), + ARRAY_SIZE(exposure4_brightness3_tbl), + ARRAY_SIZE(exposure4_brightness4_tbl), + ARRAY_SIZE(exposure4_brightness5_tbl), + ARRAY_SIZE(exposure4_brightness6_tbl), +}; struct mt9d113_reg_t mt9d113_regs = { .pll_tbl = pll_tbl, .pll_tbl_sz = ARRAY_SIZE(pll_tbl), @@ -1285,4 +1827,6 @@ struct mt9d113_reg_t mt9d113_regs = { .sharpness_tbl = sharpness_tbl, .sharpness_tbl_sz = sharpness_tbl_sz, + .brightness_exposure_tbl = brightness_exposure_tbl, + .brightness_exposure_tbl_sz = brightness_exposure_tbl_sz, }; diff --git a/drivers/media/video/msm/mt9d115.h b/drivers/media/video/msm/mt9d115.h index 46e04887..9d1b4575 100644 --- a/drivers/media/video/msm/mt9d115.h +++ b/drivers/media/video/msm/mt9d115.h @@ -20,6 +20,9 @@ /*----------------------------------------------------------------------------------------- when who what, where, why comment tag -------- ---- ------------------------------------- ---------------------- + 2010-07-28 jia.jia merged from v5330 ZTE_JIA_CAM_20100728 + 2010-07-23 li.jing update sensor settings ZTE_LJ_CAM_20100723 + 2010-06-29 li.jing created ZTE_CAMERA_LIJING_20100629 ------------------------------------------------------------------------------------------*/ #ifndef MT9D115_H diff --git a/drivers/media/video/msm/mt9d115_qtech_sunny_fpc.c b/drivers/media/video/msm/mt9d115_qtech_sunny_fpc.c index 553a3608..2d352876 100644 --- a/drivers/media/video/msm/mt9d115_qtech_sunny_fpc.c +++ b/drivers/media/video/msm/mt9d115_qtech_sunny_fpc.c @@ -21,7 +21,17 @@ /*----------------------------------------------------------------------------------------- when who what, where, why comment tag -------- ---- ------------------------------------- ---------------------- - + 2011-06-24 wangtao add sensor for 727d40 ZTE_CAM_WT_20110706 + 2011-06-24 lijing optimize adaptor flow ZTE_CAM_LJ_20110624 + 2010-12-09 jia add failure process to avoid standby ZTE_JIA_CAM_20101209 + current exception problem + 2010-12-06 jia add support for exposure compensation ZTE_CAM_JIA_20101206 + 2010-09-08 jia add exception process of i2c_del_driver ZTE_JIA_CAM_20100908 + 2010-08-04 li.jing update ISO settings ZTE_LJ_CAM_20100804 + 2010-07-23 li.jing update sensor settings ZTE_LJ_CAM_20100723 + 2010-07-05 li.jing update sensor reg settings ZTE_CAM_LIJING_20100705 + set MCLK and MT9D115_MODEL_ID + 2010-06-29 li.jing created ZTE_CAMERA_LIJING_20100629 ------------------------------------------------------------------------------------------*/ #include @@ -1392,6 +1402,10 @@ static long mt9d115_set_sensor_mode(int32_t mode) { long rc = 0; + uint16_t status = 0; + + int i = 0; + CDBG("%s: entry\n", __func__); switch (mode) @@ -1421,17 +1435,51 @@ static long mt9d115_set_sensor_mode(int32_t mode) { return rc; } + for(i = 0;i < 30;i++) { + rc = mt9d115_i2c_write(mt9d115_client->addr, 0x098C, 0xA104, WORD_LEN); + if (rc < 0) + { + return rc; + } - /* - * To improve efficiency of switch between preview and snapshot mode, - * decrease time delay from 200ms to 80ms - * - * Attention: - * The process of time delay should be set after process of setting - * manual mode for autofocus in order to avoid display exception during - * sensor initialization. - */ - mdelay(80); + rc = mt9d115_i2c_read(mt9d115_client->addr, 0x0990, &status, WORD_LEN); + if (rc < 0) + { + return rc; + } + if(0x03 == status){ + pr_err("read preview status successfully,i=%d\n",i); + break; + } + else if (29 == i) { + pr_err("read preview status fail,i=%d,status=0x%x\n",i,status); + rc = mt9d115_i2c_write(mt9d115_client->addr, 0x098C, 0xA115, WORD_LEN); + if (rc < 0) + { + return rc; + } + + rc = mt9d115_i2c_write(mt9d115_client->addr, 0x0990, 0x0000, WORD_LEN); + if (rc < 0) + { + return rc; + } + + rc = mt9d115_i2c_write(mt9d115_client->addr, 0x098C, 0xA103, WORD_LEN); + if (rc < 0) + { + return rc; + } + + rc = mt9d115_i2c_write(mt9d115_client->addr, 0x0990, 0x0001, WORD_LEN); + if (rc < 0) + { + return rc; + } + msleep(150); + } + msleep(7); + } } break; @@ -1460,6 +1508,51 @@ static long mt9d115_set_sensor_mode(int32_t mode) { return rc; } + for(i = 0;i < 30;i++) { + rc = mt9d115_i2c_write(mt9d115_client->addr, 0x098C, 0xA104, WORD_LEN); + if (rc < 0) + { + return rc; + } + + rc = mt9d115_i2c_read(mt9d115_client->addr, 0x0990, &status, WORD_LEN); + if (rc < 0) + { + return rc; + } + if(0x07 == status){ + pr_err("read snapshot status successfully,i=%d\n",i); + break; + } + else if (29 == i) { + pr_err("read snapshot status fail,i=%d,status=0x%x\n",i,status); + rc = mt9d115_i2c_write(mt9d115_client->addr, 0x098C, 0xA115, WORD_LEN); + if (rc < 0) + { + return rc; + } + + rc = mt9d115_i2c_write(mt9d115_client->addr, 0x0990, 0x0002, WORD_LEN); + if (rc < 0) + { + return rc; + } + + rc = mt9d115_i2c_write(mt9d115_client->addr, 0x098C, 0xA103, WORD_LEN); + if (rc < 0) + { + return rc; + } + + rc = mt9d115_i2c_write(mt9d115_client->addr, 0x0990, 0x0002, WORD_LEN); + if (rc < 0) + { + return rc; + } + msleep(150); + } + msleep(7); + } /* * To improve efficiency of switch between preview and snapshot mode, @@ -2659,7 +2752,12 @@ static void mt9d115_workqueue(struct work_struct *work) probe_failed: CCRT("%s: rc = %d, failed!\n", __func__, rc); - + /* + * ZTE_JIA_CAM_20101209 + * to avoid standby current exception problem + * + * ignore "rc" + */ if(rc != -ENOINIT){ pr_err("%s: rc != -ENOINIT\n", __func__); msm_camera_power_backend(MSM_CAMERA_PWRDWN_MODE); diff --git a/drivers/media/video/msm/mt9d115_qtech_sunny_socket.c b/drivers/media/video/msm/mt9d115_qtech_sunny_socket.c index f88de1c9..c7385e03 100644 --- a/drivers/media/video/msm/mt9d115_qtech_sunny_socket.c +++ b/drivers/media/video/msm/mt9d115_qtech_sunny_socket.c @@ -21,6 +21,30 @@ /*----------------------------------------------------------------------------------------- when who what, where, why comment tag -------- ---- ------------------------------------- ---------------------- + 2011-01-07 zt add the configurations of exposure & ZTE_ZT_CAM_20110107 + brightness + 2010-12-09 jia add failure process to avoid standby ZTE_JIA_CAM_20101209 + current exception problem + 2010-12-06 jia add support for exposure compensation ZTE_CAM_JIA_20101206 + 2010-09-08 jia add exception process of i2c_del_driver ZTE_JIA_CAM_20100908 + 2010-09-07 lijing modify ISO_AUTO setting to correct ZTE_LJ_CAM_20100907 + yellowish effect; + modify antibanding setting; + modify process of switch between + preview and snapshot mode + 2010-09-04 lijing add support for MT9D115 and MT9D113 ZTE_LJ_CAM_20100904 + adapter + 2010-09-02 jia modify device sub ID from 0x0011 to ZTE_CAMERA_LIJING_20100902 + 0x003F + 2010-09-02 jia add device sub ID ZTE_CAMERA_LIJING_20100902 + 2010-08-30 zt modified the ISOAUTO configuration ZTE_ZT_CAM_20100830 + 2010-08-20 jia.jia modified for support for ZTE_LJ_CAM_20100820 + CONFIG_SENSOR_ADAPTER + 2010-08-04 li.jing update ISO settings ZTE_LJ_CAM_20100804 + 2010-07-23 li.jing update sensor settings ZTE_LJ_CAM_20100723 + 2010-07-05 li.jing update sensor reg settings ZTE_CAM_LIJING_20100705 + set MCLK and MT9D115_MODEL_ID + 2010-06-29 li.jing created ZTE_CAMERA_LIJING_20100629 ------------------------------------------------------------------------------------------*/ #include @@ -144,7 +168,9 @@ static struct mt9d115_ctrl_t *mt9d115_ctrl = NULL; * For coexistence of MT9T111, MT9T112 and MT9D115 */ static uint16_t model_id; - +/* ZTE_ZT_CAM_20110107 + * Set the global value of exposure & brightness + */ static int8_t current_brightness = CAMERA_BRIGHTNESS_3; static int8_t current_exposure = CAMERA_EXPOSURE_2; @@ -525,7 +551,9 @@ static int32_t __attribute__((unused)) mt9d115_af_trigger(void) return 0; } - +/* ZTE_ZT_CAM_20110107 + * Adjust the configurations according to the value of expusure & brightness + */ static int32_t mt9d115_set_exposure_brightness(int8_t exposure, int8_t brightness) { int32_t rc = 0; @@ -2557,6 +2585,13 @@ int mt9d115_sensor_probe(const struct msm_camera_sensor_info *info, */ mt9d115_init_suspend(); + /* + * add sensor configuration + * ZTE_CAM_LJ_20110413 + */ + s->s_mount_angle = 0; + s->s_camera_type = BACK_CAMERA_2D; + s->s_init = mt9d115_sensor_init; s->s_config = mt9d115_sensor_config; s->s_release = mt9d115_sensor_release; @@ -2624,7 +2659,12 @@ static void mt9d115_workqueue(struct work_struct *work) probe_failed: CCRT("%s: rc = %d, failed!\n", __func__, rc); - + /* + * ZTE_JIA_CAM_20101209 + * to avoid standby current exception problem + * + * ignore "rc" + */ msm_camera_power_backend(MSM_CAMERA_PWRDWN_MODE); return; #endif diff --git a/drivers/media/video/msm/mt9d115_reg_qtech_sunny_fpc.c b/drivers/media/video/msm/mt9d115_reg_qtech_sunny_fpc.c index 0e14804b..813e276c 100644 --- a/drivers/media/video/msm/mt9d115_reg_qtech_sunny_fpc.c +++ b/drivers/media/video/msm/mt9d115_reg_qtech_sunny_fpc.c @@ -20,6 +20,21 @@ /*----------------------------------------------------------------------------------------- when who what, where, why comment tag -------- ---- ------------------------------------- ---------------------- + 2011-10-26 lijing update camera params ZTE_CAM_LJ_20111026 + 2011-09-29 lijing fix bug of exposure invalidation ZTE_CAM_LJ_20110929 + 2011-09-19 lijing update params for de-noise ZTE_CAM_LJ_20110919 + 2011-07-19 lijing modify gamma setting ZTE_CAM_LJ_20110719 + 2011-05-30 ygl removed the modification for 736T, ZTE_YGL_CAM_20110530 + otherwise the preview is exception + 2011-03-21 ygl fixed the execption of the display ZTE_YGL_CAM_20110321 + 2010-08-06 li.jing update reg settings to fix bug of ZTE_LJ_CAM_20100806 + orientation error and decrease AE's + time latency + 2010-07-23 li.jing update sensor settings ZTE_LJ_CAM_20100723 + 2010-07-21 jia remove setting of "lens_for_indoor_tbl" ZTE_CAM_JIA_20100721 + and "lens_for_outdoor_tbl" + 2010-07-05 li.jing update sensor reg settings ZTE_CAM_LIJING_20100705 + 2010-06-29 li.jing created ZTE_CAMERA_LIJING_20100629 ------------------------------------------------------------------------------------------*/ #include "mt9d115.h" @@ -387,6 +402,8 @@ static struct mt9d115_i2c_reg_conf const prev_snap_tbl[] = { {0x098C, 0xA005, WORD_LEN, 0}, // MCU_ADDRESS [MON_CMD] {0x0990, 0x0001, WORD_LEN, 200}, // MCU_DATA_0 +//ZTE_CAM_LJ_20111026 +#if 0 {0x364E, 0x0770, WORD_LEN, 0}, // P_GR_P0Q0 {0x3650, 0xD48A, WORD_LEN, 0}, // P_GR_P0Q1 {0x3652, 0x4E71, WORD_LEN, 0}, // P_GR_P0Q2 @@ -490,6 +507,112 @@ static struct mt9d115_i2c_reg_conf const prev_snap_tbl[] = { {0x3644, 0x0338, WORD_LEN, 0}, // POLY_ORIGIN_C {0x3642, 0x0240, WORD_LEN, 0}, // POLY_ORIGIN_R {0x3210, 0x01B8, WORD_LEN, 0}, // COLOR_PIPELINE_CONTROL +#else + {0x3210, 0x01B0, WORD_LEN,0}, // COLOR_PIPELINE_CONTROL + {0x364E, 0x03F0, WORD_LEN,0}, // P_GR_P0Q0 + {0x3650, 0x6789, WORD_LEN,0}, // P_GR_P0Q1 + {0x3652, 0x5AB1, WORD_LEN,0}, // P_GR_P0Q2 + {0x3654, 0x0D50, WORD_LEN,0}, // P_GR_P0Q3 + {0x3656, 0xAF32, WORD_LEN,0}, // P_GR_P0Q4 + {0x3658, 0x7F2F, WORD_LEN,0}, // P_RD_P0Q0 + {0x365A, 0xB7EA, WORD_LEN,0}, // P_RD_P0Q1 + {0x365C, 0x6031, WORD_LEN,0}, // P_RD_P0Q2 + {0x365E, 0x3650, WORD_LEN,0}, // P_RD_P0Q3 + {0x3660, 0x82F2, WORD_LEN,0}, // P_RD_P0Q4 + {0x3662, 0x7F8F, WORD_LEN,0}, // P_BL_P0Q0 + {0x3664, 0x974A, WORD_LEN,0}, // P_BL_P0Q1 + {0x3666, 0x60D1, WORD_LEN,0}, // P_BL_P0Q2 + {0x3668, 0x2DD0, WORD_LEN,0}, // P_BL_P0Q3 + {0x366A, 0xF9D2, WORD_LEN,0}, // P_BL_P0Q4 + {0x366C, 0x7F0F, WORD_LEN,0}, // P_GB_P0Q0 + {0x366E, 0x9D48, WORD_LEN,0}, // P_GB_P0Q1 + {0x3670, 0x5BF1, WORD_LEN,0}, // P_GB_P0Q2 + {0x3672, 0x0850, WORD_LEN,0}, // P_GB_P0Q3 + {0x3674, 0xAAB2, WORD_LEN,0}, // P_GB_P0Q4 + {0x3676, 0x5B0A, WORD_LEN,0}, // P_GR_P1Q0 + {0x3678, 0x8390, WORD_LEN,0}, // P_GR_P1Q1 + {0x367A, 0x84F0, WORD_LEN,0}, // P_GR_P1Q2 + {0x367C, 0x3A51, WORD_LEN,0}, // P_GR_P1Q3 + {0x367E, 0x2DD1, WORD_LEN,0}, // P_GR_P1Q4 + {0x3680, 0x10EC, WORD_LEN,0}, // P_RD_P1Q0 + {0x3682, 0x38EF, WORD_LEN,0}, // P_RD_P1Q1 + {0x3684, 0x3B8E, WORD_LEN,0}, // P_RD_P1Q2 + {0x3686, 0xF271, WORD_LEN,0}, // P_RD_P1Q3 + {0x3688, 0xD131, WORD_LEN,0}, // P_RD_P1Q4 + {0x368A, 0xF34C, WORD_LEN,0}, // P_BL_P1Q0 + {0x368C, 0xD60F, WORD_LEN,0}, // P_BL_P1Q1 + {0x368E, 0x8710, WORD_LEN,0}, // P_BL_P1Q2 + {0x3690, 0x0C52, WORD_LEN,0}, // P_BL_P1Q3 + {0x3692, 0xC550, WORD_LEN,0}, // P_BL_P1Q4 + {0x3694, 0x888D, WORD_LEN,0}, // P_GB_P1Q0 + {0x3696, 0x0DF0, WORD_LEN,0}, // P_GB_P1Q1 + {0x3698, 0x558D, WORD_LEN,0}, // P_GB_P1Q2 + {0x369A, 0xBF72, WORD_LEN,0}, // P_GB_P1Q3 + {0x369C, 0x8D4D, WORD_LEN,0}, // P_GB_P1Q4 + {0x369E, 0x7BF2, WORD_LEN,0}, // P_GR_P2Q0 + {0x36A0, 0x7D30, WORD_LEN,0}, // P_GR_P2Q1 + {0x36A2, 0x97D4, WORD_LEN,0}, // P_GR_P2Q2 + {0x36A4, 0x2ED1, WORD_LEN,0}, // P_GR_P2Q3 + {0x36A6, 0x8CD2, WORD_LEN,0}, // P_GR_P2Q4 + {0x36A8, 0x5D52, WORD_LEN,0}, // P_RD_P2Q0 + {0x36AA, 0x6510, WORD_LEN,0}, // P_RD_P2Q1 + {0x36AC, 0xBC52, WORD_LEN,0}, // P_RD_P2Q2 + {0x36AE, 0x9F6F, WORD_LEN,0}, // P_RD_P2Q3 + {0x36B0, 0xCF15, WORD_LEN,0}, // P_RD_P2Q4 + {0x36B2, 0x4C92, WORD_LEN,0}, // P_BL_P2Q0 + {0x36B4, 0x3A90, WORD_LEN,0}, // P_BL_P2Q1 + {0x36B6, 0x9A34, WORD_LEN,0}, // P_BL_P2Q2 + {0x36B8, 0x4091, WORD_LEN,0}, // P_BL_P2Q3 + {0x36BA, 0x6513, WORD_LEN,0}, // P_BL_P2Q4 + {0x36BC, 0x7DD2, WORD_LEN,0}, // P_GB_P2Q0 + {0x36BE, 0x5030, WORD_LEN,0}, // P_GB_P2Q1 + {0x36C0, 0x8CD4, WORD_LEN,0}, // P_GB_P2Q2 + {0x36C2, 0x1892, WORD_LEN,0}, // P_GB_P2Q3 + {0x36C4, 0xAD14, WORD_LEN,0}, // P_GB_P2Q4 + {0x36C6, 0xC651, WORD_LEN,0}, // P_GR_P3Q0 + {0x36C8, 0x0751, WORD_LEN,0}, // P_GR_P3Q1 + {0x36CA, 0xC190, WORD_LEN,0}, // P_GR_P3Q2 + {0x36CC, 0x33CC, WORD_LEN,0}, // P_GR_P3Q3 + {0x36CE, 0x1456, WORD_LEN,0}, // P_GR_P3Q4 + {0x36D0, 0xBEB0, WORD_LEN,0}, // P_RD_P3Q0 + {0x36D2, 0x8712, WORD_LEN,0}, // P_RD_P3Q1 + {0x36D4, 0x1911, WORD_LEN,0}, // P_RD_P3Q2 + {0x36D6, 0x53D3, WORD_LEN,0}, // P_RD_P3Q3 + {0x36D8, 0x0A91, WORD_LEN,0}, // P_RD_P3Q4 + {0x36DA, 0x9CAF, WORD_LEN,0}, // P_BL_P3Q0 + {0x36DC, 0x22D1, WORD_LEN,0}, // P_BL_P3Q1 + {0x36DE, 0x8E12, WORD_LEN,0}, // P_BL_P3Q2 + {0x36E0, 0xA792, WORD_LEN,0}, // P_BL_P3Q3 + {0x36E2, 0x4F55, WORD_LEN,0}, // P_BL_P3Q4 + {0x36E4, 0xA4F1, WORD_LEN,0}, // P_GB_P3Q0 + {0x36E6, 0x9FB2, WORD_LEN,0}, // P_GB_P3Q1 + {0x36E8, 0xF551, WORD_LEN,0}, // P_GB_P3Q2 + {0x36EA, 0x8EB2, WORD_LEN,0}, // P_GB_P3Q3 + {0x36EC, 0x1BB6, WORD_LEN,0}, // P_GB_P3Q4 + {0x36EE, 0xDC94, WORD_LEN,0}, // P_GR_P4Q0 + {0x36F0, 0x4ED3, WORD_LEN,0}, // P_GR_P4Q1 + {0x36F2, 0xA197, WORD_LEN,0}, // P_GR_P4Q2 + {0x36F4, 0xEA77, WORD_LEN,0}, // P_GR_P4Q3 + {0x36F6, 0x401A, WORD_LEN,0}, // P_GR_P4Q4 + {0x36F8, 0xC553, WORD_LEN,0}, // P_RD_P4Q0 + {0x36FA, 0x33F2, WORD_LEN,0}, // P_RD_P4Q1 + {0x36FC, 0xB5B7, WORD_LEN,0}, // P_RD_P4Q2 + {0x36FE, 0xF0B6, WORD_LEN,0}, // P_RD_P4Q3 + {0x3700, 0x0E3A, WORD_LEN,0}, // P_RD_P4Q4 + {0x3702, 0x80D4, WORD_LEN,0}, // P_BL_P4Q0 + {0x3704, 0x7673, WORD_LEN,0}, // P_BL_P4Q1 + {0x3706, 0xDF16, WORD_LEN,0}, // P_BL_P4Q2 + {0x3708, 0x8138, WORD_LEN,0}, // P_BL_P4Q3 + {0x370A, 0x177A, WORD_LEN,0}, // P_BL_P4Q4 + {0x370C, 0xDCD4, WORD_LEN,0}, // P_GB_P4Q0 + {0x370E, 0x2113, WORD_LEN,0}, // P_GB_P4Q1 + {0x3710, 0xB0D7, WORD_LEN,0}, // P_GB_P4Q2 + {0x3712, 0xD3B7, WORD_LEN,0}, // P_GB_P4Q3 + {0x3714, 0x49BA, WORD_LEN,0}, // P_GB_P4Q4 + {0x3644, 0x02E0, WORD_LEN,0}, // POLY_ORIGIN_C + {0x3642, 0x0264, WORD_LEN,0}, // POLY_ORIGIN_R + {0x3210, 0x01B8, WORD_LEN,0}, // COLOR_PIPELINE_CONTROL +#endif {0x321C, 0x0003, WORD_LEN, 0}, //By Pass TxFIFO = 3 {0x098C, 0x2703, WORD_LEN, 0}, //Output Width (A) @@ -511,8 +634,11 @@ static struct mt9d115_i2c_reg_conf const prev_snap_tbl[] = { {0x098C, 0x2715, WORD_LEN, 0}, //Row Speed (A) {0x0990, 0x0111, WORD_LEN, 0}, // = 273 - -#if defined(CONFIG_MACH_TURIES) + /* + * Setting for snapshot rotation + * ZTE_YGL_CAM_20110321 + */ +#if defined(CONFIG_MACH_TURIES) || defined(CONFIG_MACH_SKATE) {0x098C, 0x2717, WORD_LEN,0 }, // MCU_ADDRESS [MODE_SENSOR_READ_MODE_A] {0x0990, 0x046C, WORD_LEN,0 }, // MCU_DATA_0 for vertical orientation #else @@ -541,8 +667,11 @@ static struct mt9d115_i2c_reg_conf const prev_snap_tbl[] = { {0x098C, 0x272B, WORD_LEN, 0}, //Row Speed (B) {0x0990, 0x0111, WORD_LEN, 0}, // = 273 - -#if defined(CONFIG_MACH_TURIES) + /* + * Setting for snapshot rotation + * ZTE_YGL_CAM_20110321 + */ +#if defined(CONFIG_MACH_TURIES) || defined(CONFIG_MACH_SKATE) {0x098C, 0x272D, WORD_LEN,0 }, // MCU_ADDRESS [MODE_SENSOR_READ_MODE_B] {0x0990, 0x0024, WORD_LEN,0 }, // MCU_DATA_0 for vertical orientation #else @@ -672,6 +801,12 @@ static struct mt9d115_i2c_reg_conf const prev_snap_tbl[] = { {0x0990, 0x00FA, WORD_LEN, 0}, // MCU_DATA_0 {0x098C, 0xAB61, WORD_LEN, 0}, // MCU_ADDRESS [HG_GAMMA_TABLE_B_18] {0x0990, 0x00FF, WORD_LEN, 0}, // MCU_DATA_0 + +/* + * ZTE_CAM_LJ_20110719 + */ +//ZTE_CAM_LJ_20111026 +#if 1 {0x098C, 0xAB3C, WORD_LEN, 0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_0] {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 {0x098C, 0xAB3D, WORD_LEN, 0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_1] @@ -710,7 +845,83 @@ static struct mt9d115_i2c_reg_conf const prev_snap_tbl[] = { {0x0990, 0x00FA, WORD_LEN, 0}, // MCU_DATA_0 {0x098C, 0xAB4E, WORD_LEN, 0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_18] {0x0990, 0x00FF, WORD_LEN, 0}, // MCU_DATA_0 - +#else +//[Gamma 0.5] + {0x098C, 0xAB3C, WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_0] + {0x0990, 0x0000, WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB3D, WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_1] + {0x0990, 0x0008, WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB3E, WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_2] + {0x0990, 0x0016, WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB3F, WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_3] + {0x0990, 0x002C, WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB40, WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_4] + {0x0990, 0x004A, WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB41, WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_5] + {0x0990, 0x0063, WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB42, WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_6] + {0x0990, 0x007A, WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB43, WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_7] + {0x0990, 0x008F, WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB44, WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_8] + {0x0990, 0x00A0, WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB45, WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_9] + {0x0990, 0x00AF, WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB46, WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_10] + {0x0990, 0x00BC, WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB47, WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_11] + {0x0990, 0x00C8, WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB48, WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_12] + {0x0990, 0x00D2, WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB49, WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_13] + {0x0990, 0x00DB, WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB4A, WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_14] + {0x0990, 0x00E3, WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB4B, WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_15] + {0x0990, 0x00EB, WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB4C, WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_16] + {0x0990, 0x00F2, WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB4D, WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_17] + {0x0990, 0x00F9, WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB4E, WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_18] + {0x0990, 0x00FF, WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xA103, WORD_LEN,0}, // MCU_ADDRESS [SEQ_CMD] + {0x0990, 0x0005, WORD_LEN,0}, // MCU_DATA_0 +#endif + /* + * ZTE_CAM_LJ_20110919 + * update params for de-noise + */ + //ZTE_CAM_LJ_20111026 +//#if defined(CONFIG_MACH_TURIES) || defined(CONFIG_MACH_ROAMER) + {0x098C, 0xAB2C, WORD_LEN, 0}, // MCU_ADDRESS [HG_NR_START_R] + {0x0990, 0x0001, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xAB2D, WORD_LEN, 0}, // MCU_ADDRESS [HG_NR_START_G] + {0x0990, 0x0001, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xAB2E, WORD_LEN, 0}, // MCU_ADDRESS [HG_NR_START_B] + {0x0990, 0x0001, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xAB2F, WORD_LEN, 0}, // MCU_ADDRESS [HG_NR_START_OL] + {0x0990, 0x0001, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xAB30, WORD_LEN, 0}, // MCU_ADDRESS [HG_NR_STOP_R] + {0x0990, 0x001E, WORD_LEN, 0}, // MCU_DATA_0 //0X001E 20111024 + {0x098C, 0xAB31, WORD_LEN, 0}, // MCU_ADDRESS [HG_NR_STOP_G] + {0x0990, 0x001E, WORD_LEN, 0}, // MCU_DATA_0 //0X001E 20111024 + {0x098C, 0xAB32, WORD_LEN, 0}, // MCU_ADDRESS [HG_NR_STOP_B] + {0x0990, 0x001E, WORD_LEN, 0}, // MCU_DATA_0 //0X001E 20111024 + {0x098C, 0xAB33, WORD_LEN, 0}, // MCU_ADDRESS [HG_NR_STOP_OL] + {0x0990, 0x001E, WORD_LEN, 0}, // MCU_DATA_0 //0X001E 20111024 + {0x098C, 0xAB34, WORD_LEN, 0}, // MCU_ADDRESS [HG_NR_GAINSTART] + {0x0990, 0x000E, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xAB35, WORD_LEN, 0}, // MCU_ADDRESS [HG_NR_GAINSTOP] + {0x0990, 0x0091, WORD_LEN, 0}, // MCU_DATA_0 + + {0x33F4, 0x005B, WORD_LEN, 0}, // MCU_DATA_0 //default 4b +//#endif + /* + * ZTE_YGL_CAM_20110321 + * bit 8-11 of this reg effect the slope of PCLK, + * the larger the number,the smaller the slope + */ #if defined(CONFIG_MACH_V9) {0x001E, 0x0777, WORD_LEN,0}, #endif @@ -1383,218 +1594,499 @@ static uint16_t const sharpness_tbl_sz[] = { * values of exposure and brightness. */ //[exposure_tbl_0] +/* + * ZTE_CAM_LJ_20110929 + * fix bug of exposure invalidation + */ static struct mt9d115_i2c_reg_conf const exposure0_brightness0_tbl[] = { - {0x337E, 0x0000, WORD_LEN, 0}, + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0006, WORD_LEN, 0}, + + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 + }; static struct mt9d115_i2c_reg_conf const exposure0_brightness1_tbl[] = { - {0x337E, 0x0000, WORD_LEN, 0}, + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0010, WORD_LEN, 0}, + + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure0_brightness2_tbl[] = { - {0x337E, 0x0000, WORD_LEN, 0}, + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x001A, WORD_LEN, 0}, + + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure0_brightness3_tbl[] = { - {0x337E, 0x0000, WORD_LEN, 0}, + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0023, WORD_LEN, 0}, + + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure0_brightness4_tbl[] = { - {0x337E, 0x0000, WORD_LEN, 0}, + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x002B, WORD_LEN, 0}, + + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure0_brightness5_tbl[] = { - {0x337E, 0x0000, WORD_LEN, 0}, + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0038, WORD_LEN, 0}, + + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure0_brightness6_tbl[] = { - {0x337E, 0x0000, WORD_LEN, 0}, + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0048, WORD_LEN, 0}, + + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; //[exposure_tbl_1] static struct mt9d115_i2c_reg_conf const exposure1_brightness0_tbl[] = { - {0x337E, 0x0000, WORD_LEN, 0}, + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x000A, WORD_LEN, 0}, + + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure1_brightness1_tbl[] = { - {0x337E, 0x0000, WORD_LEN, 0}, + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0019, WORD_LEN, 0}, + + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure1_brightness2_tbl[] = { - {0x337E, 0x0000, WORD_LEN, 0}, + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0028, WORD_LEN, 0}, + + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure1_brightness3_tbl[] = { - {0x337E, 0x0000, WORD_LEN, 0}, + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0034, WORD_LEN, 0}, + + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure1_brightness4_tbl[] = { - {0x337E, 0x0000, WORD_LEN, 0}, + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0040, WORD_LEN, 0}, + + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure1_brightness5_tbl[] = { - {0x337E, 0x0000, WORD_LEN, 0}, + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0054, WORD_LEN, 0}, + + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure1_brightness6_tbl[] = { - {0x337E, 0x0000, WORD_LEN, 0}, + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x006C, WORD_LEN, 0}, + + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; //[exposure_tbl_2] static struct mt9d115_i2c_reg_conf const exposure2_brightness0_tbl[] = { - {0x337E, 0x0000, WORD_LEN, 0}, + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0010, WORD_LEN, 0}, + + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure2_brightness1_tbl[] = { - {0x337E, 0x0000, WORD_LEN, 0}, + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0022, WORD_LEN, 0}, + + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure2_brightness2_tbl[] = { - {0x337E, 0x0000, WORD_LEN, 0}, + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0036, WORD_LEN, 0}, + + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure2_brightness3_tbl[] = { - {0x337E, 0x0000, WORD_LEN, 0}, + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0046, WORD_LEN, 0}, + + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure2_brightness4_tbl[] = { - {0x337E, 0x0000, WORD_LEN, 0}, + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0056, WORD_LEN, 0}, + + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure2_brightness5_tbl[] = { - {0x337E, 0x0000, WORD_LEN, 0}, + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0070, WORD_LEN, 0}, + + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure2_brightness6_tbl[] = { - {0x337E, 0x0000, WORD_LEN, 0}, + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0090, WORD_LEN, 0}, + + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; //[exposure_tbl_3] static struct mt9d115_i2c_reg_conf const exposure3_brightness0_tbl[] = { - {0x337E, 0x1800, WORD_LEN, 0}, + //{0x337E, 0x1800, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0018, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0018, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0010, WORD_LEN, 0}, + + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure3_brightness1_tbl[] = { - {0x337E, 0x1800, WORD_LEN, 0}, + //{0x337E, 0x1800, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0018, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0018, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0022, WORD_LEN, 0}, + + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure3_brightness2_tbl[] = { - {0x337E, 0x1800, WORD_LEN, 0}, + //{0x337E, 0x1800, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0018, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0018, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0036, WORD_LEN, 0}, + + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure3_brightness3_tbl[] = { - {0x337E, 0x1800, WORD_LEN, 0}, + //{0x337E, 0x1800, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0018, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0018, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0046, WORD_LEN, 0}, + + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure3_brightness4_tbl[] = { - {0x337E, 0x1800, WORD_LEN, 0}, + //{0x337E, 0x1800, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0018, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0018, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0056, WORD_LEN, 0}, + + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure3_brightness5_tbl[] = { - {0x337E, 0x1800, WORD_LEN, 0}, + //{0x337E, 0x1800, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0018, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0018, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0070, WORD_LEN, 0}, + + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure3_brightness6_tbl[] = { - {0x337E, 0x1800, WORD_LEN, 0}, + //{0x337E, 0x1800, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0018, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0018, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0090, WORD_LEN, 0}, + + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; //[exposure_tbl_4] static struct mt9d115_i2c_reg_conf const exposure4_brightness0_tbl[] = { - {0x337E, 0x3000, WORD_LEN, 0}, + //{0x337E, 0x3000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0030, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0030, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0010, WORD_LEN, 0}, + + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure4_brightness1_tbl[] = { - {0x337E, 0x3000, WORD_LEN, 0}, + //{0x337E, 0x3000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0030, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0030, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0022, WORD_LEN, 0}, + + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure4_brightness2_tbl[] = { - {0x337E, 0x3000, WORD_LEN, 0}, + //{0x337E, 0x3000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0030, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0030, WORD_LEN, 0}, // MCU_DATA_0 {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0036, WORD_LEN, 0}, + + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 + }; static struct mt9d115_i2c_reg_conf const exposure4_brightness3_tbl[] = { - {0x337E, 0x3000, WORD_LEN, 0}, + //{0x337E, 0x3000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0030, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0030, WORD_LEN, 0}, // MCU_DATA_0 {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0046, WORD_LEN, 0}, + + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 + }; static struct mt9d115_i2c_reg_conf const exposure4_brightness4_tbl[] = { - {0x337E, 0x3000, WORD_LEN, 0}, + //{0x337E, 0x3000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0030, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0030, WORD_LEN, 0}, // MCU_DATA_0 {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0056, WORD_LEN, 0}, + + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure4_brightness5_tbl[] = { - {0x337E, 0x3000, WORD_LEN, 0}, + //{0x337E, 0x3000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0030, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0030, WORD_LEN, 0}, // MCU_DATA_0 {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0070, WORD_LEN, 0}, + + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure4_brightness6_tbl[] = { - {0x337E, 0x3000, WORD_LEN, 0}, + //{0x337E, 0x3000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0030, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0030, WORD_LEN, 0}, // MCU_DATA_0 {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0090, WORD_LEN, 0}, + + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const *brightness_exposure_tbl[] = { diff --git a/drivers/media/video/msm/mt9d115_reg_qtech_sunny_socket.c b/drivers/media/video/msm/mt9d115_reg_qtech_sunny_socket.c index ba480a4c..a4a82e74 100644 --- a/drivers/media/video/msm/mt9d115_reg_qtech_sunny_socket.c +++ b/drivers/media/video/msm/mt9d115_reg_qtech_sunny_socket.c @@ -20,7 +20,31 @@ /*----------------------------------------------------------------------------------------- when who what, where, why comment tag -------- ---- ------------------------------------- ---------------------- - + 2011-07-21 lijing add rotation for racer2 ZTE_CAM_LJ_20110721 + 2010-09-09 lijing update contrast,sharpness,brightness ZTE_LJ_CAM_20100909 + and saturation settings + 2010-09-07 lijing modify init, wb, and contrast and ZTE_LJ_CAM_20100907 + settings; + modify default value of brightness, + saturation, and sharpness to pass + lab test + 2010-09-01 li.jing add process to switch mode ZTE_LJ_CAM_20100901 + from MWB to AWB + 2010-08-30 zt modified to keep initialization settings ZTE_ZT_CAM_20100830 + and default settings consistent + 2010-08-25 li.jing improve preview & snapshot effect ZTE_LJ_CAM_20100825 + according to Aptina + 2010-08-23 jia improve preview & snapshot effect ZTE_JIA_CAM_20100823 + especially for MCNEX module + 2010-08-12 ygl improve AWB in A light environment ZTE_YGL_CAM_20100812 + 2010-08-06 li.jing update reg settings to fix bug of ZTE_LJ_CAM_20100806 + orientation error and decrease AE's + time latency + 2010-07-23 li.jing update sensor settings ZTE_LJ_CAM_20100723 + 2010-07-21 jia remove setting of "lens_for_indoor_tbl" ZTE_CAM_JIA_20100721 + and "lens_for_outdoor_tbl" + 2010-07-05 li.jing update sensor reg settings ZTE_CAM_LIJING_20100705 + 2010-06-29 li.jing created ZTE_CAMERA_LIJING_20100629 ------------------------------------------------------------------------------------------*/ #include "mt9d115.h" @@ -511,8 +535,16 @@ static struct mt9d115_i2c_reg_conf const prev_snap_tbl[] = { {0x0990, 0x064D, WORD_LEN, 0}, // = 1613 {0x098C, 0x2715, WORD_LEN, 0}, //Row Speed (A) {0x0990, 0x0111, WORD_LEN, 0}, // = 273 + +/* ZTE_CAM_LJ_20110721 */ +#if defined (CONFIG_MACH_RACER2) + {0x098C, 0x2717, WORD_LEN,0 }, // MCU_ADDRESS [MODE_SENSOR_READ_MODE_A] + {0x0990, 0x046C, WORD_LEN,0 }, // MCU_DATA_0 for vertical orientation +#else {0x098C, 0x2717, WORD_LEN, 0}, //Read Mode (A) {0x0990, 0x046F, WORD_LEN, 0}, // = 1135 +#endif + {0x098C, 0x2719, WORD_LEN, 0}, //sensor_fine_correction (A) {0x0990, 0x005A, WORD_LEN, 0}, // = 90 {0x098C, 0x271B, WORD_LEN, 0}, //sensor_fine_IT_min (A) @@ -533,8 +565,16 @@ static struct mt9d115_i2c_reg_conf const prev_snap_tbl[] = { {0x0990, 0x064B, WORD_LEN, 0}, // = 1611 {0x098C, 0x272B, WORD_LEN, 0}, //Row Speed (B) {0x0990, 0x0111, WORD_LEN, 0}, // = 273 + + /* ZTE_CAM_LJ_20110721 */ +#if defined (CONFIG_MACH_RACER2) + {0x098C, 0x272D, WORD_LEN,0 }, // MCU_ADDRESS [MODE_SENSOR_READ_MODE_B] + {0x0990, 0x0024, WORD_LEN,0 }, // MCU_DATA_0 for vertical orientation +#else {0x098C, 0x272D, WORD_LEN, 0}, //Read Mode (B) {0x0990, 0x0027, WORD_LEN, 0}, // = 39 +#endif + {0x098C, 0x272F, WORD_LEN, 0}, //sensor_fine_correction (B) {0x0990, 0x003A, WORD_LEN, 0}, // = 58 {0x098C, 0x2731, WORD_LEN, 0}, //sensor_fine_IT_min (B) @@ -1365,218 +1405,432 @@ static uint16_t const sharpness_tbl_sz[] = { * values of exposure and brightness. */ //[exposure_tbl_0] +/* + * ZTE_CAM_WXL_20111008 + * fix bug of exposure invalidation + */ static struct mt9d115_i2c_reg_conf const exposure0_brightness0_tbl[] = { - {0x337E, 0x0000, WORD_LEN, 0}, + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0006, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure0_brightness1_tbl[] = { - {0x337E, 0x0000, WORD_LEN, 0}, + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0010, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure0_brightness2_tbl[] = { - {0x337E, 0x0000, WORD_LEN, 0}, + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x001A, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure0_brightness3_tbl[] = { - {0x337E, 0x0000, WORD_LEN, 0}, + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0023, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure0_brightness4_tbl[] = { - {0x337E, 0x0000, WORD_LEN, 0}, + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x002B, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure0_brightness5_tbl[] = { - {0x337E, 0x0000, WORD_LEN, 0}, + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0038, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure0_brightness6_tbl[] = { - {0x337E, 0x0000, WORD_LEN, 0}, + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0048, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; //[exposure_tbl_1] static struct mt9d115_i2c_reg_conf const exposure1_brightness0_tbl[] = { - {0x337E, 0x0000, WORD_LEN, 0}, + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x000A, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure1_brightness1_tbl[] = { - {0x337E, 0x0000, WORD_LEN, 0}, + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0019, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure1_brightness2_tbl[] = { - {0x337E, 0x0000, WORD_LEN, 0}, + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0028, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure1_brightness3_tbl[] = { - {0x337E, 0x0000, WORD_LEN, 0}, + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0034, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure1_brightness4_tbl[] = { - {0x337E, 0x0000, WORD_LEN, 0}, + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0040, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure1_brightness5_tbl[] = { - {0x337E, 0x0000, WORD_LEN, 0}, + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0054, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure1_brightness6_tbl[] = { - {0x337E, 0x0000, WORD_LEN, 0}, + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x006C, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; //[exposure_tbl_2] static struct mt9d115_i2c_reg_conf const exposure2_brightness0_tbl[] = { - {0x337E, 0x0000, WORD_LEN, 0}, + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0010, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure2_brightness1_tbl[] = { - {0x337E, 0x0000, WORD_LEN, 0}, + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0022, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure2_brightness2_tbl[] = { - {0x337E, 0x0000, WORD_LEN, 0}, + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0036, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure2_brightness3_tbl[] = { - {0x337E, 0x0000, WORD_LEN, 0}, + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0046, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure2_brightness4_tbl[] = { - {0x337E, 0x0000, WORD_LEN, 0}, + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0056, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure2_brightness5_tbl[] = { {0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0070, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure2_brightness6_tbl[] = { - {0x337E, 0x0000, WORD_LEN, 0}, + //{0x337E, 0x0000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0090, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; //[exposure_tbl_3] static struct mt9d115_i2c_reg_conf const exposure3_brightness0_tbl[] = { - {0x337E, 0x1800, WORD_LEN, 0}, + //{0x337E, 0x1800, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0018, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0018, WORD_LEN, 0}, // MCU_DATA_0 {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0010, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure3_brightness1_tbl[] = { - {0x337E, 0x1800, WORD_LEN, 0}, + //{0x337E, 0x1800, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0018, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0018, WORD_LEN, 0}, // MCU_DATA_0 {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0022, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure3_brightness2_tbl[] = { - {0x337E, 0x1800, WORD_LEN, 0}, + //{0x337E, 0x1800, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0018, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0018, WORD_LEN, 0}, // MCU_DATA_0 {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0036, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure3_brightness3_tbl[] = { - {0x337E, 0x1800, WORD_LEN, 0}, + //{0x337E, 0x1800, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0018, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0018, WORD_LEN, 0}, // MCU_DATA_0 {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0046, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure3_brightness4_tbl[] = { - {0x337E, 0x1800, WORD_LEN, 0}, + //{0x337E, 0x1800, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0018, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0018, WORD_LEN, 0}, // MCU_DATA_0 {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0056, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure3_brightness5_tbl[] = { - {0x337E, 0x1800, WORD_LEN, 0}, + //{0x337E, 0x1800, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0018, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0018, WORD_LEN, 0}, // MCU_DATA_0 {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0070, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure3_brightness6_tbl[] = { - {0x337E, 0x1800, WORD_LEN, 0}, + //{0x337E, 0x1800, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0018, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0018, WORD_LEN, 0}, // MCU_DATA_0 {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0090, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; //[exposure_tbl_4] static struct mt9d115_i2c_reg_conf const exposure4_brightness0_tbl[] = { - {0x337E, 0x3000, WORD_LEN, 0}, + //{0x337E, 0x3000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0030, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0030, WORD_LEN, 0}, // MCU_DATA_0 {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0010, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure4_brightness1_tbl[] = { - {0x337E, 0x3000, WORD_LEN, 0}, + //{0x337E, 0x3000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0030, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0030, WORD_LEN, 0}, // MCU_DATA_0 {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0022, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure4_brightness2_tbl[] = { - {0x337E, 0x3000, WORD_LEN, 0}, + //{0x337E, 0x3000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0030, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0030, WORD_LEN, 0}, // MCU_DATA_0 {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0036, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure4_brightness3_tbl[] = { - {0x337E, 0x3000, WORD_LEN, 0}, + //{0x337E, 0x3000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0030, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0030, WORD_LEN, 0}, // MCU_DATA_0 {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0046, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure4_brightness4_tbl[] = { - {0x337E, 0x3000, WORD_LEN, 0}, + //{0x337E, 0x3000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0030, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0030, WORD_LEN, 0}, // MCU_DATA_0 {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0056, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure4_brightness5_tbl[] = { - {0x337E, 0x3000, WORD_LEN, 0}, + //{0x337E, 0x3000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0030, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0030, WORD_LEN, 0}, // MCU_DATA_0 {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0070, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const exposure4_brightness6_tbl[] = { - {0x337E, 0x3000, WORD_LEN, 0}, + //{0x337E, 0x3000, WORD_LEN, 0}, + {0x098C, 0xA75D, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_A] + {0x0990, 0x0030, WORD_LEN, 0}, // MCU_DATA_0 + {0x098C, 0xA75E, WORD_LEN, 0}, // MCU_ADDRESS [MODE_Y_RGB_OFFSET_B] + {0x0990, 0x0030, WORD_LEN, 0}, // MCU_DATA_0 {0x098C, 0xA24F, WORD_LEN, 0}, {0x0990, 0x0090, WORD_LEN, 0}, + {0x098C, 0xA103, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0005, WORD_LEN, 50}, // MCU_DATA_0 }; static struct mt9d115_i2c_reg_conf const *brightness_exposure_tbl[] = { diff --git a/drivers/media/video/msm/mt9p111.h b/drivers/media/video/msm/mt9p111.h index 7831e3ef..117b465c 100644 --- a/drivers/media/video/msm/mt9p111.h +++ b/drivers/media/video/msm/mt9p111.h @@ -20,7 +20,12 @@ /*----------------------------------------------------------------------------------------- when who what, where, why comment tag -------- ---- ------------------------------------- ---------------------- - + 2010-12-15 jia.jia Add support for exposure compensation ZTE_MSM_CAMERA_JIA_20101215 + 2010-12-03 lijing Add support for reading EEPROM LSC ZTE_LJ_CAM_20101203 + 2010-06-22 ye.ganlin Add config for loading LSC config YGL_CAM_20100622 + from OTP memory + 2010-06-13 ye.ganlin Add sensor config definition YGL_CAM_20100613 + 2009-10-24 jia.jia Merged from kernel-v4515 ZTE_MSM_CAMERA_JIA_001 ------------------------------------------------------------------------------------------*/ #ifndef MT9P111_H diff --git a/drivers/media/video/msm/mt9p111_mcnex.c b/drivers/media/video/msm/mt9p111_mcnex.c index 158258e6..fb2b59f1 100644 --- a/drivers/media/video/msm/mt9p111_mcnex.c +++ b/drivers/media/video/msm/mt9p111_mcnex.c @@ -20,7 +20,7 @@ /*----------------------------------------------------------------------------------------- when who what, where, why comment tag -------- ---- ------------------------------------- ---------------------- - + 2009-10-24 jia.jia Merged from kernel-v4515 ZTE_MSM_CAMERA_JIA_001 ------------------------------------------------------------------------------------------*/ #include diff --git a/drivers/media/video/msm/mt9p111_reg_mcnex.c b/drivers/media/video/msm/mt9p111_reg_mcnex.c index e9f1698d..de632299 100644 --- a/drivers/media/video/msm/mt9p111_reg_mcnex.c +++ b/drivers/media/video/msm/mt9p111_reg_mcnex.c @@ -20,6 +20,7 @@ /*----------------------------------------------------------------------------------------- when who what, where, why comment tag -------- ---- ------------------------------------- ---------------------- + 2009-10-24 jia.jia Merged from kernel-v4515 ZTE_MSM_CAMERA_JIA_001 ------------------------------------------------------------------------------------------*/ #include "mt9p111.h" diff --git a/drivers/media/video/msm/mt9p111_reg_samsung_fpc.c b/drivers/media/video/msm/mt9p111_reg_samsung_fpc.c index d4e6deae..ac5c18f7 100644 --- a/drivers/media/video/msm/mt9p111_reg_samsung_fpc.c +++ b/drivers/media/video/msm/mt9p111_reg_samsung_fpc.c @@ -17,7 +17,48 @@ * * Created by jia.jia@zte.com.cn */ - +/*----------------------------------------------------------------------------------------- + when who what, where, why comment tag + -------- ---- ------------------------------------- ---------------------- + 2011-03-14 wt merge reg settings from 729 mt9p111 WT_CAM_20110314 + 5.0MP + + 2011-03-07 wt change image_width and image_height WT_CAM_20110307 + of preview for zoom + 2011-02-21 wt modify reg for mirror ZTE_WT_CAM_20110221 + 2011-02-15 zt modify the value of registers for the ZTE_ZT_CAM_20110215 + pictures taken outdoors under sunny + are too red + 2010-12-24 lijing update pll setting to resolve init ZTE_CAM_LJ_20101224 + failure problem + 2010-12-24 lijing improve reddish of preview ZTE_LJ_CAM_20101224 + update AF setting for lab test + update sharpness setting for lab test + 2010-12-15 jia.jia add support for exposure compensation ZTE_MSM_CAMERA_JIA_20101215 + 2010-12-08 jia modify setting for lab test, ZTE_JIA_CAM_20101208 + such saturation, sharpness and PLL + 2010-12-03 lijing add support for reading EEPROM LSC ZTE_LJ_CAM_20101203 + modify config for lab test + 2010-11-25 jia modify time delay in init process ZTE_JIA_CAM_20101125 + recommended by Aptina + 2010-11-24 jia modify preview & snapshot orientation ZTE_JIA_CAM_20101124 + for blade board + 2010-10-22 jia modify PLL setting to fix abnormal ZTE_JIA_CAM_20100930 + preview problem + 2010-09-30 lijing update wb setting for invalidation ZTE_LJ_CAM_20100930 + i.e., add time delay of 500ms for + register of "0x8404" in MWB + 2010-09-07 lijing fix WB_AUTO setting error ZTE_LJ_CAM_20100907 + 2010-08-24 lijing update wb settings ZTE_LJ_CAM_20100824 + 2010-07-20 jia Improve effect for lab test, JIA_CAM_20100720 + Improve effect of AF + 2010-06-22 ye.ganlin Add config for loading LSC config YGL_CAM_20100622 + from OTP memory + 2010-06-14 ye.ganlin add new settings such as effect YGL_CAM_20100613 + 2010-01-25 li.jing add new settings for 3.0 version ZTE_MSM_CAMERA_LIJING_001 + 2010-01-18 li.jing rotate camera preview and snapshot image ZTE_MSM_CAMERA_LIJING_001 + 2009-10-24 jia.jia Merged from kernel-v4515 ZTE_MSM_CAMERA_JIA_001 +------------------------------------------------------------------------------------------*/ #include "mt9p111.h" @@ -122,6 +163,9 @@ static struct mt9p111_i2c_reg_conf const preview_snapshot_mode_reg_settings_arra {0xC84C, 0x0080, WORD_LEN, 0}, // CAM_CORE_A_POWER_MODE {0xC84E, 0x0001, WORD_LEN, 0}, // CAM_CORE_A_BIN_MODE + /* ZTE_JIA_CAM_20101124 WT_CAM_20110314 + * setting for preview orientation + */ {0xC850, 0x00, BYTE_LEN, 0}, // CAM_CORE_A_ORIENTATION {0xC851, 0x00, BYTE_LEN, 0},// CAM_CORE_A_PIXEL_ORDER {0xC852, 0x019C, WORD_LEN, 0}, // CAM_CORE_A_FINE_CORRECTION @@ -158,7 +202,9 @@ static struct mt9p111_i2c_reg_conf const preview_snapshot_mode_reg_settings_arra {0xC884, 0x0064, WORD_LEN, 0}, // CAM_CORE_B_POWER_MODE {0xC886, 0x0000, WORD_LEN, 0}, // CAM_CORE_B_BIN_MODE - + /* ZTE_JIA_CAM_20101124 + * setting for snapshot orientation + */ {0xC888, 0x00, BYTE_LEN, 0}, // CAM_CORE_B_ORIENTATION {0xC889, 0x00, BYTE_LEN, 0},// CAM_CORE_B_PIXEL_ORDER {0xC88A, 0x009C, WORD_LEN, 0}, // CAM_CORE_B_FINE_CORRECTION @@ -689,7 +735,9 @@ static struct mt9p111_i2c_reg_conf const preview_snapshot_mode_reg_settings_arra {0x098E, 0x0016, WORD_LEN, 0}, // LOGICAL_ADDRESS_ACCESS [MON_ADDRESS_LO] {0x8016, 0x086C, WORD_LEN, 0}, // MON_ADDRESS_LO - + /* ZTE_JIA_CAM_20101125 + * modify time delay from 100ms to 200ms recommended by Aptina + */ {0x8002, 0x0001, WORD_LEN, 200},// MON_CMD //Char setting @@ -803,7 +851,10 @@ static struct mt9p111_i2c_reg_conf const preview_snapshot_mode_reg_settings_arra {0xAC3D, 0x84,BYTE_LEN,0}, // AWB_MAX_ACCEPTED_PRE_AWB_R2G_RATIO {0xAC3E, 0x11,BYTE_LEN,0}, // AWB_MIN_ACCEPTED_PRE_AWB_B2G_RATIO {0xAC3F, 0x63,BYTE_LEN,0}, // AWB_MAX_ACCEPTED_PRE_AWB_B2G_RATIO - + /* + * ZTE_LJ_CAM_20101224 + * improve reddish of preview + */ {0xAC40, 0x62,BYTE_LEN,0}, // AWB_MIN_ACCEPTED_POST_AWB_R2G_RATIO {0xAC41, 0x68,BYTE_LEN,0}, // AWB_MAX_ACCEPTED_POST_AWB_R2G_RATIO @@ -1250,7 +1301,9 @@ static struct mt9p111_i2c_reg_conf const preview_snapshot_mode_reg_settings_arra {0xBCCA, 0x04 , BYTE_LEN, 0}, // LL_SFFB_TRANSITION_START {0xBCCB, 0x00 , BYTE_LEN, 0}, // LL_SFFB_TRANSITION_STOP - + /* ZTE_JIA_CAM_20101124 + * setting for preview & snapshot orientation + */ {0x098E, 0xC8ED , WORD_LEN, 0}, // LOGICAL_ADDRESS_ACCESS {0xC8ED, 0x00 , BYTE_LEN, 0}, // LL_SFFB_SOBEL_FLAT_START @@ -1258,7 +1311,10 @@ static struct mt9p111_i2c_reg_conf const preview_snapshot_mode_reg_settings_arra {0xC400, 0x88, BYTE_LEN, 0}, // AFM_ALGO {0x8419, 0x05, BYTE_LEN, 0}, // SEQ_STATE_CFG_1_AF {0xC400, 0x08, BYTE_LEN, 0}, // AFM_ALGO - + /* + * ZTE_LJ_CAM_20101224 + * update AF setting recommended by samsung for lab test + */ {0xB018, 0x0A, BYTE_LEN, 0}, // AF_FS_POS_0 {0xB019, 0x1B, BYTE_LEN, 0}, // AF_FS_POS_1 {0xB01A, 0x2C, BYTE_LEN, 0}, // AF_FS_POS_2 @@ -1278,7 +1334,10 @@ static struct mt9p111_i2c_reg_conf const preview_snapshot_mode_reg_settings_arra {0xB014, 0x03, BYTE_LEN, 0}, // AF_FS_STEP_SIZE - + /* + * ZTE_LJ_CAM_20101224 + * update AF setting recommended by samsung for lab test + */ {0xB010, 0x00, BYTE_LEN, 0}, // AF_FS_Sharpness_Variation_TH {0xB002, 0x0047, WORD_LEN, 0}, // AF_MODE @@ -1287,7 +1346,10 @@ static struct mt9p111_i2c_reg_conf const preview_snapshot_mode_reg_settings_arra /* * Macro Position Setting */ - + /* + * ZTE_LJ_CAM_20101224 + * update AF setting recommended by samsung for lab test + */ {0xC40C, 0x00FF, WORD_LEN, 0}, // AFM_POS_MAX {0xC40A, 0x0010, WORD_LEN, 0}, // AFM_POS_MIN @@ -1322,7 +1384,9 @@ static struct mt9p111_i2c_reg_conf const pll_setup_tbl[] = { {0x001E, 0x0575, WORD_LEN, 0}, // PAD_SLEW_PAD_CONFIG {0x0022, 0x0030, WORD_LEN, 0}, // VDD_DIS_COUNTER - + /* ZTE_JIA_CAM_20100930 + * modify PLL setting to fix abnormal preview problem, from 0x7F78 to 0x7F7E + */ {0x002A, 0x7F7E, WORD_LEN, 0}, {0x002C, 0x0000, WORD_LEN, 0}, @@ -1332,13 +1396,17 @@ static struct mt9p111_i2c_reg_conf const pll_setup_tbl[] = { //new settings from USA for version 3.0 static struct mt9p111_i2c_reg_conf const sequencer_tbl[] = { - + /* ZTE_JIA_CAM_20101125 + * modify time delay from 50ms to 150ms recommended by Aptina + */ {0x8404, 0x05, BYTE_LEN, 150}, // SEQ_CMD {0xAC02, 0x00FF, WORD_LEN, 0}, // AWB_ALGO {0xAC02, 0x00FF, WORD_LEN, 0}, // AWB_ALGO - + /* ZTE_JIA_CAM_20101125 + * modify time delay from 50ms to 150ms recommended by Aptina + */ {0x8404, 0x06, BYTE_LEN, 150}, // SEQ_CMD {0x0018, 0x2008, WORD_LEN, 100}, // STANDBY_CONTROL_AND_STATUS @@ -1708,7 +1776,10 @@ static uint16_t const saturation_tbl_sz[] = { ARRAY_SIZE(saturation_tbl_4), }; - +/* + * ZTE_LJ_CAM_20101224 + * update sharpness setting for lab test recommended by aptina + */ static struct mt9p111_i2c_reg_conf const sharpness_tbl_0[] = { {0x098E, 0xBC6A , WORD_LEN, 0}, // LOGICAL_ADDRESS_ACCESS [LL_START_APERTURE_INTEGER_GAIN] {0xBC6A, 0x0004 , WORD_LEN, 0}, // LOGICAL_ADDRESS_ACCESS [LL_START_APERTURE_INTEGER_GAIN] @@ -1811,7 +1882,9 @@ static uint16_t const exposure_tbl_sz[] = { ARRAY_SIZE(exposure_tbl_4), }; - +/* ZTE_LJ_CAM_20101203 + * Mapping between addr of EEPROM and addr of sensor + */ struct mt9p111_eeprom_lsc_reg_conf lsc_reg_addr_tbl[] = { {0x00, 0x3640}, {0x02, 0x3642}, diff --git a/drivers/media/video/msm/mt9p111_reg_samsung_socket.c b/drivers/media/video/msm/mt9p111_reg_samsung_socket.c index 9195e316..ca1fe6f3 100644 --- a/drivers/media/video/msm/mt9p111_reg_samsung_socket.c +++ b/drivers/media/video/msm/mt9p111_reg_samsung_socket.c @@ -20,6 +20,30 @@ /*----------------------------------------------------------------------------------------- when who what, where, why comment tag -------- ---- ------------------------------------- ---------------------- + 2011-03-07 wt change image_width and image_height WT_CAM_20110307 + of preview for zoom + 2010-12-24 lijing update pll setting to resolve init ZTE_CAM_LJ_20101224 + failure problem + 2010-12-15 jia.jia add support for exposure compensation ZTE_MSM_CAMERA_JIA_20101215 + 2010-12-07 jia modify pll setting to fix abnormal ZTE_JIA_CAM_20101207 + preview problem + 2010-11-25 jia modify time delay in init process ZTE_JIA_CAM_20101125 + recommended by Aptina + 2010-10-22 jia modify PLL setting to fix abnormal ZTE_JIA_CAM_20100930 + preview problem + 2010-09-30 lijing update wb setting for invalidation ZTE_LJ_CAM_20100930 + i.e., add time delay of 500ms for + register of "0x8404" in MWB + 2010-09-07 lijing fix WB_AUTO setting error ZTE_LJ_CAM_20100907 + 2010-08-24 lijing update wb settings ZTE_LJ_CAM_20100824 + 2010-07-20 jia Improve effect for lab test, JIA_CAM_20100720 + Improve effect of AF + 2010-06-22 ye.ganlin Add config for loading LSC config YGL_CAM_20100622 + from OTP memory + 2010-06-14 ye.ganlin add new settings such as effect YGL_CAM_20100613 + 2010-01-25 li.jing add new settings for 3.0 version ZTE_MSM_CAMERA_LIJING_001 + 2010-01-18 li.jing rotate camera preview and snapshot image ZTE_MSM_CAMERA_LIJING_001 + 2009-10-24 jia.jia Merged from kernel-v4515 ZTE_MSM_CAMERA_JIA_001 ------------------------------------------------------------------------------------------*/ #include "mt9p111.h" @@ -143,7 +167,7 @@ static struct mt9p111_i2c_reg_conf const preview_snapshot_mode_reg_settings_arra {0xC870, 0x0014, WORD_LEN, 0}, // CAM_CORE_A_RX_FIFO_TRIGGER_MARK {0xC8B8, 0x0004, WORD_LEN, 0}, // CAM_OUTPUT_0_JPEG_CONTROL {0xC8AE, 0x0001, WORD_LEN, 0}, // CAM_OUTPUT_0_OUTPUT_FORMAT - // change image_width and image_height of preview for zoom + //WT_CAM_20110307 change image_width and image_height of preview for zoom {0xC8AA, 0x0400, WORD_LEN, 0}, // CAM_OUTPUT_0_IMAGE_WIDTH {0xC8AC, 0x0300, WORD_LEN, 0}, // CAM_OUTPUT_0_IMAGE_HEIGHT @@ -689,7 +713,9 @@ static struct mt9p111_i2c_reg_conf const preview_snapshot_mode_reg_settings_arra {0x098E, 0x0016, WORD_LEN, 0}, // LOGICAL_ADDRESS_ACCESS [MON_ADDRESS_LO] {0x8016, 0x086C, WORD_LEN, 0}, // MON_ADDRESS_LO - + /* ZTE_JIA_CAM_20101125 + * modify time delay from 100ms to 200ms recommended by Aptina + */ {0x8002, 0x0001, WORD_LEN, 200},// MON_CMD //Char setting @@ -1306,7 +1332,9 @@ static struct mt9p111_i2c_reg_conf const pll_setup_tbl[] = { {0x001E, 0x0575, WORD_LEN, 0}, // PAD_SLEW_PAD_CONFIG {0x0022, 0x0030, WORD_LEN, 0}, // VDD_DIS_COUNTER - + /* ZTE_JIA_CAM_20100930 + * modify PLL setting to fix abnormal preview problem, from 0x7F78 to 0x7F7E + */ {0x002A, 0x7F7E, WORD_LEN, 0}, {0x002C, 0x0000, WORD_LEN, 0}, @@ -1316,13 +1344,17 @@ static struct mt9p111_i2c_reg_conf const pll_setup_tbl[] = { //new settings from USA for version 3.0 static struct mt9p111_i2c_reg_conf const sequencer_tbl[] = { - + /* ZTE_JIA_CAM_20101125 + * modify time delay from 50ms to 150ms recommended by Aptina + */ {0x8404, 0x05, BYTE_LEN, 150}, // SEQ_CMD {0xAC02, 0x00FF, WORD_LEN, 0}, // AWB_ALGO {0xAC02, 0x00FF, WORD_LEN, 0}, // AWB_ALGO - + /* ZTE_JIA_CAM_20101125 + * modify time delay from 50ms to 150ms recommended by Aptina + */ {0x8404, 0x06, BYTE_LEN, 150}, // SEQ_CMD {0x0018, 0x2008, WORD_LEN, 100}, // STANDBY_CONTROL_AND_STATUS diff --git a/drivers/media/video/msm/mt9p111_samsung_fpc.c b/drivers/media/video/msm/mt9p111_samsung_fpc.c index 22cb21ab..ffd5f67f 100644 --- a/drivers/media/video/msm/mt9p111_samsung_fpc.c +++ b/drivers/media/video/msm/mt9p111_samsung_fpc.c @@ -17,7 +17,55 @@ * * Created by jia.jia@zte.com.cn */ - +/*----------------------------------------------------------------------------------------- + when who what, where, why comment tag + -------- ---- ------------------------------------- ---------------------- + 2010-12-24 lijing update reset settings ZTE_CAM_LJ_20101224 + 2010-12-15 lijing add head file for slab.h ZTE_CAM_WT_20110221 + 2010-12-15 lijing add Touch AF and AntiShake function ZTE_CAM_LJ_20101214 + 2010-12-15 jia.jia add support for exposure compensation ZTE_MSM_CAMERA_JIA_20101215 + 2010-12-07 jia decrease time delay from 500us to 100us ZTE_CAM_JIA_20101207 + for hard reset + 2010-12-06 jia add support for exposure compensation ZTE_CAM_JIA_20101206 + + 2010-12-03 zt fix bug that standby current is higher ZTE_ZT_CAM_20101203 + when Mt9p111 is adaptered + 2010-12-03 lijing add support for reading EEPROM LSC ZTE_LJ_CAM_20101203 + 2010-11-22 lijing add time delay before reading status of ZTE_LJ_CAM_20101122 + AF to fix switch failure problem between + preview and snapshot + 2010-10-22 jia add time delay for OTP read sequence ZTE_JIA_CAM_20100930 + to fix abnormal preview problem + 2010-09-30 jia Decrease time delay from 10ms to 500us ZTE_JIA_CAM_20100930 + to fix init failure problem + 2010-09-30 jia Enable core VDD power supply to fix ZTE_JIA_CAM_20100930 + init failure problem + 2010-09-30 lijing update effect settings and wb delay time ZTE_LJ_CAM_20100930 + 2010-09-08 jia add exception process of i2c_del_driver ZTE_JIA_CAM_20100908 + 2010-08-24 lijing update iso settings ZTE_LJ_CAM_20100824 + 2010-08-19 lijing add time delay of sensor mode query ZTE_LIJING_CAM_20100819 + 2010-08-17 lijing set motor into manual mode when entering ZTE_LIJING_CAM_20100817 + preview mode to avoid motor moving in + setting wb,effect etc. + 2010-08-12 lijing add judgement for snapshot mode switch, ZTE_LIJING_CAM_20100812 + delete delay of wb + 2010-07-20 jia Improve effect of AF by reading JIA_CAM_20100720 + status of AF + 2010-06-22 ye.ganlin Add config for loading LSC config YGL_CAM_20100622 + from OTP memory + 2010-06-21 lijing solve sensor current leakage issue LIJING_CAM_20100621 + 2010-06-10 lijing add interface for getting sensor info LIJING_CAM_20100610 + 2010-06-08 jia refactor process of JIA_CAM_20100608 + "CONFIG_SENSOR_ADAPTER" + 2010-06-05 zh.shj Get FTM flag to adjust the ZHSHJ_CAM_20100605 + initialize process of camera + 2010-06-05 zh.shj add wake_lock for mt9p111 ZHSHJ_CAM_20100605 + 2010-06-05 zh.shj add probe init process of soft ZHSHJ_CAM_20100605 + standby mode for mt9p111 + 2010-06-05 zh.shj modify process of sensors adapter for ZHSHJ_CAM_20100605 + sensors share the same i2c addr + 2009-10-24 jia.jia Merged from kernel-v4515 ZTE_MSM_CAMERA_JIA_001 +------------------------------------------------------------------------------------------*/ #include #include @@ -100,7 +148,10 @@ static DECLARE_WORK(mt9p111_cb_work, mt9p111_workqueue); #define MT9P111_GPIO_SWITCH_VAL 1 #endif /* defined(CONFIG_MACH_RAISE) */ - +/* + * ZTE_CAM_LJ_20101214 + * add Touch AF funciton + */ #define MT9P111_AF_WINDOW_FULL_WIDTH 256 #define MT9P111_AF_WINDOW_FULL_HEIGHT 256 #define MT9P111_TOUCH_AF_WINDOW_DEFAULT_WIDTH 86 @@ -229,18 +280,36 @@ static int mt9p111_hard_reset(const struct msm_camera_sensor_info *dev) /* ignore "rc" */ rc = gpio_direction_output(dev->sensor_reset, 1); + /* ZTE_JIA_CAM_20100930 + * Decrease time delay from 10ms to 1ms + * to fix init failure problem + */ mdelay(1); /* ignore "rc" */ rc = gpio_direction_output(dev->sensor_reset, 0); - + /* + * RESET_BAR pulse width: Min 70 EXTCLKs + * EXTCLKs: = MCLK (i.e., MT9P111_CAMIO_MCLK) + * + * ZTE_JIA_CAM_20100930 + * Decrease time delay from 10ms to 3us + * to fix init failure problem + */ udelay(3); /* ignore "rc" */ rc = gpio_direction_output(dev->sensor_reset, 1); - + /* + * Time delay before first serial write: Min 100 EXTCLKs + * EXTCLKs: = MCLK (i.e., MT9P111_CAMIO_MCLK) + * + * ZTE_JIA_CAM_20100930 + * Decrease time delay from 500us to 100us + * to fix init failure problem + */ udelay(100); } @@ -526,7 +595,11 @@ static int32_t mt9p111_af_trigger(void) uint32_t i; int32_t rc; - + /* + * ZTE_CAM_LJ_20101214 + * Touch AF function will change AF windows size + * So when using AF restore default AF window size + */ uint16_t window_width = 0; CDBG("%s: entry\n", __func__); @@ -546,7 +619,11 @@ static int32_t mt9p111_af_trigger(void) rc = mt9p111_i2c_write(mt9p111_client->addr, 0x098E, 0x8419, WORD_LEN); rc = mt9p111_i2c_write(mt9p111_client->addr, 0x8419, 0x05, BYTE_LEN); - + /* + * ZTE_CAM_LJ_20101214 + * Touch AF function will change AF windows size + * So when using AF restore default AF window size + */ rc = mt9p111_i2c_read(mt9p111_client->addr,0xB856, &window_width, BYTE_LEN); if(window_width != 0xBF) { rc = mt9p111_i2c_write(mt9p111_client->addr, 0x098E, 0xB854, WORD_LEN); @@ -568,7 +645,13 @@ static int32_t mt9p111_af_trigger(void) rc = mt9p111_i2c_write(mt9p111_client->addr, 0x098E, 0xB006, WORD_LEN); rc = mt9p111_i2c_write(mt9p111_client->addr, 0xB006, 0x01, BYTE_LEN); - + /* ZTE_LJ_CAM_20101122 + * add time delay before reading status of + * AF to fix switch failure problem between + * preview and snapshot + * + * time delay of 150ms is needed + */ mdelay(150); af_status = 0x0000; @@ -682,6 +765,9 @@ static long mt9p111_reg_init(void) return rc; } + /* ZTE_LJ_CAM_20101203 + * read LSC config from EEPROM and write them into sensor's memory + */ for(num = 0; num < mt9p111_regs.lsc_reg_addr_tbl_sz; num++) { value = 0x0000; @@ -764,7 +850,11 @@ static long mt9p111_set_sensor_mode(int32_t mode) { case SENSOR_PREVIEW_MODE: { - + /* + * ZTE_LIJING_CAM_20100817 + * Set Focus Mode as Manual Mode + * and Make Focus Infinite + */ rc = mt9p111_i2c_write(mt9p111_client->addr,0x098E, 0x8419,WORD_LEN); if (rc < 0) { @@ -826,7 +916,14 @@ static long mt9p111_set_sensor_mode(int32_t mode) return rc; } - + /* + * ZTE_LIJING_CAM_20100817 + * judge if switch to preview mode is successful + * + * 0x03: enter into preview mode + * 0x07: enter into snapshot mode + * others: not in snapshot mode + */ while (value != 0x03 && times != 2000) { rc = mt9p111_i2c_write(mt9p111_client->addr, 0x098E, 0x8405, WORD_LEN); @@ -841,7 +938,12 @@ static long mt9p111_set_sensor_mode(int32_t mode) return rc; } - + /* + * ZTE_LIJING_CAM_20100819 + * + * MUST add time delay for next read, + * to avoid failure of reading preview mode + */ mdelay(50); times++; @@ -891,7 +993,12 @@ static long mt9p111_set_sensor_mode(int32_t mode) return rc; } - + /* + * ZTE_LIJING_CAM_20100819 + * + * MUST add time delay for next read, + * to avoid failure of reading preview mode + */ mdelay(50); times++; @@ -946,7 +1053,10 @@ static long mt9p111_set_effect(int32_t mode, int32_t effect) break; } - + /* + * ZTE_LJ_CAM_20100930 + * Change delay time to 50 ms before setting effect according to suggestion of fae + */ mdelay(50); switch (effect) @@ -1108,7 +1218,10 @@ static long mt9p111_set_effect(int32_t mode, int32_t effect) } } - + /* + * ZTE_LJ_CAM_20100930 + * Change delay time to 50 ms after setting effect according to suggestion of fae + */ mdelay(50); return rc; @@ -1734,7 +1847,10 @@ static int32_t mt9p111_set_iso(int8_t iso_val) return rc; } - +/* + * ZTE_CAM_LJ_20101214 + * add Touch AF and AntiShake funciton + */ static int32_t mt9p111_set_aec_rio(aec_rio_cfg position) { int32_t rc = 0; @@ -2158,8 +2274,13 @@ static int mt9p111_sensor_init_probe(const struct msm_camera_sensor_info *data) switch_on = 0; #endif /* defined(CONFIG_MACH_RAISE) || defined(CONFIG_MACH_JOE) */ - - + /* ZTE_JIA_CAM_20100930 + * Enable core VDD power supply to fix init failure problem + */ + /* + * ZTE_CAM_LJ_20101224 + * remove this setting for we have other method to resolve init failure problem + */ //mt9p111_i2c_write(mt9p111_client->addr, 0x0020, 0x0000, WORD_LEN); /* Exit From Hard Standby */ @@ -2179,7 +2300,13 @@ static int mt9p111_sensor_init_probe(const struct msm_camera_sensor_info *data) goto init_probe_fail; } - + /* ZTE_JIA_CAM_20100930 + * Enable core VDD power supply to fix init failure problem + */ + /* + * ZTE_CAM_LJ_20101224 + * remove this setting for we have other method to resolve init failure problem + */ // mt9p111_i2c_write(mt9p111_client->addr, 0x0020, 0x0000, WORD_LEN); /* Read the Model ID of the sensor */ @@ -2327,8 +2454,13 @@ static int mt9p111_sensor_dev_probe(const struct msm_camera_sensor_info *pinfo) switch_on = 0; #endif /* defined(CONFIG_MACH_RAISE) || defined(CONFIG_MACH_JOE) */ - - + /* ZTE_JIA_CAM_20100930 + * Enable core VDD power supply to fix init failure problem + */ + /* + * ZTE_CAM_LJ_20101224 + * remove this setting for we have other method to resolve init failure problem + */ //mt9p111_i2c_write(mt9p111_client->addr, 0x0020, 0x0000, WORD_LEN); rc = mt9p111_hard_standby(pinfo, 0); @@ -2345,8 +2477,13 @@ static int mt9p111_sensor_dev_probe(const struct msm_camera_sensor_info *pinfo) return rc; } - - + /* ZTE_JIA_CAM_20100930 + * Enable core VDD power supply to fix init failure problem + */ + /* + * ZTE_CAM_LJ_20101224 + * remove this setting for we have other method to resolve init failure problem + */ //mt9p111_i2c_write(mt9p111_client->addr, 0x0020, 0x0000, WORD_LEN); model_id = 0x0000; @@ -2649,6 +2786,10 @@ int mt9p111_sensor_config(void __user *argp) break; + /* + * ZTE_CAM_LJ_20101214 + * add variables used for Touch AF and AntiShake function + */ case CFG_SET_AEC_RIO: { rc = mt9p111_set_aec_rio(cfg_data.cfg.aec_rio); @@ -2987,7 +3128,12 @@ static void mt9p111_workqueue(struct work_struct *work) probe_failed: CCRT("%s: rc = %d, failed!\n", __func__, rc); - + /* + * ZTE_ZT_CAM_20101203 + * fix bug that standby current is higher when CONFIG_SENSOR_ADAPTER is enabled + * + * ignore "rc" + */ if(rc != -ENOINIT){ pr_err("%s: rc != -ENOINIT\n", __func__); msm_camera_power_backend(MSM_CAMERA_PWRDWN_MODE); diff --git a/drivers/media/video/msm/mt9p111_samsung_fpc.c.merge-left.r9021 b/drivers/media/video/msm/mt9p111_samsung_fpc.c.merge-left.r9021 index 17ffcfa0..fd17d660 100644 --- a/drivers/media/video/msm/mt9p111_samsung_fpc.c.merge-left.r9021 +++ b/drivers/media/video/msm/mt9p111_samsung_fpc.c.merge-left.r9021 @@ -20,8 +20,43 @@ /*----------------------------------------------------------------------------------------- when who what, where, why comment tag -------- ---- ------------------------------------- ---------------------- - - + 2010-12-03 zt fix bug that standby current is higher ZTE_ZT_CAM_20101203 + when Mt9p111 is adaptered + 2010-12-03 lijing add support for reading EEPROM LSC ZTE_LJ_CAM_20101203 + 2010-11-22 lijing add time delay before reading status of ZTE_LJ_CAM_20101122 + AF to fix switch failure problem between + preview and snapshot + 2010-10-22 jia add time delay for OTP read sequence ZTE_JIA_CAM_20100930 + to fix abnormal preview problem + 2010-09-30 jia Decrease time delay from 10ms to 500us ZTE_JIA_CAM_20100930 + to fix init failure problem + 2010-09-30 jia Enable core VDD power supply to fix ZTE_JIA_CAM_20100930 + init failure problem + 2010-09-30 lijing update effect settings and wb delay time ZTE_LJ_CAM_20100930 + 2010-09-08 jia add exception process of i2c_del_driver ZTE_JIA_CAM_20100908 + 2010-08-24 lijing update iso settings ZTE_LJ_CAM_20100824 + 2010-08-19 lijing add time delay of sensor mode query ZTE_LIJING_CAM_20100819 + 2010-08-17 lijing set motor into manual mode when entering ZTE_LIJING_CAM_20100817 + preview mode to avoid motor moving in + setting wb,effect etc. + 2010-08-12 lijing add judgement for snapshot mode switch, ZTE_LIJING_CAM_20100812 + delete delay of wb + 2010-07-20 jia Improve effect of AF by reading JIA_CAM_20100720 + status of AF + 2010-06-22 ye.ganlin Add config for loading LSC config YGL_CAM_20100622 + from OTP memory + 2010-06-21 lijing solve sensor current leakage issue LIJING_CAM_20100621 + 2010-06-10 lijing add interface for getting sensor info LIJING_CAM_20100610 + 2010-06-08 jia refactor process of JIA_CAM_20100608 + "CONFIG_SENSOR_ADAPTER" + 2010-06-05 zh.shj Get FTM flag to adjust the ZHSHJ_CAM_20100605 + initialize process of camera + 2010-06-05 zh.shj add wake_lock for mt9p111 ZHSHJ_CAM_20100605 + 2010-06-05 zh.shj add probe init process of soft ZHSHJ_CAM_20100605 + standby mode for mt9p111 + 2010-06-05 zh.shj modify process of sensors adapter for ZHSHJ_CAM_20100605 + sensors share the same i2c addr + 2009-10-24 jia.jia Merged from kernel-v4515 ZTE_MSM_CAMERA_JIA_001 ------------------------------------------------------------------------------------------*/ #include @@ -226,19 +261,36 @@ static int mt9p111_hard_reset(const struct msm_camera_sensor_info *dev) /* ignore "rc" */ rc = gpio_direction_output(dev->sensor_reset, 1); - + /* ZTE_JIA_CAM_20100930 + * Decrease time delay from 10ms to 1ms + * to fix init failure problem + */ mdelay(1); /* ignore "rc" */ rc = gpio_direction_output(dev->sensor_reset, 0); - + /* + * RESET_BAR pulse width: Min 70 EXTCLKs + * EXTCLKs: = MCLK (i.e., MT9P111_CAMIO_MCLK) + * + * ZTE_JIA_CAM_20100930 + * Decrease time delay from 10ms to 3us + * to fix init failure problem + */ udelay(3); /* ignore "rc" */ rc = gpio_direction_output(dev->sensor_reset, 1); - + /* + * Time delay before first serial write: Min 100 EXTCLKs + * EXTCLKs: = MCLK (i.e., MT9P111_CAMIO_MCLK) + * + * ZTE_JIA_CAM_20100930 + * Decrease time delay from 10ms to 500us + * to fix init failure problem + */ udelay(500); } @@ -547,7 +599,13 @@ static int32_t mt9p111_af_trigger(void) rc = mt9p111_i2c_write(mt9p111_client->addr, 0x098E, 0xB006, WORD_LEN); rc = mt9p111_i2c_write(mt9p111_client->addr, 0xB006, 0x01, BYTE_LEN); - + /* ZTE_LJ_CAM_20101122 + * add time delay before reading status of + * AF to fix switch failure problem between + * preview and snapshot + * + * time delay of 150ms is needed + */ mdelay(150); af_status = 0x0000; @@ -606,7 +664,9 @@ static long mt9p111_reg_init(void) return rc; } - + /* ZTE_LJ_CAM_20101203 + * read LSC config from EEPROM and write them into sensor's memory + */ for(num = 0; num < mt9p111_regs.lsc_reg_addr_tbl_sz; num++) { value = 0x0000; @@ -689,7 +749,11 @@ static long mt9p111_set_sensor_mode(int32_t mode) { case SENSOR_PREVIEW_MODE: { - + /* + * ZTE_LIJING_CAM_20100817 + * Set Focus Mode as Manual Mode + * and Make Focus Infinite + */ rc = mt9p111_i2c_write(mt9p111_client->addr,0x098E, 0x8419,WORD_LEN); if (rc < 0) { @@ -751,7 +815,14 @@ static long mt9p111_set_sensor_mode(int32_t mode) return rc; } - + /* + * ZTE_LIJING_CAM_20100817 + * judge if switch to preview mode is successful + * + * 0x03: enter into preview mode + * 0x07: enter into snapshot mode + * others: not in snapshot mode + */ while (value != 0x03 && times != 2000) { rc = mt9p111_i2c_write(mt9p111_client->addr, 0x098E, 0x8405, WORD_LEN); @@ -766,7 +837,12 @@ static long mt9p111_set_sensor_mode(int32_t mode) return rc; } - + /* + * ZTE_LIJING_CAM_20100819 + * + * MUST add time delay for next read, + * to avoid failure of reading preview mode + */ mdelay(50); times++; @@ -816,7 +892,12 @@ static long mt9p111_set_sensor_mode(int32_t mode) return rc; } - + /* + * ZTE_LIJING_CAM_20100819 + * + * MUST add time delay for next read, + * to avoid failure of reading preview mode + */ mdelay(50); times++; @@ -871,7 +952,10 @@ static long mt9p111_set_effect(int32_t mode, int32_t effect) break; } - + /* + * ZTE_LJ_CAM_20100930 + * Change delay time to 50 ms before setting effect according to suggestion of fae + */ mdelay(50); switch (effect) @@ -1033,7 +1117,10 @@ static long mt9p111_set_effect(int32_t mode, int32_t effect) } } - + /* + * ZTE_LJ_CAM_20100930 + * Change delay time to 50 ms after setting effect according to suggestion of fae + */ mdelay(50); return rc; @@ -1857,7 +1944,9 @@ static int mt9p111_sensor_init_probe(const struct msm_camera_sensor_info *data) switch_on = 0; #endif /* defined(CONFIG_MACH_RAISE) || defined(CONFIG_MACH_JOE) */ - + /* ZTE_JIA_CAM_20100930 + * Enable core VDD power supply to fix init failure problem + */ mt9p111_i2c_write(mt9p111_client->addr, 0x0020, 0x0000, WORD_LEN); /* Exit From Hard Standby */ @@ -1877,7 +1966,9 @@ static int mt9p111_sensor_init_probe(const struct msm_camera_sensor_info *data) goto init_probe_fail; } - + /* ZTE_JIA_CAM_20100930 + * Enable core VDD power supply to fix init failure problem + */ mt9p111_i2c_write(mt9p111_client->addr, 0x0020, 0x0000, WORD_LEN); /* Read the Model ID of the sensor */ @@ -2025,7 +2116,9 @@ static int mt9p111_sensor_dev_probe(const struct msm_camera_sensor_info *pinfo) switch_on = 0; #endif /* defined(CONFIG_MACH_RAISE) || defined(CONFIG_MACH_JOE) */ - + /* ZTE_JIA_CAM_20100930 + * Enable core VDD power supply to fix init failure problem + */ mt9p111_i2c_write(mt9p111_client->addr, 0x0020, 0x0000, WORD_LEN); rc = mt9p111_hard_standby(pinfo, 0); @@ -2042,7 +2135,9 @@ static int mt9p111_sensor_dev_probe(const struct msm_camera_sensor_info *pinfo) return rc; } - + /* ZTE_JIA_CAM_20100930 + * Enable core VDD power supply to fix init failure problem + */ mt9p111_i2c_write(mt9p111_client->addr, 0x0020, 0x0000, WORD_LEN); model_id = 0x0000; @@ -2670,7 +2765,12 @@ static void mt9p111_workqueue(struct work_struct *work) probe_failed: CCRT("%s: rc = %d, failed!\n", __func__, rc); - + /* + * ZTE_ZT_CAM_20101203 + * fix bug that standby current is higher when CONFIG_SENSOR_ADAPTER is enabled + * + * ignore "rc" + */ msm_camera_power_backend(MSM_CAMERA_PWRDWN_MODE); return; #endif diff --git a/drivers/media/video/msm/mt9p111_samsung_fpc.c.merge-right.r11080 b/drivers/media/video/msm/mt9p111_samsung_fpc.c.merge-right.r11080 index ad771f52..6a372ed0 100644 --- a/drivers/media/video/msm/mt9p111_samsung_fpc.c.merge-right.r11080 +++ b/drivers/media/video/msm/mt9p111_samsung_fpc.c.merge-right.r11080 @@ -20,7 +20,48 @@ /*----------------------------------------------------------------------------------------- when who what, where, why comment tag -------- ---- ------------------------------------- ---------------------- - + 2010-12-15 lijing add Touch AF and AntiShake function ZTE_CAM_LJ_20101214 + 2010-12-15 jia.jia add support for exposure compensation ZTE_MSM_CAMERA_JIA_20101215 + 2010-12-07 jia decrease time delay from 500us to 100us ZTE_CAM_JIA_20101207 + for hard reset + 2010-12-06 jia add support for exposure compensation ZTE_CAM_JIA_20101206 + 2010-12-03 zt fix bug that standby current is higher ZTE_ZT_CAM_20101203 + when Mt9p111 is adaptered + 2010-12-03 lijing add support for reading EEPROM LSC ZTE_LJ_CAM_20101203 + 2010-11-22 lijing add time delay before reading status of ZTE_LJ_CAM_20101122 + AF to fix switch failure problem between + preview and snapshot + 2010-10-22 jia add time delay for OTP read sequence ZTE_JIA_CAM_20100930 + to fix abnormal preview problem + 2010-09-30 jia Decrease time delay from 10ms to 500us ZTE_JIA_CAM_20100930 + to fix init failure problem + 2010-09-30 jia Enable core VDD power supply to fix ZTE_JIA_CAM_20100930 + init failure problem + 2010-09-30 lijing update effect settings and wb delay time ZTE_LJ_CAM_20100930 + 2010-09-08 jia add exception process of i2c_del_driver ZTE_JIA_CAM_20100908 + 2010-08-24 lijing update iso settings ZTE_LJ_CAM_20100824 + 2010-08-19 lijing add time delay of sensor mode query ZTE_LIJING_CAM_20100819 + 2010-08-17 lijing set motor into manual mode when entering ZTE_LIJING_CAM_20100817 + preview mode to avoid motor moving in + setting wb,effect etc. + 2010-08-12 lijing add judgement for snapshot mode switch, ZTE_LIJING_CAM_20100812 + delete delay of wb + 2010-07-20 jia Improve effect of AF by reading JIA_CAM_20100720 + status of AF + 2010-06-22 ye.ganlin Add config for loading LSC config YGL_CAM_20100622 + from OTP memory + 2010-06-21 lijing solve sensor current leakage issue LIJING_CAM_20100621 + 2010-06-10 lijing add interface for getting sensor info LIJING_CAM_20100610 + 2010-06-08 jia refactor process of JIA_CAM_20100608 + "CONFIG_SENSOR_ADAPTER" + 2010-06-05 zh.shj Get FTM flag to adjust the ZHSHJ_CAM_20100605 + initialize process of camera + 2010-06-05 zh.shj add wake_lock for mt9p111 ZHSHJ_CAM_20100605 + 2010-06-05 zh.shj add probe init process of soft ZHSHJ_CAM_20100605 + standby mode for mt9p111 + 2010-06-05 zh.shj modify process of sensors adapter for ZHSHJ_CAM_20100605 + sensors share the same i2c addr + 2009-10-24 jia.jia Merged from kernel-v4515 ZTE_MSM_CAMERA_JIA_001 ------------------------------------------------------------------------------------------*/ #include @@ -102,7 +143,10 @@ static DECLARE_WORK(mt9p111_cb_work, mt9p111_workqueue); #define MT9P111_GPIO_SWITCH_VAL 1 #endif /* defined(CONFIG_MACH_RAISE) */ - +/* + * ZTE_CAM_LJ_20101214 + * add Touch AF funciton + */ #define MT9P111_AF_WINDOW_FULL_WIDTH 256 #define MT9P111_AF_WINDOW_FULL_HEIGHT 256 #define MT9P111_TOUCH_AF_WINDOW_DEFAULT_WIDTH 86 @@ -231,19 +275,36 @@ static int mt9p111_hard_reset(const struct msm_camera_sensor_info *dev) /* ignore "rc" */ rc = gpio_direction_output(dev->sensor_reset, 1); - + /* ZTE_JIA_CAM_20100930 + * Decrease time delay from 10ms to 1ms + * to fix init failure problem + */ mdelay(1); /* ignore "rc" */ rc = gpio_direction_output(dev->sensor_reset, 0); - + /* + * RESET_BAR pulse width: Min 70 EXTCLKs + * EXTCLKs: = MCLK (i.e., MT9P111_CAMIO_MCLK) + * + * ZTE_JIA_CAM_20100930 + * Decrease time delay from 10ms to 3us + * to fix init failure problem + */ udelay(3); /* ignore "rc" */ rc = gpio_direction_output(dev->sensor_reset, 1); - + /* + * Time delay before first serial write: Min 100 EXTCLKs + * EXTCLKs: = MCLK (i.e., MT9P111_CAMIO_MCLK) + * + * ZTE_JIA_CAM_20100930 + * Decrease time delay from 500us to 100us + * to fix init failure problem + */ udelay(100); } @@ -529,7 +590,11 @@ static int32_t mt9p111_af_trigger(void) uint32_t i; int32_t rc; - + /* + * ZTE_CAM_LJ_20101214 + * Touch AF function will change AF windows size + * So when using AF restore default AF window size + */ uint16_t window_width = 0; CDBG("%s: entry\n", __func__); @@ -549,7 +614,11 @@ static int32_t mt9p111_af_trigger(void) rc = mt9p111_i2c_write(mt9p111_client->addr, 0x098E, 0x8419, WORD_LEN); rc = mt9p111_i2c_write(mt9p111_client->addr, 0x8419, 0x05, BYTE_LEN); - + /* + * ZTE_CAM_LJ_20101214 + * Touch AF function will change AF windows size + * So when using AF restore default AF window size + */ rc = mt9p111_i2c_read(mt9p111_client->addr,0xB856, &window_width, BYTE_LEN); if(window_width != 0xBF) { rc = mt9p111_i2c_write(mt9p111_client->addr, 0x098E, 0xB854, WORD_LEN); @@ -571,6 +640,13 @@ static int32_t mt9p111_af_trigger(void) rc = mt9p111_i2c_write(mt9p111_client->addr, 0x098E, 0xB006, WORD_LEN); rc = mt9p111_i2c_write(mt9p111_client->addr, 0xB006, 0x01, BYTE_LEN); + /* ZTE_LJ_CAM_20101122 + * add time delay before reading status of + * AF to fix switch failure problem between + * preview and snapshot + * + * time delay of 150ms is needed + */ mdelay(150); af_status = 0x0000; @@ -684,6 +760,9 @@ static long mt9p111_reg_init(void) return rc; } + /* ZTE_LJ_CAM_20101203 + * read LSC config from EEPROM and write them into sensor's memory + */ for(num = 0; num < mt9p111_regs.lsc_reg_addr_tbl_sz; num++) { value = 0x0000; @@ -766,7 +845,11 @@ static long mt9p111_set_sensor_mode(int32_t mode) { case SENSOR_PREVIEW_MODE: { - + /* + * ZTE_LIJING_CAM_20100817 + * Set Focus Mode as Manual Mode + * and Make Focus Infinite + */ rc = mt9p111_i2c_write(mt9p111_client->addr,0x098E, 0x8419,WORD_LEN); if (rc < 0) { @@ -828,7 +911,14 @@ static long mt9p111_set_sensor_mode(int32_t mode) return rc; } - + /* + * ZTE_LIJING_CAM_20100817 + * judge if switch to preview mode is successful + * + * 0x03: enter into preview mode + * 0x07: enter into snapshot mode + * others: not in snapshot mode + */ while (value != 0x03 && times != 2000) { rc = mt9p111_i2c_write(mt9p111_client->addr, 0x098E, 0x8405, WORD_LEN); @@ -843,7 +933,12 @@ static long mt9p111_set_sensor_mode(int32_t mode) return rc; } - + /* + * ZTE_LIJING_CAM_20100819 + * + * MUST add time delay for next read, + * to avoid failure of reading preview mode + */ mdelay(50); times++; @@ -893,7 +988,12 @@ static long mt9p111_set_sensor_mode(int32_t mode) return rc; } - + /* + * ZTE_LIJING_CAM_20100819 + * + * MUST add time delay for next read, + * to avoid failure of reading preview mode + */ mdelay(50); times++; @@ -948,7 +1048,10 @@ static long mt9p111_set_effect(int32_t mode, int32_t effect) break; } - + /* + * ZTE_LJ_CAM_20100930 + * Change delay time to 50 ms before setting effect according to suggestion of fae + */ mdelay(50); switch (effect) @@ -1110,7 +1213,10 @@ static long mt9p111_set_effect(int32_t mode, int32_t effect) } } - + /* + * ZTE_LJ_CAM_20100930 + * Change delay time to 50 ms after setting effect according to suggestion of fae + */ mdelay(50); return rc; @@ -1736,7 +1842,10 @@ static int32_t mt9p111_set_iso(int8_t iso_val) return rc; } - +/* + * ZTE_CAM_LJ_20101214 + * add Touch AF and AntiShake funciton + */ static int32_t mt9p111_set_aec_rio(aec_rio_cfg position) { int32_t rc = 0; @@ -2160,7 +2269,9 @@ static int mt9p111_sensor_init_probe(const struct msm_camera_sensor_info *data) switch_on = 0; #endif /* defined(CONFIG_MACH_RAISE) || defined(CONFIG_MACH_JOE) */ - + /* ZTE_JIA_CAM_20100930 + * Enable core VDD power supply to fix init failure problem + */ mt9p111_i2c_write(mt9p111_client->addr, 0x0020, 0x0000, WORD_LEN); /* Exit From Hard Standby */ @@ -2180,6 +2291,9 @@ static int mt9p111_sensor_init_probe(const struct msm_camera_sensor_info *data) goto init_probe_fail; } + /* ZTE_JIA_CAM_20100930 + * Enable core VDD power supply to fix init failure problem + */ mt9p111_i2c_write(mt9p111_client->addr, 0x0020, 0x0000, WORD_LEN); /* Read the Model ID of the sensor */ @@ -2327,7 +2441,9 @@ static int mt9p111_sensor_dev_probe(const struct msm_camera_sensor_info *pinfo) switch_on = 0; #endif /* defined(CONFIG_MACH_RAISE) || defined(CONFIG_MACH_JOE) */ - + /* ZTE_JIA_CAM_20100930 + * Enable core VDD power supply to fix init failure problem + */ mt9p111_i2c_write(mt9p111_client->addr, 0x0020, 0x0000, WORD_LEN); rc = mt9p111_hard_standby(pinfo, 0); @@ -2344,7 +2460,9 @@ static int mt9p111_sensor_dev_probe(const struct msm_camera_sensor_info *pinfo) return rc; } - + /* ZTE_JIA_CAM_20100930 + * Enable core VDD power supply to fix init failure problem + */ mt9p111_i2c_write(mt9p111_client->addr, 0x0020, 0x0000, WORD_LEN); model_id = 0x0000; @@ -2646,7 +2764,11 @@ int mt9p111_sensor_config(void __user *argp) } break; - + + /* + * ZTE_CAM_LJ_20101214 + * add variables used for Touch AF and AntiShake function + */ case CFG_SET_AEC_RIO: { rc = mt9p111_set_aec_rio(cfg_data.cfg.aec_rio); @@ -2707,7 +2829,11 @@ static int mt9p111_sensor_release_internal(void) } mdelay(1); - + /* + * Solve sensor current leakage issue. + * Write this reg to shut off all sensor gpios. + * by lijing LIJING_CAM_20100621 + */ rc = mt9p111_i2c_write(mt9p111_client->addr, 0x060E, 0x00FF, WORD_LEN); if (rc < 0) { @@ -2981,7 +3107,12 @@ static void mt9p111_workqueue(struct work_struct *work) probe_failed: CCRT("%s: rc = %d, failed!\n", __func__, rc); - + /* + * ZTE_ZT_CAM_20101203 + * fix bug that standby current is higher when CONFIG_SENSOR_ADAPTER is enabled + * + * ignore "rc" + */ msm_camera_power_backend(MSM_CAMERA_PWRDWN_MODE); return; #endif diff --git a/drivers/media/video/msm/mt9p111_samsung_fpc.c.working b/drivers/media/video/msm/mt9p111_samsung_fpc.c.working index 12b747a0..596f2708 100644 --- a/drivers/media/video/msm/mt9p111_samsung_fpc.c.working +++ b/drivers/media/video/msm/mt9p111_samsung_fpc.c.working @@ -20,7 +20,49 @@ /*----------------------------------------------------------------------------------------- when who what, where, why comment tag -------- ---- ------------------------------------- ---------------------- - + 2010-12-15 lijing add Touch AF and AntiShake function ZTE_CAM_LJ_20101214 + 2010-12-15 jia.jia add support for exposure compensation ZTE_MSM_CAMERA_JIA_20101215 + 2010-12-07 jia decrease time delay from 500us to 100us ZTE_CAM_JIA_20101207 + for hard reset + 2010-12-06 jia add support for exposure compensation ZTE_CAM_JIA_20101206 + + 2010-12-03 zt fix bug that standby current is higher ZTE_ZT_CAM_20101203 + when Mt9p111 is adaptered + 2010-12-03 lijing add support for reading EEPROM LSC ZTE_LJ_CAM_20101203 + 2010-11-22 lijing add time delay before reading status of ZTE_LJ_CAM_20101122 + AF to fix switch failure problem between + preview and snapshot + 2010-10-22 jia add time delay for OTP read sequence ZTE_JIA_CAM_20100930 + to fix abnormal preview problem + 2010-09-30 jia Decrease time delay from 10ms to 500us ZTE_JIA_CAM_20100930 + to fix init failure problem + 2010-09-30 jia Enable core VDD power supply to fix ZTE_JIA_CAM_20100930 + init failure problem + 2010-09-30 lijing update effect settings and wb delay time ZTE_LJ_CAM_20100930 + 2010-09-08 jia add exception process of i2c_del_driver ZTE_JIA_CAM_20100908 + 2010-08-24 lijing update iso settings ZTE_LJ_CAM_20100824 + 2010-08-19 lijing add time delay of sensor mode query ZTE_LIJING_CAM_20100819 + 2010-08-17 lijing set motor into manual mode when entering ZTE_LIJING_CAM_20100817 + preview mode to avoid motor moving in + setting wb,effect etc. + 2010-08-12 lijing add judgement for snapshot mode switch, ZTE_LIJING_CAM_20100812 + delete delay of wb + 2010-07-20 jia Improve effect of AF by reading JIA_CAM_20100720 + status of AF + 2010-06-22 ye.ganlin Add config for loading LSC config YGL_CAM_20100622 + from OTP memory + 2010-06-21 lijing solve sensor current leakage issue LIJING_CAM_20100621 + 2010-06-10 lijing add interface for getting sensor info LIJING_CAM_20100610 + 2010-06-08 jia refactor process of JIA_CAM_20100608 + "CONFIG_SENSOR_ADAPTER" + 2010-06-05 zh.shj Get FTM flag to adjust the ZHSHJ_CAM_20100605 + initialize process of camera + 2010-06-05 zh.shj add wake_lock for mt9p111 ZHSHJ_CAM_20100605 + 2010-06-05 zh.shj add probe init process of soft ZHSHJ_CAM_20100605 + standby mode for mt9p111 + 2010-06-05 zh.shj modify process of sensors adapter for ZHSHJ_CAM_20100605 + sensors share the same i2c addr + 2009-10-24 jia.jia Merged from kernel-v4515 ZTE_MSM_CAMERA_JIA_001 ------------------------------------------------------------------------------------------*/ #include @@ -102,7 +144,10 @@ static DECLARE_WORK(mt9p111_cb_work, mt9p111_workqueue); #define MT9P111_GPIO_SWITCH_VAL 1 #endif /* defined(CONFIG_MACH_RAISE) */ - +/* + * ZTE_CAM_LJ_20101214 + * add Touch AF funciton + */ #define MT9P111_AF_WINDOW_FULL_WIDTH 256 #define MT9P111_AF_WINDOW_FULL_HEIGHT 256 #define MT9P111_TOUCH_AF_WINDOW_DEFAULT_WIDTH 86 @@ -231,18 +276,36 @@ static int mt9p111_hard_reset(const struct msm_camera_sensor_info *dev) /* ignore "rc" */ rc = gpio_direction_output(dev->sensor_reset, 1); - + /* ZTE_JIA_CAM_20100930 + * Decrease time delay from 10ms to 1ms + * to fix init failure problem + */ mdelay(1); /* ignore "rc" */ rc = gpio_direction_output(dev->sensor_reset, 0); - + /* + * RESET_BAR pulse width: Min 70 EXTCLKs + * EXTCLKs: = MCLK (i.e., MT9P111_CAMIO_MCLK) + * + * ZTE_JIA_CAM_20100930 + * Decrease time delay from 10ms to 3us + * to fix init failure problem + */ udelay(3); /* ignore "rc" */ rc = gpio_direction_output(dev->sensor_reset, 1); + /* + * Time delay before first serial write: Min 100 EXTCLKs + * EXTCLKs: = MCLK (i.e., MT9P111_CAMIO_MCLK) + * + * ZTE_JIA_CAM_20100930 + * Decrease time delay from 500us to 100us + * to fix init failure problem + */ udelay(100); } @@ -528,7 +591,11 @@ static int32_t mt9p111_af_trigger(void) uint32_t i; int32_t rc; - + /* + * ZTE_CAM_LJ_20101214 + * Touch AF function will change AF windows size + * So when using AF restore default AF window size + */ uint16_t window_width = 0; CDBG("%s: entry\n", __func__); @@ -548,7 +615,11 @@ static int32_t mt9p111_af_trigger(void) rc = mt9p111_i2c_write(mt9p111_client->addr, 0x098E, 0x8419, WORD_LEN); rc = mt9p111_i2c_write(mt9p111_client->addr, 0x8419, 0x05, BYTE_LEN); - + /* + * ZTE_CAM_LJ_20101214 + * Touch AF function will change AF windows size + * So when using AF restore default AF window size + */ rc = mt9p111_i2c_read(mt9p111_client->addr,0xB856, &window_width, BYTE_LEN); if(window_width != 0xBF) { rc = mt9p111_i2c_write(mt9p111_client->addr, 0x098E, 0xB854, WORD_LEN); @@ -570,7 +641,13 @@ static int32_t mt9p111_af_trigger(void) rc = mt9p111_i2c_write(mt9p111_client->addr, 0x098E, 0xB006, WORD_LEN); rc = mt9p111_i2c_write(mt9p111_client->addr, 0xB006, 0x01, BYTE_LEN); - + /* ZTE_LJ_CAM_20101122 + * add time delay before reading status of + * AF to fix switch failure problem between + * preview and snapshot + * + * time delay of 150ms is needed + */ mdelay(150); af_status = 0x0000; @@ -684,7 +761,9 @@ static long mt9p111_reg_init(void) return rc; } - + /* ZTE_LJ_CAM_20101203 + * read LSC config from EEPROM and write them into sensor's memory + */ for(num = 0; num < mt9p111_regs.lsc_reg_addr_tbl_sz; num++) { value = 0x0000; @@ -767,7 +846,11 @@ static long mt9p111_set_sensor_mode(int32_t mode) { case SENSOR_PREVIEW_MODE: { - + /* + * ZTE_LIJING_CAM_20100817 + * Set Focus Mode as Manual Mode + * and Make Focus Infinite + */ rc = mt9p111_i2c_write(mt9p111_client->addr,0x098E, 0x8419,WORD_LEN); if (rc < 0) { @@ -829,7 +912,14 @@ static long mt9p111_set_sensor_mode(int32_t mode) return rc; } - + /* + * ZTE_LIJING_CAM_20100817 + * judge if switch to preview mode is successful + * + * 0x03: enter into preview mode + * 0x07: enter into snapshot mode + * others: not in snapshot mode + */ while (value != 0x03 && times != 2000) { rc = mt9p111_i2c_write(mt9p111_client->addr, 0x098E, 0x8405, WORD_LEN); @@ -844,7 +934,12 @@ static long mt9p111_set_sensor_mode(int32_t mode) return rc; } - + /* + * ZTE_LIJING_CAM_20100819 + * + * MUST add time delay for next read, + * to avoid failure of reading preview mode + */ mdelay(50); times++; @@ -894,7 +989,12 @@ static long mt9p111_set_sensor_mode(int32_t mode) return rc; } - + /* + * ZTE_LIJING_CAM_20100819 + * + * MUST add time delay for next read, + * to avoid failure of reading preview mode + */ mdelay(50); times++; @@ -949,7 +1049,10 @@ static long mt9p111_set_effect(int32_t mode, int32_t effect) break; } - + /* + * ZTE_LJ_CAM_20100930 + * Change delay time to 50 ms before setting effect according to suggestion of fae + */ mdelay(50); switch (effect) @@ -1111,7 +1214,10 @@ static long mt9p111_set_effect(int32_t mode, int32_t effect) } } - + /* + * ZTE_LJ_CAM_20100930 + * Change delay time to 50 ms after setting effect according to suggestion of fae + */ mdelay(50); return rc; @@ -1737,7 +1843,10 @@ static int32_t mt9p111_set_iso(int8_t iso_val) return rc; } - +/* + * ZTE_CAM_LJ_20101214 + * add Touch AF and AntiShake funciton + */ static int32_t mt9p111_set_aec_rio(aec_rio_cfg position) { int32_t rc = 0; @@ -2161,7 +2270,9 @@ static int mt9p111_sensor_init_probe(const struct msm_camera_sensor_info *data) switch_on = 0; #endif /* defined(CONFIG_MACH_RAISE) || defined(CONFIG_MACH_JOE) */ - + /* ZTE_JIA_CAM_20100930 + * Enable core VDD power supply to fix init failure problem + */ mt9p111_i2c_write(mt9p111_client->addr, 0x0020, 0x0000, WORD_LEN); /* Exit From Hard Standby */ @@ -2181,7 +2292,9 @@ static int mt9p111_sensor_init_probe(const struct msm_camera_sensor_info *data) goto init_probe_fail; } - + /* ZTE_JIA_CAM_20100930 + * Enable core VDD power supply to fix init failure problem + */ mt9p111_i2c_write(mt9p111_client->addr, 0x0020, 0x0000, WORD_LEN); /* Read the Model ID of the sensor */ @@ -2329,7 +2442,9 @@ static int mt9p111_sensor_dev_probe(const struct msm_camera_sensor_info *pinfo) switch_on = 0; #endif /* defined(CONFIG_MACH_RAISE) || defined(CONFIG_MACH_JOE) */ - + /* ZTE_JIA_CAM_20100930 + * Enable core VDD power supply to fix init failure problem + */ mt9p111_i2c_write(mt9p111_client->addr, 0x0020, 0x0000, WORD_LEN); rc = mt9p111_hard_standby(pinfo, 0); @@ -2346,7 +2461,9 @@ static int mt9p111_sensor_dev_probe(const struct msm_camera_sensor_info *pinfo) return rc; } - + /* ZTE_JIA_CAM_20100930 + * Enable core VDD power supply to fix init failure problem + */ mt9p111_i2c_write(mt9p111_client->addr, 0x0020, 0x0000, WORD_LEN); model_id = 0x0000; @@ -2648,7 +2765,11 @@ int mt9p111_sensor_config(void __user *argp) } break; - + + /* + * ZTE_CAM_LJ_20101214 + * add variables used for Touch AF and AntiShake function + */ case CFG_SET_AEC_RIO: { rc = mt9p111_set_aec_rio(cfg_data.cfg.aec_rio); @@ -2709,7 +2830,11 @@ static int mt9p111_sensor_release_internal(void) } mdelay(1); - + /* + * Solve sensor current leakage issue. + * Write this reg to shut off all sensor gpios. + * by lijing LIJING_CAM_20100621 + */ rc = mt9p111_i2c_write(mt9p111_client->addr, 0x060E, 0x00FF, WORD_LEN); if (rc < 0) { @@ -2983,7 +3108,12 @@ static void mt9p111_workqueue(struct work_struct *work) probe_failed: CCRT("%s: rc = %d, failed!\n", __func__, rc); - + /* + * ZTE_ZT_CAM_20101203 + * fix bug that standby current is higher when CONFIG_SENSOR_ADAPTER is enabled + * + * ignore "rc" + */ msm_camera_power_backend(MSM_CAMERA_PWRDWN_MODE); return; #endif diff --git a/drivers/media/video/msm/mt9p111_samsung_socket.c b/drivers/media/video/msm/mt9p111_samsung_socket.c index c78da189..8e60f526 100644 --- a/drivers/media/video/msm/mt9p111_samsung_socket.c +++ b/drivers/media/video/msm/mt9p111_samsung_socket.c @@ -20,6 +20,49 @@ /*----------------------------------------------------------------------------------------- when who what, where, why comment tag -------- ---- ------------------------------------- ---------------------- + 2010-12-15 lijing add Touch AF and AntiShake function ZTE_CAM_LJ_20101214 + 2010-12-15 jia.jia add support for exposure compensation ZTE_MSM_CAMERA_JIA_20101215 + 2010-12-07 jia decrease time delay from 500us to 100us ZTE_CAM_JIA_20101207 + for hard reset + 2010-12-06 jia add support for exposure compensation ZTE_CAM_JIA_20101206 + 2010-12-03 zt fix bug that standby current is higher ZTE_ZT_CAM_20101203 + when Mt9p111 is adaptered + 2010-12-03 zt fix bug that standby current is higher ZTE_ZT_CAM_20101203 + when Mt9p111 is adaptered + 2010-11-22 lijing add time delay before reading status of ZTE_LJ_CAM_20101122 + AF to fix switch failure problem between + preview and snapshot + 2010-10-22 jia add time delay for OTP read sequence ZTE_JIA_CAM_20100930 + to fix abnormal preview problem + 2010-09-30 jia Decrease time delay from 10ms to 500us ZTE_JIA_CAM_20100930 + to fix init failure problem + 2010-09-30 jia Enable core VDD power supply to fix ZTE_JIA_CAM_20100930 + init failure problem + 2010-09-30 lijing update effect settings and wb delay time ZTE_LJ_CAM_20100930 + 2010-09-08 jia add exception process of i2c_del_driver ZTE_JIA_CAM_20100908 + 2010-08-24 lijing update iso settings ZTE_LJ_CAM_20100824 + 2010-08-19 lijing add time delay of sensor mode query ZTE_LIJING_CAM_20100819 + 2010-08-17 lijing set motor into manual mode when entering ZTE_LIJING_CAM_20100817 + preview mode to avoid motor moving in + setting wb,effect etc. + 2010-08-12 lijing add judgement for snapshot mode switch, ZTE_LIJING_CAM_20100812 + delete delay of wb + 2010-07-20 jia Improve effect of AF by reading JIA_CAM_20100720 + status of AF + 2010-06-22 ye.ganlin Add config for loading LSC config YGL_CAM_20100622 + from OTP memory + 2010-06-21 lijing solve sensor current leakage issue LIJING_CAM_20100621 + 2010-06-10 lijing add interface for getting sensor info LIJING_CAM_20100610 + 2010-06-08 jia refactor process of JIA_CAM_20100608 + "CONFIG_SENSOR_ADAPTER" + 2010-06-05 zh.shj Get FTM flag to adjust the ZHSHJ_CAM_20100605 + initialize process of camera + 2010-06-05 zh.shj add wake_lock for mt9p111 ZHSHJ_CAM_20100605 + 2010-06-05 zh.shj add probe init process of soft ZHSHJ_CAM_20100605 + standby mode for mt9p111 + 2010-06-05 zh.shj modify process of sensors adapter for ZHSHJ_CAM_20100605 + sensors share the same i2c addr + 2009-10-24 jia.jia Merged from kernel-v4515 ZTE_MSM_CAMERA_JIA_001 ------------------------------------------------------------------------------------------*/ #include @@ -98,7 +141,10 @@ static DECLARE_WORK(mt9p111_cb_work, mt9p111_workqueue); #define MT9P111_GPIO_SWITCH_VAL 1 #endif /* defined(CONFIG_MACH_RAISE) */ - +/* + * ZTE_CAM_LJ_20101214 + * add Touch AF funciton + */ #define MT9P111_AF_WINDOW_FULL_WIDTH 256 #define MT9P111_AF_WINDOW_FULL_HEIGHT 256 #define MT9P111_TOUCH_AF_WINDOW_DEFAULT_WIDTH 86 @@ -227,19 +273,36 @@ static int mt9p111_hard_reset(const struct msm_camera_sensor_info *dev) /* ignore "rc" */ rc = gpio_direction_output(dev->sensor_reset, 1); - + /* ZTE_JIA_CAM_20100930 + * Decrease time delay from 10ms to 1ms + * to fix init failure problem + */ mdelay(1); /* ignore "rc" */ rc = gpio_direction_output(dev->sensor_reset, 0); - + /* + * RESET_BAR pulse width: Min 70 EXTCLKs + * EXTCLKs: = MCLK (i.e., MT9P111_CAMIO_MCLK) + * + * ZTE_JIA_CAM_20100930 + * Decrease time delay from 10ms to 3us + * to fix init failure problem + */ udelay(3); /* ignore "rc" */ rc = gpio_direction_output(dev->sensor_reset, 1); - + /* + * Time delay before first serial write: Min 100 EXTCLKs + * EXTCLKs: = MCLK (i.e., MT9P111_CAMIO_MCLK) + * + * ZTE_JIA_CAM_20100930 + * Decrease time delay from 500us to 100us + * to fix init failure problem + */ udelay(100); } @@ -442,7 +505,11 @@ static int32_t mt9p111_af_trigger(void) uint32_t i; int32_t rc; - + /* + * ZTE_CAM_LJ_20101214 + * Touch AF function will change AF windows size + * So when using AF restore default AF window size + */ uint16_t window_width = 0; CDBG("%s: entry\n", __func__); @@ -462,7 +529,11 @@ static int32_t mt9p111_af_trigger(void) rc = mt9p111_i2c_write(mt9p111_client->addr, 0x098E, 0x8419, WORD_LEN); rc = mt9p111_i2c_write(mt9p111_client->addr, 0x8419, 0x05, BYTE_LEN); - + /* + * ZTE_CAM_LJ_20101214 + * Touch AF function will change AF windows size + * So when using AF restore default AF window size + */ rc = mt9p111_i2c_read(mt9p111_client->addr,0xB856, &window_width, BYTE_LEN); if(window_width != 0xBF) { rc = mt9p111_i2c_write(mt9p111_client->addr, 0x098E, 0xB854, WORD_LEN); @@ -484,7 +555,13 @@ static int32_t mt9p111_af_trigger(void) rc = mt9p111_i2c_write(mt9p111_client->addr, 0x098E, 0xB006, WORD_LEN); rc = mt9p111_i2c_write(mt9p111_client->addr, 0xB006, 0x01, BYTE_LEN); - + /* ZTE_LJ_CAM_20101122 + * add time delay before reading status of + * AF to fix switch failure problem between + * preview and snapshot + * + * time delay of 150ms is needed + */ mdelay(150); af_status = 0x0000; @@ -638,7 +715,9 @@ static long mt9p111_reg_init(void) return rc; } - + /* ZTE_JIA_CAM_20100930 + * add time delay for OTP read sequence, from 100ms to 200ms + */ mdelay(200); CDBG("%s: check otp memory is whether available for reading, is_otp_written=0x%x!\n", @@ -690,7 +769,9 @@ static long mt9p111_reg_init(void) return rc; } - + /* ZTE_JIA_CAM_20100930 + * add time delay for OTP read sequence, from 100ms to 200ms + */ mdelay(200); CDBG("%s: check for the 3rd otp memory, is_otp_written =0x%x !\n", __func__, is_otp_written); @@ -729,7 +810,9 @@ static long mt9p111_reg_init(void) return rc; } - + /* ZTE_JIA_CAM_20100930 + * add time delay for OTP read sequence, from 100ms to 200ms + */ mdelay(200); CDBG("%s: check for the 2nd otp memory, is_otp_written =0x%x !\n", __func__, is_otp_written); @@ -765,7 +848,9 @@ static long mt9p111_reg_init(void) return rc; } - + /* ZTE_JIA_CAM_20100930 + * add time delay for OTP read sequence, from 100ms to 200ms + */ mdelay(200); CDBG("%s: check for the 1st otp memory, is_otp_written =0x%x !\n", __func__, is_otp_written); @@ -887,7 +972,11 @@ static long mt9p111_set_sensor_mode(int32_t mode) { case SENSOR_PREVIEW_MODE: { - + /* + * ZTE_LIJING_CAM_20100817 + * Set Focus Mode as Manual Mode + * and Make Focus Infinite + */ rc = mt9p111_i2c_write(mt9p111_client->addr,0x098E, 0x8419,WORD_LEN); if (rc < 0) { @@ -949,7 +1038,14 @@ static long mt9p111_set_sensor_mode(int32_t mode) return rc; } - + /* + * ZTE_LIJING_CAM_20100817 + * judge if switch to preview mode is successful + * + * 0x03: enter into preview mode + * 0x07: enter into snapshot mode + * others: not in snapshot mode + */ while (value != 0x03 && times != 2000) { rc = mt9p111_i2c_write(mt9p111_client->addr, 0x098E, 0x8405, WORD_LEN); @@ -964,7 +1060,12 @@ static long mt9p111_set_sensor_mode(int32_t mode) return rc; } - + /* + * ZTE_LIJING_CAM_20100819 + * + * MUST add time delay for next read, + * to avoid failure of reading preview mode + */ mdelay(50); times++; @@ -1014,7 +1115,12 @@ static long mt9p111_set_sensor_mode(int32_t mode) return rc; } - + /* + * ZTE_LIJING_CAM_20100819 + * + * MUST add time delay for next read, + * to avoid failure of reading preview mode + */ mdelay(50); times++; @@ -1069,7 +1175,10 @@ static long mt9p111_set_effect(int32_t mode, int32_t effect) break; } - + /* + * ZTE_LJ_CAM_20100930 + * Change delay time to 50 ms before setting effect according to suggestion of fae + */ mdelay(50); switch (effect) @@ -1231,7 +1340,10 @@ static long mt9p111_set_effect(int32_t mode, int32_t effect) } } - + /* + * ZTE_LJ_CAM_20100930 + * Change delay time to 50 ms after setting effect according to suggestion of fae + */ mdelay(50); return rc; @@ -1857,7 +1969,10 @@ static int32_t mt9p111_set_iso(int8_t iso_val) return rc; } - +/* + * ZTE_CAM_LJ_20101214 + * add Touch AF and AntiShake funciton + */ static int32_t mt9p111_set_aec_rio(aec_rio_cfg position) { int32_t rc = 0; @@ -2281,7 +2396,13 @@ static int mt9p111_sensor_init_probe(const struct msm_camera_sensor_info *data) switch_on = 0; #endif /* defined(CONFIG_MACH_RAISE) || defined(CONFIG_MACH_JOE) */ - + /* ZTE_JIA_CAM_20100930 + * Enable core VDD power supply to fix init failure problem + */ + /* + * ZTE_CAM_LJ_20101224 + * remove this setting for we have other method to resolve init failure problem + */ //mt9p111_i2c_write(mt9p111_client->addr, 0x0020, 0x0000, WORD_LEN); /* Exit From Hard Standby */ @@ -2301,7 +2422,13 @@ static int mt9p111_sensor_init_probe(const struct msm_camera_sensor_info *data) goto init_probe_fail; } - + /* ZTE_JIA_CAM_20100930 + * Enable core VDD power supply to fix init failure problem + */ + /* + * ZTE_CAM_LJ_20101224 + * remove this setting for we have other method to resolve init failure problem + */ //mt9p111_i2c_write(mt9p111_client->addr, 0x0020, 0x0000, WORD_LEN); /* Read the Model ID of the sensor */ @@ -2449,8 +2576,13 @@ static int mt9p111_sensor_dev_probe(const struct msm_camera_sensor_info *pinfo) switch_on = 0; #endif /* defined(CONFIG_MACH_RAISE) || defined(CONFIG_MACH_JOE) */ - - + /* ZTE_JIA_CAM_20100930 + * Enable core VDD power supply to fix init failure problem + */ + /* + * ZTE_CAM_LJ_20101224 + * remove this setting for we have other method to resolve init failure problem + */ //mt9p111_i2c_write(mt9p111_client->addr, 0x0020, 0x0000, WORD_LEN); rc = mt9p111_hard_standby(pinfo, 0); @@ -2467,7 +2599,13 @@ static int mt9p111_sensor_dev_probe(const struct msm_camera_sensor_info *pinfo) return rc; } - + /* ZTE_JIA_CAM_20100930 + * Enable core VDD power supply to fix init failure problem + */ + /* + * ZTE_CAM_LJ_20101224 + * remove this setting for we have other method to resolve init failure problem + */ //mt9p111_i2c_write(mt9p111_client->addr, 0x0020, 0x0000, WORD_LEN); model_id = 0x0000; @@ -2770,7 +2908,10 @@ int mt9p111_sensor_config(void __user *argp) break; - + /* + * ZTE_CAM_LJ_20101214 + * add variables used for Touch AF and AntiShake function + */ case CFG_SET_AEC_RIO: { rc = mt9p111_set_aec_rio(cfg_data.cfg.aec_rio); @@ -2831,7 +2972,11 @@ static int mt9p111_sensor_release_internal(void) } mdelay(1); - + /* + * Solve sensor current leakage issue. + * Write this reg to shut off all sensor gpios. + * by lijing LIJING_CAM_20100621 + */ rc = mt9p111_i2c_write(mt9p111_client->addr, 0x060E, 0x00FF, WORD_LEN); if (rc < 0) { @@ -3105,7 +3250,12 @@ static void mt9p111_workqueue(struct work_struct *work) probe_failed: CCRT("%s: rc = %d, failed!\n", __func__, rc); - + /* + * ZTE_ZT_CAM_20101203 + * fix bug that standby current is higher when CONFIG_SENSOR_ADAPTER is enabled + * + * ignore "rc" + */ msm_camera_power_backend(MSM_CAMERA_PWRDWN_MODE); return; #endif diff --git a/drivers/media/video/msm/mt9t111_reg_qtech_mcnex_fpc.c b/drivers/media/video/msm/mt9t111_reg_qtech_mcnex_fpc.c index 4589c2a6..de7accca 100644 --- a/drivers/media/video/msm/mt9t111_reg_qtech_mcnex_fpc.c +++ b/drivers/media/video/msm/mt9t111_reg_qtech_mcnex_fpc.c @@ -20,8 +20,33 @@ /*----------------------------------------------------------------------------------------- when who what, where, why comment tag -------- ---- ------------------------------------- ---------------------- - - + 2010-12-15 jia.jia add support for exposure compensation ZTE_MSM_CAMERA_JIA_20101215 + 2010-07-21 jia fix bug of wrong ptr of ZTE_MSM_CAMERA_JIA_001 + "lens_for_indoor_tbl" + 2010-04-23 ygl add process for setting WB ZTE_MSM_CAMERA_YGL_001 + successfully when returned from other + effect mode + 2010-04-15 zh.shj add process for different board types ZTE_MSM_CAMERA_ZHSHJ_001 + e.g., CONFIG_MACH_BLADE and CONFIG_ + MACH_RAISE + 2010-01-14 zh.shj modify config of sharpness ZTE_MSM_CAMERA_ZHSHJ_001 + 2010-01-07 zh.shj modify config of saturation to fix bug ZTE_MSM_CAMERA_ZHSHJ_001 + of no effect after setting effect + 2010-01-06 zh.shj modify config of PLL to make PCLK equal ZTE_MSM_CAMERA_ZHSHJ_001 + to MCLK + 2010-01-05 zh.shj modify config of brightness ZTE_MSM_CAMERA_ZHSHJ_001 + 2009-12-21 zh.shj improve effects of white balance ZTE_MSM_CAMERA_ZHSHJ_001 + 2009-12-21 chg for vfe zoom CHG_CAM_20091217 + 2009-12-19 zh.shj add config for contrast ZTE_MSM_CAMERA_ZHSHJ_001 + 2009-12-11 jia.jia rename file with mt9t111_reg_qtech ZTE_MSM_CAMERA_JIA_001 + 2009-12-03 jia.jia Improve efficiency of sensor init ZTE_MSM_CAMERA_JIA_001 + 2009-12-01 jia.jia Refactor code for sensor init ZTE_MSM_CAMERA_JIA_001 + 2009-11-09 jia.jia add wb and af settings ZTE_MSM_CAMERA_ZHSHJ_001 + 2009-11-26 zh.shj improve effects of AF, AWB and LSC; ZTE_MSM_CAMERA_ZHSHJ_001 + 2009-11-09 jia.jia add orientation setting for preview ZTE_MSM_CAMERA_ZHSHJ_001 + and snapshot + 2009-11-05 zh.shj mt9t111 preview function implemented ZTE_MSM_CAMERA_ZHSHJ_001 + 2009-10-24 jia.jia Merged from kernel-v4515 ZTE_MSM_CAMERA_JIA_001 ------------------------------------------------------------------------------------------*/ #include "mt9t11x.h" diff --git a/drivers/media/video/msm/mt9t111_reg_qtech_mcnex_socket.c b/drivers/media/video/msm/mt9t111_reg_qtech_mcnex_socket.c index a57ca757..6150d9d0 100644 --- a/drivers/media/video/msm/mt9t111_reg_qtech_mcnex_socket.c +++ b/drivers/media/video/msm/mt9t111_reg_qtech_mcnex_socket.c @@ -20,7 +20,31 @@ /*----------------------------------------------------------------------------------------- when who what, where, why comment tag -------- ---- ------------------------------------- ---------------------- - + 2010-12-15 jia.jia add support for exposure compensation ZTE_MSM_CAMERA_JIA_20101215 + 2010-07-21 jia fix bug of wrong ptr of ZTE_MSM_CAMERA_JIA_001 + "lens_for_indoor_tbl" + 2010-04-23 ygl add process for setting WB ZTE_MSM_CAMERA_YGL_001 + successfully when returned from other + effect mode + 2010-04-15 zh.shj merged from v4735 ZTE_MSM_CAMERA_ZHSHJ_001 + 2010-01-14 zh.shj modify config of sharpness ZTE_MSM_CAMERA_ZHSHJ_001 + 2010-01-07 zh.shj modify config of saturation to fix bug ZTE_MSM_CAMERA_ZHSHJ_001 + of no effect after setting effect + 2010-01-06 zh.shj modify config of PLL to make PCLK equal ZTE_MSM_CAMERA_ZHSHJ_001 + to MCLK + 2010-01-05 zh.shj modify config of brightness ZTE_MSM_CAMERA_ZHSHJ_001 + 2009-12-21 zh.shj improve effects of white balance ZTE_MSM_CAMERA_ZHSHJ_001 + 2009-12-21 chg for vfe zoom CHG_CAM_20091217 + 2009-12-19 zh.shj add config for contrast ZTE_MSM_CAMERA_ZHSHJ_001 + 2009-12-11 jia.jia rename file with mt9t111_reg_qtech ZTE_MSM_CAMERA_JIA_001 + 2009-12-03 jia.jia Improve efficiency of sensor init ZTE_MSM_CAMERA_JIA_001 + 2009-12-01 jia.jia Refactor code for sensor init ZTE_MSM_CAMERA_JIA_001 + 2009-11-09 jia.jia add wb and af settings ZTE_MSM_CAMERA_ZHSHJ_001 + 2009-11-26 zh.shj improve effects of AF, AWB and LSC; ZTE_MSM_CAMERA_ZHSHJ_001 + 2009-11-09 jia.jia add orientation setting for preview ZTE_MSM_CAMERA_ZHSHJ_001 + and snapshot + 2009-11-05 zh.shj mt9t111 preview function implemented ZTE_MSM_CAMERA_ZHSHJ_001 + 2009-10-24 jia.jia Merged from kernel-v4515 ZTE_MSM_CAMERA_JIA_001 ------------------------------------------------------------------------------------------*/ #include "mt9t11x.h" diff --git a/drivers/media/video/msm/mt9t112_reg_qtech_mcnex_fpc.c b/drivers/media/video/msm/mt9t112_reg_qtech_mcnex_fpc.c index 54f24450..f031df56 100644 --- a/drivers/media/video/msm/mt9t112_reg_qtech_mcnex_fpc.c +++ b/drivers/media/video/msm/mt9t112_reg_qtech_mcnex_fpc.c @@ -20,7 +20,78 @@ /*----------------------------------------------------------------------------------------- when who what, where, why comment tag -------- ---- ------------------------------------- ---------------------- - + 2011-10-26 lijing update for A light fail of P727P ZTE_CAM_LJ_20111026 + 2011-07-26 wangtao modify display more red 727d40 ZTE_CAM_WT_20110726 + 2011-06-24 lijng modify the sharpness of data pin rising ZTE_CAM_LJ_20110624 + edge. + 2011-03-30 ygl modified the focus mode to improve the ZTE_CAM_WT_20110215 + focus time + 2010-12-16 zt modify PLL setting ZTE_ZT_CAM_20101216 + modify clk + modify init setting, i.e., prev_snap + modify LSC + modify setting of brightness + modify setting of saturation + modify setting of sharpness + setting of lens_for_outdoor and + lens_for_indoor are disused + 2010-12-15 jia.jia add support for exposure compensation ZTE_MSM_CAMERA_JIA_20101215 + 2010-09-27 zt eliminate the preview flash under the ZTE_MSM_CAMERA_ZT_001 + specific A light source + 2010-08-09 jia modify setting of AWB and lensshading ZTE_MSM_CAMERA_JIA_001 + to improve effects of preview and + snapshot + 2010-07-28 li.jing fix bug of white line display during ZTE_MSM_CAMERA_LIJING_001 + snapshot + 2010-07-21 jia fix bug of wrong ptr of ZTE_MSM_CAMERA_JIA_001 + "lens_for_indoor_tbl" + 2010-05-13 zh.shj modify config of AWB & LSC settings ZTE_MSM_CAMERA_ZHSHJ_001 + for different projects + 2010-05-06 zh.shj modify config of lens shading for Mcnex ZTE_MSM_CAMERA_ZHSHJ_001 + MT9T112 and add AF TWICE process to + improve AF effect + 2010-04-15 zh.shj add process for different board types ZTE_MSM_CAMERA_ZHSHJ_001 + e.g., CONFIG_MACH_BLADE and CONFIG_ + MACH_RAISE + 2010-03-13 zh.shj improve performance of auto WB, ZTE_MSM_CAMERA_ZHSHJ_001 + contrast, and LS in indoor environment + 2010-03-03 zh.shj Add process of lens shading before ZTE_MSM_CAMERA_ZHSHJ_001 + preview and snapshot + 2010-02-21 zh.shj set sharpenss value according to ZTE_MSM_CAMERA_ZHSHJ_001 + different brightness level; + patched from Aptina, USA; + modify contrast value according to + patch provided by Aptina, USA; + enlarge AF windows; + improve AWB effect for new sensor; + 2010-02-04 zh.shj improve effect of preview and snapshot ZTE_MSM_CAMERA_ZHSHJ_001 + after new module is available + 2010-01-28 zh.shj modify setting of maximum brightness ZTE_MSM_CAMERA_ZHSHJ_001 + 2010-01-26 zh.shj fix bug of inconsistence during setting ZTE_MSM_CAMERA_ZHSHJ_001 + minimum brightness + 2010-01-22 zh.shj improve effect of preview and snapshot ZTE_MSM_CAMERA_ZHSHJ_001 + under poor light condition + 2010-01-14 zh.shj modify config of sharpness ZTE_MSM_CAMERA_ZHSHJ_001 + 2010-01-06 zh.shj modify config of PLL to make PCLK equal ZTE_MSM_CAMERA_ZHSHJ_001 + to MCLK + modify config of AWB and CCM + modify config of auto mode of white balance + modify config of brightness + 2010-01-05 zh.shj modify config of contrast ZTE_MSM_CAMERA_ZHSHJ_001 + 2009-12-28 zh.shj add config for MT9T112-3.1Mp-AF ZTE_MSM_CAMERA_ZHSHJ_001 + 2009-12-28 jia.jia merged from mt9t111_reg_qtech.c ZTE_MSM_CAMERA_JIA_001 + 2009-12-21 zh.shj improve effects of white balance ZTE_MSM_CAMERA_ZHSHJ_001 + 2009-12-21 chg for vfe zoom CHG_CAM_20091217 + 2009-12-19 zh.shj add config for contrast ZTE_MSM_CAMERA_ZHSHJ_001 + 2009-12-11 jia.jia rename file with mt9t111_reg_qtech ZTE_MSM_CAMERA_JIA_001 + 2009-12-03 jia.jia Improve efficiency of sensor init ZTE_MSM_CAMERA_JIA_001 + 2009-12-01 jia.jia Refactor code for sensor init ZTE_MSM_CAMERA_JIA_001 + 2009-11-09 jia.jia add wb and af settings ZTE_MSM_CAMERA_ZHSHJ_001 + 2009-11-26 zh.shj improve effects of AF, AWB and LSC; ZTE_MSM_CAMERA_ZHSHJ_001 + 2009-11-09 jia.jia add orientation setting for preview ZTE_MSM_CAMERA_ZHSHJ_001 + and snapshot + 2009-11-05 zh.shj mt9t111 preview function implemented ZTE_MSM_CAMERA_ZHSHJ_001 + 2009-10-24 jia.jia Merged from kernel-v4515 ZTE_MSM_CAMERA_JIA_001 ------------------------------------------------------------------------------------------*/ #include "mt9t11x.h" @@ -1076,6 +1147,196 @@ static struct mt9t11x_i2c_reg_conf const prev_snap_tbl[] = { /* * For narrow visual angle of lens only */ + //resolve dispaly more red 20110726 wangtao + #if defined(CONFIG_MACH_SAILBOAT) + //[Lens Correction 95% 06/14/11 19:13:21] + //BITFIELD= 0x3210, 0x0008, 0 //PGA_ENABLE + {0x3210, 0x00B0, WORD_LEN,0}, // COLOR_PIPELINE_CONTROL + {0x3640, 0x00F0, WORD_LEN,0}, // P_G1_P0Q0 + {0x3642, 0x932C, WORD_LEN,0}, // P_G1_P0Q1 + {0x3644, 0x7C51, WORD_LEN,0}, // P_G1_P0Q2 + {0x3646, 0xB36E, WORD_LEN,0}, // P_G1_P0Q3 + {0x3648, 0xD731, WORD_LEN,0}, // P_G1_P0Q4 + {0x364A, 0x0090, WORD_LEN,0}, // P_R_P0Q0 + {0x364C, 0xB82B, WORD_LEN,0}, // P_R_P0Q1 + {0x364E, 0x6931, WORD_LEN,0}, // P_R_P0Q2 + {0x3650, 0xD6CD, WORD_LEN,0}, // P_R_P0Q3 + {0x3652, 0xBB71, WORD_LEN,0}, // P_R_P0Q4 + {0x3654, 0x0090, WORD_LEN,0}, // P_B_P0Q0 + {0x3656, 0xC54B, WORD_LEN,0}, // P_B_P0Q1 + {0x3658, 0x47B1, WORD_LEN,0}, // P_B_P0Q2 + {0x365A, 0x8A0E, WORD_LEN,0}, // P_B_P0Q3 + {0x365C, 0xC131, WORD_LEN,0}, // P_B_P0Q4 + {0x365E, 0x7FEF, WORD_LEN,0}, // P_G2_P0Q0 + {0x3660, 0x832C, WORD_LEN,0}, // P_G2_P0Q1 + {0x3662, 0x7FF1, WORD_LEN,0}, // P_G2_P0Q2 + {0x3664, 0xB02E, WORD_LEN,0}, // P_G2_P0Q3 + {0x3666, 0xEA31, WORD_LEN,0}, // P_G2_P0Q4 + {0x3680, 0x2A2C, WORD_LEN,0}, // P_G1_P1Q0 + {0x3682, 0x852A, WORD_LEN,0}, // P_G1_P1Q1 + {0x3684, 0x282F, WORD_LEN,0}, // P_G1_P1Q2 + {0x3686, 0x0FCE, WORD_LEN,0}, // P_G1_P1Q3 + {0x3688, 0xDC90, WORD_LEN,0}, // P_G1_P1Q4 + {0x368A, 0x2D8D, WORD_LEN,0}, // P_R_P1Q0 + {0x368C, 0x1BAD, WORD_LEN,0}, // P_R_P1Q1 + {0x368E, 0x36EF, WORD_LEN,0}, // P_R_P1Q2 + {0x3690, 0xF2ED, WORD_LEN,0}, // P_R_P1Q3 + {0x3692, 0xD5B0, WORD_LEN,0}, // P_R_P1Q4 + {0x3694, 0xA9ED, WORD_LEN,0}, // P_B_P1Q0 + {0x3696, 0x61CB, WORD_LEN,0}, // P_B_P1Q1 + {0x3698, 0xC72E, WORD_LEN,0}, // P_B_P1Q2 + {0x369A, 0x208E, WORD_LEN,0}, // P_B_P1Q3 + {0x369C, 0x0470, WORD_LEN,0}, // P_B_P1Q4 + {0x369E, 0xFA2D, WORD_LEN,0}, // P_G2_P1Q0 + {0x36A0, 0x0BAD, WORD_LEN,0}, // P_G2_P1Q1 + {0x36A2, 0x878E, WORD_LEN,0}, // P_G2_P1Q2 + {0x36A4, 0x7AAD, WORD_LEN,0}, // P_G2_P1Q3 + {0x36A6, 0x454E, WORD_LEN,0}, // P_G2_P1Q4 + {0x36C0, 0x3352, WORD_LEN,0}, // P_G1_P2Q0 + {0x36C2, 0xE26E, WORD_LEN,0}, // P_G1_P2Q1 + {0x36C4, 0xCF93, WORD_LEN,0}, // P_G1_P2Q2 + {0x36C6, 0x1DF2, WORD_LEN,0}, // P_G1_P2Q3 + {0x36C8, 0x0D55, WORD_LEN,0}, // P_G1_P2Q4 + {0x36CA, 0x1A92, WORD_LEN,0}, // P_R_P2Q0 + {0x36CC, 0xBD2F, WORD_LEN,0}, // P_R_P2Q1 + {0x36CE, 0xD2B2, WORD_LEN,0}, // P_R_P2Q2 + {0x36D0, 0x2DD2, WORD_LEN,0}, // P_R_P2Q3 + {0x36D2, 0x6773, WORD_LEN,0}, // P_R_P2Q4 + {0x36D4, 0x1472, WORD_LEN,0}, // P_B_P2Q0 + {0x36D6, 0xC0EF, WORD_LEN,0}, // P_B_P2Q1 + {0x36D8, 0xD833, WORD_LEN,0}, // P_B_P2Q2 + {0x36DA, 0x1472, WORD_LEN,0}, // P_B_P2Q3 + {0x36DC, 0x2555, WORD_LEN,0}, // P_B_P2Q4 + {0x36DE, 0x39D2, WORD_LEN,0}, // P_G2_P2Q0 + {0x36E0, 0xCDAF, WORD_LEN,0}, // P_G2_P2Q1 + {0x36E2, 0xD7B3, WORD_LEN,0}, // P_G2_P2Q2 + {0x36E4, 0x5252, WORD_LEN,0}, // P_G2_P2Q3 + {0x36E6, 0x0BB5, WORD_LEN,0}, // P_G2_P2Q4 + {0x3700, 0x2AEE, WORD_LEN,0}, // P_G1_P3Q0 + {0x3702, 0xA2D0, WORD_LEN,0}, // P_G1_P3Q1 + {0x3704, 0xAB92, WORD_LEN,0}, // P_G1_P3Q2 + {0x3706, 0x0E71, WORD_LEN,0}, // P_G1_P3Q3 + {0x3708, 0x2C34, WORD_LEN,0}, // P_G1_P3Q4 + {0x370A, 0x384C, WORD_LEN,0}, // P_R_P3Q0 + {0x370C, 0x9D50, WORD_LEN,0}, // P_R_P3Q1 + {0x370E, 0x8A52, WORD_LEN,0}, // P_R_P3Q2 + {0x3710, 0x2591, WORD_LEN,0}, // P_R_P3Q3 + {0x3712, 0x1634, WORD_LEN,0}, // P_R_P3Q4 + {0x3714, 0xC04E, WORD_LEN,0}, // P_B_P3Q0 + {0x3716, 0xB7CE, WORD_LEN,0}, // P_B_P3Q1 + {0x3718, 0x0D71, WORD_LEN,0}, // P_B_P3Q2 + {0x371A, 0xAF8F, WORD_LEN,0}, // P_B_P3Q3 + {0x371C, 0x9792, WORD_LEN,0}, // P_B_P3Q4 + {0x371E, 0xC96E, WORD_LEN,0}, // P_G2_P3Q0 + {0x3720, 0x5B2D, WORD_LEN,0}, // P_G2_P3Q1 + {0x3722, 0xB40F, WORD_LEN,0}, // P_G2_P3Q2 + {0x3724, 0x92D2, WORD_LEN,0}, // P_G2_P3Q3 + {0x3726, 0x37D3, WORD_LEN,0}, // P_G2_P3Q4 + {0x3740, 0x8C33, WORD_LEN,0}, // P_G1_P4Q0 + {0x3742, 0xEE11, WORD_LEN,0}, // P_G1_P4Q1 + {0x3744, 0x6290, WORD_LEN,0}, // P_G1_P4Q2 + {0x3746, 0x1334, WORD_LEN,0}, // P_G1_P4Q3 + {0x3748, 0x4517, WORD_LEN,0}, // P_G1_P4Q4 + {0x374A, 0xCCF2, WORD_LEN,0}, // P_R_P4Q0 + {0x374C, 0xF2D0, WORD_LEN,0}, // P_R_P4Q1 + {0x374E, 0xB2B4, WORD_LEN,0}, // P_R_P4Q2 + {0x3750, 0x0E13, WORD_LEN,0}, // P_R_P4Q3 + {0x3752, 0x0D18, WORD_LEN,0}, // P_R_P4Q4 + {0x3754, 0xE472, WORD_LEN,0}, // P_B_P4Q0 + {0x3756, 0x96B1, WORD_LEN,0}, // P_B_P4Q1 + {0x3758, 0x2BD4, WORD_LEN,0}, // P_B_P4Q2 + {0x375A, 0x1794, WORD_LEN,0}, // P_B_P4Q3 + {0x375C, 0x7D36, WORD_LEN,0}, // P_B_P4Q4 + {0x375E, 0x9433, WORD_LEN,0}, // P_G2_P4Q0 + {0x3760, 0x9771, WORD_LEN,0}, // P_G2_P4Q1 + {0x3762, 0x914F, WORD_LEN,0}, // P_G2_P4Q2 + {0x3764, 0x31F3, WORD_LEN,0}, // P_G2_P4Q3 + {0x3766, 0x4E97, WORD_LEN,0}, // P_G2_P4Q4 + {0x3782, 0x0310, WORD_LEN,0}, // CENTER_ROW + {0x3784, 0x0410, WORD_LEN,0}, // CENTER_COLUMN + //STATE= Lens Correction Falloff, 95 + //BITFIELD= 0x3210, 0x0008, 1 //PGA_ENABLE + {0x3210, 0x00B8, WORD_LEN,0}, // COLOR_PIPELINE_CONTROL + + + + {0x098E, 0x48B0 ,WORD_LEN,0}, // MCU_ADDRESS [CAM1_AWB_CCM_L_0] + {0x0990, 0x0242 ,WORD_LEN,0}, // MCU_DATA_0 + {0x098E, 0x48B2 ,WORD_LEN,0}, // MCU_ADDRESS [CAM1_AWB_CCM_L_1] + {0x0990, 0xFE23 ,WORD_LEN,0}, // MCU_DATA_0 + {0x098E, 0x48B4 ,WORD_LEN,0}, // MCU_ADDRESS [CAM1_AWB_CCM_L_2] + {0x0990, 0x00B7 ,WORD_LEN,0}, // MCU_DATA_0 + {0x098E, 0x48B6 ,WORD_LEN,0}, // MCU_ADDRESS [CAM1_AWB_CCM_L_3] + {0x0990, 0xFFC6 ,WORD_LEN,0}, // MCU_DATA_0 + {0x098E, 0x48B8 ,WORD_LEN,0}, // MCU_ADDRESS [CAM1_AWB_CCM_L_4] + {0x0990, 0x0176 ,WORD_LEN,0}, // MCU_DATA_0 + {0x098E, 0x48BA ,WORD_LEN,0}, // MCU_ADDRESS [CAM1_AWB_CCM_L_5] + {0x0990, 0xFFDE ,WORD_LEN,0}, // MCU_DATA_0 + {0x098E, 0x48BC ,WORD_LEN,0}, // MCU_ADDRESS [CAM1_AWB_CCM_L_6] + {0x0990, 0xFF9E ,WORD_LEN,0}, // MCU_DATA_0 + {0x098E, 0x48BE ,WORD_LEN,0}, // MCU_ADDRESS [CAM1_AWB_CCM_L_7] + {0x0990, 0xFE81 ,WORD_LEN,0}, // MCU_DATA_0 + {0x098E, 0x48C0 ,WORD_LEN,0}, // MCU_ADDRESS [CAM1_AWB_CCM_L_8] + {0x0990, 0x02FC ,WORD_LEN,0}, // MCU_DATA_0 + {0x098E, 0x48C2 ,WORD_LEN,0}, // MCU_ADDRESS [CAM1_AWB_CCM_L_9] + {0x0990, 0x001E ,WORD_LEN,0}, // MCU_DATA_0 + {0x098E, 0x48C4 ,WORD_LEN,0}, // MCU_ADDRESS [CAM1_AWB_CCM_L_10] + {0x0990, 0x003A ,WORD_LEN,0}, // MCU_DATA_0 + {0x098E, 0x48C6 ,WORD_LEN,0}, // MCU_ADDRESS [CAM1_AWB_CCM_RL_0] + {0x0990, 0x0034 ,WORD_LEN,0}, // MCU_DATA_0 + {0x098E, 0x48C8 ,WORD_LEN,0}, // MCU_ADDRESS [CAM1_AWB_CCM_RL_1] + {0x0990, 0x0041 ,WORD_LEN,0}, // MCU_DATA_0 + {0x098E, 0x48CA ,WORD_LEN,0}, // MCU_ADDRESS [CAM1_AWB_CCM_RL_2] + {0x0990, 0xFF89 ,WORD_LEN,0}, // MCU_DATA_0 + {0x098E, 0x48CC ,WORD_LEN,0}, // MCU_ADDRESS [CAM1_AWB_CCM_RL_3] + {0x0990, 0x001C ,WORD_LEN,0}, // MCU_DATA_0 + {0x098E, 0x48CE ,WORD_LEN,0}, // MCU_ADDRESS [CAM1_AWB_CCM_RL_4] + {0x0990, 0xFFF9 ,WORD_LEN,0}, // MCU_DATA_0 + {0x098E, 0x48D0 ,WORD_LEN,0}, // MCU_ADDRESS [CAM1_AWB_CCM_RL_5] + {0x0990, 0xFFE9 ,WORD_LEN,0}, // MCU_DATA_0 + {0x098E, 0x48D2 ,WORD_LEN,0}, // MCU_ADDRESS [CAM1_AWB_CCM_RL_6] + {0x0990, 0x0062 ,WORD_LEN,0}, // MCU_DATA_0 + {0x098E, 0x48D4 ,WORD_LEN,0}, // MCU_ADDRESS [CAM1_AWB_CCM_RL_7] + {0x0990, 0x008A ,WORD_LEN,0}, // MCU_DATA_0 + {0x098E, 0x48D6 ,WORD_LEN,0}, // MCU_ADDRESS [CAM1_AWB_CCM_RL_8] + {0x0990, 0xFF12 ,WORD_LEN,0}, // MCU_DATA_0 + {0x098E, 0x48D8 ,WORD_LEN,0}, // MCU_ADDRESS [CAM1_AWB_CCM_RL_9] + {0x0990, 0x0019 ,WORD_LEN,0}, // MCU_DATA_0 + {0x098E, 0x48DA ,WORD_LEN,0}, // MCU_ADDRESS [CAM1_AWB_CCM_RL_10] + {0x0990, 0xFFE6 ,WORD_LEN,0}, // MCU_DATA_0 + {0x098E, 0x4906 ,WORD_LEN,0}, // MCU_ADDRESS [CAM1_AWB_AWB_XSHIFT_PRE_ADJ] + {0x0990, 0x002F ,WORD_LEN,0}, // MCU_DATA_0 + {0x098E, 0x4908 ,WORD_LEN,0}, // MCU_ADDRESS [CAM1_AWB_AWB_YSHIFT_PRE_ADJ] + {0x0990, 0x0024 ,WORD_LEN,0}, // MCU_DATA_0 + {0x098E, 0xC8F4 ,WORD_LEN,0}, // MCU_ADDRESS [CAM1_AWB_AWB_XSCALE] + {0x0990, 0x0004 ,WORD_LEN,0}, // MCU_DATA_0 + {0x098E, 0xC8F5 ,WORD_LEN,0}, // MCU_ADDRESS [CAM1_AWB_AWB_YSCALE] + {0x0990, 0x0003 ,WORD_LEN,0}, // MCU_DATA_0 + {0x098E, 0x48F6 ,WORD_LEN,0}, // MCU_ADDRESS [CAM1_AWB_AWB_WEIGHTS_0] + {0x0990, 0xCBEF ,WORD_LEN,0}, // MCU_DATA_0 + {0x098E, 0x48F8 ,WORD_LEN,0}, // MCU_ADDRESS [CAM1_AWB_AWB_WEIGHTS_1] + {0x0990, 0xEA40 ,WORD_LEN,0}, // MCU_DATA_0 + {0x098E, 0x48FA ,WORD_LEN,0}, // MCU_ADDRESS [CAM1_AWB_AWB_WEIGHTS_2] + {0x0990, 0x95A0 ,WORD_LEN,0}, // MCU_DATA_0 + {0x098E, 0x48FC ,WORD_LEN,0}, // MCU_ADDRESS [CAM1_AWB_AWB_WEIGHTS_3] + {0x0990, 0x509D ,WORD_LEN,0}, // MCU_DATA_0 + {0x098E, 0x48FE ,WORD_LEN,0}, // MCU_ADDRESS [CAM1_AWB_AWB_WEIGHTS_4] + {0x0990, 0x1680 ,WORD_LEN,0}, // MCU_DATA_0 + {0x098E, 0x4900 ,WORD_LEN,0}, // MCU_ADDRESS [CAM1_AWB_AWB_WEIGHTS_5] + {0x0990, 0xAD6D ,WORD_LEN,0}, // MCU_DATA_0 + {0x098E, 0x4902 ,WORD_LEN,0}, // MCU_ADDRESS [CAM1_AWB_AWB_WEIGHTS_6] + {0x0990, 0xFF4D ,WORD_LEN,0}, // MCU_DATA_0 + {0x098E, 0x4904 ,WORD_LEN,0}, // MCU_ADDRESS [CAM1_AWB_AWB_WEIGHTS_7] + {0x0990, 0xC757 ,WORD_LEN,0}, // MCU_DATA_0 + {0x098E, 0x48C2 ,WORD_LEN,0}, // MCU_ADDRESS [CAM1_AWB_CCM_L_9] + {0x0990, 0x001E ,WORD_LEN,0}, // MCU_DATA_0 + {0x098E, 0x48C4 ,WORD_LEN,0}, // MCU_ADDRESS [CAM1_AWB_CCM_L_10] + {0x0990, 0x003E ,WORD_LEN,0}, // MCU_DATA_0 + {0x098E, 0x48D8 ,WORD_LEN,0}, // MCU_ADDRESS [CAM1_AWB_CCM_RL_9] + {0x0990, 0x0015 ,WORD_LEN,0}, // MCU_DATA_0 + {0x098E, 0x48DA ,WORD_LEN,0}, // MCU_ADDRESS [CAM1_AWB_CCM_RL_10] + {0x0990, 0xFFE9 ,WORD_LEN,0}, // MCU_DATA_0 +#else //[85% with white paper in sunlight] {0x3640, 0x0230, WORD_LEN, 0}, // P_G1_P0Q0 {0x3642, 0xCB8C, WORD_LEN, 0}, // P_G1_P0Q1 @@ -1257,6 +1518,7 @@ static struct mt9t11x_i2c_reg_conf const prev_snap_tbl[] = { {0x0990, 0x0015, WORD_LEN, 0}, // MCU_DATA_0 {0x098E, 0x48DA, WORD_LEN, 0}, // MCU_ADDRESS [CAM1_AWB_CCM_RL_10] {0x0990, 0xFFE9, WORD_LEN, 0}, // MCU_DATA_0 + #endif // Pa calib {0x098E, 0x6837, WORD_LEN, 0}, // MCU_ADDRESS [PRI_A_CONFIG_AE_TRACK_AE_MIN_VIRT_AGAIN] @@ -1454,6 +1716,17 @@ static struct mt9t11x_i2c_reg_conf const prev_snap_tbl[] = { {0x0990, 0x007E, WORD_LEN, 0}, // MCU_DATA_0 // for A light +//ZTE_CAM_LJ_20111026 +#if defined (CONFIG_MACH_SAILBOAT) + {0x098E, 0xE84A, WORD_LEN, 0}, // MCU_ADDRESS [PRI_A_CONFIG_AWB_K_R_L] + {0x0990, 0x0066, WORD_LEN, 0}, // MCU_DATA_0 + {0x098E, 0xE84C, WORD_LEN, 0}, // MCU_ADDRESS [PRI_A_CONFIG_AWB_K_B_L] + {0x0990, 0x008B, WORD_LEN, 0}, // MCU_DATA_0 + {0x098E, 0xEC4A, WORD_LEN, 0}, // MCU_ADDRESS [PRI_B_CONFIG_AWB_K_R_L] + {0x0990, 0x0066, WORD_LEN, 0}, // MCU_DATA_0 + {0x098E, 0xEC4C, WORD_LEN, 0}, // MCU_ADDRESS [PRI_B_CONFIG_AWB_K_B_L] + {0x0990, 0x008B, WORD_LEN, 0}, // MCU_DATA_0 +#else {0x098E, 0xE84A, WORD_LEN, 0}, // MCU_ADDRESS [PRI_A_CONFIG_AWB_K_R_L] {0x0990, 0x0073, WORD_LEN, 0}, // MCU_DATA_0 {0x098E, 0xE84C, WORD_LEN, 0}, // MCU_ADDRESS [PRI_A_CONFIG_AWB_K_B_L] @@ -1461,13 +1734,18 @@ static struct mt9t11x_i2c_reg_conf const prev_snap_tbl[] = { {0x098E, 0xEC4A, WORD_LEN, 0}, // MCU_ADDRESS [PRI_B_CONFIG_AWB_K_R_L] {0x0990, 0x0073, WORD_LEN, 0}, // MCU_DATA_0 {0x098E, 0xEC4C, WORD_LEN, 0}, // MCU_ADDRESS [PRI_B_CONFIG_AWB_K_B_L] - {0x0990, 0x008B, WORD_LEN, 0}, // MCU_DATA_0 + {0x0990, 0x008B, WORD_LEN, 0}, // MCU_DATA_0 +#endif // Saturation / DDCCM {0x098E, 0x8400, WORD_LEN, 0}, // MCU_ADDRESS [SEQ_CMD] {0x0990, 0x0006, WORD_LEN, 200}, // MCU_DATA_0 {0x098E, 0xE86F, WORD_LEN, 0}, // MCU_ADDRESS [PRI_A_CONFIG_LL_START_SATURATION] + #if defined(CONFIG_MACH_SAILBOAT) //ZTE_CAM_WT_20110726 + {0x0990, 0x008c, WORD_LEN, 0}, // MCU_DATA_0 + #else {0x0990, 0x0098, WORD_LEN, 0}, // MCU_DATA_0 + #endif {0x098E, 0xE870, WORD_LEN, 0}, // MCU_ADDRESS [PRI_A_CONFIG_LL_END_SATURATION] {0x0990, 0x0038, WORD_LEN, 0}, // MCU_DATA_0 {0x098E, 0xEC6F, WORD_LEN, 0}, // MCU_ADDRESS [PRI_B_CONFIG_LL_START_SATURATION] @@ -1489,17 +1767,47 @@ static struct mt9t11x_i2c_reg_conf const prev_snap_tbl[] = { {0x3092, 0x0A49, WORD_LEN, 0}, // DAC_LD_18_19 {0x3094, 0x4949, WORD_LEN, 0}, // DAC_LD_20_21 {0x3096, 0x4950, WORD_LEN, 5}, // DAC_LD_22_23 - + +#if defined (CONFIG_MACH_TURIES) + //do nothing +#else {0x3C20, 0x0000, WORD_LEN, 0}, // TX_SS_CONTROL - + /* + * ZTE_CAM_LJ_20110624 + * make data line rising edge more sharply for sailboat, + * else preview data is not correct. + */ #if defined (CONFIG_MACH_SAILBOAT) {0x001E, 0x0701, WORD_LEN, 5}, // PAD_SLEW_PAD_CONFIG #else {0x001E, 0x0777, WORD_LEN, 5}, // PAD_SLEW_PAD_CONFIG +#endif #endif {0x0018, 0x002A, WORD_LEN, 20}, // STANDBY_CONTROL_AND_STATUS= +#if defined (CONFIG_MACH_SAILBOAT) +{0x098E, 0x48FE, WORD_LEN, 0}, // MCU_ADDRESS [CAM1_AWB_AWB_WEIGHTS_4] +{0x0990, 0x1EEF, WORD_LEN, 0}, // MCU_DATA_0 +{0x098E, 0xE84F, WORD_LEN, 0}, // MCU_ADDRESS [PRI_A_CONFIG_AWB_K_B_R] +{0x0990, 0x007D, WORD_LEN, 0}, // MCU_DATA_0 +#endif + +#if defined (CONFIG_MACH_TURIES) +//[normal] +{0x098E, 0x480C, WORD_LEN,0}, // MCU_ADDRESS [CAM1_CTX_A_READ_MODE] +{0x0990, 0x046C, WORD_LEN,0}, // MCU_DATA_0 +{0x098E, 0xC80E, WORD_LEN,0}, // MCU_ADDRESS [CAM1_CTX_A_PIXEL_ORDER] +{0x0990, 0x0000, WORD_LEN,0}, // MCU_DATA_0 +{0x098E, 0x4854, WORD_LEN,0}, // MCU_ADDRESS [CAM1_CTX_B_READ_MODE] +{0x0990, 0x0024, WORD_LEN,0}, // MCU_DATA_0 +{0x098E, 0xC856, WORD_LEN,0}, // MCU_ADDRESS [CAM1_CTX_B_PIXEL_ORDER] +{0x0990, 0x0000, WORD_LEN,0}, // MCU_DATA_0 +{0x098E, 0x8400, WORD_LEN,0}, // MCU_ADDRESS [SEQ_CMD] +{0x0990, 0x0006, WORD_LEN,0}, // MCU_DATA_0 +#endif + + }; static struct mt9t11x_i2c_reg_conf const wb_cloudy_tbl[] = { @@ -1755,8 +2063,15 @@ static struct mt9t11x_i2c_reg_conf const af_tbl[] = { {0x0990, 0x03B6, WORD_LEN, 0}, // MCU_DATA_0 //AF TWICE + + /* + * ZTE_CAM_LJ_20110915, + * Fix bug of AF time too long in high light + * 0x0002 -> 0x0042 + */ {0x098E, 0xB002, WORD_LEN, 0}, // MCU_ADDRESS [AFM_POS_MAX] - {0x0990, 0x0002, WORD_LEN, 0}, // MCU_DATA_0 + {0x0990, 0x0042, WORD_LEN, 0}, // MCU_DATA_0 + //{0x0990, 0x0002, WORD_LEN, 0}, // MCU_DATA_0 {0x098E, 0x8400, WORD_LEN, 0}, // MCU_ADDRESS [SEQ_CMD] {0x0990, 0x0006, WORD_LEN, 50},// MCU_DATA_0 @@ -1768,7 +2083,11 @@ static struct mt9t11x_i2c_reg_conf const af_tbl[] = { {0x0990, 0x0000, WORD_LEN, 0}, // MCU_DATA_0 {0x098E, 0x3003, WORD_LEN, 0}, // MCU_ADDRESS [AF_ALGO] - + /* + * ZTE_CAM_WT_20110215, + * modified the focus mode to improve the focus time + * 0x0002 -> 0x0008 + */ //{0x0990, 0x0002, WORD_LEN, 0}, // MCU_DATA_0 {0x0990, 0x0008, WORD_LEN, 0}, // MCU_DATA_0 //AF window enlarged @@ -2108,7 +2427,11 @@ static struct mt9t11x_i2c_reg_conf const saturation_tbl_1[] = { static struct mt9t11x_i2c_reg_conf const saturation_tbl_2[] = { {0x098E, 0xE86F, WORD_LEN, 0}, // MCU_ADDRESS [PRI_A_CONFIG_LL_START_SATURATION] + #if defined(CONFIG_MACH_SAILBOAT) //ZTE_CAM_WT_20110726 + {0x0990, 0x008c, WORD_LEN, 0}, // MCU_DATA_0 + #else {0x0990, 0x0098, WORD_LEN, 0}, // MCU_DATA_0 + #endif {0x098E, 0xE870, WORD_LEN, 0}, // MCU_ADDRESS [PRI_A_CONFIG_LL_END_SATURATION] {0x0990, 0x0038, WORD_LEN, 0}, // MCU_DATA_0 {0x098E, 0xEC6F, WORD_LEN, 0}, // MCU_ADDRESS [PRI_B_CONFIG_LL_START_SATURATION] @@ -2318,7 +2641,7 @@ static uint16_t const exposure_tbl_sz[] = { * For wide visual angle of lens only */ static struct mt9t11x_i2c_reg_conf const lens_for_outdoor_tbl[] ={ -#if 0 +#if 0 // ZTE_ZT_CAM_20101216 disused //[85% with white paper in sunlight] {0x3640, 0x08B0, WORD_LEN, 0}, // P_G1_P0Q0 {0x3642, 0x9F8E, WORD_LEN, 0}, // P_G1_P0Q1 @@ -2426,7 +2749,7 @@ static struct mt9t11x_i2c_reg_conf const lens_for_outdoor_tbl[] ={ }; static struct mt9t11x_i2c_reg_conf const lens_for_indoor_tbl[] ={ -#if 0 +#if 0 //ZTE_ZT_CAM_20101216 disused #if defined(CONFIG_MACH_BLADE) || defined (CONFIG_MACH_SMOOTH) //[Lens Correction 10/08/00] {0x3640, 0x0130, WORD_LEN, 0}, diff --git a/drivers/media/video/msm/mt9t112_reg_qtech_mcnex_socket.c b/drivers/media/video/msm/mt9t112_reg_qtech_mcnex_socket.c index 6a1aa078..ed8695c4 100644 --- a/drivers/media/video/msm/mt9t112_reg_qtech_mcnex_socket.c +++ b/drivers/media/video/msm/mt9t112_reg_qtech_mcnex_socket.c @@ -20,8 +20,53 @@ /*----------------------------------------------------------------------------------------- when who what, where, why comment tag -------- ---- ------------------------------------- ---------------------- - - + 2010-12-15 jia.jia add support for exposure compensation ZTE_MSM_CAMERA_JIA_20101215 + 2010-08-12 ygl modify setting of AWB and lensshading ZTE_MSM_CAMERA_YGL_001 + to improve effects of preview and + snapshot + 2010-07-21 jia fix bug of wrong ptr of ZTE_MSM_CAMERA_JIA_001 + "lens_for_indoor_tbl" + 2010-06-28 jia improve AWB for internal lab test ZTE_MSM_CAMERA_JIA_20100628 + 2010-06-25 jia improve AWB for internal lab test ZTE_MSM_CAMERA_JIA_20100625 + 2010-03-13 zh.shj improve performance of auto WB, ZTE_MSM_CAMERA_ZHSHJ_001 + contrast, and LS in indoor environment + 2010-03-03 zh.shj Add process of lens shading before ZTE_MSM_CAMERA_ZHSHJ_001 + preview and snapshot + 2010-02-21 zh.shj set sharpenss value according to ZTE_MSM_CAMERA_ZHSHJ_001 + different brightness level; + patched from Aptina, USA; + modify contrast value according to + patch provided by Aptina, USA; + enlarge AF windows; + improve AWB effect for new sensor; + 2010-02-04 zh.shj improve effect of preview and snapshot ZTE_MSM_CAMERA_ZHSHJ_001 + after new module is available + 2010-01-28 zh.shj modify setting of maximum brightness ZTE_MSM_CAMERA_ZHSHJ_001 + 2010-01-26 zh.shj fix bug of inconsistence during setting ZTE_MSM_CAMERA_ZHSHJ_001 + minimum brightness + 2010-01-22 zh.shj improve effect of preview and snapshot ZTE_MSM_CAMERA_ZHSHJ_001 + under poor light condition + 2010-01-14 zh.shj modify config of sharpness ZTE_MSM_CAMERA_ZHSHJ_001 + 2010-01-06 zh.shj modify config of PLL to make PCLK equal ZTE_MSM_CAMERA_ZHSHJ_001 + to MCLK + modify config of AWB and CCM + modify config of auto mode of white balance + modify config of brightness + 2010-01-05 zh.shj modify config of contrast ZTE_MSM_CAMERA_ZHSHJ_001 + 2009-12-28 zh.shj add config for MT9T112-3.1Mp-AF ZTE_MSM_CAMERA_ZHSHJ_001 + 2009-12-28 jia.jia merged from mt9t111_reg_qtech.c ZTE_MSM_CAMERA_JIA_001 + 2009-12-21 zh.shj improve effects of white balance ZTE_MSM_CAMERA_ZHSHJ_001 + 2009-12-21 chg for vfe zoom CHG_CAM_20091217 + 2009-12-19 zh.shj add config for contrast ZTE_MSM_CAMERA_ZHSHJ_001 + 2009-12-11 jia.jia rename file with mt9t111_reg_qtech ZTE_MSM_CAMERA_JIA_001 + 2009-12-03 jia.jia Improve efficiency of sensor init ZTE_MSM_CAMERA_JIA_001 + 2009-12-01 jia.jia Refactor code for sensor init ZTE_MSM_CAMERA_JIA_001 + 2009-11-09 jia.jia add wb and af settings ZTE_MSM_CAMERA_ZHSHJ_001 + 2009-11-26 zh.shj improve effects of AF, AWB and LSC; ZTE_MSM_CAMERA_ZHSHJ_001 + 2009-11-09 jia.jia add orientation setting for preview ZTE_MSM_CAMERA_ZHSHJ_001 + and snapshot + 2009-11-05 zh.shj mt9t111 preview function implemented ZTE_MSM_CAMERA_ZHSHJ_001 + 2009-10-24 jia.jia Merged from kernel-v4515 ZTE_MSM_CAMERA_JIA_001 ------------------------------------------------------------------------------------------*/ #include "mt9t11x.h" diff --git a/drivers/media/video/msm/mt9t11x.h b/drivers/media/video/msm/mt9t11x.h index 9785abc9..a266d947 100644 --- a/drivers/media/video/msm/mt9t11x.h +++ b/drivers/media/video/msm/mt9t11x.h @@ -21,7 +21,11 @@ /*----------------------------------------------------------------------------------------- when who what, where, why comment tag -------- ---- ------------------------------------- ---------------------- - + 2010-12-15 jia.jia Add support for exposure compensation ZTE_MSM_CAMERA_JIA_20101215 + 2010-03-03 zh.shj Add process of lens shading before ZTE_MSM_CAMERA_ZHSHJ_001 + preview and snapshot + 2009-12-19 zh.shj Add struct item for contrast ZTE_MSM_CAMERA_ZHSHJ_001 + 2009-10-24 jia.jia Merged from kernel-v4515 ZTE_MSM_CAMERA_JIA_001 ------------------------------------------------------------------------------------------*/ #ifndef MT9T11X_H diff --git a/drivers/media/video/msm/mt9t11x_qtech_mcnex_fpc.c b/drivers/media/video/msm/mt9t11x_qtech_mcnex_fpc.c index 3f1223cf..a848bb38 100644 --- a/drivers/media/video/msm/mt9t11x_qtech_mcnex_fpc.c +++ b/drivers/media/video/msm/mt9t11x_qtech_mcnex_fpc.c @@ -21,8 +21,118 @@ /*----------------------------------------------------------------------------------------- when who what, where, why comment tag -------- ---- ------------------------------------- ---------------------- - - + 2011-07-07 wangtao add front camera for 727d40 ZTE_CAM_LJ_20110707 + 2011-06-24 lijing optimize adaptor flow ZTE_CAM_LJ_20110624 + 2011-05-25 wangtao modified for 727ad40 dual camera ZTE_WT_CAM_20110525 + 2011-01-19 zt modify the configuration before sensor ZTE_ZT_CAM_20110119 + go into standby mode for abnormal MCNEX + camera sleep current + 2010-12-20 zt add macro definition for V9 to ZTE_ZT_CAM_20101220 + disable the AF motor in standby mode + 2010-12-16 zt increase time delay for AF trigger; ZTE_ZT_CAM_20101216 + remove the process of sharpness + which is decided by brightness value + 2010-12-15 jia.jia add support for exposure compensation ZTE_CAM_JIA_20101215 + 2010-12-09 jia add failure process to avoid standby ZTE_JIA_CAM_20101209 + current exception problem + 2010-12-06 jia add support for exposure compensation ZTE_CAM_JIA_20101206 + 2010-11-29 lijing add refresh result judgement for ZTE_CAM_LJ_20101129 + parameters that need to refresh(at the + end of setting write 0x8400 register to + refresh) + 2010-11-22 zt disable the AF motor control IC before ZTE_ZT_CAM_20101122 + entering the standby status + 2010-09-08 jia add exception process of i2c_del_driver ZTE_JIA_CAM_20100908 + 2010-09-06 jia add support of CAM_CLK_SWT for MCLK JIA_CAM_20100906 + switch between back-end and front-end + camera + 2010-08-25 zt reduce the sleep current ZT_CAM_20100825 + for CONFIG_SENSOR_ADAPTER + 2010-08-19 jia add support for CONFIG_SENSOR_ADAPTER JIA_CAM_20100819 + 2010-08-09 jia use lens_for_indoor as default setting JIA_CAM_20100809 + of lensshading + 2010-08-04 jia using lens_for_outdoor instead of JIA_CAM_20100804 + lens_for_indoor_tbl for Lensshading + 2010-07-05 jia improve effect of ISO JIA_CAM_20100705 + 2010-06-10 lijing add interface for getting sensor info LIJING_CAM_20100610 + 2010-05-20 jia add process of wake lock ZTE_MSM_CAMERA_JIA_001 + 2010-05-15 jia ignore "rc" of queue_work ZTE_MSM_CAMERA_JIA_001 + 2010-04-29 zh.shj Get FTM flag to adjust the ZTE_MSM_CAMERA_ZHSHJ_001 + initialize process of camera + 2010-04-17 jia Add process of MCLK switch for different ZTE_MSM_CAMERA_JIA_001 + board types + 2010-04-15 zh.shj Add process for different sensors, ZTE_MSM_CAMERA_ZHSHJ_001 + e.g., MT9T111 and MT9T112 + 2010-04-13 chg optimize autofocus, avoid compiler CHG_CAM_20100413 + optimization exception when loop is little. + 2010-04-06 jia Enable MT9T11X_SENSOR_PROBE_INIT ZTE_MSM_CAMERA_JIA_001 + 2010-03-11 jia Set the process of time delay for switch ZTE_MSM_CAMERA_JIA_001 + to preview mode after the process of + setting manual mode for autofocus in + order to avoid display exception during + sensor initialization. + 2010-03-03 zh.shj Add process of lens shading before ZTE_MSM_CAMERA_ZHSHJ_001 + preview and snapshot + 2010-02-21 zh.shj Increase MCLK to maximum value (54MHz); ZTE_MSM_CAMERA_ZHSHJ_001 + Set sharpness value according to + brightness level + 2010-02-11 zh.shj Change the value of register to fix ZTE_MSM_CAMERA_ZHSHJ_001 + the bug of flicker under ISO800 and + ISO400 + 2010-02-06 zh.shj Change the value of register to fix ZTE_MSM_CAMERA_ZHSHJ_001 + the bug of flicker under ISO800 and + ISO400 + 2010-02-04 jia.jia Increase time delay for AF ZTE_MSM_CAMERA_ZHSHJ_001 + 2010-02-01 zh.shj Change the value of register to fix ZTE_MSM_CAMERA_ZHSHJ_001 + the bug of flicker under ISO800 + 2010-01-27 jia.jia Increase time delay to wait the ZTE_MSM_CAMERA_JIA_001 + resumming of len after auto focus + 2010-01-21 jia.jia Add time delay to wait the resumming ZTE_MSM_CAMERA_JIA_001 + of len after auto focus + 2010-01-06 zh.shj set MCLK as 48MHz ZTE_MSM_CAMERA_ZHSHJ_001 + 2009-12-25 zh.shj fix bug of no effect of sepia ZTE_MSM_CAMERA_ZHSHJ_001 + 2009-12-24 zh.shj add time delay to fix bug of no effect ZTE_MSM_CAMERA_ZHSHJ_001 + when Effect setting is selected + 2009-12-21 zh.shj add macro judgment of ZTE_MSM_CAMERA_ZHSHJ_001 + MT9T111_SENSOR_PROBE_INIT for init + throught I2C + 2009-12-21 zh.shj improve effects of saturation, iso, ZTE_MSM_CAMERA_ZHSHJ_001 + sharpness, antibanding + 2009-12-21 zh.shj modify register value for setting of ZTE_MSM_CAMERA_ZHSHJ_001 + saturation + 2009-12-19 zh.shj add register configurations for contrast ZTE_MSM_CAMERA_ZHSHJ_001 + , brightness, saturation, sharpness, + iso, antibanding, and effect + 2009-12-17 jia.jia add process of brightness, saturation ZTE_MSM_CAMERA_JIA_001 + contrast, and sharpness + 2009-12-14 jia.jia add functions of WB, ISO, ZTE_MSM_CAMERA_JIA_001 + and Antibanding + 2009-12-11 jia.jia rename file with mt9t111_qtech ZTE_MSM_CAMERA_JIA_001 + 2009-12-11 jia.jia decrease time delay during AF trigger, ZTE_MSM_CAMERA_JIA_001 + switch between preview and snapshot + 2009-12-03 jia.jia Improve efficiency of switch between ZTE_MSM_CAMERA_JIA_001 + preview and snapshot mode + 2009-12-01 jia.jia Add function of AF with keypress ZTE_MSM_CAMERA_JIA_001 + 2009-12-01 jia.jia Replace sensor init during system ZTE_MSM_CAMERA_JIA_001 + startup with that during camera app + startup; + Refactor code for sensor init + 2009-11-21 jia.jia Add process for time out of AF during ZTE_MSM_CAMERA_JIA_001 + snapshot; + Refactor code for AF, AWB and LSC; + 2009-11-26 zh.shj improve effects of AF, AWB and LSC; ZTE_MSM_CAMERA_ZHSHJ_001 + 2009-11-21 jia.jia Refactor code for initializaton; ZTE_MSM_CAMERA_JIA_001 + 2009-11-12 jia.jia Roll code back; ZTE_MSM_CAMERA_JIA_001 + 2009-11-12 jia.jia Disable MT9T111_PROBE_WORKQUEUE; ZTE_MSM_CAMERA_JIA_001 + Comment 1ms time delay during sensor + register initialization which is disused; + Refactor code for initialization + 2009-11-09 jia.jia add config for saving values of other ZTE_MSM_CAMERA_ZHSHJ_001 + registers before enterring hard standby + mode + 2009-11-06 h.qh mt9t111 parallel init process implementedZTE_MSM_CAMERA_HQH_001 + 2009-11-05 zh.shj mt9t111 preview function implemented ZTE_MSM_CAMERA_ZHSHJ_001 + 2009-10-24 jia.jia Merged from kernel-v4515 ZTE_MSM_CAMERA_JIA_001 ------------------------------------------------------------------------------------------*/ #include @@ -572,7 +682,9 @@ static int32_t mt9t11x_af_trigger(void) return 0; } - + /* ZTE_ZT_CAM_20101216 + * increase time delay from 20ms to 70ms + */ mdelay(70); } @@ -857,7 +969,10 @@ static int32_t mt9t11x_set_sharpness(int8_t sharpness) return rc; } - + /* ZTE_ZT_CAM_20101216 + * The judgment of brightness is disused, + * therefore, current level of sharpness is total 5 level(0~4). + */ #if 0 rc = mt9t11x_i2c_read(mt9t11x_client->addr, 0x0990, &brightness_lev, WORD_LEN); if (rc < 0) @@ -971,6 +1086,12 @@ static int32_t mt9t11x_set_iso(int8_t iso_val) { int32_t rc = 0; + /* + * ZTE_CAM_LJ_20101129 + * add refresh result judgement for parameters that need to refresh + * read 0x8400 register to judge if setting is sucessfully changed + * 0x0 means sucessful + */ uint32_t i = 0; uint16_t value = 0x0006; @@ -1226,7 +1347,14 @@ static int32_t mt9t11x_set_iso(int8_t iso_val) } } - + /* + * ZTE_CAM_LJ_20101129 + * add refresh result judgement for parameters that need to refresh + * read 0x8400 register to judge if setting is sucessfully changed + * + * 0x0000: sucessful + * others: failed + */ mdelay(50); for (i = 0; i < 8; ++i) { @@ -1260,7 +1388,12 @@ static int32_t mt9t11x_set_antibanding(int8_t antibanding) { int32_t rc = 0; - + /* + * ZTE_CAM_LJ_20101129 + * add refresh result judgement for parameters that need to refresh + * read 0x8400 register to judge if setting is sucessfully changed + * 0x0 means sucessful + */ uint32_t i = 0; uint16_t value = 0x0005; @@ -1386,7 +1519,14 @@ static int32_t mt9t11x_set_antibanding(int8_t antibanding) } } - + /* + * ZTE_CAM_LJ_20101129 + * add refresh result judgement for parameters that need to refresh + * read 0x8400 register to judge if setting is sucessfully changed + * + * 0x0000: sucessful + * others: failed + */ mdelay(50); for (i = 0; i < 8; ++i) { @@ -1851,7 +1991,12 @@ static long mt9t11x_set_effect(int32_t mode, int32_t effect) uint16_t __attribute__((unused)) reg_val; long rc = 0; - + /* + * ZTE_CAM_LJ_20101129 + * add refresh result judgement for parameters that need to refresh + * read 0x8400 register to judge if setting is sucessfully changed + * 0x0 means sucessful + */ uint32_t i = 0; uint16_t value = 0x0006; @@ -2121,7 +2266,14 @@ static long mt9t11x_set_effect(int32_t mode, int32_t effect) } } - + /* + * ZTE_CAM_LJ_20101129 + * add refresh result judgement for parameters that need to refresh + * read 0x8400 register to judge if setting is sucessfully changed + * + * 0x0000: sucessful + * others: failed + */ mdelay(50); for (i = 0; i < 8; ++i) { @@ -2628,7 +2780,7 @@ static int mt9t11x_sensor_init(const struct msm_camera_sensor_info *data) { // Do nothing here } - +//ZTE_CAM_LJ_20110707 #if defined(CONFIG_MACH_SAILBOAT) rc = msm_camera_clk_switch(mt9t11x_ctrl->sensordata, MT9T11X_GPIO_SWITCH_CTL, MT9T11X_GPIO_SWITCH_VAL); if (rc < 0) @@ -2846,9 +2998,11 @@ static int mt9t11x_sensor_release_internal(void) } mdelay(1); - + /* ZTE_ZT_CAM_20101122 ZTE_ZT_CAM_20110119 + * Disable the AF motor control IC before entering the standby status + */ /* Pull down the GPIO 0 of mt9t11x IC to disable the AF motor control IC */ -#if defined(CONFIG_MACH_V9) || defined(CONFIG_MACH_ROAMER) || defined(CONFIG_MACH_SAILBOAT) +//#if defined(CONFIG_MACH_V9) || defined(CONFIG_MACH_ROAMER) || defined(CONFIG_MACH_SAILBOAT) rc = mt9t11x_i2c_write(mt9t11x_client->addr, 0x098E, 0x3003, WORD_LEN); if (rc < 0) { @@ -2900,7 +3054,7 @@ static int mt9t11x_sensor_release_internal(void) return rc; } mdelay(150); -#endif +//#endif /* * mt9t11x_ctrl's memory is allocated in mt9t11x_sensor_probe_init @@ -3108,7 +3262,10 @@ int mt9t11x_sensor_probe(const struct msm_camera_sensor_info *info, */ mt9t11x_init_suspend(); - + /* + * add sensor configuration + * ZTE_CAM_LJ_20110413 + */ s->s_mount_angle = 0; s->s_camera_type = BACK_CAMERA_2D; @@ -3168,7 +3325,10 @@ static void mt9t11x_workqueue(struct work_struct *work) CCRT("%s: msm_camera_dev_start failed!\n", __func__); goto probe_failed; } - + /* + * ZTE_CAM_LJ_20110608 + * fix bug of high current + */ #if defined(CONFIG_MACH_BLADE) else { msm_camera_power_backend(MSM_CAMERA_PWRDWN_MODE); @@ -3185,7 +3345,12 @@ static void mt9t11x_workqueue(struct work_struct *work) probe_failed: CCRT("%s: rc = %d, failed!\n", __func__, rc); - + /* + * ZTE_JIA_CAM_20101209 + * to avoid standby current exception problem + * + * ignore "rc" + */ if(rc != -ENOINIT){ pr_err("%s: rc != -ENOINIT\n", __func__); msm_camera_power_backend(MSM_CAMERA_PWRDWN_MODE); diff --git a/drivers/media/video/msm/mt9t11x_qtech_mcnex_socket.c b/drivers/media/video/msm/mt9t11x_qtech_mcnex_socket.c index cf4221bd..bdf0eeda 100644 --- a/drivers/media/video/msm/mt9t11x_qtech_mcnex_socket.c +++ b/drivers/media/video/msm/mt9t11x_qtech_mcnex_socket.c @@ -21,8 +21,111 @@ /*----------------------------------------------------------------------------------------- when who what, where, why comment tag -------- ---- ------------------------------------- ---------------------- - - + 2010-12-15 jia.jia add support for exposure compensation ZTE_MSM_CAMERA_JIA_20101215 + 2010-12-09 jia add failure process to avoid standby ZTE_JIA_CAM_20101209 + current exception problem + 2010-12-06 jia add support for exposure compensation ZTE_CAM_JIA_20101206 + 2010-11-30 lijing add refresh result judgement for ZTE_CAM_LJ_20101129 + parameters that need to refresh(at the + end of setting write 0x8400 register to + refresh) + 2010-09-08 jia add exception process of i2c_del_driver ZTE_JIA_CAM_20100908 + 2010-08-30 zt modified to reduce sleep current ZTE_ZT_CAM_20100830 + when CONFIG_SENSOR_ADAPTER is enabled + 2010-08-12 ygl use lens_for_indoor as default setting YGL_CAM_20100812 + of lensshading + 2010-08-04 jia using lens_for_outdoor instead of JIA_CAM_20100804 + lens_for_indoor_tbl for Lensshading + 2010-07-05 jia improve effect of ISO JIA_CAM_20100705 + 2010-06-10 lijing add interface for getting sensor info LIJING_CAM_20100610 + 2010-06-10 lijing Add time delay to fix bug of preview LJ_CAM_20100610 + blur after AF + 2010-06-08 jia refactor process of JIA_CAM_20100608 + "CONFIG_SENSOR_ADAPTER" + 2010-06-02 ygl fix bug of no correct "rc" in YGL_CAM_20100430 + "mt9t11x_sensor_probe" + 2010-05-20 jia add process of wake lock ZTE_MSM_CAMERA_JIA_001 + 2009-05-15 lijing add process of "rc" in mt9t11x_dev_probe LIJING_CAM_20100504 + 2010-05-07 jia Fix compile error ZTE_MSM_CAMERA_JIA_001 + 2009-04-30 lijing add for mt9t11x and ov5642 adapter LIJING_CAM_20100430 + 2010-04-29 zh.shj Get FTM flag to adjust the ZTE_MSM_CAMERA_ZHSHJ_001 + initialize process of camera + 2010-04-19 jia Modify MT9T11X_GPIO_SWITCH_VAL according ZTE_MSM_CAMERA_JIA_001 + SCH + 2010-04-17 jia Add process of MCLK switch for different ZTE_MSM_CAMERA_JIA_001 + board types + 2010-04-15 jia Add process for different sensor types ZTE_MSM_CAMERA_JIA_001 + e.g., MT9T111 and MT9T112 + 2010-04-13 chg optimize autofocus, avoid compiler CHG_CAM_20100413 + optimization exception when loop is little. + 2010-04-13 jia Enable MT9T11X_SENSOR_PROBE_INIT ZTE_MSM_CAMERA_JIA_001 + 2010-03-11 jia Set the process of time delay for switch ZTE_MSM_CAMERA_JIA_001 + to preview mode after the process of + setting manual mode for autofocus in + order to avoid display exception during + sensor initialization. + 2010-03-03 zh.shj Add process of lens shading before ZTE_MSM_CAMERA_ZHSHJ_001 + preview and snapshot + 2010-02-21 zh.shj Increase MCLK to maximum value (54MHz); ZTE_MSM_CAMERA_ZHSHJ_001 + Set sharpness value according to + brightness level + 2010-02-11 zh.shj Change the value of register to fix ZTE_MSM_CAMERA_ZHSHJ_001 + the bug of flicker under ISO800 and + ISO400 + 2010-02-06 zh.shj Change the value of register to fix ZTE_MSM_CAMERA_ZHSHJ_001 + the bug of flicker under ISO800 and + ISO400 + 2010-02-04 jia.jia Increase time delay for AF ZTE_MSM_CAMERA_ZHSHJ_001 + 2010-02-01 zh.shj Change the value of register to fix ZTE_MSM_CAMERA_ZHSHJ_001 + the bug of flicker under ISO800 + 2010-01-27 jia.jia Increase time delay to wait the ZTE_MSM_CAMERA_JIA_001 + resumming of len after auto focus + 2010-01-21 jia.jia Add time delay to wait the resumming ZTE_MSM_CAMERA_JIA_001 + of len after auto focus + 2010-01-06 zh.shj set MCLK as 48MHz ZTE_MSM_CAMERA_ZHSHJ_001 + 2009-12-25 zh.shj fix bug of no effect of sepia ZTE_MSM_CAMERA_ZHSHJ_001 + 2009-12-24 zh.shj add time delay to fix bug of no effect ZTE_MSM_CAMERA_ZHSHJ_001 + when Effect setting is selected + 2009-12-21 zh.shj add macro judgment of ZTE_MSM_CAMERA_ZHSHJ_001 + MT9T111_SENSOR_PROBE_INIT for init + throught I2C + 2009-12-21 zh.shj improve effects of saturation, iso, ZTE_MSM_CAMERA_ZHSHJ_001 + sharpness, antibanding + 2009-12-21 zh.shj modify register value for setting of ZTE_MSM_CAMERA_ZHSHJ_001 + saturation + 2009-12-19 zh.shj add register configurations for contrast ZTE_MSM_CAMERA_ZHSHJ_001 + , brightness, saturation, sharpness, + iso, antibanding, and effect + 2009-12-17 jia.jia add process of brightness, saturation ZTE_MSM_CAMERA_JIA_001 + contrast, and sharpness + 2009-12-14 jia.jia add functions of WB, ISO, ZTE_MSM_CAMERA_JIA_001 + and Antibanding + 2009-12-11 jia.jia rename file with mt9t111_qtech ZTE_MSM_CAMERA_JIA_001 + 2009-12-11 jia.jia decrease time delay during AF trigger, ZTE_MSM_CAMERA_JIA_001 + switch between preview and snapshot + 2009-12-03 jia.jia Improve efficiency of switch between ZTE_MSM_CAMERA_JIA_001 + preview and snapshot mode + 2009-12-01 jia.jia Add function of AF with keypress ZTE_MSM_CAMERA_JIA_001 + 2009-12-01 jia.jia Replace sensor init during system ZTE_MSM_CAMERA_JIA_001 + startup with that during camera app + startup; + Refactor code for sensor init + 2009-11-21 jia.jia Add process for time out of AF during ZTE_MSM_CAMERA_JIA_001 + snapshot; + Refactor code for AF, AWB and LSC; + 2009-11-26 zh.shj improve effects of AF, AWB and LSC; ZTE_MSM_CAMERA_ZHSHJ_001 + 2009-11-21 jia.jia Refactor code for initializaton; ZTE_MSM_CAMERA_JIA_001 + 2009-11-12 jia.jia Roll code back; ZTE_MSM_CAMERA_JIA_001 + 2009-11-12 jia.jia Disable MT9T111_PROBE_WORKQUEUE; ZTE_MSM_CAMERA_JIA_001 + Comment 1ms time delay during sensor + register initialization which is disused; + Refactor code for initialization + 2009-11-09 jia.jia add config for saving values of other ZTE_MSM_CAMERA_ZHSHJ_001 + registers before enterring hard standby + mode + 2009-11-06 h.qh mt9t111 parallel init process implementedZTE_MSM_CAMERA_HQH_001 + 2009-11-05 zh.shj mt9t111 preview function implemented ZTE_MSM_CAMERA_ZHSHJ_001 + 2009-10-24 jia.jia Merged from kernel-v4515 ZTE_MSM_CAMERA_JIA_001 ------------------------------------------------------------------------------------------*/ #include @@ -968,7 +1071,12 @@ static int32_t mt9t11x_set_iso(int8_t iso_val) { int32_t rc = 0; - + /* + * ZTE_CAM_LJ_20101129 + * add refresh result judgement for parameters that need to refresh + * read 0x8400 register to judge if setting is sucessfully changed + * 0x0 means sucessful + */ uint32_t i = 0; uint16_t value = 0x0006; @@ -1224,7 +1332,14 @@ static int32_t mt9t11x_set_iso(int8_t iso_val) } } - + /* + * ZTE_CAM_LJ_20101129 + * add refresh result judgement for parameters that need to refresh + * read 0x8400 register to judge if setting is sucessfully changed + * + * 0x0000: sucessful + * others: failed + */ mdelay(50); for (i = 0; i < 8; ++i) { @@ -1258,7 +1373,12 @@ static int32_t mt9t11x_set_antibanding(int8_t antibanding) { int32_t rc = 0; - + /* + * ZTE_CAM_LJ_20101129 + * add refresh result judgement for parameters that need to refresh + * read 0x8400 register to judge if setting is sucessfully changed + * 0x0 means sucessful + */ uint32_t i = 0; uint16_t value = 0x0005; @@ -1384,7 +1504,14 @@ static int32_t mt9t11x_set_antibanding(int8_t antibanding) } } - + /* + * ZTE_CAM_LJ_20101129 + * add refresh result judgement for parameters that need to refresh + * read 0x8400 register to judge if setting is sucessfully changed + * + * 0x0000: sucessful + * others: failed + */ mdelay(50); for (i = 0; i < 8; ++i) { @@ -1849,7 +1976,12 @@ static long mt9t11x_set_effect(int32_t mode, int32_t effect) uint16_t __attribute__((unused)) reg_val; long rc = 0; - + /* + * ZTE_CAM_LJ_20101129 + * add refresh result judgement for parameters that need to refresh + * read 0x8400 register to judge if setting is sucessfully changed + * 0x0 means sucessful + */ uint32_t i = 0; uint16_t value = 0x0006; @@ -2119,7 +2251,14 @@ static long mt9t11x_set_effect(int32_t mode, int32_t effect) } } - + /* + * ZTE_CAM_LJ_20101129 + * add refresh result judgement for parameters that need to refresh + * read 0x8400 register to judge if setting is sucessfully changed + * + * 0x0000: sucessful + * others: failed + */ mdelay(50); for (i = 0; i < 8; ++i) { @@ -3105,7 +3244,12 @@ static void mt9t11x_workqueue(struct work_struct *work) probe_failed: CCRT("%s: rc = %d, failed!\n", __func__, rc); - + /* + * ZTE_JIA_CAM_20101209 + * to avoid standby current exception problem + * + * ignore "rc" + */ msm_camera_power_backend(MSM_CAMERA_PWRDWN_MODE); return; #endif diff --git a/drivers/media/video/msm/mt9v113.c b/drivers/media/video/msm/mt9v113.c index 2fa7ef23..83438b19 100644 --- a/drivers/media/video/msm/mt9v113.c +++ b/drivers/media/video/msm/mt9v113.c @@ -20,6 +20,8 @@ /*----------------------------------------------------------------------------------------- when who what, where, why comment tag -------- ---- ------------------------------------- ---------------------- + 2011-07-06 wangtao add sensor for 727d40 front camera ZTE_MSM_CAMERA_WT + 2009-10-24 jia.jia Merged from kernel-v4515 ZTE_MSM_CAMERA_JIA_001 ------------------------------------------------------------------------------------------*/ #include @@ -220,34 +222,32 @@ static int32_t mt9v113_i2c_write(unsigned short saddr, return rc; } -/*static int32_t mt9v113_i2c_write_table(struct mt9v113_i2c_reg_conf const *reg_conf_tbl, - int num_of_items_in_table) + +static int32_t mt9v113_i2c_write_table(struct mt9v113_i2c_reg_conf const *reg_conf_tbl, + int len) { + uint32_t i; + int32_t rc = 0; - int i; - int32_t rc = -EFAULT; - CCRT("%s: entry\n", __func__); - for (i = 0; i < num_of_items_in_table; i++) + for (i = 0; i < len; i++) { rc = mt9v113_i2c_write(mt9v113_client->addr, - reg_conf_tbl->waddr, - reg_conf_tbl->wdata, - reg_conf_tbl->width); + reg_conf_tbl[i].waddr, + reg_conf_tbl[i].wdata, + reg_conf_tbl[i].width); if (rc < 0) { break; } - if (reg_conf_tbl->mdelay_time != 0) + if (reg_conf_tbl[i].mdelay_time != 0) { - mdelay(reg_conf_tbl->mdelay_time); + mdelay(reg_conf_tbl[i].mdelay_time); } - - reg_conf_tbl++; } return rc; -}*/ +} static int mt9v113_i2c_rxdata(unsigned short saddr, unsigned char *rxdata, @@ -711,228 +711,1118 @@ static long mt9v113_set_effect(int32_t mode, int32_t effect) return rc; } -static long mt9v113_set_sensor_mode(int32_t mode) +static long mt9v113_set_wb(int8_t wb_mode) { + long rc = 0; - long __attribute__((unused)) rc = 0; - - CDBG("%s: entry\n", __func__); - - switch (mode) + CDBG("%s: entry: wb_mode=%d\n", __func__, wb_mode); +#if 1 + switch (wb_mode) { - case SENSOR_PREVIEW_MODE: + case CAMERA_WB_MODE_AWB: { - rc = mt9v113_i2c_write(mt9v113_client->addr, 0x098C, 0xA103, WORD_LEN); - if (rc < 0) - { - return rc; - } + rc = mt9v113_i2c_write_table(mt9v113_regs.wb_auto_tbl, + mt9v113_regs.wb_auto_tbl_sz); + } + break; - /* - * SEQ_STATE_CFG_5_MAX_FRAME_CNT - */ - rc = mt9v113_i2c_write(mt9v113_client->addr, 0x0990, 0x0001, WORD_LEN); + case CAMERA_WB_MODE_SUNLIGHT: + { + rc = mt9v113_i2c_write_table(mt9v113_regs.wb_daylight_tbl, + mt9v113_regs.wb_daylight_tbl_sz); + } + break; + + case CAMERA_WB_MODE_INCANDESCENT: + { + rc = mt9v113_i2c_write_table(mt9v113_regs.wb_incandescent_tbl, + mt9v113_regs.wb_incandescent_tbl_sz); + } + break; + + case CAMERA_WB_MODE_FLUORESCENT: + { + rc = mt9v113_i2c_write_table(mt9v113_regs.wb_flourescant_tbl, + mt9v113_regs.wb_flourescant_tbl_sz); + } + break; + + case CAMERA_WB_MODE_CLOUDY: + { + rc = mt9v113_i2c_write_table(mt9v113_regs.wb_cloudy_tbl, + mt9v113_regs.wb_cloudy_tbl_sz); + } + break; + + default: + { + pr_err("%s: parameter error!\n", __func__); + rc = -EFAULT; + } + } +#endif + return rc; +} + +static long mt9v113_set_brightness(int8_t brightness) +{ + long rc = 0; + + pr_err("%s: entry: brightness=%d\n", __func__, brightness); +#if 1 + switch(brightness) + { + case CAMERA_BRIGHTNESS_0: + { + + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x098C, 0xA24F, WORD_LEN); if (rc < 0) { - return rc; + return rc; } - - rc = mt9v113_i2c_write(mt9v113_client->addr, 0x098C, 0xA115, WORD_LEN); + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x0990, 0x002B, WORD_LEN); if (rc < 0) { - return rc; + return rc; } + + } + break; - /* - * SEQ_CMD - */ - rc = mt9v113_i2c_write(mt9v113_client->addr, 0x0990, 0x0000, WORD_LEN); + case CAMERA_BRIGHTNESS_1: + { + + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x098C, 0xA24F, WORD_LEN); if (rc < 0) { - return rc; + return rc; } - mdelay(5); - rc = mt9v113_set_effect(SENSOR_PREVIEW_MODE, CAMERA_EFFECT_OFF); + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x0990, 0x003B, WORD_LEN); if (rc < 0) { - return rc; + return rc; } + } break; - case SENSOR_SNAPSHOT_MODE: + case CAMERA_BRIGHTNESS_2: { - /* Switch to lower fps for Snapshot */ - rc = mt9v113_i2c_write(mt9v113_client->addr, 0x098C, 0xA115, WORD_LEN); + + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x098C, 0xA24F, WORD_LEN); if (rc < 0) { - return rc; + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x0990, 0x004B, WORD_LEN); + if (rc < 0) + { + return rc; } + + } + break; - /* - * SEQ_STATE_CFG_5_MAX_FRAME_CNT - */ - rc = mt9v113_i2c_write(mt9v113_client->addr, 0x0990, 0x0002, WORD_LEN); + case CAMERA_BRIGHTNESS_3: + { + + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x098C, 0xA24F, WORD_LEN); if (rc < 0) { - return rc; + return rc; } - mdelay(5); - rc = mt9v113_i2c_write(mt9v113_client->addr, 0x098C, 0xA103, WORD_LEN); + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x0990, 0x004B, WORD_LEN); if (rc < 0) { - return rc; + return rc; } + + } + break; - /* - * SEQ_CMD - */ - rc = mt9v113_i2c_write(mt9v113_client->addr, 0x0990, 0x0002, WORD_LEN); + case CAMERA_BRIGHTNESS_4: + { + + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x098C, 0xA24F, WORD_LEN); if (rc < 0) { - return rc; + return rc; } - - rc = mt9v113_set_effect(SENSOR_SNAPSHOT_MODE, CAMERA_EFFECT_OFF); + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x0990, 0x005B, WORD_LEN); if (rc < 0) { - return rc; + return rc; } + } break; default: { + CCRT("%s: parameter error!\n", __func__); return -EFAULT; - } + } } - - return 0; +#endif + return rc; } - -static int mt9v113_sensor_init_probe(const struct msm_camera_sensor_info *data) +static long mt9v113_set_contrast(int8_t contrast_val) { - uint16_t model_id = 0; - int rc = 0; - - CDBG("%s: entry\n", __func__); + long rc = 0; - /* ".sensor_pwd" NOT used - switch_on = 1; //pwd active HIGH, if switch_on = 0, i2c R/W will fail. - rc = mt9v113_hard_standby(data, switch_on); - if (rc < 0) + CINF("%s: entry: contrast_val=%d\n", __func__, contrast_val); + +#if 1 + switch (contrast_val) + { + case CAMERA_CONTRAST_0: { - CCRT("set standby failed!\n"); - goto init_probe_fail; + rc = mt9v113_i2c_write_table(mt9v113_regs.contrast_tbl[0], + mt9v113_regs.contrast_tbl_sz[0]); } - */ + break; - /* Enable Hard Reset */ - rc = mt9v113_hard_reset(data); - if (rc < 0) - { - CCRT("reset failed!\n"); - goto init_probe_fail; - } - - rc = mt9v113_power_up(); - if (rc < 0) - { - return rc; - } + case CAMERA_CONTRAST_1: + { + rc = mt9v113_i2c_write_table(mt9v113_regs.contrast_tbl[1], + mt9v113_regs.contrast_tbl_sz[1]); + } + break; - rc = mt9v113_i2c_write(mt9v113_client->addr, 0x301A, 0x1218, WORD_LEN);// RESET_REGISTER - if (rc < 0) - { - return rc; - } - mdelay(100); - - rc = mt9v113_i2c_write(mt9v113_client->addr, 0x301A, 0x121C, WORD_LEN); - if (rc < 0) - { - return rc; - } - mdelay(100); + case CAMERA_CONTRAST_2: + { + rc = mt9v113_i2c_write_table(mt9v113_regs.contrast_tbl[2], + mt9v113_regs.contrast_tbl_sz[2]); + } + break; + + case CAMERA_CONTRAST_3: + { + rc = mt9v113_i2c_write_table(mt9v113_regs.contrast_tbl[3], + mt9v113_regs.contrast_tbl_sz[3]); + } + break; - rc = mt9v113_i2c_write(mt9v113_client->addr, 0x001A, 0x0011, WORD_LEN); // RESET_AND_MISC_CONTROL - if (rc < 0) - { - return rc; - } - mdelay(10); - - rc = mt9v113_i2c_write(mt9v113_client->addr, 0x001A, 0x0010, WORD_LEN); // RESET_AND_MISC_CONTROL - if (rc < 0) - { - return rc; - } - mdelay(10); - - rc = mt9v113_i2c_write(mt9v113_client->addr, 0x0018, 0x4028, WORD_LEN); // STANDBY_CONTROL - if (rc < 0) - { - return rc; - } - mdelay(50); - - rc = mt9v113_i2c_write(mt9v113_client->addr, 0x001A, 0x0210, WORD_LEN); // RESET_AND_MISC_CONTROL - if (rc < 0) - { - return rc; - } + case CAMERA_CONTRAST_4: + { + rc = mt9v113_i2c_write_table(mt9v113_regs.contrast_tbl[4], + mt9v113_regs.contrast_tbl_sz[4]); + } + break; - rc = mt9v113_i2c_write(mt9v113_client->addr, 0x001E, 0x0777, WORD_LEN); // PAD_SLEW - if (rc < 0) - { - return rc; + default: + { + pr_err("%s: parameter error!\n", __func__); + rc = -EFAULT; + } } - mdelay(100); +#endif + return rc; +} - /* Read the Model ID of the sensor */ - rc = mt9v113_i2c_read(mt9v113_client->addr, REG_MT9V113_MODEL_ID, &model_id, WORD_LEN); - if (rc < 0) - { - goto init_probe_fail; - } +static long mt9v113_set_saturation(int8_t saturation_val) +{ + long rc = 0; - CINF("%s: model_id = 0x%x\n", __func__, model_id); - /* Check if it matches it with the value in Datasheet */ - if (model_id != MT9V113_MODEL_ID) + pr_err("%s: entry: saturation_val=%d\n", __func__, saturation_val); +#if 1 + switch (saturation_val) { - rc = -EFAULT; - goto init_probe_fail; - } + case CAMERA_SATURATION_0: + { + rc = mt9v113_i2c_write_table(mt9v113_regs.saturation_tbl[0], + mt9v113_regs.saturation_tbl_sz[0]); + } + break; - rc = mt9v113_reg_init(); - if (rc < 0) - { - goto init_probe_fail; - } + case CAMERA_SATURATION_1: + { + rc = mt9v113_i2c_write_table(mt9v113_regs.saturation_tbl[1], + mt9v113_regs.saturation_tbl_sz[1]); + } + break; - return rc; + case CAMERA_SATURATION_2: + { + rc = mt9v113_i2c_write_table(mt9v113_regs.saturation_tbl[2], + mt9v113_regs.saturation_tbl_sz[2]); + } + break; + + case CAMERA_SATURATION_3: + { + rc = mt9v113_i2c_write_table(mt9v113_regs.saturation_tbl[3], + mt9v113_regs.saturation_tbl_sz[3]); + } + break; -init_probe_fail: - CCRT("%s: rc = %d, failed!\n", __func__, rc); + case CAMERA_SATURATION_4: + { + rc = mt9v113_i2c_write_table(mt9v113_regs.saturation_tbl[4], + mt9v113_regs.saturation_tbl_sz[4]); + } + break; + + default: + { + pr_err("%s: parameter error!\n", __func__); + rc = -EFAULT; + } + } +#endif return rc; } -int mt9v113_sensor_init(const struct msm_camera_sensor_info *data) +static int32_t mt9v113_set_iso(int8_t iso_val) { - int rc = 0; - - CDBG("%s: entry\n", __func__); + int32_t rc = 0; - mt9v113_ctrl = kzalloc(sizeof(struct mt9v113_ctrl_t), GFP_KERNEL); - if (!mt9v113_ctrl) + CDBG("%s: entry: iso_val=%d\n", __func__, iso_val); +#if 0 + switch (iso_val) { - CCRT("%s: kzalloc failed!\n", __func__); - rc = -ENOMEM; - goto init_done; - } - + case CAMERA_ISO_SET_AUTO: + { + //WT_CAM_20110428 iso value + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x3A18 ,0x0000, WORD_LEN); + if (rc < 0) + { + return rc; + } + #if 1 // 主观测试版本 2011-06-16 ken + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x3A19 ,0x00f8, WORD_LEN); + #else + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x3A19 ,0x0040, WORD_LEN); + #endif + if (rc < 0) + { + return rc; + } + } + break; + + case CAMERA_ISO_SET_HJR: + { + //add code here + } + break; + + case CAMERA_ISO_SET_100: + { + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x3A18 ,0x0000, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x3A19 ,0x0020, WORD_LEN); + if (rc < 0) + { + return rc; + } + } + break; + + case CAMERA_ISO_SET_200: + { + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x3A18 ,0x0000, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x3A19 ,0x0040, WORD_LEN); + if (rc < 0) + { + return rc; + } + } + break; + + case CAMERA_ISO_SET_400: + { + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x3A18 ,0x0000, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x3A19 ,0x0080, WORD_LEN); + if (rc < 0) + { + return rc; + } + } + break; + + case CAMERA_ISO_SET_800: + { + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x3A18 ,0x0000, WORD_LEN);//ZTE_YGL_CAM_20110708,modifed for SNR + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x3A19 ,0x00f8, WORD_LEN); + if (rc < 0) + { + return rc; + } + } + break; + + default: + { + CCRT("%s: parameter error!\n", __func__); + rc = -EFAULT; + } + } +#endif + return rc; +} + +static int32_t mt9v113_set_antibanding(int8_t antibanding) +{ + int32_t rc = 0; + + pr_err("%s: entry: antibanding=%d\n", __func__, antibanding); +#if 0 + switch (antibanding) + { + case CAMERA_ANTIBANDING_SET_OFF: + { + pr_err("%s: CAMERA_ANTIBANDING_SET_OFF NOT supported!\n", __func__); + } + break; + + case CAMERA_ANTIBANDING_SET_60HZ: + { + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x098C, 0xA118, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x0990, 0x0002, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x098C, 0xA11E, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x0990, 0x0002, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x098C, 0xA124, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x0990, 0x0002, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x098C, 0xA12A, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x0990, 0x0002, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x098C, 0xA404, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x0990, 0x00A0, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x098C, 0xA103, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x0990, 0x0005, WORD_LEN); + if (rc < 0) + { + return rc; + } + } + break; + case CAMERA_ANTIBANDING_SET_50HZ: + { + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x098C, 0xA118, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x0990, 0x0002, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x098C, 0xA11E, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x0990, 0x0002, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x098C, 0xA124, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x0990, 0x0002, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x098C, 0xA12A, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x0990, 0x0002, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x098C, 0xA404, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x0990, 0x00E0, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x098C, 0xA103, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x0990, 0x0005, WORD_LEN); + if (rc < 0) + { + return rc; + } + } + break; + + case CAMERA_ANTIBANDING_SET_AUTO: + { + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x098C, 0xA118, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x0990, 0x0001, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x098C, 0xA11E, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x0990, 0x0001, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x098C, 0xA124, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x0990, 0x0000, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x098C, 0xA12A, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x0990, 0x0001, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x098C, 0xA103, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x0990, 0x0005, WORD_LEN); + if (rc < 0) + { + return rc; + } + } + break; + + default: + { + pr_err("%s: parameter error!\n", __func__); + rc = -EFAULT; + } + } +#endif + return rc; +} + +static int32_t mt9v113_set_sharpness(int8_t sharpness) +{ + int32_t rc = 0; + + CDBG("%s: entry: sharpness=%d\n", __func__, sharpness); + +#if 0 + switch (sharpness) + { + case CAMERA_SHARPNESS_0: + { + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x5308 ,0x0065, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x5302 ,0x0018, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x5303 ,0x0000, WORD_LEN); + if (rc < 0) + { + return rc; + } + } + break; + + case CAMERA_SHARPNESS_1: + { + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x5308 ,0x0065, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x5302 ,0x0010, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x5303 ,0x0000, WORD_LEN); + if (rc < 0) + { + return rc; + } + } + break; + + case CAMERA_SHARPNESS_2: + { + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x5308 ,0x0025, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x5302 ,0x0010, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x5303 ,0x0008, WORD_LEN); + if (rc < 0) + { + return rc; + } + } + break; + + case CAMERA_SHARPNESS_3: + { + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x5308 ,0x0065, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x5302 ,0x0008, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x5303 ,0x0000, WORD_LEN); + if (rc < 0) + { + return rc; + } + } + break; + + case CAMERA_SHARPNESS_4: + { + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x5308 ,0x0065, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x5302 ,0x0002, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x5303 ,0x0000, WORD_LEN); + if (rc < 0) + { + return rc; + } + } + break; + + default: + { + CCRT("%s: parameter error!\n", __func__); + rc = -EFAULT; + } + } + +#endif +return rc; +} + +static long mt9v113_set_exposure_compensation(int8_t exposure) +{ + long rc = 0; + + pr_err("%s: entry: exposure=%d\n", __func__, exposure); +#if 0 + switch(exposure) + { + case CAMERA_EXPOSURE_0: + { + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x3a0f, 0x0018, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x3a10, 0x0010, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x3a11, 0x0050, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x3a1b, 0x0018, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x3a1e, 0x0010, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x3a1f, 0x0004, WORD_LEN); + if (rc < 0) + { + return rc; + } + } + break; + + case CAMERA_EXPOSURE_1: + { + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x3a0f, 0x0020, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x3a10, 0x0018, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x3a11, 0x0050, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x3a1b, 0x0020, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x3a1e, 0x0018, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x3a1f, 0x0008, WORD_LEN); + if (rc < 0) + { + return rc; + } + } + break; + + case CAMERA_EXPOSURE_2: + { + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x3a0f, 0x0038, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x3a10, 0x0030, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x3a11, 0x0060, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x3a1b, 0x0038, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x3a1e, 0x0030, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x3a1f, 0x0014, WORD_LEN); + if (rc < 0) + { + return rc; + } + } + break; + + case CAMERA_EXPOSURE_3: + { + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x3a0f, 0x0048, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x3a10, 0x0040, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x3a11, 0x0070, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x3a1b, 0x0048, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x3a1e, 0x0040, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x3a1f, 0x0020, WORD_LEN); + if (rc < 0) + { + return rc; + } + } + break; + + case CAMERA_EXPOSURE_4: + { + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x3a0f, 0x0058, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x3a10, 0x0050, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x3a11, 0x0080, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x3a1b, 0x0058, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x3a1e, 0x0050, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x3a1f, 0x0020, WORD_LEN); + if (rc < 0) + { + return rc; + } + } + break; + + default: + { + pr_err("%s: parameter error!\n", __func__); + return -EFAULT; + } + } +#endif + return rc; +} + +static long mt9v113_set_sensor_mode(int32_t mode) +{ + + long __attribute__((unused)) rc = 0; + + CDBG("%s: entry\n", __func__); + + switch (mode) + { + case SENSOR_PREVIEW_MODE: + { + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x098C, 0xA103, WORD_LEN); + if (rc < 0) + { + return rc; + } + + /* + * SEQ_STATE_CFG_5_MAX_FRAME_CNT + */ + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x0990, 0x0001, WORD_LEN); + if (rc < 0) + { + return rc; + } + + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x098C, 0xA115, WORD_LEN); + if (rc < 0) + { + return rc; + } + + /* + * SEQ_CMD + */ + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x0990, 0x0000, WORD_LEN); + if (rc < 0) + { + return rc; + } + mdelay(5); + rc = mt9v113_set_effect(SENSOR_PREVIEW_MODE, CAMERA_EFFECT_OFF); + if (rc < 0) + { + return rc; + } + } + break; + + case SENSOR_SNAPSHOT_MODE: + { + /* Switch to lower fps for Snapshot */ + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x098C, 0xA115, WORD_LEN); + if (rc < 0) + { + return rc; + } + + /* + * SEQ_STATE_CFG_5_MAX_FRAME_CNT + */ + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x0990, 0x0002, WORD_LEN); + if (rc < 0) + { + return rc; + } + mdelay(5); + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x098C, 0xA103, WORD_LEN); + if (rc < 0) + { + return rc; + } + + /* + * SEQ_CMD + */ + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x0990, 0x0002, WORD_LEN); + if (rc < 0) + { + return rc; + } +#if 0 + rc = mt9v113_set_effect(SENSOR_SNAPSHOT_MODE, CAMERA_EFFECT_OFF); + if (rc < 0) + { + return rc; + } +#endif + } + break; + + default: + { + return -EFAULT; + } + } + + return 0; +} + + +static int mt9v113_sensor_init_probe(const struct msm_camera_sensor_info *data) +{ + uint16_t model_id = 0; + int rc = 0; + + CDBG("%s: entry\n", __func__); + + /* ".sensor_pwd" NOT used + switch_on = 1; //pwd active HIGH, if switch_on = 0, i2c R/W will fail. + rc = mt9v113_hard_standby(data, switch_on); + if (rc < 0) + { + CCRT("set standby failed!\n"); + goto init_probe_fail; + } + */ + + /* Enable Hard Reset */ + rc = mt9v113_hard_reset(data); + if (rc < 0) + { + CCRT("reset failed!\n"); + goto init_probe_fail; + } + + rc = mt9v113_power_up(); + if (rc < 0) + { + return rc; + } + + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x301A, 0x1218, WORD_LEN);// RESET_REGISTER + if (rc < 0) + { + return rc; + } + mdelay(100); + + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x301A, 0x121C, WORD_LEN); + if (rc < 0) + { + return rc; + } + mdelay(100); + + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x001A, 0x0011, WORD_LEN); // RESET_AND_MISC_CONTROL + if (rc < 0) + { + return rc; + } + mdelay(10); + + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x001A, 0x0010, WORD_LEN); // RESET_AND_MISC_CONTROL + if (rc < 0) + { + return rc; + } + mdelay(10); + + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x0018, 0x4028, WORD_LEN); // STANDBY_CONTROL + if (rc < 0) + { + return rc; + } + mdelay(50); + + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x001A, 0x0210, WORD_LEN); // RESET_AND_MISC_CONTROL + if (rc < 0) + { + return rc; + } + + rc = mt9v113_i2c_write(mt9v113_client->addr, 0x001E, 0x0777, WORD_LEN); // PAD_SLEW + if (rc < 0) + { + return rc; + } + mdelay(100); + + /* Read the Model ID of the sensor */ + rc = mt9v113_i2c_read(mt9v113_client->addr, REG_MT9V113_MODEL_ID, &model_id, WORD_LEN); + if (rc < 0) + { + goto init_probe_fail; + } + + CINF("%s: model_id = 0x%x\n", __func__, model_id); + + /* Check if it matches it with the value in Datasheet */ + if (model_id != MT9V113_MODEL_ID) + { + rc = -EFAULT; + goto init_probe_fail; + } + + rc = mt9v113_reg_init(); + if (rc < 0) + { + goto init_probe_fail; + } + + return rc; + +init_probe_fail: + CCRT("%s: rc = %d, failed!\n", __func__, rc); + return rc; +} + +int mt9v113_sensor_init(const struct msm_camera_sensor_info *data) +{ + int rc = 0; + + CDBG("%s: entry\n", __func__); + + mt9v113_ctrl = kzalloc(sizeof(struct mt9v113_ctrl_t), GFP_KERNEL); + if (!mt9v113_ctrl) + { + CCRT("%s: kzalloc failed!\n", __func__); + rc = -ENOMEM; + goto init_done; + } + if (data) { mt9v113_ctrl->sensordata = data; @@ -1039,8 +1929,56 @@ int mt9v113_sensor_config(void __user *argp) { rc = mt9v113_power_down(); } + break; + + case CFG_SET_WB: + { + rc = mt9v113_set_wb(cfg_data.cfg.wb_mode); + } + break; + + case CFG_SET_BRIGHTNESS: + { + rc = mt9v113_set_brightness(cfg_data.cfg.brightness); + } + break; + + case CFG_SET_CONTRAST: + { + rc = mt9v113_set_contrast(cfg_data.cfg.contrast); + } break; + case CFG_SET_SATURATION: + { + rc = mt9v113_set_saturation(cfg_data.cfg.saturation); + } + break; + + case CFG_SET_ISO: + { + rc = mt9v113_set_iso(cfg_data.cfg.iso_val); + } + break; + + case CFG_SET_ANTIBANDING: + { + rc = mt9v113_set_antibanding(cfg_data.cfg.antibanding); + } + break; + + case CFG_SET_SHARPNESS: + { + rc = mt9v113_set_sharpness(cfg_data.cfg.sharpness); + } + break; + + case CFG_SET_EXPOSURE_COMPENSATION://ZTE_ZT_CAM_20101026_04 + { + rc = mt9v113_set_exposure_compensation(cfg_data.cfg.exposure); + } + break; + default: { rc = -EFAULT; diff --git a/drivers/media/video/msm/mt9v113.h b/drivers/media/video/msm/mt9v113.h index 66137fdf..c4d2d67b 100644 --- a/drivers/media/video/msm/mt9v113.h +++ b/drivers/media/video/msm/mt9v113.h @@ -20,7 +20,7 @@ /*----------------------------------------------------------------------------------------- when who what, where, why comment tag -------- ---- ------------------------------------- ---------------------- - + 2009-10-24 jia.jia Merged from kernel-v4515 ZTE_MSM_CAMERA_JIA_001 ------------------------------------------------------------------------------------------*/ #ifndef MT9V113_H @@ -54,6 +54,20 @@ struct mt9v113_reg_t { uint16_t stbl_size; struct mt9v113_i2c_reg_conf const *rftbl; uint16_t rftbl_size; + struct mt9v113_i2c_reg_conf const **contrast_tbl; + uint16_t const *contrast_tbl_sz; + struct mt9v113_i2c_reg_conf const **saturation_tbl; + uint16_t const *saturation_tbl_sz; + struct mt9v113_i2c_reg_conf const *wb_cloudy_tbl; + uint16_t wb_cloudy_tbl_sz; + struct mt9v113_i2c_reg_conf const *wb_daylight_tbl; + uint16_t wb_daylight_tbl_sz; + struct mt9v113_i2c_reg_conf const *wb_flourescant_tbl; + uint16_t wb_flourescant_tbl_sz; + struct mt9v113_i2c_reg_conf const *wb_incandescent_tbl; + uint16_t wb_incandescent_tbl_sz; + struct mt9v113_i2c_reg_conf const *wb_auto_tbl; + uint16_t wb_auto_tbl_sz; }; #endif /* MT9V113_H */ diff --git a/drivers/media/video/msm/mt9v113_reg.c b/drivers/media/video/msm/mt9v113_reg.c index a8971d8c..de6bc56a 100644 --- a/drivers/media/video/msm/mt9v113_reg.c +++ b/drivers/media/video/msm/mt9v113_reg.c @@ -20,6 +20,7 @@ /*----------------------------------------------------------------------------------------- when who what, where, why comment tag -------- ---- ------------------------------------- ---------------------- + 2009-10-24 jia.jia Merged from kernel-v4515 ZTE_MSM_CAMERA_JIA_001 ------------------------------------------------------------------------------------------*/ #include "mt9v113.h" @@ -290,6 +291,353 @@ static struct mt9v113_i2c_reg_conf const sequencer_tbl[] = { {0x0000, 0x0000, WORD_LEN, 0}, }; +static struct mt9v113_i2c_reg_conf const contrast_tbl_0[] = { + + {0x098C, 0xAB3C,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_0] + {0x0990, 0x0000,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB3D,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_1] + {0x0990, 0x0018,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB3E,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_2] + {0x0990, 0x0041,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB3F,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_3] + {0x0990, 0x0064,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB40,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_4] + {0x0990, 0x0083,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB41,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_5] + {0x0990, 0x0096,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB42,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_6] + {0x0990, 0x00A5,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB43,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_7] + {0x0990, 0x00B1,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB44,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_8] + {0x0990, 0x00BC,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB45,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_9] + {0x0990, 0x00C5,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB46,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_10] + {0x0990, 0x00CE,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB47,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_11] + {0x0990, 0x00D6,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB48,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_12] + {0x0990, 0x00DD,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB49,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_13] + {0x0990, 0x00E3,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB4A,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_14] + {0x0990, 0x00E9,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB4B,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_15] + {0x0990, 0x00EF,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB4C,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_16] + {0x0990, 0x00F5,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB4D,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_17] + {0x0990, 0x00FA,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB4E,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_18] + {0x0990, 0x00FF,WORD_LEN,0}, // MCU_DATA_0 +}; +static struct mt9v113_i2c_reg_conf const contrast_tbl_1[] = { + + {0x098C, 0xAB3C,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_0] + {0x0990, 0x0000,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB3D,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_1] + {0x0990, 0x000F,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB3E,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_2] + {0x0990, 0x002A,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB3F,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_3] + {0x0990, 0x0049,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB40,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_4] + {0x0990, 0x0069,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB41,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_5] + {0x0990, 0x007E,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB42,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_6] + {0x0990, 0x008F,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB43,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_7] + {0x0990, 0x009D,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB44,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_8] + {0x0990, 0x00AA,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB45,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_9] + {0x0990, 0x00B5,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB46,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_10] + {0x0990, 0x00C0,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB47,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_11] + {0x0990, 0x00C9,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB48,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_12] + {0x0990, 0x00D2,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB49,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_13] + {0x0990, 0x00DB,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB4A,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_14] + {0x0990, 0x00E3,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB4B,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_15] + {0x0990, 0x00EA,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB4C,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_16] + {0x0990, 0x00F1,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB4D,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_17] + {0x0990, 0x00F8,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB4E,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_18] + {0x0990, 0x00FF,WORD_LEN,0}, // MCU_DATA_0 +}; +static struct mt9v113_i2c_reg_conf const contrast_tbl_2[] = { + + {0x098C, 0xAB3C,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_0] + {0x0990, 0x0000,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB3D,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_1] + {0x0990, 0x000A,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB3E,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_2] + {0x0990, 0x001D,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB3F,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_3] + {0x0990, 0x0037,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB40,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_4] + {0x0990, 0x0058,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB41,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_5] + {0x0990, 0x0071,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB42,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_6] + {0x0990, 0x0086,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB43,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_7] + {0x0990, 0x0098,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB44,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_8] + {0x0990, 0x00A7,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB45,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_9] + {0x0990, 0x00B5,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB46,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_10] + {0x0990, 0x00C0,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB47,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_11] + {0x0990, 0x00CB,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB48,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_12] + {0x0990, 0x00D4,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB49,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_13] + {0x0990, 0x00DD,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB4A,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_14] + {0x0990, 0x00E4,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB4B,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_15] + {0x0990, 0x00EC,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB4C,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_16] + {0x0990, 0x00F3,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB4D,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_17] + {0x0990, 0x00F9,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB4E,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_18] + {0x0990, 0x00FF,WORD_LEN,0}, // MCU_DATA_0 +}; + +static struct mt9v113_i2c_reg_conf const contrast_tbl_3[] = { + + {0x098C, 0xAB3C,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_0] + {0x0990, 0x0000,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB3D,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_1] + {0x0990, 0x0007,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB3E,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_2] + {0x0990, 0x0016,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB3F,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_3] + {0x0990, 0x002D,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB40,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_4] + {0x0990, 0x004E,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB41,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_5] + {0x0990, 0x006C,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB42,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_6] + {0x0990, 0x0088,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB43,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_7] + {0x0990, 0x009F,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB44,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_8] + {0x0990, 0x00B1,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB45,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_9] + {0x0990, 0x00BF,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB46,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_10] + {0x0990, 0x00CB,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB47,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_11] + {0x0990, 0x00D5,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB48,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_12] + {0x0990, 0x00DD,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB49,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_13] + {0x0990, 0x00E4,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB4A,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_14] + {0x0990, 0x00EB,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB4B,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_15] + {0x0990, 0x00F1,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB4C,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_16] + {0x0990, 0x00F6,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB4D,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_17] + {0x0990, 0x00FB,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB4E,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_18] + {0x0990, 0x00FF,WORD_LEN,0}, // MCU_DATA_0 + +}; + +static struct mt9v113_i2c_reg_conf const contrast_tbl_4[] = { + {0x098C, 0xAB3C,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_0] + {0x0990, 0x0000,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB3D,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_1] + {0x0990, 0x0004,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB3E,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_2] + {0x0990, 0x000C,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB3F,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_3] + {0x0990, 0x001A,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB40,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_4] + {0x0990, 0x0032,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB41,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_5] + {0x0990, 0x004C,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB42,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_6] + {0x0990, 0x0068,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB43,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_7] + {0x0990, 0x0087,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB44,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_8] + {0x0990, 0x00A1,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB45,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_9] + {0x0990, 0x00B5,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB46,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_10] + {0x0990, 0x00C4,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB47,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_11] + {0x0990, 0x00D1,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB48,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_12] + {0x0990, 0x00DB,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB49,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_13] + {0x0990, 0x00E3,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB4A,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_14] + {0x0990, 0x00EA,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB4B,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_15] + {0x0990, 0x00F0,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB4C,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_16] + {0x0990, 0x00F6,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB4D,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_17] + {0x0990, 0x00FA,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xAB4E,WORD_LEN,0}, // MCU_ADDRESS [HG_GAMMA_TABLE_A_18] + {0x0990, 0x00FF,WORD_LEN,0}, // MCU_DATA_0 +}; + +static struct mt9v113_i2c_reg_conf const *contrast_tbl[] = { + contrast_tbl_0, + contrast_tbl_1, + contrast_tbl_2, + contrast_tbl_3, + contrast_tbl_4, +}; + +static uint16_t const contrast_tbl_sz[] = { + ARRAY_SIZE(contrast_tbl_0), + ARRAY_SIZE(contrast_tbl_1), + ARRAY_SIZE(contrast_tbl_2), + ARRAY_SIZE(contrast_tbl_3), + ARRAY_SIZE(contrast_tbl_4), +}; + +static struct mt9v113_i2c_reg_conf const saturation_tbl_0[] = { + {0x098C, 0xAB20, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0020, WORD_LEN, 0}, // MCU_DATA_0 +}; + +static struct mt9v113_i2c_reg_conf const saturation_tbl_1[] = { + {0x098C, 0xAB20, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0040, WORD_LEN, 0}, // MCU_DATA_0 +}; + +static struct mt9v113_i2c_reg_conf const saturation_tbl_2[] = { + {0x098C, 0xAB20, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0060, WORD_LEN, 0}, // MCU_DATA_0 +}; + +static struct mt9v113_i2c_reg_conf const saturation_tbl_3[] = { + {0x098C, 0xAB20, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x0080, WORD_LEN, 0}, // MCU_DATA_0 +}; + +static struct mt9v113_i2c_reg_conf const saturation_tbl_4[] = { + {0x098C, 0xAB20, WORD_LEN, 0}, // MCU_ADDRESS [HG_LL_SAT1] + {0x0990, 0x00A0, WORD_LEN, 0}, // MCU_DATA_0 +}; + +static struct mt9v113_i2c_reg_conf const *saturation_tbl[] = { + saturation_tbl_0, + saturation_tbl_1, + saturation_tbl_2, + saturation_tbl_3, + saturation_tbl_4, +}; + +static uint16_t const saturation_tbl_sz[] = { + ARRAY_SIZE(saturation_tbl_0), + ARRAY_SIZE(saturation_tbl_1), + ARRAY_SIZE(saturation_tbl_2), + ARRAY_SIZE(saturation_tbl_3), + ARRAY_SIZE(saturation_tbl_4), +}; + +static struct mt9v113_i2c_reg_conf const wb_cloudy_tbl[] = { + {0x098C, 0xA11F,WORD_LEN,0}, + {0x0990, 0x0000,WORD_LEN,0}, + {0x098C, 0xA103,WORD_LEN,0}, + {0x0990, 0x0005,WORD_LEN,0}, + {0x098C, 0xA355,WORD_LEN,0}, // MCU_ADDRESS [AWB_MODE] + {0x0990, 0x0020,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xA353,WORD_LEN,0}, // MCU_ADDRESS [AWB_CCM_POSITION] + {0x0990, 0x007F,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xA34E,WORD_LEN,0}, + {0x0990, 0x00DC,WORD_LEN,0}, + {0x098C, 0xA34F,WORD_LEN,0}, + {0x0990, 0x0080,WORD_LEN,0}, + {0x098C, 0xA350,WORD_LEN,0}, + {0x0990, 0x0078,WORD_LEN,0}, +}; + +static struct mt9v113_i2c_reg_conf const wb_daylight_tbl[] = { + {0x098C, 0xA11F,WORD_LEN,0}, + {0x0990, 0x0000,WORD_LEN,0}, + {0x098C, 0xA103,WORD_LEN,0}, + {0x0990, 0x0006,WORD_LEN,0}, + {0x098C, 0xA355,WORD_LEN,0}, // MCU_ADDRESS [AWB_MODE] + {0x0990, 0x0020,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xA353,WORD_LEN,0}, // MCU_ADDRESS [AWB_CCM_POSITION] + {0x0990, 0x007F,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xA34E,WORD_LEN,0}, + {0x0990, 0x00BC,WORD_LEN,0}, + {0x098C, 0xA34F,WORD_LEN,0}, + {0x0990, 0x0080,WORD_LEN,0}, + {0x098C, 0xA350,WORD_LEN,0}, + {0x0990, 0x007C,WORD_LEN,0}, +}; + +static struct mt9v113_i2c_reg_conf const wb_flourescant_tbl[] = { + {0x098C, 0xA11F,WORD_LEN,0}, + {0x0990, 0x0000,WORD_LEN,0}, + {0x098C, 0xA103,WORD_LEN,0}, + {0x0990, 0x0006,WORD_LEN,0}, + {0x098C, 0xA355,WORD_LEN,0}, // MCU_ADDRESS [AWB_MODE] + {0x0990, 0x0020,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xA353,WORD_LEN,0}, // MCU_ADDRESS [AWB_CCM_POSITION] + {0x0990, 0x003F,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xA34E,WORD_LEN,0}, + {0x0990, 0x00B8,WORD_LEN,0}, + {0x098C, 0xA34F,WORD_LEN,0}, + {0x0990, 0x0080,WORD_LEN,0}, + {0x098C, 0xA350,WORD_LEN,0}, + {0x0990, 0x0080,WORD_LEN,0}, +}; + +static struct mt9v113_i2c_reg_conf const wb_incandescent_tbl[] = { + {0x098C, 0xA11F,WORD_LEN,0}, + {0x0990, 0x0000,WORD_LEN,0}, + {0x098C, 0xA103,WORD_LEN,0}, + {0x0990, 0x0006,WORD_LEN,0}, + {0x098C, 0xA355,WORD_LEN,0}, // MCU_ADDRESS [AWB_MODE] + {0x0990, 0x0020,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xA353,WORD_LEN,0}, // MCU_ADDRESS [AWB_CCM_POSITION] + {0x0990, 0x0000,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xA34E,WORD_LEN,0}, + {0x0990, 0x00AC,WORD_LEN,0}, + {0x098C, 0xA34F,WORD_LEN,0}, + {0x0990, 0x0080,WORD_LEN,0}, + {0x098C, 0xA350,WORD_LEN,0}, + {0x0990, 0x0080,WORD_LEN,0}, +}; + +static struct mt9v113_i2c_reg_conf const wb_auto_tbl[] = { + {0x098C, 0xA11F,WORD_LEN,0}, + {0x0990, 0x0001,WORD_LEN,0}, + {0x098C, 0xA103,WORD_LEN,0}, + {0x0990, 0x0006,WORD_LEN,0}, + {0x098C, 0xA355,WORD_LEN,0}, // MCU_ADDRESS [AWB_MODE] + {0x0990, 0x0000,WORD_LEN,0}, // MCU_DATA_0 + {0x098C, 0xA34E,WORD_LEN,0}, + {0x0990, 0x0080,WORD_LEN,0}, + {0x098C, 0xA34F,WORD_LEN,0}, + {0x0990, 0x0080,WORD_LEN,0}, + {0x098C, 0xA350,WORD_LEN,0}, + {0x0990, 0x0080,WORD_LEN,0}, +}; struct mt9v113_reg_t mt9v113_regs = { .prev_snap_reg_settings = &preview_snapshot_mode_reg_settings_array[0], .prev_snap_reg_settings_size = ARRAY_SIZE(preview_snapshot_mode_reg_settings_array), @@ -305,6 +653,27 @@ struct mt9v113_reg_t mt9v113_regs = { .rftbl = &lens_roll_off_tbl[0], .rftbl_size = 0, /* ARRAY_SIZE(lens_roll_off_tbl), */ + + .contrast_tbl = contrast_tbl, + .contrast_tbl_sz = contrast_tbl_sz, + + .saturation_tbl = saturation_tbl, + .saturation_tbl_sz = saturation_tbl_sz, + + .wb_cloudy_tbl = wb_cloudy_tbl, + .wb_cloudy_tbl_sz = ARRAY_SIZE(wb_cloudy_tbl), + + .wb_daylight_tbl = wb_daylight_tbl, + .wb_daylight_tbl_sz = ARRAY_SIZE(wb_daylight_tbl), + + .wb_flourescant_tbl = wb_flourescant_tbl, + .wb_flourescant_tbl_sz = ARRAY_SIZE(wb_flourescant_tbl), + + .wb_incandescent_tbl = wb_incandescent_tbl, + .wb_incandescent_tbl_sz = ARRAY_SIZE(wb_incandescent_tbl), + + .wb_auto_tbl = wb_auto_tbl, + .wb_auto_tbl_sz = ARRAY_SIZE(wb_auto_tbl), }; diff --git a/drivers/media/video/msm/ov5640.h b/drivers/media/video/msm/ov5640.h index be2ce38d..452135c8 100644 --- a/drivers/media/video/msm/ov5640.h +++ b/drivers/media/video/msm/ov5640.h @@ -20,7 +20,8 @@ /*----------------------------------------------------------------------------------------- when who what, where, why comment tag -------- ---- ------------------------------------- ---------------------- - + 2009-11-02 zh.shj Add AF setting items ZTE_MSM_CAMERA_ZHSHJ_001 + 2009-10-24 jia.jia Merged from kernel-v4515 ZTE_MSM_CAMERA_JIA_001 ------------------------------------------------------------------------------------------*/ #ifndef OV5640_H diff --git a/drivers/media/video/msm/ov5640_globaloptics.c b/drivers/media/video/msm/ov5640_globaloptics.c index 85ad4636..847098a8 100644 --- a/drivers/media/video/msm/ov5640_globaloptics.c +++ b/drivers/media/video/msm/ov5640_globaloptics.c @@ -20,7 +20,24 @@ /*----------------------------------------------------------------------------------------- when who what, where, why comment tag -------- -- ---- ------------------------------------- -------------------------- - + 2011-07-20 wangtao modified for add front camer ovm7690 ZTE_WT_CAM_20110720 + 2011-07-08 ygl Ken modified for SNR test ZTE_YGL_CAM_20110708 + 2011-07-01 wangtao neil modified for clolor special effect WT_CAM_20110701 + cannt reserver reg(w/r ) + 2011-06-24 lijing optimize adaptor flow ZTE_CAM_LJ_20110624 + 2011-06-21 wangtao kenxu add for reduce noise under dark condition WT_CAM_20110621 + neil add color matrix + 2011-05-06 wangtao resolve bug of wb cannt save WT_CAM_20110506 + 2011-05-03 wangtao resolve bug of af sleep ov neil WT_CAM_20110503 + 2011-04-28 wangtao resolve iso settings ov ken WT_CAM_20110428 + 2011-04-26 wangtao resolve bright is differ from preview and snapshot WT_CAM_20110426 + 2011-04-21 wangtao optimize contrast /staturation register write avoid direct write WT_CAM_20110421 + 2011-04-11 wangtao modified for some register write avoid direct write WT_CAM_20110411 + value by use tmp_reg + 2011-03-31 wangtao modified for lens shading and display green WT_CAM_20110331 + 2011-03-10 wangtao add ov5640 5.0MP effect / wb / bright WT_CAM_20110127 + reduce snap time by neil ov + 2011-01-27 wangtao add ov5640 5.0MP af setting by set register WT_CAM_20110127 ------------------------------------------------------------------------------------------*/ #include @@ -81,8 +98,21 @@ static DECLARE_WORK(ov5640_cb_work, ov5640_workqueue); /* GPIO For Sensor Clock Switch */ +#if defined(CONFIG_MACH_RAISE) +#define OV5640_GPIO_SWITCH_CTL 39 +#define OV5640_GPIO_SWITCH_VAL 1 +#elif defined(CONFIG_MACH_SAILBOAT) +#define OV5640_GPIO_SWITCH_CTL 30 +#define OV5640_GPIO_SWITCH_VAL 0 +#elif defined(CONFIG_MACH_R750) || defined(CONFIG_MACH_JOE) #define OV5640_GPIO_SWITCH_CTL 39 +#define OV5640_GPIO_SWITCH_VAL 0 +#else +#define OV5640_GPIO_SWITCH_CTL 39 +#define OV5640_GPIO_SWITCH_VAL 1 +#endif +#if 0 /* * modify for mclk switch for msm7627_joe */ @@ -93,6 +123,7 @@ static DECLARE_WORK(ov5640_cb_work, ov5640_workqueue); #else #define OV5640_GPIO_SWITCH_VAL 1 #endif +#endif //#define CAPTURE_FRAMERATE 375 //#define PREVIEW_FRAMERATE 1500 @@ -100,7 +131,9 @@ static DECLARE_WORK(ov5640_cb_work, ov5640_workqueue); #define CAPTURE_FRAMERATE 750 #define PREVIEW_FRAMERATE 1500 - +/* ZTE_YGL_CAM_20101214 + * add the interface of touch AF for froyo + */ #define OV5640_AF_WINDOW_FULL_WIDTH 64 #define OV5640_AF_WINDOW_FULL_HEIGHT 48 /* @@ -136,7 +169,7 @@ static uint32_t g_preview_line_width; static uint16_t g_preview_gain,g_preview_gain_low,g_preview_gain_high; static uint32_t g_preview_frame_rate = 0; -#if 0 +#if 0 //ZTE_ZT_CAM_20101203 static uint16_t temp_l,temp_m,temp_h; #endif @@ -820,7 +853,10 @@ static long ov5640_set_contrast(int8_t contrast_val) return rc; } - + /* + * ZTE_LJ_CAM_20101026 + * fix bug of no preview image after changing effect mode repeatedly + */ tmp_reg &= 0x00FF; tmp_reg |= 0x0080; rc = ov5640_i2c_write(ov5640_client->addr, 0x5001, tmp_reg, BYTE_LEN); @@ -869,6 +905,10 @@ static long ov5640_set_contrast(int8_t contrast_val) return rc; } + /* + * ZTE_LJ_CAM_20101026 + * fix bug of no preview image after changing effect mode repeatedly + */ tmp_reg &= 0x00FF; tmp_reg |= 0x0080; rc = ov5640_i2c_write(ov5640_client->addr, 0x5001, tmp_reg, BYTE_LEN); @@ -917,7 +957,10 @@ static long ov5640_set_contrast(int8_t contrast_val) return rc; } - + /* + * ZTE_LJ_CAM_20101026 + * fix bug of no preview image after changing effect mode repeatedly + */ tmp_reg &= 0x00FF; tmp_reg |= 0x0080; rc = ov5640_i2c_write(ov5640_client->addr, 0x5001, tmp_reg, BYTE_LEN); @@ -966,7 +1009,10 @@ static long ov5640_set_contrast(int8_t contrast_val) return rc; } - + /* + * ZTE_LJ_CAM_20101026 + * fix bug of no preview image after changing effect mode repeatedly + */ tmp_reg &= 0x00FF; tmp_reg |= 0x0080; rc = ov5640_i2c_write(ov5640_client->addr, 0x5001, tmp_reg, BYTE_LEN); @@ -1015,7 +1061,10 @@ static long ov5640_set_contrast(int8_t contrast_val) return rc; } - + /* + * ZTE_LJ_CAM_20101026 + * fix bug of no preview image after changing effect mode repeatedly + */ tmp_reg &= 0x00FF; tmp_reg |= 0x0080; rc = ov5640_i2c_write(ov5640_client->addr, 0x5001, tmp_reg, BYTE_LEN); @@ -1085,7 +1134,10 @@ static long ov5640_set_saturation(int8_t saturation_val) return rc; } - + /* + * ZTE_LJ_CAM_20101026 + * fix bug of no preview image after changing effect mode repeatedly + */ tmp_reg &= 0x00FF; tmp_reg |= 0x0080; rc = ov5640_i2c_write(ov5640_client->addr, 0x5001, tmp_reg, BYTE_LEN); @@ -1144,6 +1196,10 @@ static long ov5640_set_saturation(int8_t saturation_val) return rc; } + /* + * ZTE_LJ_CAM_20101026 + * fix bug of no preview image after changing effect mode repeatedly + */ tmp_reg &= 0x00FF; tmp_reg |= 0x0080; rc = ov5640_i2c_write(ov5640_client->addr, 0x5001, tmp_reg, BYTE_LEN); @@ -1201,7 +1257,10 @@ static long ov5640_set_saturation(int8_t saturation_val) return rc; } - + /* + * ZTE_LJ_CAM_20101026 + * fix bug of no preview image after changing effect mode repeatedly + */ tmp_reg &= 0x00FF; tmp_reg |= 0x0080; rc = ov5640_i2c_write(ov5640_client->addr, 0x5001, tmp_reg, BYTE_LEN); @@ -1259,7 +1318,10 @@ static long ov5640_set_saturation(int8_t saturation_val) return rc; } - + /* + * ZTE_LJ_CAM_20101026 + * fix bug of no preview image after changing effect mode repeatedly + */ tmp_reg &= 0x00FF; tmp_reg |= 0x0080; rc = ov5640_i2c_write(ov5640_client->addr, 0x5001, tmp_reg, BYTE_LEN); @@ -1317,6 +1379,10 @@ static long ov5640_set_saturation(int8_t saturation_val) return rc; } + /* + * ZTE_LJ_CAM_20101026 + * fix bug of no preview image after changing effect mode repeatedly + */ tmp_reg &= 0x00FF; tmp_reg |= 0x0080; rc = ov5640_i2c_write(ov5640_client->addr, 0x5001, tmp_reg, BYTE_LEN); @@ -1742,7 +1808,9 @@ static long ov5640_set_wb(int8_t wb_mode) return rc; } - + /* ZTE_YGL_CAM_20101214 + * add the interface of touch AF for froyo + */ static int32_t ov5640_set_aec_rio(aec_rio_cfg position) { @@ -1887,6 +1955,17 @@ static int32_t ov5640_set_iso(int8_t iso_val) case CAMERA_ISO_SET_100: { + rc = ov5640_i2c_write(ov5640_client->addr, 0x3503 ,0x0002, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = ov5640_i2c_write(ov5640_client->addr, 0x350b ,0x0000, WORD_LEN); + if (rc < 0) + { + return rc; + } + msleep(100); rc = ov5640_i2c_write(ov5640_client->addr, 0x3A18 ,0x0000, WORD_LEN); if (rc < 0) { @@ -1897,11 +1976,27 @@ static int32_t ov5640_set_iso(int8_t iso_val) { return rc; } + rc = ov5640_i2c_write(ov5640_client->addr, 0x3503 ,0x0000, WORD_LEN); + if (rc < 0) + { + return rc; + } } break; case CAMERA_ISO_SET_200: { + rc = ov5640_i2c_write(ov5640_client->addr, 0x3503 ,0x0002, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = ov5640_i2c_write(ov5640_client->addr, 0x350b ,0x0000, WORD_LEN); + if (rc < 0) + { + return rc; + } + msleep(100); rc = ov5640_i2c_write(ov5640_client->addr, 0x3A18 ,0x0000, WORD_LEN); if (rc < 0) { @@ -1912,11 +2007,27 @@ static int32_t ov5640_set_iso(int8_t iso_val) { return rc; } + rc = ov5640_i2c_write(ov5640_client->addr, 0x3503 ,0x0000, WORD_LEN); + if (rc < 0) + { + return rc; + } } break; case CAMERA_ISO_SET_400: { + rc = ov5640_i2c_write(ov5640_client->addr, 0x3503 ,0x0002, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = ov5640_i2c_write(ov5640_client->addr, 0x350b ,0x0000, WORD_LEN); + if (rc < 0) + { + return rc; + } + msleep(100); rc = ov5640_i2c_write(ov5640_client->addr, 0x3A18 ,0x0000, WORD_LEN); if (rc < 0) { @@ -1927,12 +2038,28 @@ static int32_t ov5640_set_iso(int8_t iso_val) { return rc; } + rc = ov5640_i2c_write(ov5640_client->addr, 0x3503 ,0x0000, WORD_LEN); + if (rc < 0) + { + return rc; + } } break; case CAMERA_ISO_SET_800: { - rc = ov5640_i2c_write(ov5640_client->addr, 0x3A18 ,0x0000, WORD_LEN); + rc = ov5640_i2c_write(ov5640_client->addr, 0x3503 ,0x0002, WORD_LEN); + if (rc < 0) + { + return rc; + } + rc = ov5640_i2c_write(ov5640_client->addr, 0x350b ,0x0000, WORD_LEN); + if (rc < 0) + { + return rc; + } + msleep(100); + rc = ov5640_i2c_write(ov5640_client->addr, 0x3A18 ,0x0000, WORD_LEN);//ZTE_YGL_CAM_20110708,modifed for SNR if (rc < 0) { return rc; @@ -1942,6 +2069,11 @@ static int32_t ov5640_set_iso(int8_t iso_val) { return rc; } + rc = ov5640_i2c_write(ov5640_client->addr, 0x3503 ,0x0000, WORD_LEN); + if (rc < 0) + { + return rc; + } } break; @@ -2258,6 +2390,9 @@ static int32_t ov5640_set_sharpness(int8_t sharpness) return rc; } +/* ZTE_ZT_CAM_20101026_04 + * add the interface of exposure compensation for foryo + */ static long ov5640_set_exposure_compensation(int8_t exposure) { long rc = 0; @@ -2623,7 +2758,7 @@ if(temp_reg == 0) //no flip //Read back AGC gain for preview - + //ZTE_YGL_CAM_20110708,modifed for SNR rc = ov5640_i2c_read(ov5640_client->addr, 0x350b, &g_preview_gain_low, BYTE_LEN); if (rc < 0) { @@ -2657,7 +2792,7 @@ static long ov5640_hw_ae_transfer(void) uint16_t gain = g_preview_gain; uint32_t capture_lines_max; - + //ZTE_YGL_CAM_20110708,modifed for SNR uint16_t YAVG; //kenxu add for improve noise. @@ -2998,7 +3133,10 @@ static long ov5640_set_effect(int32_t mode, int32_t effect) return rc; } - + /* + * ZTE_LJ_CAM_20101026 + * fix bug of no preview image after changing effect mode repeatedly + */ tmp_reg &= 0x00FF; tmp_reg |= 0x0080; rc = ov5640_i2c_write(ov5640_client->addr, 0x5001, tmp_reg, BYTE_LEN); @@ -3514,7 +3652,7 @@ static int ov5640_sensor_dev_probe(const struct msm_camera_sensor_info *pinfo) * switch_val: 0, to switch clock to frontend sensor, i.e., MT9V113, or * 1, to switch clock to backend sensor, i.e., OV5640 */ -#if defined(CONFIG_MACH_RAISE) +#if defined(CONFIG_MACH_RAISE) || defined(CONFIG_MACH_SAILBOAT) rc = msm_camera_clk_switch(pinfo, OV5640_GPIO_SWITCH_CTL, OV5640_GPIO_SWITCH_VAL); if (rc < 0) { @@ -3595,7 +3733,8 @@ static int ov5640_sensor_dev_probe(const struct msm_camera_sensor_info *pinfo) static int ov5640_sensor_probe_init(const struct msm_camera_sensor_info *data) { -#if !defined(CONFIG_SENSOR_ADAPTER) + +#if !defined(CONFIG_SENSOR_ADAPTER) && !defined(CONFIG_OVM7690) uint32_t switch_on; #endif int rc = 0; @@ -3620,6 +3759,8 @@ printk("zt debug: %s\n", __func__);//zhangtao ov5640_ctrl->sensordata = data; +#if !defined(CONFIG_OVM7690) + #if !defined(CONFIG_SENSOR_ADAPTER) /* * Deassert Sensor Reset @@ -3660,7 +3801,7 @@ printk("zt debug: %s\n", __func__);//zhangtao * switch_val: 0, to switch clock to frontend sensor, i.e., MT9V113, or * 1, to switch clock to backend sensor, i.e., OV5640 */ -#if defined(CONFIG_MACH_RAISE) +#if defined(CONFIG_MACH_RAISE) || defined(CONFIG_MACH_SAILBOAT) rc = msm_camera_clk_switch(ov5640_ctrl->sensordata, OV5640_GPIO_SWITCH_CTL, OV5640_GPIO_SWITCH_VAL); if (rc < 0) { @@ -3740,6 +3881,83 @@ printk("zt debug: %s\n", __func__);//zhangtao CCRT("%s: sensor_release failed!\n", __func__); goto probe_init_fail; } +#else //CONFIG_OVM7690 + +// 20110720 wt modified for front camera ovm7690 +// when ov5640 sensor init ,set ovm7690 pwd high and set ov5640 pwd low + + rc = gpio_request(23, "ovm7690"); + if (0 == rc) + { + /* ignore "rc" */ + rc = gpio_direction_output(23, 1); + } + gpio_free(23); + + mdelay(5); + +// set pwd is low + rc = ov5640_hard_standby(ov5640_ctrl->sensordata, 0); + mdelay(5); + +//set sda statue and set 3017 3018 ff after pwd is low + rc = ov5640_i2c_write(ov5640_client->addr, 0x3017, 0x00FF, WORD_LEN); + if (rc < 0) + { + CCRT("%s: failed, rc=%d!\n", __func__, rc); + return rc; + } + rc = ov5640_i2c_write(ov5640_client->addr, 0x3018, 0x00FF, WORD_LEN); + if (rc < 0) + { + CCRT("%s: failed, rc=%d!\n", __func__, rc); + return rc; + } + + //reset 0 -> 1 + rc = gpio_request(ov5640_ctrl->sensordata->sensor_reset, "ov5640"); + rc = gpio_direction_output(ov5640_ctrl->sensordata->sensor_reset, 0); + gpio_free(ov5640_ctrl->sensordata->sensor_reset); + + /* time delay for deasserting RESET */ + mdelay(3); + + rc = gpio_request(ov5640_ctrl->sensordata->sensor_reset, "ov5640"); + rc = gpio_direction_output(ov5640_ctrl->sensordata->sensor_reset, 1); + gpio_free(ov5640_ctrl->sensordata->sensor_reset); + + mdelay(10); + + /* Sensor Register Setting */ + rc = ov5640_sensor_init_probe(ov5640_ctrl->sensordata); + if (rc < 0) + { + pr_err("%s: sensor_init_probe failed!\n", __func__); + goto probe_init_fail; + } + + mdelay(3); + +//set 3017 3018 0 before pwd set high + rc = ov5640_i2c_write(ov5640_client->addr, 0x3017, 0x0000, WORD_LEN); + if (rc < 0) + { + CCRT("%s: failed, rc=%d!\n", __func__, rc); + return rc; + } + rc = ov5640_i2c_write(ov5640_client->addr, 0x3018, 0x0000, WORD_LEN); + if (rc < 0) + { + CCRT("%s: failed, rc=%d!\n", __func__, rc); + return rc; + } + + + rc = ov5640_hard_standby(ov5640_ctrl->sensordata, 1); + + mdelay(5); + +#endif //CONFIG_OVM7690 return 0; @@ -3770,17 +3988,40 @@ static int ov5640_sensor_init(const struct msm_camera_sensor_info *data) goto sensor_init_fail; } - msm_camio_camif_pad_reg_reset(); +#if defined(CONFIG_OVM7690) +//set front camera pwd high and back camera pwd low to swtich to back camera + rc = gpio_request(23, "ovm7690"); + if (0 == rc) + { + /* ignore "rc" */ + rc = gpio_direction_output(23, 1); + pr_err("ovm7690:rc=%d",rc); + + } + gpio_free(23); - /* time delay for resetting CAMIF's PAD */ - mdelay(10); + mdelay(10); +#endif //CONFIG_OVM7690 + +#if defined(CONFIG_MACH_SAILBOAT) + rc = msm_camera_clk_switch(ov5640_ctrl->sensordata, OV5640_GPIO_SWITCH_CTL, OV5640_GPIO_SWITCH_VAL); + if (rc < 0) + { + pr_err("%s: camera_clk_switch failed!\n", __func__); + goto sensor_init_fail; + } +#endif /* defined(CONFIG_MACH_RAISE) */ /* Input MCLK */ msm_camio_clk_rate_set(OV5640_CAMIO_MCLK); /* time delay for enabling MCLK */ mdelay(10); + msm_camio_camif_pad_reg_reset(); + + /* time delay for resetting CAMIF's PAD */ + mdelay(10); /* Exit From Hard Standby */ switch_on = 0; rc = ov5640_hard_standby(ov5640_ctrl->sensordata, switch_on); @@ -3790,8 +4031,32 @@ static int ov5640_sensor_init(const struct msm_camera_sensor_info *data) rc = -EFAULT; goto sensor_init_fail; } +#if defined(CONFIG_OVM7690) ||defined(CONFIG_MT9V113) +// set 3017 3018 ff after pwd is low + rc = ov5640_i2c_write(ov5640_client->addr, 0x3017, 0x00FF, WORD_LEN); + if (rc < 0) + { + pr_err("%s: failed 1, rc=%d!\n", __func__, rc); + return rc; + } + rc = ov5640_i2c_write(ov5640_client->addr, 0x3018, 0x00FF, WORD_LEN); + if (rc < 0) + { + pr_err("%s: failed 2, rc=%d!\n", __func__, rc); + return rc; + } +#endif //CONFIG_OVM7690 - + /* + * To avoid green display when preview mode is resumed + * after snapshot or review. + * The action of pulling STANDBY GPIO down is the key which + * generates the problem mentioned above, + * So time delay is added to avoid this problem. + * + * ZTE_YGL_CAM_20101018, ZTE_YGL_CAM_20101123 + * Decrease time delay from 700ms to 400ms in order to pass CTS + */ mdelay(400); return 0; @@ -3892,13 +4157,15 @@ static int ov5640_sensor_config(void __user *argp) } break; - case CFG_SET_EXPOSURE_COMPENSATION: + case CFG_SET_EXPOSURE_COMPENSATION://ZTE_ZT_CAM_20101026_04 { rc = ov5640_set_exposure_compensation(cfg_data.cfg.exposure); } break; - + /* ZTE_YGL_CAM_20101214 + * add the interface of touch AF for froyo + */ case CFG_SET_AEC_RIO: { rc = ov5640_set_aec_rio(cfg_data.cfg.aec_rio); @@ -3935,6 +4202,22 @@ static int ov5640_sensor_release(void) /* Enter Into Hard Standby */ /* ignore rc */ + +#if defined(CONFIG_OVM7690) ||defined(CONFIG_MT9V113)// for sda 20110720 + rc = ov5640_i2c_write(ov5640_client->addr, 0x3017, 0x0000, WORD_LEN); + if (rc < 0) + { + CCRT("%s: failed, rc=%d!\n", __func__, rc); + return rc; + } + rc = ov5640_i2c_write(ov5640_client->addr, 0x3018, 0x0000, WORD_LEN); + if (rc < 0) + { + CCRT("%s: failed, rc=%d!\n", __func__, rc); + return rc; + } +#endif + switch_on = 1; rc = ov5640_hard_standby(ov5640_ctrl->sensordata, switch_on); @@ -4055,7 +4338,10 @@ int ov5640_sensor_probe(const struct msm_camera_sensor_info *info, goto probe_failed; } - + /* + * add sensor configuration + * ZTE_CAM_LJ_20110413 + */ s->s_mount_angle = 0; s->s_camera_type = BACK_CAMERA_2D; @@ -4123,7 +4409,12 @@ static int __ov5640_probe_internal(struct platform_device *pdev) probe_failed: CCRT("%s: rc = %d, failed!\n", __func__, rc); - + /* + * ZTE_JIA_CAM_20101209 + * to avoid standby current exception problem + * + * ignore "rc" + */ if(rc != -ENOINIT){ pr_err("%s: rc != -ENOINIT\n", __func__); msm_camera_power_backend(MSM_CAMERA_PWRDWN_MODE); diff --git a/drivers/media/video/msm/ov5640_reg_globaloptics.c b/drivers/media/video/msm/ov5640_reg_globaloptics.c index 5eaa9b4f..b2c76117 100644 --- a/drivers/media/video/msm/ov5640_reg_globaloptics.c +++ b/drivers/media/video/msm/ov5640_reg_globaloptics.c @@ -20,7 +20,19 @@ /*----------------------------------------------------------------------------------------- when who what, where, why comment tag -------- -------- ------------------------------------- --------------------------- - +2011-07-08 ygl Ken modified for SNR test ZTE_YGL_CAM_20110708 +2011-07-01 wangtao neil modified for clolor special effect WT_CAM_20110701 + cannt reserver reg(w/r ) +2011-06-21 wangtao kenxu add for reduce noise under dark condition WT_CAM_20110621 + neil add color matrix +2011-05-06 wangtao update lens shading(5800-583d) WT_CAM_20110506 +2011-04-28 wangtao disable night model WT_CAM_20110428 +2011-04-11 wangtao change reg 5580 init position WT_CAM_20110411 +2011-03-31 wangtao modified for lens shading and display green WT_CAM_20110331 +2011-03-10 wangtao add ov5640 5.0MP skate romer for orientation WT_CAM_20110310 +2011-03-10 wangtao add ov5640 5.0MP effect / wb / bright WT_CAM_20110127 + reduce snap time by neil ov +2011-01-27 wangtao add ov5640 5.0MP af setting by set register WT_CAM_20110127 ------------------------------------------------------------------------------------------*/ #include "ov5640.h" @@ -77,12 +89,13 @@ static struct ov5640_i2c_reg_conf const preview_snapshot_mode_reg_settings_array {0x3c0a, 0x009c, WORD_LEN, 0}, {0x3c0b, 0x0040, WORD_LEN, 0}, -#if defined(CONFIG_MACH_ROAMER)||defined(CONFIG_MACH_BLADE2) +//ZTE_CAM_GYL_20110802 +#if defined(CONFIG_MACH_ROAMER) ||defined(CONFIG_MACH_BLADE2) ||defined(CONFIG_MACH_BLUETICK)||defined(CONFIG_MACH_SAILBOAT)//WT_CAM_20110310 {0x3820, 0x0047, WORD_LEN, 0},//up down switch to change bit2 bit1 wangtao 20110127 {0x3821, 0x0001, WORD_LEN, 0},//left right switch to change bit2 bit1 wangtao 20110127 #endif -#if defined(CONFIG_MACH_SKATE) +#if defined(CONFIG_MACH_SKATE) //WT_CAM_20110310 {0x3820, 0x0041, WORD_LEN, 0}, {0x3821, 0x0007, WORD_LEN, 0}, #endif @@ -693,7 +706,7 @@ static struct ov5640_i2c_reg_conf const preview_snapshot_mode_reg_settings_array //Ken Xu add 20110325 for BLC auto update {0x4005, 0x001a, WORD_LEN, 0}, // always update BLC -//ken , move from snapshot2preview_mode_array +//ken , move from snapshot2preview_mode_array WT_CAM_20110411 {0x5580, 0x0002, WORD_LEN, 0}, {0x5588, 0x0000, WORD_LEN, 0}, //enable uv adjust {0x5583, 0x0040, WORD_LEN, 0}, @@ -703,7 +716,11 @@ static struct ov5640_i2c_reg_conf const preview_snapshot_mode_reg_settings_array {0x558b, 0x00f8, WORD_LEN, 0}, }; - +/* + *WT_CAM_20110127 + *add af register default value + */ + //update the af firmware to improve the AF speed,YGL_CAM_20110711 static struct ov5640_i2c_reg_conf const autofocus_value[] = { #if 0 {0x3000, 0x0020, WORD_LEN, 0}, diff --git a/drivers/media/video/msm/ov5642.h b/drivers/media/video/msm/ov5642.h index 8a0f0eca..08e06e5a 100644 --- a/drivers/media/video/msm/ov5642.h +++ b/drivers/media/video/msm/ov5642.h @@ -20,7 +20,8 @@ /*----------------------------------------------------------------------------------------- when who what, where, why comment tag -------- ---- ------------------------------------- ---------------------- - + 2009-11-02 zh.shj Add AF setting items ZTE_MSM_CAMERA_ZHSHJ_001 + 2009-10-24 jia.jia Merged from kernel-v4515 ZTE_MSM_CAMERA_JIA_001 ------------------------------------------------------------------------------------------*/ #ifndef OV5642_H diff --git a/drivers/media/video/msm/ov5642_globaloptics.c b/drivers/media/video/msm/ov5642_globaloptics.c index 25a2a174..d711dcd5 100644 --- a/drivers/media/video/msm/ov5642_globaloptics.c +++ b/drivers/media/video/msm/ov5642_globaloptics.c @@ -20,7 +20,69 @@ /*----------------------------------------------------------------------------------------- when who what, where, why comment tag -------- ---- ------------------------------------- -------------------------- - + 2011-06-24 lijing optimize adaptor flow ZTE_CAM_LJ_20110624 + 2010-12-15 ygl add the interface of touch AF for froyo ZTE_YGL_CAM_20101214 + 2010-12-09 jia add failure process to avoid standby ZTE_JIA_CAM_20101209 + current exception problem + 2010-12-07 zt set gain no mater value of ZTE_ZT_CAM_20101203 + g_preview_exposure under normal light or backlight + 2010-12-03 zt modified for capturing under backlight ZTE_ZT_CAM_20101203 + 2010-11-23 ygl add time delay of 400ms after sensor ZTE_YGL_CAM_20101123 + init to avoid green display when preview + mode is resumed after snapshot or review + 2010-10-26 lijing fix bug of no preview image after ZTE_LJ_CAM_20101026 + changing effect mode repeatedly + 2010-10-26 zt add the interface of exposure ZTE_ZT_CAM_20101026_04 + compensation for foryo + 2010-10-26 zt update the config of saturation ZTE_ZT_CAM_20101026 + 2010-10-26 zt update the config of MWB cloudy ZTE_ZT_CAM_20101026 + 2010-10-18 ygl decrease time delay in ZTE_YGL_CAM_20101018 + "ov5642_sensor_init" to pass CTS + 2010-09-29 zt update the saturation parameter ZTE_ZT_CAM_20100929 + 2010-09-21 zt update the saturation parameter ZTE_ZT_CAM_20100921 + 2010-09-14 zt solve the problem that exit the ZTE_ZT_CAM_20100914 + camera application when adjusting + the brightness due to register 0x5580; + modify setting of register 0x5580 for + contrast, saturation, and effect + 2010-09-08 jia add exception process of i2c_del_driver ZTE_JIA_CAM_20100908 + 2010-09-07 jia add process for variable initialization JIA_CAM_20100907 + 2010-09-06 zt add the register configuration of ZT_CAM_20100906 + ISO, sharpness, antibanding and effect, + update the brightness configuration + 2010-08-31 jia add functions of ISO, sharpness, and JIA_CAM_20100831 + antibanding + 2010-08-20 zt modified the configuration ZT_CAM_20100820 + parameter of brightness + 2010-08-19 jia fix slave address error for JIA_CAM_20100819 + CONFIG_SENSOR_ADAPTER + 2010-08-18 jia refactor code for support of JIA_CAM_20100818 + CONFIG_SENSOR_ADAPTER, + add support for CONFIG_SENSOR_INFO, + add support for OV5642_PROBE_WORKQUEUE + 2010-08-13 zt modified the frequency of MCLK ZT_CAM_20100813_002 + 2010-08-13 zt modified the value of wb configration ZT_CAM_20100813_001 + 2010-06-08 jia refactor process of JIA_CAM_20100608 + "CONFIG_SENSOR_ADAPTER" + 2009-04-30 lijing add for mt9t11x and ov5642 adapter LIJING_CAM_20100430 + 2010-04-29 zh.shj Get FTM flag to adjust the ZTE_MSM_CAMERA_ZHSHJ_001 + initialize process of camera + 2010-01-28 lijing modify brighness for snapshot ZTE_MSM_CAMERA_LIJING_001 + 2010-01-28 lijing adjust MCLK switch setting ZTE_MSM_CAMERA_LIJING_001 + + 2009-12-11 jia.jia decrease time delay during AF trigger, ZTE_MSM_CAMERA_JIA_001 + switch between preview and snapshot + 2009-12-07 jia.jia Remove functions called for ZTE_CAMERA_JIA_001 + turning on/off FLASH LED, which is + moved to + vfe_process_QDSP_VFETASK_MSG_VFE_RESET_ACK + in HAL + 2009-12-02 jia.jia Add function of AF with keypress ZTE_CAMERA_JIA_001 + Improve effects of preview and + snapshot + 2009-11-12 jia.jia Refactor code for initialization ZTE_MSM_CAMERA_JIA_001 + 2009-11-02 zh.shj Add AF,AWB & Brightness settings ZTE_MSM_CAMERA_ZHSHJ_001 + 2009-10-24 jia.jia Merged from kernel-v4515 ZTE_MSM_CAMERA_JIA_001 ------------------------------------------------------------------------------------------*/ #include @@ -97,7 +159,9 @@ static DECLARE_WORK(ov5642_cb_work, ov5642_workqueue); #define CAPTURE_FRAMERATE 375 #define PREVIEW_FRAMERATE 1500 - +/* ZTE_YGL_CAM_20101214 + * add the interface of touch AF for froyo + */ #define OV5642_AF_WINDOW_FULL_WIDTH 64 #define OV5642_AF_WINDOW_FULL_HEIGHT 48 /* @@ -133,7 +197,7 @@ static uint32_t g_preview_line_width; static uint16_t g_preview_gain; static uint32_t g_preview_frame_rate = 0; -#if 0 +#if 0 //ZTE_ZT_CAM_20101203 static uint16_t temp_l,temp_m,temp_h; #endif @@ -1371,7 +1435,9 @@ static long ov5642_set_wb(int8_t wb_mode) return rc; } - + /* ZTE_YGL_CAM_20101214 + * add the interface of touch AF for froyo + */ static int32_t ov5642_set_aec_rio(aec_rio_cfg position) { int32_t rc = 0; @@ -1864,7 +1930,9 @@ static int32_t ov5642_set_sharpness(int8_t sharpness) return rc; } - +/* ZTE_ZT_CAM_20101026_04 + * add the interface of exposure compensation for foryo + */ static long ov5642_set_exposure_compensation(int8_t exposure) { long rc = 0; @@ -2249,12 +2317,16 @@ static long ov5642_hw_ae_transfer(void) //CDBG("can not divide zero\n"); } - + /* ZTE_ZT_CAM_20101203 + * fix exception for capturing under backlight + * + * set gain no mater value of g_preview_exposure under normal light or backlight + */ /* * g_preview_exposure > 4: for normal light * g_preview_exposure <= 4: under backlight */ -#if 0 +#if 0 //ZTE_ZT_CAM_20101203 if (g_preview_exposure > 4) #endif { @@ -2389,7 +2461,7 @@ static long ov5642_hw_ae_transfer(void) return rc; } } -#if 0 +#if 0 //ZTE_ZT_CAM_20101203 else { if (g_preview_exposure > 1) @@ -2499,7 +2571,10 @@ static long ov5642_set_effect(int32_t mode, int32_t effect) return rc; } - + /* + * ZTE_LJ_CAM_20101026 + * fix bug of no preview image after changing effect mode repeatedly + */ tmp_reg &= 0x00FF; tmp_reg |= 0x0080; rc = ov5642_i2c_write(ov5642_client->addr, 0x5001, tmp_reg, BYTE_LEN); @@ -3229,7 +3304,16 @@ static int ov5642_sensor_init(const struct msm_camera_sensor_info *data) goto sensor_init_fail; } - + /* + * To avoid green display when preview mode is resumed + * after snapshot or review. + * The action of pulling STANDBY GPIO down is the key which + * generates the problem mentioned above, + * So time delay is added to avoid this problem. + * + * ZTE_YGL_CAM_20101018, ZTE_YGL_CAM_20101123 + * Decrease time delay from 700ms to 400ms in order to pass CTS + */ mdelay(400); return 0; @@ -3329,13 +3413,15 @@ static int ov5642_sensor_config(void __user *argp) } break; - case CFG_SET_EXPOSURE_COMPENSATION: + case CFG_SET_EXPOSURE_COMPENSATION://ZTE_ZT_CAM_20101026_04 { rc = ov5642_set_exposure_compensation(cfg_data.cfg.exposure); } break; - + /* ZTE_YGL_CAM_20101214 + * add the interface of touch AF for froyo + */ case CFG_SET_AEC_RIO: { rc = ov5642_set_aec_rio(cfg_data.cfg.aec_rio); @@ -3491,7 +3577,10 @@ int ov5642_sensor_probe(const struct msm_camera_sensor_info *info, goto probe_failed; } - + /* + * add sensor configuration + * ZTE_CAM_LJ_20110413 + */ s->s_mount_angle = 0; s->s_camera_type = BACK_CAMERA_2D; @@ -3558,7 +3647,12 @@ static int __ov5642_probe_internal(struct platform_device *pdev) probe_failed: CCRT("%s: rc = %d, failed!\n", __func__, rc); - + /* + * ZTE_JIA_CAM_20101209 + * to avoid standby current exception problem + * + * ignore "rc" + */ if(rc != -ENOINIT){ pr_err("%s: rc != -ENOINIT\n", __func__); msm_camera_power_backend(MSM_CAMERA_PWRDWN_MODE); diff --git a/drivers/media/video/msm/ov5642_globaloptics.c.merge-left.r9021 b/drivers/media/video/msm/ov5642_globaloptics.c.merge-left.r9021 index b5f983cd..2fa35bc2 100644 --- a/drivers/media/video/msm/ov5642_globaloptics.c.merge-left.r9021 +++ b/drivers/media/video/msm/ov5642_globaloptics.c.merge-left.r9021 @@ -20,8 +20,63 @@ /*----------------------------------------------------------------------------------------- when who what, where, why comment tag -------- ---- ------------------------------------- -------------------------- - - + 2010-12-03 zt modified for capturing under backlight ZTE_ZT_CAM_20101203 + 2010-11-23 ygl add time delay of 400ms after sensor ZTE_YGL_CAM_20101123 + init to avoid green display when preview + mode is resumed after snapshot or review + 2010-10-26 lijing fix bug of no preview image after ZTE_LJ_CAM_20101026 + changing effect mode repeatedly + 2010-10-26 zt add the interface of exposure ZTE_ZT_CAM_20101026_04 + compensation for foryo + 2010-10-26 zt update the config of saturation ZTE_ZT_CAM_20101026 + 2010-10-26 zt update the config of MWB cloudy ZTE_ZT_CAM_20101026 + 2010-10-18 ygl decrease time delay in ZTE_YGL_CAM_20101018 + "ov5642_sensor_init" to pass CTS + 2010-09-29 zt update the saturation parameter ZTE_ZT_CAM_20100929 + 2010-09-21 zt update the saturation parameter ZTE_ZT_CAM_20100921 + 2010-09-14 zt solve the problem that exit the ZTE_ZT_CAM_20100914 + camera application when adjusting + the brightness due to register 0x5580; + modify setting of register 0x5580 for + contrast, saturation, and effect + 2010-09-08 jia add exception process of i2c_del_driver ZTE_JIA_CAM_20100908 + 2010-09-07 jia add process for variable initialization JIA_CAM_20100907 + 2010-09-06 zt add the register configuration of ZT_CAM_20100906 + ISO, sharpness, antibanding and effect, + update the brightness configuration + 2010-08-31 jia add functions of ISO, sharpness, and JIA_CAM_20100831 + antibanding + 2010-08-20 zt modified the configuration ZT_CAM_20100820 + parameter of brightness + 2010-08-19 jia fix slave address error for JIA_CAM_20100819 + CONFIG_SENSOR_ADAPTER + 2010-08-18 jia refactor code for support of JIA_CAM_20100818 + CONFIG_SENSOR_ADAPTER, + add support for CONFIG_SENSOR_INFO, + add support for OV5642_PROBE_WORKQUEUE + 2010-08-13 zt modified the frequency of MCLK ZT_CAM_20100813_002 + 2010-08-13 zt modified the value of wb configration ZT_CAM_20100813_001 + 2010-06-08 jia refactor process of JIA_CAM_20100608 + "CONFIG_SENSOR_ADAPTER" + 2009-04-30 lijing add for mt9t11x and ov5642 adapter LIJING_CAM_20100430 + 2010-04-29 zh.shj Get FTM flag to adjust the ZTE_MSM_CAMERA_ZHSHJ_001 + initialize process of camera + 2010-01-28 lijing modify brighness for snapshot ZTE_MSM_CAMERA_LIJING_001 + 2010-01-28 lijing adjust MCLK switch setting ZTE_MSM_CAMERA_LIJING_001 + + 2009-12-11 jia.jia decrease time delay during AF trigger, ZTE_MSM_CAMERA_JIA_001 + switch between preview and snapshot + 2009-12-07 jia.jia Remove functions called for ZTE_CAMERA_JIA_001 + turning on/off FLASH LED, which is + moved to + vfe_process_QDSP_VFETASK_MSG_VFE_RESET_ACK + in HAL + 2009-12-02 jia.jia Add function of AF with keypress ZTE_CAMERA_JIA_001 + Improve effects of preview and + snapshot + 2009-11-12 jia.jia Refactor code for initialization ZTE_MSM_CAMERA_JIA_001 + 2009-11-02 zh.shj Add AF,AWB & Brightness settings ZTE_MSM_CAMERA_ZHSHJ_001 + 2009-10-24 jia.jia Merged from kernel-v4515 ZTE_MSM_CAMERA_JIA_001 ------------------------------------------------------------------------------------------*/ #include @@ -1752,7 +1807,9 @@ static int32_t ov5642_set_sharpness(int8_t sharpness) return rc; } - +/* ZTE_ZT_CAM_20101026_04 + * add the interface of exposure compensation for foryo + */ static long ov5642_set_exposure_compensation(int8_t exposure) { long rc = 0; @@ -2131,7 +2188,9 @@ static long ov5642_hw_ae_transfer(void) //CDBG("can not divide zero\n"); } - + /* ZTE_ZT_CAM_20101203 + * fix exception for capturing under backlight + */ g_preview_exposure = 5; /* @@ -2379,7 +2438,10 @@ static long ov5642_set_effect(int32_t mode, int32_t effect) return rc; } - + /* + * ZTE_LJ_CAM_20101026 + * fix bug of no preview image after changing effect mode repeatedly + */ tmp_reg &= 0x00FF; tmp_reg |= 0x0080; rc = ov5642_i2c_write(ov5642_client->addr, 0x5001, tmp_reg, BYTE_LEN); @@ -3109,7 +3171,16 @@ static int ov5642_sensor_init(const struct msm_camera_sensor_info *data) goto sensor_init_fail; } - + /* + * To avoid green display when preview mode is resumed + * after snapshot or review. + * The action of pulling STANDBY GPIO down is the key which + * generates the problem mentioned above, + * So time delay is added to avoid this problem. + * + * ZTE_YGL_CAM_20101018, ZTE_YGL_CAM_20101123 + * Decrease time delay from 700ms to 400ms in order to pass CTS + */ mdelay(400); return 0; @@ -3209,7 +3280,7 @@ static int ov5642_sensor_config(void __user *argp) } break; - case CFG_SET_EXPOSURE_COMPENSATION: + case CFG_SET_EXPOSURE_COMPENSATION://ZTE_ZT_CAM_20101026_04 { rc = ov5642_set_exposure_compensation(cfg_data.cfg.exposure); } diff --git a/drivers/media/video/msm/ov5642_globaloptics.c.merge-right.r11080 b/drivers/media/video/msm/ov5642_globaloptics.c.merge-right.r11080 index 81b55624..766601db 100644 --- a/drivers/media/video/msm/ov5642_globaloptics.c.merge-right.r11080 +++ b/drivers/media/video/msm/ov5642_globaloptics.c.merge-right.r11080 @@ -20,7 +20,68 @@ /*----------------------------------------------------------------------------------------- when who what, where, why comment tag -------- ---- ------------------------------------- -------------------------- - + 2010-12-15 ygl add the interface of touch AF for froyo ZTE_YGL_CAM_20101214 + 2010-12-09 jia add failure process to avoid standby ZTE_JIA_CAM_20101209 + current exception problem + 2010-12-07 zt set gain no mater value of ZTE_ZT_CAM_20101203 + g_preview_exposure under normal light or backlight + 2010-12-03 zt modified for capturing under backlight ZTE_ZT_CAM_20101203 + 2010-11-23 ygl add time delay of 400ms after sensor ZTE_YGL_CAM_20101123 + init to avoid green display when preview + mode is resumed after snapshot or review + 2010-10-26 lijing fix bug of no preview image after ZTE_LJ_CAM_20101026 + changing effect mode repeatedly + 2010-10-26 zt add the interface of exposure ZTE_ZT_CAM_20101026_04 + compensation for foryo + 2010-10-26 zt update the config of saturation ZTE_ZT_CAM_20101026 + 2010-10-26 zt update the config of MWB cloudy ZTE_ZT_CAM_20101026 + 2010-10-18 ygl decrease time delay in ZTE_YGL_CAM_20101018 + "ov5642_sensor_init" to pass CTS + 2010-09-29 zt update the saturation parameter ZTE_ZT_CAM_20100929 + 2010-09-21 zt update the saturation parameter ZTE_ZT_CAM_20100921 + 2010-09-14 zt solve the problem that exit the ZTE_ZT_CAM_20100914 + camera application when adjusting + the brightness due to register 0x5580; + modify setting of register 0x5580 for + contrast, saturation, and effect + 2010-09-08 jia add exception process of i2c_del_driver ZTE_JIA_CAM_20100908 + 2010-09-07 jia add process for variable initialization JIA_CAM_20100907 + 2010-09-06 zt add the register configuration of ZT_CAM_20100906 + ISO, sharpness, antibanding and effect, + update the brightness configuration + 2010-08-31 jia add functions of ISO, sharpness, and JIA_CAM_20100831 + antibanding + 2010-08-20 zt modified the configuration ZT_CAM_20100820 + parameter of brightness + 2010-08-19 jia fix slave address error for JIA_CAM_20100819 + CONFIG_SENSOR_ADAPTER + 2010-08-18 jia refactor code for support of JIA_CAM_20100818 + CONFIG_SENSOR_ADAPTER, + add support for CONFIG_SENSOR_INFO, + add support for OV5642_PROBE_WORKQUEUE + 2010-08-13 zt modified the frequency of MCLK ZT_CAM_20100813_002 + 2010-08-13 zt modified the value of wb configration ZT_CAM_20100813_001 + 2010-06-08 jia refactor process of JIA_CAM_20100608 + "CONFIG_SENSOR_ADAPTER" + 2009-04-30 lijing add for mt9t11x and ov5642 adapter LIJING_CAM_20100430 + 2010-04-29 zh.shj Get FTM flag to adjust the ZTE_MSM_CAMERA_ZHSHJ_001 + initialize process of camera + 2010-01-28 lijing modify brighness for snapshot ZTE_MSM_CAMERA_LIJING_001 + 2010-01-28 lijing adjust MCLK switch setting ZTE_MSM_CAMERA_LIJING_001 + + 2009-12-11 jia.jia decrease time delay during AF trigger, ZTE_MSM_CAMERA_JIA_001 + switch between preview and snapshot + 2009-12-07 jia.jia Remove functions called for ZTE_CAMERA_JIA_001 + turning on/off FLASH LED, which is + moved to + vfe_process_QDSP_VFETASK_MSG_VFE_RESET_ACK + in HAL + 2009-12-02 jia.jia Add function of AF with keypress ZTE_CAMERA_JIA_001 + Improve effects of preview and + snapshot + 2009-11-12 jia.jia Refactor code for initialization ZTE_MSM_CAMERA_JIA_001 + 2009-11-02 zh.shj Add AF,AWB & Brightness settings ZTE_MSM_CAMERA_ZHSHJ_001 + 2009-10-24 jia.jia Merged from kernel-v4515 ZTE_MSM_CAMERA_JIA_001 ------------------------------------------------------------------------------------------*/ #include @@ -94,7 +155,9 @@ static DECLARE_WORK(ov5642_cb_work, ov5642_workqueue); #define CAPTURE_FRAMERATE 375 #define PREVIEW_FRAMERATE 1500 - +/* ZTE_YGL_CAM_20101214 + * add the interface of touch AF for froyo + */ #define OV5642_AF_WINDOW_FULL_WIDTH 64 #define OV5642_AF_WINDOW_FULL_HEIGHT 48 /* @@ -130,7 +193,7 @@ static uint32_t g_preview_line_width; static uint16_t g_preview_gain; static uint32_t g_preview_frame_rate = 0; -#if 0 +#if 0 //ZTE_ZT_CAM_20101203 static uint16_t temp_l,temp_m,temp_h; #endif @@ -1367,7 +1430,9 @@ static long ov5642_set_wb(int8_t wb_mode) return rc; } - + /* ZTE_YGL_CAM_20101214 + * add the interface of touch AF for froyo + */ static int32_t ov5642_set_aec_rio(aec_rio_cfg position) { int32_t rc = 0; @@ -1860,7 +1925,9 @@ static int32_t ov5642_set_sharpness(int8_t sharpness) return rc; } - +/* ZTE_ZT_CAM_20101026_04 + * add the interface of exposure compensation for foryo + */ static long ov5642_set_exposure_compensation(int8_t exposure) { long rc = 0; @@ -2251,7 +2318,7 @@ static long ov5642_hw_ae_transfer(void) * g_preview_exposure > 4: for normal light * g_preview_exposure <= 4: under backlight */ -#if 0 +#if 0 //ZTE_ZT_CAM_20101203 if (g_preview_exposure > 4) #endif { @@ -2386,7 +2453,7 @@ static long ov5642_hw_ae_transfer(void) return rc; } } -#if 0 +#if 0 //ZTE_ZT_CAM_20101203 else { if (g_preview_exposure > 1) @@ -2496,7 +2563,10 @@ static long ov5642_set_effect(int32_t mode, int32_t effect) return rc; } - + /* + * ZTE_LJ_CAM_20101026 + * fix bug of no preview image after changing effect mode repeatedly + */ tmp_reg &= 0x00FF; tmp_reg |= 0x0080; rc = ov5642_i2c_write(ov5642_client->addr, 0x5001, tmp_reg, BYTE_LEN); @@ -3226,8 +3296,16 @@ static int ov5642_sensor_init(const struct msm_camera_sensor_info *data) goto sensor_init_fail; } - - + /* + * To avoid green display when preview mode is resumed + * after snapshot or review. + * The action of pulling STANDBY GPIO down is the key which + * generates the problem mentioned above, + * So time delay is added to avoid this problem. + * + * ZTE_YGL_CAM_20101018, ZTE_YGL_CAM_20101123 + * Decrease time delay from 700ms to 400ms in order to pass CTS + */ mdelay(400); return 0; @@ -3327,13 +3405,15 @@ static int ov5642_sensor_config(void __user *argp) } break; - case CFG_SET_EXPOSURE_COMPENSATION: + case CFG_SET_EXPOSURE_COMPENSATION://ZTE_ZT_CAM_20101026_04 { rc = ov5642_set_exposure_compensation(cfg_data.cfg.exposure); } break; - + /* ZTE_YGL_CAM_20101214 + * add the interface of touch AF for froyo + */ case CFG_SET_AEC_RIO: { rc = ov5642_set_aec_rio(cfg_data.cfg.aec_rio); @@ -3552,7 +3632,12 @@ static int __ov5642_probe_internal(struct platform_device *pdev) probe_failed: CCRT("%s: rc = %d, failed!\n", __func__, rc); - + /* + * ZTE_JIA_CAM_20101209 + * to avoid standby current exception problem + * + * ignore "rc" + */ msm_camera_power_backend(MSM_CAMERA_PWRDWN_MODE); return rc; #endif diff --git a/drivers/media/video/msm/ov5642_globaloptics.c.working b/drivers/media/video/msm/ov5642_globaloptics.c.working index 9be366c7..8f50cfd0 100644 --- a/drivers/media/video/msm/ov5642_globaloptics.c.working +++ b/drivers/media/video/msm/ov5642_globaloptics.c.working @@ -20,9 +20,68 @@ /*----------------------------------------------------------------------------------------- when who what, where, why comment tag -------- ---- ------------------------------------- -------------------------- - - - + 2010-12-15 ygl add the interface of touch AF for froyo ZTE_YGL_CAM_20101214 + 2010-12-09 jia add failure process to avoid standby ZTE_JIA_CAM_20101209 + current exception problem + 2010-12-07 zt set gain no mater value of ZTE_ZT_CAM_20101203 + g_preview_exposure under normal light or backlight + 2010-12-03 zt modified for capturing under backlight ZTE_ZT_CAM_20101203 + 2010-11-23 ygl add time delay of 400ms after sensor ZTE_YGL_CAM_20101123 + init to avoid green display when preview + mode is resumed after snapshot or review + 2010-10-26 lijing fix bug of no preview image after ZTE_LJ_CAM_20101026 + changing effect mode repeatedly + 2010-10-26 zt add the interface of exposure ZTE_ZT_CAM_20101026_04 + compensation for foryo + 2010-10-26 zt update the config of saturation ZTE_ZT_CAM_20101026 + 2010-10-26 zt update the config of MWB cloudy ZTE_ZT_CAM_20101026 + 2010-10-18 ygl decrease time delay in ZTE_YGL_CAM_20101018 + "ov5642_sensor_init" to pass CTS + 2010-09-29 zt update the saturation parameter ZTE_ZT_CAM_20100929 + 2010-09-21 zt update the saturation parameter ZTE_ZT_CAM_20100921 + 2010-09-14 zt solve the problem that exit the ZTE_ZT_CAM_20100914 + camera application when adjusting + the brightness due to register 0x5580; + modify setting of register 0x5580 for + contrast, saturation, and effect + 2010-09-08 jia add exception process of i2c_del_driver ZTE_JIA_CAM_20100908 + 2010-09-07 jia add process for variable initialization JIA_CAM_20100907 + 2010-09-06 zt add the register configuration of ZT_CAM_20100906 + ISO, sharpness, antibanding and effect, + update the brightness configuration + 2010-08-31 jia add functions of ISO, sharpness, and JIA_CAM_20100831 + antibanding + 2010-08-20 zt modified the configuration ZT_CAM_20100820 + parameter of brightness + 2010-08-19 jia fix slave address error for JIA_CAM_20100819 + CONFIG_SENSOR_ADAPTER + 2010-08-18 jia refactor code for support of JIA_CAM_20100818 + CONFIG_SENSOR_ADAPTER, + add support for CONFIG_SENSOR_INFO, + add support for OV5642_PROBE_WORKQUEUE + 2010-08-13 zt modified the frequency of MCLK ZT_CAM_20100813_002 + 2010-08-13 zt modified the value of wb configration ZT_CAM_20100813_001 + 2010-06-08 jia refactor process of JIA_CAM_20100608 + "CONFIG_SENSOR_ADAPTER" + 2009-04-30 lijing add for mt9t11x and ov5642 adapter LIJING_CAM_20100430 + 2010-04-29 zh.shj Get FTM flag to adjust the ZTE_MSM_CAMERA_ZHSHJ_001 + initialize process of camera + 2010-01-28 lijing modify brighness for snapshot ZTE_MSM_CAMERA_LIJING_001 + 2010-01-28 lijing adjust MCLK switch setting ZTE_MSM_CAMERA_LIJING_001 + + 2009-12-11 jia.jia decrease time delay during AF trigger, ZTE_MSM_CAMERA_JIA_001 + switch between preview and snapshot + 2009-12-07 jia.jia Remove functions called for ZTE_CAMERA_JIA_001 + turning on/off FLASH LED, which is + moved to + vfe_process_QDSP_VFETASK_MSG_VFE_RESET_ACK + in HAL + 2009-12-02 jia.jia Add function of AF with keypress ZTE_CAMERA_JIA_001 + Improve effects of preview and + snapshot + 2009-11-12 jia.jia Refactor code for initialization ZTE_MSM_CAMERA_JIA_001 + 2009-11-02 zh.shj Add AF,AWB & Brightness settings ZTE_MSM_CAMERA_ZHSHJ_001 + 2009-10-24 jia.jia Merged from kernel-v4515 ZTE_MSM_CAMERA_JIA_001 ------------------------------------------------------------------------------------------*/ #include @@ -96,7 +155,9 @@ static DECLARE_WORK(ov5642_cb_work, ov5642_workqueue); #define CAPTURE_FRAMERATE 375 #define PREVIEW_FRAMERATE 1500 - +/* ZTE_YGL_CAM_20101214 + * add the interface of touch AF for froyo + */ #define OV5642_AF_WINDOW_FULL_WIDTH 64 #define OV5642_AF_WINDOW_FULL_HEIGHT 48 /* @@ -131,7 +192,7 @@ static uint32_t g_preview_exposure; static uint32_t g_preview_line_width; static uint16_t g_preview_gain; static uint32_t g_preview_frame_rate = 0; -#if 0 +#if 0 //ZTE_ZT_CAM_20101203 static uint16_t temp_l,temp_m,temp_h; #endif @@ -1368,7 +1429,9 @@ static long ov5642_set_wb(int8_t wb_mode) return rc; } - + /* ZTE_YGL_CAM_20101214 + * add the interface of touch AF for froyo + */ static int32_t ov5642_set_aec_rio(aec_rio_cfg position) { int32_t rc = 0; @@ -1861,7 +1924,9 @@ static int32_t ov5642_set_sharpness(int8_t sharpness) return rc; } - +/* ZTE_ZT_CAM_20101026_04 + * add the interface of exposure compensation for foryo + */ static long ov5642_set_exposure_compensation(int8_t exposure) { long rc = 0; @@ -2251,7 +2316,7 @@ static long ov5642_hw_ae_transfer(void) * g_preview_exposure > 4: for normal light * g_preview_exposure <= 4: under backlight */ -#if 0 +#if 0 //ZTE_ZT_CAM_20101203 if (g_preview_exposure > 4) #endif { @@ -2386,7 +2451,7 @@ static long ov5642_hw_ae_transfer(void) return rc; } } -#if 0 +#if 0 //ZTE_ZT_CAM_20101203 else { if (g_preview_exposure > 1) @@ -2496,7 +2561,10 @@ static long ov5642_set_effect(int32_t mode, int32_t effect) return rc; } - + /* + * ZTE_LJ_CAM_20101026 + * fix bug of no preview image after changing effect mode repeatedly + */ tmp_reg &= 0x00FF; tmp_reg |= 0x0080; rc = ov5642_i2c_write(ov5642_client->addr, 0x5001, tmp_reg, BYTE_LEN); @@ -3226,7 +3294,16 @@ static int ov5642_sensor_init(const struct msm_camera_sensor_info *data) goto sensor_init_fail; } - + /* + * To avoid green display when preview mode is resumed + * after snapshot or review. + * The action of pulling STANDBY GPIO down is the key which + * generates the problem mentioned above, + * So time delay is added to avoid this problem. + * + * ZTE_YGL_CAM_20101018, ZTE_YGL_CAM_20101123 + * Decrease time delay from 700ms to 400ms in order to pass CTS + */ mdelay(400); return 0; @@ -3326,13 +3403,15 @@ static int ov5642_sensor_config(void __user *argp) } break; - case CFG_SET_EXPOSURE_COMPENSATION: + case CFG_SET_EXPOSURE_COMPENSATION://ZTE_ZT_CAM_20101026_04 { rc = ov5642_set_exposure_compensation(cfg_data.cfg.exposure); } break; - + /* ZTE_YGL_CAM_20101214 + * add the interface of touch AF for froyo + */ case CFG_SET_AEC_RIO: { rc = ov5642_set_aec_rio(cfg_data.cfg.aec_rio); @@ -3551,7 +3630,12 @@ static int __ov5642_probe_internal(struct platform_device *pdev) probe_failed: CCRT("%s: rc = %d, failed!\n", __func__, rc); - + /* + * ZTE_JIA_CAM_20101209 + * to avoid standby current exception problem + * + * ignore "rc" + */ msm_camera_power_backend(MSM_CAMERA_PWRDWN_MODE); return rc; #endif diff --git a/drivers/media/video/msm/ov5642_reg_globaloptics.c b/drivers/media/video/msm/ov5642_reg_globaloptics.c index d7fabba9..4ee77835 100644 --- a/drivers/media/video/msm/ov5642_reg_globaloptics.c +++ b/drivers/media/video/msm/ov5642_reg_globaloptics.c @@ -20,7 +20,36 @@ /*----------------------------------------------------------------------------------------- when who what, where, why comment tag -------- ---- ------------------------------------- --------------------------- - + 2010-10-26 zt update the parameter for auto focus ZTE_ZT_CAM_20101026 + 2010-10-26 zt update the parameter for lab test ZTE_ZT_CAM_20101026 + 2010-10-25 ygl update the setting of auto focus to ZTE_YGL_CAM_20101025 + remove OSD of auto focus frame + 2010-09-30 zt update the register configration for ZTE_ZT_CAM_20100929 + objective test + 2010-09-14 zt modify the wb configration to ZTE_ZT_CAM_20100921 + solve the photo color distortion + 2010-09-14 zt solve the problem that exit the ZTE_ZT_CAM_20100914 + camera application when adjusting + the brightness + 2010-09-08 jia set PCLK mode as manul mode ZTE_YGL_CAM_20100908 + set PCLK from 24M to 48M for preview + 2010-08-31 ygl modify the preview size for zoom ZTE_YGL_CAM_20100831 + 2010-08-20 zt adjust the register parameter ZT_CAM_20100820_001 + 2010-08-16 jia refactor code JIA_CAM_20100816 + 2010-08-13 zt modified the average luminance to ZT_CAM_20100813_006 + solve the screen edge stripes + 2010-08-13 zt reduce the PCLK frequency from ZT_CAM_20100813_005 + 48Mhz to 24Mhz + 2010-08-13 zt update the array of camera init ZT_CAM_20100813_004 + 2010-02-23 lijing add control for different projects ZTE_MSM_CAMERA_LIJING_001 + 2010-01-29 lijing adjust settings for P727A for flip ZTE_MSM_CAMERA_LIJING_001 + and mirror + 2010-01-28 lijing adjust settings for P727A for flip ZTE_MSM_CAMERA_LIJING_001 + and mirror + 2009-12-02 jia.jia Improve effects of preview and ZTE_MSM_CAMERA_JIA_001 + snapshot + 2009-11-02 zh.shj Add AF regs settings ZTE_MSM_CAMERA_ZHSHJ_001 + 2009-10-24 jia.jia Merged from kernel-v4515 ZTE_MSM_CAMERA_JIA_001 ------------------------------------------------------------------------------------------*/ #include "ov5642.h" @@ -255,7 +284,13 @@ static struct ov5642_i2c_reg_conf const preview_snapshot_mode_reg_settings_array {0x5583, 0x003a, WORD_LEN, 0}, {0x5584, 0x003a, WORD_LEN, 0}, - + /* ZTE_ZT_CAM_20100914 + * enable the Special Digital Effects(SDE) functions we need + * + * Register 0x5580 + * Bit[2]: 1, Contrast enable + * Bit[1]: 1, Saturation enable + */ {0x5580, 0x0006, WORD_LEN, 0}, {0x5000, 0x00cf, WORD_LEN, 0}, @@ -492,7 +527,12 @@ static struct ov5642_i2c_reg_conf const preview_snapshot_mode_reg_settings_array {0x3806, 0x0003, WORD_LEN, 0}, {0x3807, 0x00c0, WORD_LEN, 0}, - + /* ZTE_YGL_CAM_20100831 + * modify the preview size for zoom + * + * PREVIEW_SIZE_WIDTH: 1024 + * PREVIEW_SIZE_HEIGHT: 768 + */ {0x3808, 0x0004, WORD_LEN, 0}, //dvp vga output {0x3809, 0x0000, WORD_LEN, 0}, {0x380a, 0x0003, WORD_LEN, 0}, //dvp vga output @@ -522,7 +562,12 @@ static struct ov5642_i2c_reg_conf const preview_snapshot_mode_reg_settings_array {0x3002, 0x005c, WORD_LEN, 0}, {0x3503, 0x0000, WORD_LEN, 0}, - + /* ZTE_YGL_CAM_20100831, ZTE_YGL_CAM_20100908 + * modify the preview size for zoom + * + * set PCLK mode as manual mode, + * i.e., to set 0x3815 + */ {0x460c, 0x0022, WORD_LEN, 0}, {0x460b, 0x0037, WORD_LEN, 0}, @@ -598,7 +643,11 @@ static struct ov5642_i2c_reg_conf const preview_snapshot_mode_reg_settings_array {0x3010, 0x0010, WORD_LEN, 0}, - + /* ZTE_YGL_CAM_20100908 + * + * set PCLK from 24M to 48M (from 0x0007 to 0x0003) + * for preview mode + */ {0x3815, 0x0003, WORD_LEN, 0}, //DVP CLOCK //AEC/AGC setting @@ -6770,7 +6819,9 @@ static struct ov5642_i2c_reg_conf const autofocus_value[] = { {0x3027, 0x00FF, WORD_LEN, 0}, {0x3000, 0x0000, WORD_LEN, 0} #else - + /* ZTE_YGL_CAM_20101025 + * Autofocus with OSD of autofocus frame + */ {0x3000, 0x0020, WORD_LEN, 0}, {0x8000, 0x0002, WORD_LEN, 0}, {0x8001, 0x0000, WORD_LEN, 0}, @@ -12841,7 +12892,12 @@ static struct ov5642_i2c_reg_conf const snapshot2preview_mode_array[] = { {0x3806, 0x0003, WORD_LEN, 0}, {0x3807, 0x00c0, WORD_LEN, 0}, - + /* ZTE_YGL_CAM_20100831 + * modify the preview size for zoom + * + * PREVIEW_SIZE_WIDTH: 1024 + * PREVIEW_SIZE_HEIGHT: 768 + */ {0x3808, 0x0004, WORD_LEN, 0}, //0811, for preview output 1024*768 {0x3809, 0x0000, WORD_LEN, 0}, //0811, for preview output 1024*768 {0x380a, 0x0003, WORD_LEN, 0}, //0811, for preview output 1024*768 @@ -12853,7 +12909,11 @@ static struct ov5642_i2c_reg_conf const snapshot2preview_mode_array[] = { {0x380f, 0x0040, WORD_LEN, 0}, //818, //change frame rate to 14.3 fps, for flicker {0x3810, 0x0040, WORD_LEN, 0}, - + /* ZTE_YGL_CAM_20100908 + * + * set PCLK from 24M to 48M (from 0x0007 to 0x0003) + * for preview mode + */ {0x3815, 0x0003, WORD_LEN, 0},//DVP PCKL divider is controlled ZT_CAM_20100813_005 #if defined(CONFIG_MACH_RAISE) @@ -12877,7 +12937,12 @@ static struct ov5642_i2c_reg_conf const snapshot2preview_mode_array[] = { {0x3a1f, 0x0030, WORD_LEN, 0}, {0x460b, 0x0037, WORD_LEN, 0}, - + /* ZTE_YGL_CAM_20100831, ZTE_YGL_CAM_20100908 + * modify the preview size for zoom + * + * set PCLK mode as manual mode, + * i.e., to set 0x3815 + */ {0x460c, 0x0022, WORD_LEN, 0}, {0x471d, 0x0005, WORD_LEN, 0}, @@ -12895,14 +12960,23 @@ static struct ov5642_i2c_reg_conf const snapshot2preview_mode_array[] = { {0x3002, 0x005c, WORD_LEN, 0}, {0x3503, 0x0000, WORD_LEN, 0}, - + /* ZTE_YGL_CAM_20100831, ZTE_YGL_CAM_20100908 + * modify the preview size for zoom + * + * set PCLK mode as manual mode, + * i.e., to set 0x3815 + */ {0x460c, 0x0022, WORD_LEN, 0}, {0x460b, 0x0037, WORD_LEN, 0}, {0x471c, 0x00d0, WORD_LEN, 0}, {0x471d, 0x0005, WORD_LEN, 0}, - + /* ZTE_YGL_CAM_20100908 + * + * set PCLK from 24M to 48M (from 0x0007 to 0x0003) + * for preview mode + */ {0x3815, 0x0003, WORD_LEN, 0},//DVP PCKL divider is controlled #if defined(CONFIG_MACH_RAISE) @@ -12950,7 +13024,9 @@ static struct ov5642_i2c_reg_conf const snapshot2preview_mode_array[] = { //Do nothing #endif - + /* ZTE_ZT_CAM_20101026_02 + * update the parameter for auto focus + */ {0x3024, 0x0008, WORD_LEN, 0}, //set to idle mode {0x3024, 0x0012, WORD_LEN, 0}, //update zone }; diff --git a/drivers/media/video/msm/ovm7690.h b/drivers/media/video/msm/ovm7690.h new file mode 100644 index 00000000..46c91a9b --- /dev/null +++ b/drivers/media/video/msm/ovm7690.h @@ -0,0 +1,73 @@ +/* + * drivers/media/video/msm/mt9v113.h + * + * Refer to drivers/media/video/msm/mt9d112.h + * For MT9V113: 0.3Mp, 1/11-Inch System-On-A-Chip (SOC) CMOS Digital Image Sensor + * + * Copyright (C) 2009-2010 ZTE Corporation. + * + * 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. + * + * Created by jia.jia@zte.com.cn + */ +/*----------------------------------------------------------------------------------------- + when who what, where, why comment tag + -------- ---- ------------------------------------- ---------------------- + 2011-04-15 lijing add setting array ZTE_CAM_LJ_20100415 + 2009-10-24 jia.jia Merged from kernel-v4515 ZTE_MSM_CAMERA_JIA_001 +------------------------------------------------------------------------------------------*/ + +#ifndef OVM7690_H +#define OVM7690_H + +#include +#include + +extern struct ovm7690_reg_t ovm7690_regs; + +enum ovm7690_width_t { + WORD_LEN, + BYTE_LEN +}; + +struct ovm7690_i2c_reg_conf { + unsigned short waddr; + unsigned short wdata; + enum ovm7690_width_t width; + unsigned short mdelay_time; +}; + +struct ovm7690_reg_t { + struct ovm7690_i2c_reg_conf const *prev_snap_reg_settings; + uint16_t prev_snap_reg_settings_size; + struct ovm7690_i2c_reg_conf const *noise_reduction_reg_settings; + uint16_t noise_reduction_reg_settings_size; + struct ovm7690_i2c_reg_conf const *plltbl; + uint16_t plltbl_size; + struct ovm7690_i2c_reg_conf const *stbl; + uint16_t stbl_size; + struct ovm7690_i2c_reg_conf const *rftbl; + uint16_t rftbl_size; + + /* + * ZTE_CAM_LJ_20100415 + * add antibanding array + */ + struct ovm7690_i2c_reg_conf const *antibanding_auto_tbl; + uint16_t antibanding_auto_tbl_size; + + struct ovm7690_i2c_reg_conf const *antibanding_50_tbl; + uint16_t antibanding_50_tbl_size; + + struct ovm7690_i2c_reg_conf const *antibanding_60_tbl; + uint16_t antibanding_60_tbl_size; +}; + +#endif /* OVM7690_H */ diff --git a/drivers/media/video/msm/ovm7690_fpc.c b/drivers/media/video/msm/ovm7690_fpc.c new file mode 100644 index 00000000..1ad50398 --- /dev/null +++ b/drivers/media/video/msm/ovm7690_fpc.c @@ -0,0 +1,2191 @@ +/* + * drivers/media/video/msm/mt9v113.c + * + * Refer to drivers/media/video/msm/mt9d112.c + * For MT9V113: 0.3Mp, 1/11-Inch System-On-A-Chip (SOC) CMOS Digital Image Sensor + * + * Copyright (C) 2009-2010 ZTE Corporation. + * + * 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. + * + * Created by jia.jia@zte.com.cn + */ +/*----------------------------------------------------------------------------------------- + when who what, where, why comment tag + -------- ---- ------------------------------------- --------------------- + 2011-07-28 wangtao add settings ZTE_CAM_WT_20100728 + 2011-04-16 lijing add param setting ZTE_CAM_LJ_20110416 + 2011-04-14 lijing modify sensor angle from 90 to 180, else ZTE_CAM_LJ_20110414_01 + snapshot angle is 90 rotated + 2009-10-24 jia.jia Merged from kernel-v4515 ZTE_MSM_CAMERA_JIA_001 +------------------------------------------------------------------------------------------*/ + +#include +#include +#include +#include +#include +#include +#include +#include "ovm7690.h" +#include + +/* + * Micron MT9V113 Registers and their values + */ +/* Sensor I2C Slave Address */ +#define OVM7690_SLAVE_WR_ADDR 0x60 /* replaced by "msm_i2c_devices.addr" */ +#define OVM7690_SLAVE_RD_ADDR 0x61 + +/* Sensor I2C Device ID */ +#define REG_OVM7690_MODEL_ID 0x04 +#define OVM7690_MODEL_ID 0x7691 + +/* SOC Registers */ +//#define REG_MT9V113_SENSOR_RESET 0x001A +//#define REG_MT9V113_STANDBY_CONTROL 0x0018 +//#define REG_MT9V113_MCU_BOOT 0x001C + +/* CAMIO Input MCLK (MHz) */ +#define OVM7690_CAMIO_MCLK 24000000 /*48000000*/ + +/* GPIO For Sensor Clock Switch */ +#define OVM7690_GPIO_SWITCH_CTL 107 + +#define OVM7690_GPIO_SWITCH_VAL 1 + + +struct ovm7690_work_t { + struct work_struct work; +}; + +static struct ovm7690_work_t *ovm7690_sensorw; +static struct i2c_client *ovm7690_client; + +struct ovm7690_ctrl_t { + const struct msm_camera_sensor_info *sensordata; +}; + +static struct ovm7690_ctrl_t *ovm7690_ctrl; + +static DECLARE_WAIT_QUEUE_HEAD(ovm7690_wait_queue); +DECLARE_MUTEX(ovm7690_sem); + +extern int32_t msm_camera_power_frontend(enum msm_camera_pwr_mode_t pwr_mode); +extern int msm_camera_clk_switch(const struct msm_camera_sensor_info *data, + uint32_t gpio_switch, + uint32_t switch_val); +/*=============================================================*/ + +/* + * Hard standby of sensor + * on: =1, enter hard standby + * on: =0, exit hard standby + * + * Hard standby mode is set by register of REG_MT9V113_STANDBY_CONTROL. + */ +static int __attribute__((unused)) ovm7690_hard_standby(const struct msm_camera_sensor_info *dev, uint32_t on) +{ + int rc; + + pr_err("%s: entry\n", __func__); + + rc = gpio_request(dev->sensor_pwd, "ovm7690"); + if (0 == rc) + { + /* ignore "rc" */ + rc = gpio_direction_output(dev->sensor_pwd, on); + /* time delay for enterring into standby */ + mdelay(30); + } + + gpio_free(dev->sensor_pwd); + + return rc; +} + +/* + * Soft reset has the same effect as the hard reset. + */ + #if 0 +static int ovm7690_hard_reset(const struct msm_camera_sensor_info *dev) +{ + int rc = 0; + + pr_err("%s: entry\n", __func__); + + rc = gpio_request(dev->sensor_reset, "ovm7690"); + if (0 == rc) + { + /* ignore "rc" */ + rc = gpio_direction_output(dev->sensor_reset, 1); + + mdelay(10); + + /* ignore "rc" */ + rc = gpio_direction_output(dev->sensor_reset, 0); + + /* + * RESET_BAR pulse width: Min 70 EXTCLKs + * EXTCLKs: = MCLK (i.e., MT9P111_CAMIO_MCLK) + */ + mdelay(10); + + /* ignore "rc" */ + rc = gpio_direction_output(dev->sensor_reset, 1); + + /* + * Time delay before first serial write: Min 100 EXTCLKs + * EXTCLKs: = MCLK (i.e., MT9P111_CAMIO_MCLK) + */ + mdelay(10); + } + + gpio_free(dev->sensor_reset); + + return rc; +} +#endif +static int32_t ovm7690_i2c_txdata(unsigned short saddr, + unsigned char *txdata, + int length) +{ + struct i2c_msg msg[] = { + { + .addr = saddr, + .flags = 0, + .len = length, + .buf = txdata, + }, + }; + + if (i2c_transfer(ovm7690_client->adapter, msg, 1) < 0) + { + CCRT("%s: failed!\n", __func__); + return -EIO; + } + + return 0; +} + +static int32_t ovm7690_i2c_write(unsigned short saddr, + unsigned short waddr, + unsigned short wdata, + enum ovm7690_width_t width) +{ + int32_t rc = -EFAULT; + unsigned char buf[4]; + + memset(buf, 0, sizeof(buf)); + + switch (width) + { + case WORD_LEN: + { + buf[0] = (waddr & 0xFF00) >> 8; + buf[1] = (waddr & 0x00FF); + buf[2] = (wdata & 0xFF00) >> 8; + buf[3] = (wdata & 0x00FF); + + rc = ovm7690_i2c_txdata(saddr, buf, 4); + } + break; + + case BYTE_LEN: + { + buf[0] = waddr; + buf[1] = wdata; + + rc = ovm7690_i2c_txdata(saddr, buf, 2); + } + break; + + default: + { + } + break; + } + + if (rc < 0) + { + pr_err("%s: saddr = 0x%x, waddr = 0x%x, wdata = 0x%x, failed!\n", __func__, saddr,waddr, wdata); + }else + { + //pr_err("%s: saddr = 0x%x, waddr = 0x%x, wdata = 0x%x, ok!\n", __func__, saddr,waddr, wdata); + } + + return rc; +} + +/*static int32_t mt9v113_i2c_write_table(struct mt9v113_i2c_reg_conf const *reg_conf_tbl, + int num_of_items_in_table) +{ + + int i; + int32_t rc = -EFAULT; + CCRT("%s: entry\n", __func__); + for (i = 0; i < num_of_items_in_table; i++) + { + rc = mt9v113_i2c_write(mt9v113_client->addr, + reg_conf_tbl->waddr, + reg_conf_tbl->wdata, + reg_conf_tbl->width); + if (rc < 0) + { + break; + } + + if (reg_conf_tbl->mdelay_time != 0) + { + mdelay(reg_conf_tbl->mdelay_time); + } + + reg_conf_tbl++; + } + + return rc; +}*/ +#if 1 +static int ovm7690_i2c_rxdata(unsigned short saddr, + unsigned char *rxdata, + int length) +{ + struct i2c_msg msgs[] = { + { + .addr = saddr, + .flags = 0, + .len = 1, + .buf = rxdata, + }, + { + .addr = saddr, + .flags = I2C_M_RD, + .len = length, + .buf = rxdata, + }, + }; + + if (i2c_transfer(ovm7690_client->adapter, msgs, 2) < 0) + { + CCRT("%s: failed!\n", __func__); + return -EIO; + } + + return 0; +} + + +static int32_t ovm7690_i2c_read(unsigned short saddr, + unsigned short raddr, + unsigned short *rdata, + enum ovm7690_width_t width) +{ + int32_t rc = 0; + unsigned char buf[4]; + pr_err("wt %s ",__func__); + + if (!rdata) + { + CCRT("%s: rdata points to NULL!\n", __func__); + return -EIO; + } + + memset(buf, 0, sizeof(buf)); + + switch (width) + { + case WORD_LEN: + { + buf[0] = (raddr & 0xFF00) >> 8; + buf[1] = (raddr & 0x00FF); + + rc = ovm7690_i2c_rxdata(saddr, buf, 2); + if (rc < 0) + { + return rc; + } + + *rdata = buf[0] << 8 | buf[1]; + } + break; + + case BYTE_LEN: + { + buf[0] = raddr; + + rc = ovm7690_i2c_rxdata(saddr, buf, 1); + if (rc < 0) + { + return rc; + } + + *rdata = buf[0]| 0x0000; + } + break; + + default: + { + } + break; + } + + if (rc < 0) + { + CCRT("%s: failed!\n", __func__); + } + + return rc; +} +#endif + +static long ovm7690_set_sensor_mode(int32_t mode) +{ + return 0; +} + +static long ovm7690_set_effect(int32_t mode, int32_t effect) +{ + long rc = 0; + + pr_err("%s model = %d effect =%d",__func__,mode ,effect); + + + switch (effect) + { + + case CAMERA_EFFECT_OFF: + { + pr_err("effect =%d CAMERA_EFFECT_OFF",effect); + + + + rc = ovm7690_i2c_write(ovm7690_client->addr,0xbe,0x26,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0xbf,0x7b,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0xc0,0xac,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0xbb,0x80,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0xbc,0x62,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0xbd,0x1e,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0xc1,0x1e,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0x28,0x00,BYTE_LEN); + if (rc < 0) + { + return rc; + } + + } + break; + + case CAMERA_EFFECT_MONO: + { pr_err("effect =%d CAMERA_EFFECT_MONO",effect); + + + rc = ovm7690_i2c_write(ovm7690_client->addr,0xbe,0x00,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0xbf,0x00,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0xc0,0x00,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0xbb,0x00,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0xbc,0x00,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0xbd,0x00,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0xc1,0x00,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0x28,0x00,BYTE_LEN); + if (rc < 0) + { + return rc; + } + } + break; + + case CAMERA_EFFECT_NEGATIVE: + { + pr_err("effect =%d CAMERA_EFFECT_NEGATIVE",effect); + + + rc = ovm7690_i2c_write(ovm7690_client->addr,0xbe,0x26,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0xbf,0x7b,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0xc0,0xac,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0xbb,0x80,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0xbc,0x62,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0xbd,0x1e,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0xc1,0x1e,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0x28,0x80,BYTE_LEN); + if (rc < 0) + { + return rc; + } + } + break; + + case CAMERA_EFFECT_SOLARIZE: + { + pr_err("effect =%d CAMERA_EFFECT_SOLARIZE not surport ",effect); + } + break; + + case CAMERA_EFFECT_SEPIA: + { + pr_err("effect =%d CAMERA_EFFECT_SEPIA",effect); + + rc = ovm7690_i2c_write(ovm7690_client->addr,0xbe,0x26,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0xbf,0x7b,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0xc0,0x10,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0xbb,0x90,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0xbc,0x28,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0xbd,0x1e,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0xc1,0x1e,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0x28,0x00,BYTE_LEN); + if (rc < 0) + { + return rc; + } + + } + break; + + default: + { + /* add code here + e.g. + reg_val = 0xXXXX; + + rc = mt9t11x_i2c_write(mt9t11x_client->addr, 0xXXXX, reg_addr, WORD_LEN); + if (rc < 0) + { + return rc; + } + */ + + return -EFAULT; + } + + + } + pr_err("test effect "); + mdelay(20); + + return rc; +} + + +/* + * White Balance Setting + */ +static int32_t ovm7690_set_wb(int8_t wb_mode) +{ + int32_t rc = 0; + + pr_err("%s: entry: wb_mode=%d\n", __func__, wb_mode); + + switch (wb_mode) + { + case CAMERA_WB_MODE_AWB: + { + rc = ovm7690_i2c_write(ovm7690_client->addr,0x13,0xf7,BYTE_LEN); //AWB on + if (rc < 0) + { + return rc; + } + + } + break; + + case CAMERA_WB_MODE_SUNLIGHT: + { + rc = ovm7690_i2c_write(ovm7690_client->addr,0x13,0xf5,BYTE_LEN); //AWB off + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0x01,0x5a,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0x02,0x5c,BYTE_LEN); + if (rc < 0) + { + return rc; + } + + } + break; + + case CAMERA_WB_MODE_INCANDESCENT: + { + rc = ovm7690_i2c_write(ovm7690_client->addr,0x13,0xf5,BYTE_LEN); //AWB off + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0x01,0x96,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0x02,0x40,BYTE_LEN); + if (rc < 0) + { + return rc; + } + } + break; + + case CAMERA_WB_MODE_FLUORESCENT: + { + rc = ovm7690_i2c_write(ovm7690_client->addr,0x13,0xf5,BYTE_LEN); //AWB off + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0x01,0x84,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0x02,0x4c,BYTE_LEN); + if (rc < 0) + { + return rc; + } + + } + break; + + case CAMERA_WB_MODE_CLOUDY: + { + rc = ovm7690_i2c_write(ovm7690_client->addr,0x13,0xf5,BYTE_LEN); //AWB off + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0x01,0x58,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0x02,0x60,BYTE_LEN); + if (rc < 0) + { + return rc; + } + + } + break; + + default: + { + CCRT("%s: parameter error!\n", __func__); + rc = -EFAULT; + } + } + + + return rc; +} + +static int32_t ovm7690_set_contrast(int8_t contrast) +{ + int32_t rc = 0; + uint16_t temp=0; + + pr_err("lijing:%s: entry: contrast=%d\n", __func__, contrast); + + + switch (contrast) + { + + + rc = ovm7690_i2c_write(ovm7690_client->addr,0xd2,0x07,BYTE_LEN); + if (rc < 0) + { + return rc; + } + case CAMERA_CONTRAST_0: + { + + + rc = ovm7690_i2c_write(ovm7690_client->addr,0xd5,0x20,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0xd4,0x20,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0xd3,0x00,BYTE_LEN); + if (rc < 0) + { + return rc; + } + + temp=0; + rc = ovm7690_i2c_read(ovm7690_client->addr, 0xdc, &temp, BYTE_LEN); + if (rc < 0) + { + return rc; + } + temp |= 0x04; + rc = ovm7690_i2c_write(ovm7690_client->addr,0xdc,temp,BYTE_LEN); + if (rc < 0) + { + return rc; + } + + + + } + break; + + case CAMERA_CONTRAST_1: + { + + rc = ovm7690_i2c_write(ovm7690_client->addr,0xd5,0x20,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0xd4,0x24,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0xd3,0x00,BYTE_LEN); + if (rc < 0) + { + return rc; + } + + + temp=0; + rc = ovm7690_i2c_read(ovm7690_client->addr, 0xdc, &temp, BYTE_LEN); + if (rc < 0) + { + return rc; + } + temp |= 0x04; + rc = ovm7690_i2c_write(ovm7690_client->addr,0xdc,temp,BYTE_LEN); + if (rc < 0) + { + return rc; + } + + } + break; + + case CAMERA_CONTRAST_2: + { + + + rc = ovm7690_i2c_write(ovm7690_client->addr,0xd5,0x20,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0xd4,0x28,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0xd3,0x00,BYTE_LEN); + if (rc < 0) + { + return rc; + } + + temp=0; + rc = ovm7690_i2c_read(ovm7690_client->addr, 0xdc, &temp, BYTE_LEN); + if (rc < 0) + { + return rc; + } + temp &= 0xfb; + rc = ovm7690_i2c_write(ovm7690_client->addr,0xdc,temp,BYTE_LEN); + if (rc < 0) + { + return rc; + } + + } + break; + + case CAMERA_CONTRAST_3: + { + + rc = ovm7690_i2c_write(ovm7690_client->addr,0xd5,0x20,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0xd4,0x2c,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0xd3,0x00,BYTE_LEN); + if (rc < 0) + { + return rc; + } + + temp=0; + rc = ovm7690_i2c_read(ovm7690_client->addr, 0xdc, &temp, BYTE_LEN); + if (rc < 0) + { + return rc; + } + temp &= 0xfb; + rc = ovm7690_i2c_write(ovm7690_client->addr,0xdc,temp,BYTE_LEN); + if (rc < 0) + { + return rc; + } + } + break; + + case CAMERA_CONTRAST_4: + { + + + rc = ovm7690_i2c_write(ovm7690_client->addr,0xd5,0x20,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0xd4,0x30,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0xd3,0x00,BYTE_LEN); + if (rc < 0) + { + return rc; + } + + temp=0; + rc = ovm7690_i2c_read(ovm7690_client->addr, 0xdc, &temp, BYTE_LEN); + if (rc < 0) + { + return rc; + } + temp &= 0xfb; + rc = ovm7690_i2c_write(ovm7690_client->addr,0xdc,temp,BYTE_LEN); + if (rc < 0) + { + return rc; + } + } + break; + + default: + { + CCRT("%s: parameter error!\n", __func__); + rc = -EFAULT; + } + } + + return rc; +} + + +static int32_t ovm7690_set_exposure_compensation(int8_t exposure) +{ + int32_t rc = 0; + + pr_err("lijing:%s: entry: exposure=%d\n", __func__, exposure); + + switch (exposure) + { + case CAMERA_EXPOSURE_0: + { + rc = ovm7690_i2c_write(ovm7690_client->addr,0x24,0x38,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0x25,0x28,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0x26,0x81,BYTE_LEN); + if (rc < 0) + { + return rc; + } + + } + break; + + case CAMERA_EXPOSURE_1: + { + rc = ovm7690_i2c_write(ovm7690_client->addr,0x24,0x58,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0x25,0x48,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0x26,0xa2,BYTE_LEN); + if (rc < 0) + { + return rc; + } + } + break; + + case CAMERA_EXPOSURE_2: + { + rc = ovm7690_i2c_write(ovm7690_client->addr,0x24,0x88,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0x25,0x78,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0x26,0xd3,BYTE_LEN); + if (rc < 0) + { + return rc; + } + } + break; + + case CAMERA_EXPOSURE_3: + { + rc = ovm7690_i2c_write(ovm7690_client->addr,0x24,0xa8,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0x25,0x98,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0x26,0xd4,BYTE_LEN); + if (rc < 0) + { + return rc; + } + + } + break; + + case CAMERA_EXPOSURE_4: + { + rc = ovm7690_i2c_write(ovm7690_client->addr,0x24,0xc8,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0x25,0xb8,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0x26,0xf5,BYTE_LEN); + if (rc < 0) + { + return rc; + } + } + break; + + default: + { + pr_err("%s: parameter error!\n", __func__); + rc = -EFAULT; + } + } + + + return rc; +} + + +static int32_t ovm7690_set_brightness(int8_t brightness) +{ + int32_t rc = 0; + uint16_t temp = 0; + + pr_err("%s: entry: brightness=%d\n", __func__, brightness); + + + switch (brightness) + { + + + case CAMERA_BRIGHTNESS_0: //->-4 + { + + + rc = ovm7690_i2c_write(ovm7690_client->addr,0xd3,0x40,BYTE_LEN); + if (rc < 0) + { + return rc; + } + + + temp=0; + rc = ovm7690_i2c_read(ovm7690_client->addr, 0xdc, &temp, BYTE_LEN); + if (rc < 0) + { + return rc; + } + temp |= 0x08; + rc = ovm7690_i2c_write(ovm7690_client->addr,0xdc,temp,BYTE_LEN); + if (rc < 0) + { + return rc; + } + + pr_err("brightness =%d reg 0xd3 value =0x%0x",brightness,temp); + + } + break; + + case CAMERA_BRIGHTNESS_1: //->-2 + { + + rc = ovm7690_i2c_write(ovm7690_client->addr,0xd3,0x20,BYTE_LEN); + if (rc < 0) + { + return rc; + } + + rc = ovm7690_i2c_write(ovm7690_client->addr,0xdc,0x09,BYTE_LEN); + if (rc < 0) + { + return rc; + } + pr_err("brightness =%d reg 0xd3 value =0x%0x",brightness,temp); + } + break; + + case CAMERA_BRIGHTNESS_2: //-> 0 + { + + rc = ovm7690_i2c_write(ovm7690_client->addr,0xd3,0x00,BYTE_LEN); + if (rc < 0) + { + return rc; + } + + + rc = ovm7690_i2c_write(ovm7690_client->addr,0xdc,0x09,BYTE_LEN); + if (rc < 0) + { + return rc; + } + pr_err("brightness =%d reg 0xd3 value =0x%0x",brightness,temp); + } + break; + + case CAMERA_BRIGHTNESS_3: + { + rc = ovm7690_i2c_write(ovm7690_client->addr,0xd3,0x10,BYTE_LEN); + if (rc < 0) + { + return rc; + } + + + rc = ovm7690_i2c_write(ovm7690_client->addr,0xdc,0x01,BYTE_LEN); + if (rc < 0) + { + return rc; + } + pr_err("brightness =%d reg 0xd3 value =0x%0x",brightness,temp); + } + break; + + case CAMERA_BRIGHTNESS_4: + { + rc = ovm7690_i2c_write(ovm7690_client->addr,0xd3,0x20,BYTE_LEN); + if (rc < 0) + { + return rc; + } + + + + rc = ovm7690_i2c_write(ovm7690_client->addr,0xdc,0x01,BYTE_LEN); + if (rc < 0) + { + return rc; + } + pr_err("brightness =%d reg 0xd3 value =0x%0x",brightness,temp); + } + break; + + case CAMERA_BRIGHTNESS_5: + { + + rc = ovm7690_i2c_write(ovm7690_client->addr,0xd3,0x30,BYTE_LEN); + if (rc < 0) + { + return rc; + } + + + rc = ovm7690_i2c_write(ovm7690_client->addr,0xdc,0x01,BYTE_LEN); + if (rc < 0) + { + return rc; + } + pr_err("brightness =%d reg 0xd3 value =0x%0x",brightness,temp); + } + break; + + case CAMERA_BRIGHTNESS_6: + { + + rc = ovm7690_i2c_write(ovm7690_client->addr,0xd3,0x40,BYTE_LEN); + if (rc < 0) + { + return rc; + } + + + rc = ovm7690_i2c_write(ovm7690_client->addr,0xdc,0x01,BYTE_LEN); + if (rc < 0) + { + return rc; + } + pr_err("brightness =%d reg 0xd3 value =0x%0x",brightness,temp); + } + break; + + default: + { + CCRT("%s: parameter error!\n", __func__); + rc = -EFAULT; + } + } + mdelay(20); + + + return rc; +} + +static int32_t ovm7690_set_saturation(int8_t saturation) +{ + int32_t rc = 0; + //uint16_t temp=0; + + pr_err("lijing:%s: entry: saturation=%d\n", __func__, saturation); + + switch (saturation) + { + + rc = ovm7690_i2c_write(ovm7690_client->addr,0xd2,0x07,BYTE_LEN); + if (rc < 0) + { + return rc; + } + case CAMERA_SATURATION_0: //-> - 4 + { + + + + rc = ovm7690_i2c_write(ovm7690_client->addr,0xD8,0x00,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0xD9,0x00,BYTE_LEN); + if (rc < 0) + { + return rc; + } + + + } + break; + + case CAMERA_SATURATION_1: // -> - 2 + { + + rc = ovm7690_i2c_write(ovm7690_client->addr,0xD8,0x20,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0xD9,0x20,BYTE_LEN); + if (rc < 0) + { + return rc; + } + + } + break; + + case CAMERA_SATURATION_2: // -> 0 + { + + + rc = ovm7690_i2c_write(ovm7690_client->addr,0xD8,0x40,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0xD9,0x40,BYTE_LEN); + if (rc < 0) + { + return rc; + } + + + } + break; + + case CAMERA_SATURATION_3: // ->2 + { + + + rc = ovm7690_i2c_write(ovm7690_client->addr,0xD8,0x60,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0xD9,0x60,BYTE_LEN); + if (rc < 0) + { + return rc; + } + + } + break; + + case CAMERA_SATURATION_4: //->4 + { + + + rc = ovm7690_i2c_write(ovm7690_client->addr,0xD8,0x80,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0xD9,0x80,BYTE_LEN); + if (rc < 0) + { + return rc; + } + + } + break; + + default: + { + pr_err("%s: parameter error!\n", __func__); + rc = -EFAULT; + } + } + + return rc; +} + +static int32_t ovm7690_set_sharpness(int8_t sharpness) +{ + int32_t rc = 0; + //uint16_t brightness_lev = 0; + + pr_err("lijing:%s: entry: sharpness=%d\n", __func__, sharpness); + switch (sharpness) + { + case CAMERA_SHARPNESS_0: + { + rc = ovm7690_i2c_write(ovm7690_client->addr,0xb4,0x26,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0xb6,0x00,BYTE_LEN); + if (rc < 0) + { + return rc; + } + + + + } + break; + + case CAMERA_SHARPNESS_1: + { + rc = ovm7690_i2c_write(ovm7690_client->addr,0xb4,0x26,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0xb6,0x02,BYTE_LEN); + if (rc < 0) + { + return rc; + } + + } + break; + + case CAMERA_SHARPNESS_2: + { + rc = ovm7690_i2c_write(ovm7690_client->addr,0xb4,0x26,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0xb6,0x04,BYTE_LEN); + if (rc < 0) + { + return rc; + } + + } + break; + + case CAMERA_SHARPNESS_3: + { + rc = ovm7690_i2c_write(ovm7690_client->addr,0xb4,0x26,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0xb6,0x06,BYTE_LEN); + if (rc < 0) + { + return rc; + } + } + break; + + case CAMERA_SHARPNESS_4: + { + rc = ovm7690_i2c_write(ovm7690_client->addr,0xb4,0x26,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0xb6,0x08,BYTE_LEN); + if (rc < 0) + { + return rc; + } + } + break; + default: + { + CCRT("%s: parameter error!\n", __func__); + rc = -EFAULT; + } + } + return rc; + +} + + +/* + * ISO Setting + */ +static int32_t ovm7690_set_iso(int8_t iso_val) +{ + int32_t rc = 0; + + pr_err("lijing:%s: entry: iso_val=%d\n", __func__, iso_val); + + switch (iso_val) + { + case CAMERA_ISO_SET_AUTO: + { + rc = ovm7690_i2c_write(ovm7690_client->addr,0x14,0x21,BYTE_LEN); + if (rc < 0) + { + return rc; + } + + } + break; + + case CAMERA_ISO_SET_HJR: + { + } + break; + + case CAMERA_ISO_SET_100: + { + rc = ovm7690_i2c_write(ovm7690_client->addr,0x14,0x01,BYTE_LEN); + if (rc < 0) + { + return rc; + } + + } + break; + + case CAMERA_ISO_SET_200: + { + rc = ovm7690_i2c_write(ovm7690_client->addr,0x14,0x11,BYTE_LEN); + if (rc < 0) + { + return rc; + } + } + break; + + case CAMERA_ISO_SET_400: + { + rc = ovm7690_i2c_write(ovm7690_client->addr,0x14,0x21,BYTE_LEN); + if (rc < 0) + { + return rc; + } + } + break; + + case CAMERA_ISO_SET_800: + { + rc = ovm7690_i2c_write(ovm7690_client->addr,0x14,0x31,BYTE_LEN); + if (rc < 0) + { + return rc; + } + } + break; + + default: + { + CCRT("%s: parameter error!\n", __func__); + rc = -EFAULT; + } + } + return rc; +} + +/* + * Antibanding Setting + */ +static int32_t ovm7690_set_antibanding(int8_t antibanding) +{ + int32_t rc = 0; + + + + pr_err("lijing:%s: entry: antibanding=%d\n", __func__, antibanding); + + switch (antibanding) + { + case CAMERA_ANTIBANDING_SET_OFF: + { + CCRT("%s: CAMERA_ANTIBANDING_SET_OFF NOT supported!\n", __func__); + } + break; + + case CAMERA_ANTIBANDING_SET_60HZ: + { + rc = ovm7690_i2c_write(ovm7690_client->addr,0x14,0x20,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0x51,0x80,BYTE_LEN); + if (rc < 0) + { + return rc; + } + + } + break; + + case CAMERA_ANTIBANDING_SET_50HZ: + { + rc = ovm7690_i2c_write(ovm7690_client->addr,0x14,0x21,BYTE_LEN); + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_write(ovm7690_client->addr,0x50,0x9a,BYTE_LEN); + if (rc < 0) + { + return rc; + } + + } + break; + + case CAMERA_ANTIBANDING_SET_AUTO: + { + pr_err("auto banding can not support"); + } + break; + + default: + { + CCRT("%s: parameter error!\n", __func__); + rc = -EFAULT; + } + } + + return rc; +} +/*static int32_t mt9v113_set_lens_roll_off(void) +{ + + int32_t rc = 0; + CCRT("%s: entry\n", __func__); + rc = mt9v113_i2c_write_table(&mt9v113_regs.rftbl[0], mt9v113_regs.rftbl_size); + return rc; +}*/ + +/* + * Power-down Steps: + * + * Configure sensor as standby mode; + * Assert standby pin; + * Time delay for 200ms; + * Cut off MCLK; + */ + +/* + * Power-up Process + */ +static long ovm7690_power_up(void) +{ + pr_err("%s: not supported!\n", __func__); + return 0; +} +static long ovm7690_power_down(const struct msm_camera_sensor_info *dev, uint32_t on) +{ + long rc = 0; + + pr_err("%s: entry dev->sensor_pwd=%d on=%d \n", __func__,dev->sensor_pwd,on); + + rc = gpio_request(dev->sensor_pwd, "ovm7690"); + if (0 == rc) + { + /* ignore "rc" */ + rc = gpio_direction_output(dev->sensor_pwd, on); + + /* + * time delay for entry into standby + * decrease time delay from 200ms to 10ms + * to improve sensor init + */ + pr_err("ovm7690_power_down:rc=%ld",rc); + mdelay(10); + } + + gpio_free(dev->sensor_pwd); + + return rc; + +} + + +static long ovm7690_reg_init(void) +{ + + int32_t array_length; + int32_t i; + long rc; + + pr_err("%s: entry\n", __func__); + + array_length = ovm7690_regs.prev_snap_reg_settings_size; + + /* Configure sensor for Preview mode and Snapshot mode */ + for (i = 0; i < array_length; i++) + { + rc = ovm7690_i2c_write(ovm7690_client->addr, + ovm7690_regs.prev_snap_reg_settings[i].waddr, + ovm7690_regs.prev_snap_reg_settings[i].wdata, + BYTE_LEN); + + if (rc < 0) + { + pr_err("write reg failed"); + return rc; + } + } + + return 0; +} + + + +static int ovm7690_sensor_probe_init(const struct msm_camera_sensor_info *data) +{ + uint16_t model_idh = 0; + uint16_t model_idl = 0; + int rc; + + pr_err("%s: entry\n", __func__); + + if (!data || strcmp(data->sensor_name, "ovm7690")) + { + CCRT("%s: invalid parameters!\n", __func__); + rc = -ENODEV; + goto probe_init_fail; + } + + ovm7690_ctrl = kzalloc(sizeof(struct ovm7690_ctrl_t), GFP_KERNEL); + if (!ovm7690_ctrl) + { + CCRT("%s: kzalloc failed!\n", __func__); + rc = -ENOMEM; + goto probe_init_fail; + } + + ovm7690_ctrl->sensordata = data; + + + /* + * Power sensor on + */ + rc = msm_camera_power_frontend(MSM_CAMERA_PWRUP_MODE); + if (rc < 0) + { + CCRT("%s: camera_power_frontend failed!\n", __func__); + goto probe_init_fail; + } + + + mdelay(2); + + // for ovm7690 + ovm7690_power_down(ovm7690_ctrl->sensordata,0); + mdelay(5); + + + /* Input MCLK */ + msm_camio_clk_rate_set(OVM7690_CAMIO_MCLK); + mdelay(10); + + + rc = ovm7690_i2c_write(ovm7690_client->addr,0x12,0x80,BYTE_LEN); + if (rc < 0) + { + return rc; + } + mdelay(5); + rc = ovm7690_i2c_write(ovm7690_client->addr,0x49,0x0D,BYTE_LEN); + if (rc < 0) + { + return rc; + } + + + rc = ovm7690_reg_init(); + if (rc < 0) + { + goto probe_init_fail; + } + + mdelay(1); + + + + rc = ovm7690_i2c_read(ovm7690_client->addr, 0x0A, &model_idh, BYTE_LEN);// RESET_REGISTER + if (rc < 0) + { + return rc; + } + pr_err("%s: model_id HI = 0x%x\n", __func__, model_idh); + rc = ovm7690_i2c_read(ovm7690_client->addr, 0x0B, &model_idl, BYTE_LEN);// RESET_REGISTER + if (rc < 0) + { + return rc; + } + pr_err("%s: model_id LO = 0x%x\n", __func__, model_idl); + + /* Check if it matches it with the value in Datasheet */ + if (model_idh !=0x76 || model_idl !=0x91 ) + { + pr_err("ovm7690 model_ id is error "); + rc = -EFAULT; + goto probe_init_fail; + } + + ovm7690_power_down(ovm7690_ctrl->sensordata,1); + + mdelay(100); + + pr_err("%s is ok",__func__); + return 0; + +probe_init_fail: + /* + * To shut sensor down + * Ignore "rc" + */ + ovm7690_power_down(ovm7690_ctrl->sensordata,1); + msm_camera_power_frontend(MSM_CAMERA_PWRDWN_MODE); + kfree(ovm7690_ctrl); + return rc; +} +static int ovm7690_sensor_init_probe(const struct msm_camera_sensor_info *data) +{ + uint16_t model_idh = 0; + uint16_t model_idl = 0; + int rc = 0; +// uint16_t reg_value = 0; + + pr_err("%s: entry\n", __func__); + + /* Read the Model ID of the sensor */ + rc = ovm7690_i2c_read(ovm7690_client->addr, 0x0A, &model_idh, BYTE_LEN);// RESET_REGISTER + if (rc < 0) + { + return rc; + } + rc = ovm7690_i2c_read(ovm7690_client->addr, 0x0B, &model_idl, BYTE_LEN);// RESET_REGISTER + if (rc < 0) + { + return rc; + } + + + pr_err("%s: model_idh model_idl 0x%x 0x%x\n", __func__, model_idh,model_idl); + + /* Check if it matches it with the value in Datasheet */ + if (model_idh != 0x76 || model_idl != 0x91) + { + pr_err("ovm7690 : model_id is error \n"); + rc = -EFAULT; + goto init_probe_fail; + } + + + rc = ovm7690_reg_init(); + if (rc < 0) + { + goto init_probe_fail; + } + + return rc; + +init_probe_fail: + CCRT("%s: rc = %d, failed!\n", __func__, rc); + return rc; +} + +int ovm7690_sensor_init(const struct msm_camera_sensor_info *data) +{ + int rc = 0; + + pr_err("wt %s: entry\n", __func__); + + ovm7690_ctrl = kzalloc(sizeof(struct ovm7690_ctrl_t), GFP_KERNEL); + if (!ovm7690_ctrl) + { + CCRT("%s: kzalloc failed!\n", __func__); + rc = -ENOMEM; + goto init_done; + } + + if (data) + { + ovm7690_ctrl->sensordata = data; + } + + + rc = msm_camera_power_frontend(MSM_CAMERA_PWRUP_MODE); + if (rc < 0) + { + pr_err("%s: camera_power_frontend failed!\n", __func__); + goto init_fail; + } + + + //set ov5640 pwd h && set ovm760 pwd l to swtich ovm7690 + rc = gpio_request(1, "ov5640"); + if (0 == rc) + { + /* ignore "rc" */ + rc = gpio_direction_output(1, 1); + + /* + * time delay for entry into standby + * decrease time delay from 200ms to 10ms + * to improve sensor init + */ + pr_err("%s set ov5640 pwd high :rc=%d",__func__,rc); + //mdelay(); + } + gpio_free(1); + + + mdelay(20); + ovm7690_power_down(ovm7690_ctrl->sensordata,0); + + mdelay(5); + + + /* Input MCLK */ + msm_camio_clk_rate_set(OVM7690_CAMIO_MCLK); + + // msm_camio_camif_pad_reg_reset(); + + mdelay(5); + + mdelay(60); + + // for 20110719_night + rc = ovm7690_i2c_write(ovm7690_client->addr,0x12,0x80,BYTE_LEN); + if (rc < 0) + { + return rc; + } + mdelay(5); + rc = ovm7690_i2c_write(ovm7690_client->addr,0x49,0x0D,BYTE_LEN); + if (rc < 0) + { + return rc; + } + + + rc = ovm7690_sensor_init_probe(ovm7690_ctrl->sensordata); + if (rc < 0) + { + pr_err("%s: sensor_init_probe failed!\n", __func__); + goto init_fail; + } + +init_done: + pr_err(" %s wt is ok ",__func__); + return rc; + +init_fail: + /* + * To power sensor down + * Ignore "rc" + */ + msm_camera_power_frontend(MSM_CAMERA_PWRDWN_MODE); + kfree(ovm7690_ctrl); + return rc; +} + +static int ovm7690_init_client(struct i2c_client *client) +{ + /* Initialize the MSM_CAMI2C Chip */ + init_waitqueue_head(&ovm7690_wait_queue); + return 0; +} + +int ovm7690_sensor_config(void __user *argp) +{ + struct sensor_cfg_data cfg_data; + long rc = 0; + + pr_err("%s: entry\n", __func__); + + if (copy_from_user(&cfg_data, (void *)argp, sizeof(struct sensor_cfg_data))) + { + CCRT("%s: copy_from_user failed!\n", __func__); + return -EFAULT; + } + + + pr_err("%s: cfgtype = %d, mode = %d\n", __func__, cfg_data.cfgtype, cfg_data.mode); + + switch (cfg_data.cfgtype) + { + case CFG_SET_MODE: + { + rc = ovm7690_set_sensor_mode(cfg_data.mode); + } + break; + + case CFG_SET_EFFECT: + { + rc = ovm7690_set_effect(cfg_data.mode, cfg_data.cfg.effect); + } + break; + + case CFG_PWR_UP: + { + rc = ovm7690_power_up(); + } + break; + + case CFG_PWR_DOWN: + { + //rc = ovm7690_power_down(); + } + break; + case CFG_SET_WB: + { + rc = ovm7690_set_wb(cfg_data.cfg.wb_mode); + } + break; + + case CFG_SET_ISO: + { + rc = ovm7690_set_iso(cfg_data.cfg.iso_val); + } + break; + + case CFG_SET_ANTIBANDING: + { + rc = ovm7690_set_antibanding(cfg_data.cfg.antibanding); + } + break; + + case CFG_SET_BRIGHTNESS: + { + rc = ovm7690_set_brightness(cfg_data.cfg.brightness); + } + break; + + case CFG_SET_SATURATION: + { + rc = ovm7690_set_saturation(cfg_data.cfg.saturation); + } + break; + + case CFG_SET_CONTRAST: + { + rc = ovm7690_set_contrast(cfg_data.cfg.contrast); + } + break; + + case CFG_SET_SHARPNESS: + { + rc = ovm7690_set_sharpness(cfg_data.cfg.sharpness); + } + break; + + case CFG_SET_EXPOSURE_COMPENSATION: + { + rc = ovm7690_set_exposure_compensation(cfg_data.cfg.exposure); + } + break; + + default: + { + rc = -EFAULT; + } + break; + } + + + return rc; +} + +int ovm7690_sensor_release(void) +{ + int rc = 0; + + pr_err("wt %s: entry\n", __func__); + + + /* + * Power VREG Off + * Ignore "rc" + */ +#if 1 + ovm7690_power_down(ovm7690_ctrl->sensordata,1); + + rc = msm_camera_power_frontend(MSM_CAMERA_PWRDWN_MODE); + + kfree(ovm7690_ctrl); +#endif + + + return rc; +} + +static int ovm7690_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + int rc = 0; + + pr_err("wt %s: entry\n", __func__); + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) + { + rc = -ENOTSUPP; + goto probe_failure; + } + + ovm7690_sensorw = kzalloc(sizeof(struct ovm7690_work_t), GFP_KERNEL); + if (!ovm7690_sensorw) + { + rc = -ENOMEM; + goto probe_failure; + } + + i2c_set_clientdata(client, ovm7690_sensorw); + ovm7690_init_client(client); + ovm7690_client = client; + + pr_err("wt %s ok",__func__); + return 0; + +probe_failure: + kfree(ovm7690_sensorw); + ovm7690_sensorw = NULL; + pr_err("%s: rc = %d, failed!\n", __func__, rc); + return rc; +} + +static int __exit ovm7690_i2c_remove(struct i2c_client *client) +{ + struct ovm7690_work_t *sensorw = i2c_get_clientdata(client); + + pr_err("%s: entry\n", __func__); + + free_irq(client->irq, sensorw); + kfree(sensorw); + + ovm7690_client = NULL; + ovm7690_sensorw = NULL; + + return 0; +} + +static const struct i2c_device_id ovm7690_id[] = { + { "ovm7690", 0}, + { }, +}; + +static struct i2c_driver ovm7690_driver = { + .id_table = ovm7690_id, + .probe = ovm7690_i2c_probe, + .remove = __exit_p(ovm7690_i2c_remove), + .driver = { + .name = "ovm7690", + }, +}; + +static int32_t ovm7690_i2c_add_driver(void) +{ + int32_t rc = 0; + + pr_err("wt %s: entry\n", __func__); + + rc = i2c_add_driver(&ovm7690_driver); + if (IS_ERR_VALUE(rc)) + { + goto init_failure; + } + + return rc; + +init_failure: + pr_err("%s: rc = %d, failed!\n", __func__, rc); + return rc; +} + +static void ovm7690_i2c_del_driver(void) +{ + i2c_del_driver(&ovm7690_driver); +} + +void ovm7690_exit(void) +{ + CDBG("%s: entry\n", __func__); + + i2c_del_driver(&ovm7690_driver); +} + +int ovm7690_sensor_probe(const struct msm_camera_sensor_info *info, + struct msm_sensor_ctrl *s) +{ + int rc = 0; + + pr_err("%s: entry\n", __func__); + rc = ovm7690_i2c_add_driver(); + if (rc < 0) + { + goto probe_failed; + } + + + rc = ovm7690_sensor_probe_init(info); + if (rc < 0) + { + pr_err("%s: ovm7690_sensor_probe_init failed!\n", __func__); + goto probe_failed; + } + + pr_err("ovm ovm7690_sensor_probe 1"); + + rc = ovm7690_sensor_release(); + if (rc < 0) + { + pr_err("%s: ovm7690_sensor_release failed!\n", __func__); + goto probe_failed; + } + + /* + * modify sensor angle from 90 to 180, else snapshot angle is 90 rotated + * ZTE_CAM_LJ_20110414_01 + */ + s->s_mount_angle = 0; + s->s_camera_type = FRONT_CAMERA_2D; + + s->s_init = ovm7690_sensor_init; + s->s_release = ovm7690_sensor_release; + s->s_config = ovm7690_sensor_config; + + pr_err("ovm7690_sensor_probe is ok "); + return rc; + +probe_failed: + pr_err("%s: rc = %d, failed!\n", __func__, rc); + + + ovm7690_i2c_del_driver(); + + + return rc; +} + +static int __ovm7690_probe(struct platform_device *pdev) +{ + return msm_camera_drv_start(pdev, ovm7690_sensor_probe); +} + +static struct platform_driver msm_camera_driver = { + .probe = __ovm7690_probe, + .driver = { + .name = "msm_camera_ovm7690", + .owner = THIS_MODULE, + }, +}; + +static int __init ovm7690_init(void) +{ + pr_err("wt entry %s ",__func__); + return platform_driver_register(&msm_camera_driver); +} + +//module_init(ovm7690_init); +fs_initcall(ovm7690_init); + +MODULE_DESCRIPTION("OMNI VGA YUV sensor driver"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/media/video/msm/ovm7690_reg_fpc.c b/drivers/media/video/msm/ovm7690_reg_fpc.c new file mode 100644 index 00000000..750ad413 --- /dev/null +++ b/drivers/media/video/msm/ovm7690_reg_fpc.c @@ -0,0 +1,242 @@ +/* + * drivers/media/video/msm/mt9v113_reg.c + * + * Refer to drivers/media/video/msm/mt9d112_reg.c + * For MT9V113: 0.3Mp, 1/11-Inch System-On-A-Chip (SOC) CMOS Digital Image Sensor + * + * Copyright (C) 2009-2010 ZTE Corporation. + * + * 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. + * + * Created by jia.jia@zte.com.cn + */ +/*----------------------------------------------------------------------------------------- + when who what, where, why comment tag + -------- ---- ------------------------------------- ---------------------- + 2011-07-28 wangtao add settings ZTE_CAM_WT_20100728 + 2011-04-15 lijing add settings ZTE_CAM_LJ_20100415 + 2009-10-24 jia.jia Merged from kernel-v4515 ZTE_MSM_CAMERA_JIA_001 +------------------------------------------------------------------------------------------*/ + +#include "ovm7690.h" + +static struct ovm7690_i2c_reg_conf const preview_snapshot_mode_reg_settings_array[] = { +//{0x12, 0x80, BYTE_LEN, 0}, +{0x0c, 0x96, BYTE_LEN, 0}, +{0x0c, 0xd6, BYTE_LEN, 0}, +{0x0c, 0x46, BYTE_LEN, 0}, +{0x0c, 0x06, BYTE_LEN, 0}, +{0x48, 0x42, BYTE_LEN, 0}, +{0x41, 0x43, BYTE_LEN, 0}, +{0x4c, 0x73, BYTE_LEN, 0}, +{0x81, 0xff, BYTE_LEN, 0}, +{0x21, 0x44, BYTE_LEN, 0}, +{0x16, 0x03, BYTE_LEN, 0}, +{0x39, 0x80, BYTE_LEN, 0}, +{0x1e, 0xb1, BYTE_LEN, 0}, +{0x12, 0x00, BYTE_LEN, 0}, +{0x82, 0x03, BYTE_LEN, 0}, +{0xd0, 0x48, BYTE_LEN, 0}, +{0x80, 0x7f, BYTE_LEN, 0}, +{0x3e, 0x30, BYTE_LEN, 0}, +{0x22, 0x00, BYTE_LEN, 0}, +{0x17, 0x69, BYTE_LEN, 0}, +{0x18, 0xa4, BYTE_LEN, 0}, +{0x19, 0x0c, BYTE_LEN, 0}, +{0x1a, 0xf6, BYTE_LEN, 0}, +{0xc8, 0x02, BYTE_LEN, 0}, +{0xc9, 0x80, BYTE_LEN, 0}, +{0xca, 0x01, BYTE_LEN, 0}, +{0xcb, 0xe0, BYTE_LEN, 0}, +{0xcc, 0x02, BYTE_LEN, 0}, +{0xcd, 0x80, BYTE_LEN, 0}, +{0xce, 0x01, BYTE_LEN, 0}, +{0xcf, 0xe0, BYTE_LEN, 0}, +{0x85, 0x90, BYTE_LEN, 0}, +{0x86, 0x10, BYTE_LEN, 0}, +{0x87, 0x00, BYTE_LEN, 0}, +{0x88, 0x10, BYTE_LEN, 0}, +{0x89, 0x18, BYTE_LEN, 0}, +{0x8a, 0x10, BYTE_LEN, 0}, +{0x8b, 0x14, BYTE_LEN, 0}, + +{0xb7, 0x02, BYTE_LEN, 0}, +{0xb8, 0x07, BYTE_LEN, 0}, //0x0b neil 20110825 +{0xb9, 0x00, BYTE_LEN, 0}, +{0xba, 0x18, BYTE_LEN, 0}, +{0x5A, 0x4A, BYTE_LEN, 0}, +{0x5B, 0x9F, BYTE_LEN, 0}, +{0x5C, 0x48, BYTE_LEN, 0}, +{0x5d, 0x32, BYTE_LEN, 0}, +{0x8e, 0x92, BYTE_LEN, 0}, +{0x96, 0xff, BYTE_LEN, 0}, +{0x97, 0x00, BYTE_LEN, 0}, +{0x8c, 0x5d, BYTE_LEN, 0}, +{0x8d, 0x11, BYTE_LEN, 0}, +{0x8e, 0x12, BYTE_LEN, 0}, +{0x8f, 0x11, BYTE_LEN, 0}, +{0x90, 0x50, BYTE_LEN, 0}, +{0x91, 0x22, BYTE_LEN, 0}, +{0x92, 0xd1, BYTE_LEN, 0}, +{0x93, 0xa7, BYTE_LEN, 0}, +{0x94, 0x23, BYTE_LEN, 0}, +{0x24, 0x88, BYTE_LEN, 0}, +{0x25, 0x78, BYTE_LEN, 0}, +{0x26, 0xc4, BYTE_LEN, 0}, +{0x95, 0x3b, BYTE_LEN, 0}, +{0x96, 0xff, BYTE_LEN, 0}, +{0x97, 0x00, BYTE_LEN, 0}, +{0x98, 0x4a, BYTE_LEN, 0}, +{0x99, 0x46, BYTE_LEN, 0}, +{0x9a, 0x3d, BYTE_LEN, 0}, +{0x9b, 0x3a, BYTE_LEN, 0}, +{0x9c, 0xf0, BYTE_LEN, 0}, +{0x9d, 0xf0, BYTE_LEN, 0}, +{0x9e, 0xf0, BYTE_LEN, 0}, +{0x9f, 0xff, BYTE_LEN, 0}, +{0xa0, 0x56, BYTE_LEN, 0}, +{0xa1, 0x55, BYTE_LEN, 0}, +{0xa2, 0x13, BYTE_LEN, 0}, +{0x50, 0x4d, BYTE_LEN, 0}, +{0x51, 0x3f, BYTE_LEN, 0}, +{0x21, 0x57, BYTE_LEN, 0}, +{0x20, 0x00, BYTE_LEN, 0}, +{0x14, 0x29, BYTE_LEN, 0}, +{0x13, 0xf7, BYTE_LEN, 0}, +{0x11, 0x01, BYTE_LEN, 0}, +{0x15, 0x98, BYTE_LEN, 0}, //neil add auto frame function +{0x68, 0xb0, BYTE_LEN, 0}, +{0xd2, 0x07, BYTE_LEN, 0}, + + +#if 0 +{0xa3, 0x08, BYTE_LEN, 0}, //gamma +{0xa4, 0x15, BYTE_LEN, 0}, +{0xa5, 0x24, BYTE_LEN, 0}, +{0xa6, 0x45, BYTE_LEN, 0}, +{0xa7, 0x55, BYTE_LEN, 0}, +{0xa8, 0x6a, BYTE_LEN, 0}, +{0xa9, 0x78, BYTE_LEN, 0}, +{0xaa, 0x87, BYTE_LEN, 0}, +{0xab, 0x96, BYTE_LEN, 0}, +{0xac, 0xa3, BYTE_LEN, 0}, +{0xad, 0xb4, BYTE_LEN, 0}, +{0xae, 0xc3, BYTE_LEN, 0}, +{0xaf, 0xd6, BYTE_LEN, 0}, +{0xb0, 0xe6, BYTE_LEN, 0}, +{0xb1, 0xf2, BYTE_LEN, 0}, +{0xb2, 0x12, BYTE_LEN, 0}, + + +#else +{0xa3, 0x04, BYTE_LEN, 0}, //new gamma neil 20110825 +{0xa4, 0x0c, BYTE_LEN, 0}, +{0xa5, 0x23, BYTE_LEN, 0}, +{0xa6, 0x55, BYTE_LEN, 0}, +{0xa7, 0x69, BYTE_LEN, 0}, +{0xa8, 0x78, BYTE_LEN, 0}, +{0xa9, 0x80, BYTE_LEN, 0}, +{0xaa, 0x88, BYTE_LEN, 0}, +{0xab, 0x90, BYTE_LEN, 0}, +{0xac, 0x97, BYTE_LEN, 0}, +{0xad, 0xa4, BYTE_LEN, 0}, +{0xae, 0xb0, BYTE_LEN, 0}, +{0xaf, 0xc5, BYTE_LEN, 0}, +{0xb0, 0xd7, BYTE_LEN, 0}, +{0xb1, 0xe8, BYTE_LEN, 0}, +{0xb2, 0x20, BYTE_LEN, 0}, + +#endif + +{0xbb, 0x80, BYTE_LEN, 0}, //cmx +{0xbc, 0x62, BYTE_LEN, 0}, +{0xbd, 0x1e, BYTE_LEN, 0}, +{0xbe, 0x26, BYTE_LEN, 0}, +{0xbf, 0x7b, BYTE_LEN, 0}, +{0xc0, 0xac, BYTE_LEN, 0}, +{0xc1, 0x1e, BYTE_LEN, 0}, +}; + +static struct ovm7690_i2c_reg_conf const noise_reduction_reg_settings_array[] = { + /* add code here + e.g. {0xXXXX, 0xXXXX, WORD_LEN, 0}, + */ + {0x0000, 0x0000, WORD_LEN, 0}, +}; + +static struct ovm7690_i2c_reg_conf const lens_roll_off_tbl[] = { + /* add code here + e.g. {0xXXXX, 0xXXXX, WORD_LEN, 0}, + */ + {0x0000, 0x0000, WORD_LEN, 0}, +}; + +static struct ovm7690_i2c_reg_conf const pll_setup_tbl[] = { + /* add code here + e.g. {0xXXXX, 0xXXXX, WORD_LEN, 0}, + */ + {0x0000, 0x0000, WORD_LEN, 0}, +}; + +/* Refresh Sequencer */ +static struct ovm7690_i2c_reg_conf const sequencer_tbl[] = { + /* add code here + e.g. {0xXXXX, 0xXXXX, WORD_LEN, 0}, + */ + {0x0000, 0x0000, WORD_LEN, 0}, +}; + +/* + * ZTE_CAM_LJ_20100415 + * add antibanding settings + */ + static struct ovm7690_i2c_reg_conf const antibanding_auto_tbl[] = { + {0x00, 0x00, BYTE_LEN, 0}, + +}; + +static struct ovm7690_i2c_reg_conf const antibanding_50_tbl[] = { + {0x00, 0x00, BYTE_LEN, 0}, + + +}; + +static struct ovm7690_i2c_reg_conf const antibanding_60_tbl[] = { + {0x00, 0x00, BYTE_LEN, 0}, + +}; + + +struct ovm7690_reg_t ovm7690_regs = { + .prev_snap_reg_settings = &preview_snapshot_mode_reg_settings_array[0], + .prev_snap_reg_settings_size = ARRAY_SIZE(preview_snapshot_mode_reg_settings_array), + + .noise_reduction_reg_settings = &noise_reduction_reg_settings_array[0], + .noise_reduction_reg_settings_size = 0, /* ARRAY_SIZE(noise_reduction_reg_settings_array), */ + + .plltbl = &pll_setup_tbl[0], + .plltbl_size = 0, /* ARRAY_SIZE(pll_setup_tbl), */ + + .stbl = &sequencer_tbl[0], + .stbl_size = 0, /* ARRAY_SIZE(sequencer_tbl), */ + + .rftbl = &lens_roll_off_tbl[0], + .rftbl_size = 0, /* ARRAY_SIZE(lens_roll_off_tbl), */ + + .antibanding_auto_tbl = antibanding_auto_tbl, + .antibanding_auto_tbl_size = ARRAY_SIZE(antibanding_auto_tbl), + + .antibanding_50_tbl = antibanding_50_tbl, + .antibanding_50_tbl_size = ARRAY_SIZE(antibanding_50_tbl), + + .antibanding_60_tbl = antibanding_60_tbl, + .antibanding_60_tbl_size = ARRAY_SIZE(antibanding_60_tbl), +}; + diff --git a/drivers/media/video/msm/s5k5cagx_mcnex_qtech_fpc.c b/drivers/media/video/msm/s5k5cagx_mcnex_qtech_fpc.c index 3498b42a..49848c02 100644 --- a/drivers/media/video/msm/s5k5cagx_mcnex_qtech_fpc.c +++ b/drivers/media/video/msm/s5k5cagx_mcnex_qtech_fpc.c @@ -20,6 +20,9 @@ /*----------------------------------------------------------------------------------------- when who what, where, why comment tag -------- ---- ------------------------------------- ---------------------- + 2011-07-14 lijing move motor to original position after ZTE_CAM_LJ_20110714 + snapshot + 2011-06-02 lijing fix bug of high current in sleep mode ZTE_CAM_LJ_20110602 ------------------------------------------------------------------------------------------*/ @@ -238,7 +241,10 @@ static int s5k5cagx_mcnex_qtech_hard_standby(const struct msm_camera_sensor_info if(on == 1) { - + /* + * ZTE_CAM_LJ_20110602 + * fix bug of high current in sleep mode + */ rc = s5k5cagx_mcnex_qtech_i2c_write(s5k5cagx_mcnex_qtech_client->addr, 0x0028, 0x7000, WORD_LEN); if(rc < 0) { @@ -1489,7 +1495,11 @@ rc = s5k5cagx_mcnex_qtech_i2c_write(s5k5cagx_mcnex_qtech_client->addr, 0x0F12, 0 { return rc; } - #if 0 +/* + * ZTE_CAM_LJ_20110714 + * Move motor to original position + */ + #if 1 rc = s5k5cagx_mcnex_qtech_i2c_write(s5k5cagx_mcnex_qtech_client->addr, 0x002a, 0x0252, WORD_LEN); if (rc < 0) { @@ -2374,7 +2384,10 @@ static int s5k5cagx_mcnex_qtech_sensor_init(const struct msm_camera_sensor_info } mdelay(10); - + /* + * ZTE_CAM_LJ_20110602 + * fix bug of high current in sleep mode + */ rc = s5k5cagx_mcnex_qtech_i2c_write(s5k5cagx_mcnex_qtech_client->addr, 0x0028, 0x7000, WORD_LEN); if(rc < 0) { diff --git a/drivers/media/video/msm/s5k5cagx_reg_mcnex_qtech_fpc.c b/drivers/media/video/msm/s5k5cagx_reg_mcnex_qtech_fpc.c index d07c612b..157207a4 100644 --- a/drivers/media/video/msm/s5k5cagx_reg_mcnex_qtech_fpc.c +++ b/drivers/media/video/msm/s5k5cagx_reg_mcnex_qtech_fpc.c @@ -17,7 +17,12 @@ * * Created by guoyanling */ - +/*----------------------------------------------------------------------------------------- + when who what, where, why comment tag + -------- ---- ------------------------------------- ---------------------- + 2011-07-14 lijing modify af table ZTE_CAM_LJ_20110714 + 2011-06-02 lijing fix bug of high current in sleep mode ZTE_CAM_LJ_20110602 +------------------------------------------------------------------------------------------*/ #include "s5k5cagx_mcnex_qtech.h" @@ -1227,8 +1232,18 @@ static struct s5k5cagx_mcnex_qtech_i2c_reg_conf const prev_snap_tbl[] = { // AF Lens Position Table Settings {0x002A, 0x1074, WORD_LEN, 0}, +/* + * ZTE_CAM_LJ_20110714 + * Modify af table,else it will cause AF fail. + */ +#if 0 {0x0F12, 0x0012, WORD_LEN, 0}, //JK Kim, AF fine tuning {0x0F12, 0x001E, WORD_LEN, 0}, +#else + {0x0F12, 0x0013, WORD_LEN, 0}, //JK Kim, AF fine tuning + {0x0F12, 0x0000, WORD_LEN, 0}, + {0x0F12, 0x0015, WORD_LEN, 0}, +#endif {0x0F12, 0x0024, WORD_LEN, 0}, {0x0F12, 0x002A, WORD_LEN, 0}, {0x0F12, 0x0030, WORD_LEN, 0}, @@ -3377,7 +3392,10 @@ static struct s5k5cagx_mcnex_qtech_i2c_reg_conf const prev_snap_tbl[] = { {0x0F12, 0x0000, WORD_LEN, 1000}, //=============================================================== - +/* + * ZTE_CAM_LJ_20110602 + * fix bug of high current in sleep mode + */ #if 0 {0xFCFC, 0xD000, WORD_LEN, 0}, {0x0028, 0x7000, WORD_LEN, 0}, diff --git a/drivers/media/video/msm/s5k5cagx_reg_samsung_fpc.c b/drivers/media/video/msm/s5k5cagx_reg_samsung_fpc.c index eacff59b..f69e0152 100644 --- a/drivers/media/video/msm/s5k5cagx_reg_samsung_fpc.c +++ b/drivers/media/video/msm/s5k5cagx_reg_samsung_fpc.c @@ -17,7 +17,11 @@ * * Created by guoyanling */ - +/*----------------------------------------------------------------------------------------- + when who what, where, why comment tag + -------- ---- ------------------------------------- ---------------------- + 2011-06-02 lijing fix bug of high current in sleep mode ZTE_CAM_LJ_20110602 +------------------------------------------------------------------------------------------*/ #include "s5k5cagx.h" @@ -3321,7 +3325,10 @@ static struct s5k5cagx_i2c_reg_conf const prev_snap_tbl[] = { {0x0F12, 0x0000, WORD_LEN, 1000}, //=============================================================== - +/* + * ZTE_CAM_LJ_20110602 + * fix bug of high current in sleep mode + */ #if 0 {0xFCFC, 0xD000, WORD_LEN, 0}, {0x0028, 0x7000, WORD_LEN, 0}, diff --git a/drivers/media/video/msm/s5k5cagx_samsung_fpc.c b/drivers/media/video/msm/s5k5cagx_samsung_fpc.c index 416b1efa..e092dac2 100644 --- a/drivers/media/video/msm/s5k5cagx_samsung_fpc.c +++ b/drivers/media/video/msm/s5k5cagx_samsung_fpc.c @@ -17,6 +17,13 @@ * * Created by guoyanling */ +/*----------------------------------------------------------------------------------------- + when who what, where, why comment tag + -------- ---- ------------------------------------- ---------------------- + 2011-06-24 lijing optimize adaptor flow ZTE_CAM_LJ_20110624 + 2010-06-10 lijing add sensor configuration ZTE_CAM_LJ_20110610 + 2011-05-24 wt merge from froyo 5ca camera function ZTE_CAM_WT20110524 +------------------------------------------------------------------------------------------*/ #include #include @@ -232,7 +239,10 @@ static int s5k5cagx_hard_standby(const struct msm_camera_sensor_info *dev, uint3 if(on == 1) { - + /* + * ZTE_CAM_LJ_20110602 + * fix bug of high current in sleep mode + */ rc = s5k5cagx_i2c_write(s5k5cagx_client->addr, 0x0028, 0x7000, WORD_LEN); if(rc < 0) { @@ -2358,7 +2368,10 @@ static int s5k5cagx_sensor_init(const struct msm_camera_sensor_info *data) } mdelay(10); - +/* + * ZTE_CAM_LJ_20110602 + * fix bug of high current in sleep mode + */ rc = s5k5cagx_i2c_write(s5k5cagx_client->addr, 0x0028, 0x7000, WORD_LEN); if(rc < 0) { @@ -2754,7 +2767,10 @@ int s5k5cagx_sensor_probe(const struct msm_camera_sensor_info *info, */ s5k5cagx_init_suspend(); - + /* + * add sensor configuration + * ZTE_CAM_LJ_20110610 + */ s->s_mount_angle = 0; s->s_camera_type = BACK_CAMERA_2D; @@ -2825,7 +2841,12 @@ static void s5k5cagx_workqueue(struct work_struct *work) probe_failed: CCRT("%s: rc = %d, failed!\n", __func__, rc); - + /* + * ZTE_JIA_CAM_20101209 + * to avoid standby current exception problem + * + * ignore "rc" + */ if(rc != -ENOINIT){ pr_err("%s: rc != -ENOINIT\n", __func__); msm_camera_power_backend(MSM_CAMERA_PWRDWN_MODE); diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index 9021daa0..883f1a98 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c @@ -228,15 +228,15 @@ void mmc_wait_for_req(struct mmc_host *host, struct mmc_request *mrq) mrq->done = mmc_wait_done; mmc_start_request(host, mrq); -#ifdef CONFIG_BCM_WIFI - if(!wait_for_completion_timeout(&complete, 5*HZ)) - { - printk("shaohua mmc 5 dec timeout \n"); - mrq->cmd->error = -1; - } -#else +//#ifdef CONFIG_BCM_WIFI +// if(!wait_for_completion_timeout(&complete, 5*HZ)) +// { +// printk("shaohua mmc 5 dec timeout \n"); +// mrq->cmd->error = -1; +// } +//#else wait_for_completion(&complete); -#endif +//#endif } EXPORT_SYMBOL(mmc_wait_for_req); @@ -1345,7 +1345,11 @@ int mmc_suspend_host(struct mmc_host *host, pm_message_t state) mmc_power_off(host); #ifdef CONFIG_ATH_WIFI - host->last_suspend_error = err; + /* + * Change to zero to turn off the clock + */ + if (err == -EBUSY) + err = 0; #endif return err; @@ -1369,8 +1373,14 @@ int mmc_resume_host(struct mmc_host *host) } if (host->bus_ops && !host->bus_dead) { +#ifdef CONFIG_ATH_WIFI + if (!host->suspend_keep_power) { +#endif mmc_power_up(host); mmc_select_voltage(host, host->ocr); +#ifdef CONFIG_ATH_WIFI + } +#endif BUG_ON(!host->bus_ops->resume); err = host->bus_ops->resume(host); if (err) { diff --git a/drivers/mmc/core/sdio.c b/drivers/mmc/core/sdio.c index 0fac67b7..8d5f5c65 100644 --- a/drivers/mmc/core/sdio.c +++ b/drivers/mmc/core/sdio.c @@ -371,7 +371,14 @@ static int mmc_sdio_init_card(struct mmc_host *host, u32 ocr, goto err; } card = oldcard; -#ifndef CONFIG_ATH_WIFI +#ifdef CONFIG_ATH_WIFI + pr_info("CIS VID %x DEV %x\n", card->cis.vendor, card->cis.device); + if ((card->cis.device & 0xF00) == 0x300) { + pr_info("AR6003 device\n"); + return 0; + } else + pr_info("AR6002 device\n"); +#else return 0; #endif } @@ -488,6 +495,21 @@ static int mmc_sdio_suspend(struct mmc_host *host) break; } } + +#ifdef CONFIG_ATH_WIFI + pr_info("%s () ret = %d\n", __func__, err); + if (err == -EBUSY) { + pr_info("%s () set keep power flag\n", __func__); + host->suspend_keep_power = 1; +#if 0 + mmc_claim_host(host); + sdio_disable_wide(host->card); + mmc_release_host(host); +#endif + return err; + } +#endif + while (err && --i >= 0) { struct sdio_func *func = host->card->sdio_func[i]; if (func && sdio_func_present(func) && func->dev.driver) { @@ -512,17 +534,29 @@ static int mmc_sdio_resume(struct mmc_host *host) BUG_ON(!host); BUG_ON(!host->card); +#ifdef CONFIG_ATH_WIFI + if (!host->suspend_keep_power) { +#endif /* Basic card reinitialization. */ mmc_claim_host(host); err = mmc_sdio_init_card(host, host->ocr, host->card); +#ifdef CONFIG_ATH_WIFI + mmc_release_host(host); + } else { + pr_info("%s keep power resume case\n", __func__); + err = 0; + host->suspend_keep_power = 0; + } +#endif +#ifndef CONFIG_ATH_WIFI if (!err) /* We may have switched to 1-bit mode during suspend. */ err = sdio_enable_wide(host->card); if (!err && host->sdio_irqs) mmc_signal_sdio_irq(host); mmc_release_host(host); - +#endif /* * If the card looked to be the same as before suspending, then * we proceed to resume all card functions. If one of them returns diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig index 1d15ff07..99ebb648 100644 --- a/drivers/mmc/host/Kconfig +++ b/drivers/mmc/host/Kconfig @@ -524,6 +524,14 @@ config ATH_WIFI default n help Enable Atheros SDIO wifi suspend resume function + +config WOW_BY_SDIO_DATA1 + bool "wakeup by sdio data1" + depends on ATH_WIFI + default n + help + Select Y to use sdio data1 to wakeup arm11 otherwise by external WOW_GPIO pin + config MMC_TMIO tristate "Toshiba Mobile IO Controller (TMIO) MMC/SD function support" depends on MFD_TMIO || MFD_ASIC3 || MFD_SH_MOBILE_SDHI diff --git a/drivers/mmc/host/msm_sdcc.c b/drivers/mmc/host/msm_sdcc.c index f3dc6fb8..a3427a24 100644 --- a/drivers/mmc/host/msm_sdcc.c +++ b/drivers/mmc/host/msm_sdcc.c @@ -1727,13 +1727,28 @@ msmsdcc_probe(struct platform_device *pdev) if (plat->sdiowakeup_irq) { ret = request_irq(plat->sdiowakeup_irq, msmsdcc_platform_sdiowakeup_irq, +#ifdef CONFIG_ATH_WIFI +#ifdef CONFIG_WOW_BY_SDIO_DATA1 IRQF_SHARED | IRQF_TRIGGER_FALLING, DRIVER_NAME "sdiowakeup", host); +#else + IRQF_DISABLED | IRQF_TRIGGER_RISING, + DRIVER_NAME "gpiowakeup", host); +#endif /*CONFIG_WOW_BY_SDIO_DATA1*/ +#else + IRQF_SHARED | IRQF_TRIGGER_FALLING, + DRIVER_NAME "sdiowakeup", host); +#endif /*CONFIG_ATH_WIFI*/ if (ret) { pr_err("Unable to get sdio wakeup IRQ %d (%d)\n", plat->sdiowakeup_irq, ret); goto irq_free; } else { +#ifdef CONFIG_WOW_BY_SDIO_DATA1 + pr_info("%s use sdiowakup irq\n", mmc_hostname(mmc)); +#else + pr_info("%s use WoW EXT GPIO irq\n", mmc_hostname(mmc)); +#endif //ZTE_ZBS_20110308: NOTE, both ATH and BCM don't use this SDIO wake up IRQ set_irq_wake(plat->sdiowakeup_irq, 1); disable_irq(plat->sdiowakeup_irq); @@ -1924,7 +1939,7 @@ static int msmsdcc_remove(struct platform_device *pdev) } #ifdef CONFIG_PM -#if defined(CONFIG_ATH_WIFI) || defined(CONFIG_BCM_WIFI) +#if defined(CONFIG_BCM_WIFI) struct msmsdcc_host *wlan_host; void plat_disable_wlan_slot(void) { @@ -1969,7 +1984,7 @@ void plat_enable_wlan_slot(void) } EXPORT_SYMBOL(plat_enable_wlan_slot); -#endif /*defined(CONFIG_ATH_WIFI) || defined(CONFIG_BCM_WIFI)*/ +#endif /*defined(CONFIG_BCM_WIFI)*/ #ifdef CONFIG_BCM_WIFI #define BRCM_CRTL_HOST_POWER 1 @@ -2049,18 +2064,12 @@ msmsdcc_suspend(struct platform_device *dev, pm_message_t state) host->clks_on = 0; } } -#ifdef CONFIG_ATH_WIFI - if (mmc->last_suspend_error) { - /* - * save host for WoW mode - * Don't enable sdio wakeup irq before system suspend - */ - wlan_host = host; - return 0; - } -#else - if (host->plat->sdiowakeup_irq) + + if (host->plat->sdiowakeup_irq) { + pr_info("%s () enable sdiowakeup_irq %d\n", __func__, host->plat->sdiowakeup_irq); enable_irq(host->plat->sdiowakeup_irq); + } + #ifdef CONFIG_BCM_WIFI #ifdef BRCM_CRTL_HOST_POWER if (!wifi_host && mmc->card && mmc->card->type == MMC_TYPE_SDIO){ @@ -2069,7 +2078,6 @@ msmsdcc_suspend(struct platform_device *dev, pm_message_t state) } #endif #endif /*CONFIG_BCM_WIFI*/ -#endif /*CONFIG_ATH_WIFI */ } return rc; } @@ -2086,13 +2094,6 @@ msmsdcc_resume(struct platform_device *dev) return 0; #endif if (mmc) { -#ifdef CONFIG_ATH_WIFI - if (mmc->last_suspend_error) { - wlan_host = host; - mmc->last_suspend_error = 0; - return 0; - } -#endif /*CONFIG_ATH_WIFI*/ spin_lock_irqsave(&host->lock, flags); if (!host->clks_on) { if (!IS_ERR(host->pclk)) @@ -2104,11 +2105,15 @@ msmsdcc_resume(struct platform_device *dev) writel(host->mci_irqenable, host->base + MMCIMASK0); spin_unlock_irqrestore(&host->lock, flags); + + if (host->plat->sdiowakeup_irq) { + pr_info("%s () disable sdiowakeup_irq %d\n", __func__, host->plat->sdiowakeup_irq); + disable_irq(host->plat->sdiowakeup_irq); + } + #ifdef CONFIG_ATH_WIFI -if (1) { + if (1) #else - if (host->plat->sdiowakeup_irq) - disable_irq(host->plat->sdiowakeup_irq); #ifdef CONFIG_BCM_WIFI if (mmc->card && mmc->card->type != MMC_TYPE_SDIO) #else @@ -2118,9 +2123,6 @@ if (1) { mmc_resume_host(mmc); if (host->plat->status_irq) enable_irq(host->plat->status_irq); -#ifdef CONFIG_ATH_WIFI -} -#endif #ifdef CONFIG_BCM_WIFI #ifdef BRCM_CRTL_HOST_POWER diff --git a/drivers/net/wireless/bcm4319/Makefile b/drivers/net/wireless/bcm4319/Makefile index 34d506e5..3d7f3008 100644 --- a/drivers/net/wireless/bcm4319/Makefile +++ b/drivers/net/wireless/bcm4319/Makefile @@ -4,7 +4,7 @@ DHDCFLAGS = -DLINUX -DBCMDRIVER -DBCMDONGLEHOST -DDHDTHREAD -DBCMWPA2 -DBCMWAPI -DDHD_BCMEVENTS -DSHOW_EVENTS -DBCMSDIO -DDHD_GPL \ -DBCMLXSDMMC -DBCMPLATFORM_BUS -DEMBEDDED_PLATFORM -DOEM_ANDROID \ -DMMC_SDIO_ABORT -Wall -DOOB_INTR_ONLY -DCUSTOM_OOB_GPIO_NUM=19 \ --Wstrict-prototypes -Werror -DCSCAN -DKEEP_ALIVE \ +-Wstrict-prototypes -Werror -DCSCAN -DKEEP_ALIVE -DPKT_FILTER_SUPPORT -DARP_OFFLOAD_SUPPORT \ -Idrivers/net/wireless/bcm4319 -Idrivers/net/wireless/bcm4319/include DHDOFILES = dhd_linux.o linux_osl.o bcmutils.o dhd_common.o dhd_custom_gpio.o \ diff --git a/drivers/net/wireless/bcm4319/dhd.h b/drivers/net/wireless/bcm4319/dhd.h index 006f8143..4dcf5689 100644 --- a/drivers/net/wireless/bcm4319/dhd.h +++ b/drivers/net/wireless/bcm4319/dhd.h @@ -534,4 +534,25 @@ extern char nv_path[MOD_PARAM_PATHLEN]; extern void dhd_wait_for_event(dhd_pub_t *dhd, bool *lockvar); extern void dhd_wait_event_wakeup(dhd_pub_t*dhd); +//#ifdef CONFIG_MACH_SKATE +#define WLAN_PFN 1 +//#else +//#undef WLAN_PFN +//#endif + +#ifdef WLAN_PFN +#define PFN_SCAN_FREQ 60 /* in secs */ +#define PFN_RSSI_MARGIN 30 /* in dBm */ +#define PFN_LOST_NETWORK_TIMEOUT 60 /* in secs */ +int dhd_set_pfn_ssid(char * ssid, int ssid_len); +int dhd_clear_pfn_ssid(void); +int dhd_enable_pfn_ssid(int enabled); +#endif + + +/* dhd_commn arp offload wrapers */ +extern void dhd_arp_cleanup(dhd_pub_t *dhd); +int dhd_arp_get_arp_hostip_table(dhd_pub_t *dhd, void *buf, int buflen); +void dhd_arp_offload_add_ip(dhd_pub_t *dhd, u32 ipaddr); + #endif /* _dhd_h_ */ diff --git a/drivers/net/wireless/bcm4319/dhd_common.c b/drivers/net/wireless/bcm4319/dhd_common.c index f271fa80..20bd3cfc 100644 --- a/drivers/net/wireless/bcm4319/dhd_common.c +++ b/drivers/net/wireless/bcm4319/dhd_common.c @@ -68,6 +68,8 @@ extern int dhd_wl_ioctl(dhd_pub_t *dhd, uint cmd, char *buf, uint buflen); void dhd_iscan_lock(void); void dhd_iscan_unlock(void); +extern bool ap_fw_loaded; + /* Packet alignment for most efficient SDIO (can change based on platform) */ #ifndef DHD_SDALIGN #define DHD_SDALIGN 32 @@ -1020,10 +1022,10 @@ dhd_pktfilter_offload_enable(dhd_pub_t * dhd, char *arg, int enable, int master_ rc = dhdcdc_set_ioctl(dhd, 0, WLC_SET_VAR, buf, buf_len); rc = rc >= 0 ? 0 : rc; if (rc) - DHD_TRACE(("%s: failed to add pktfilter %s, retcode = %d\n", + DHD_ERROR(("%s: failed to add pktfilter %s, retcode = %d\n", __FUNCTION__, arg, rc)); else - DHD_TRACE(("%s: successfully added pktfilter %s\n", + DHD_ERROR(("%s: successfully added pktfilter %s\n", __FUNCTION__, arg)); /* Contorl the master mode */ @@ -1031,7 +1033,7 @@ dhd_pktfilter_offload_enable(dhd_pub_t * dhd, char *arg, int enable, int master_ rc = dhdcdc_set_ioctl(dhd, 0, WLC_SET_VAR, buf, sizeof(buf)); rc = rc >= 0 ? 0 : rc; if (rc) - DHD_TRACE(("%s: failed to add pktfilter %s, retcode = %d\n", + DHD_ERROR(("%s: failed to add pktfilter %s, retcode = %d\n", __FUNCTION__, arg, rc)); fail: @@ -1173,6 +1175,7 @@ dhd_pktfilter_offload_set(dhd_pub_t * dhd, char *arg) MFREE(dhd->osh, buf, BUF_SIZE); } +#ifdef ARP_OFFLOAD_SUPPORT void dhd_arp_offload_set(dhd_pub_t * dhd, int arp_mode) { @@ -1200,19 +1203,96 @@ dhd_arp_offload_enable(dhd_pub_t * dhd, int arp_enable) retcode = dhdcdc_set_ioctl(dhd, 0, WLC_SET_VAR, iovbuf, sizeof(iovbuf)); retcode = retcode >= 0 ? 0 : retcode; if (retcode) - DHD_TRACE(("%s: failed to enabe ARP offload to %d, retcode = %d\n", + DHD_ERROR(("%s: failed to enabe ARP offload to %d, retcode = %d\n", __FUNCTION__, arp_enable, retcode)); else - DHD_TRACE(("%s: successfully enabed ARP offload to %d\n", + DHD_ERROR(("%s: successfully enabed ARP offload to %d\n", __FUNCTION__, arp_enable)); } +#endif + + + +void dhd_arp_cleanup(dhd_pub_t *dhd) +{ +#ifdef ARP_OFFLOAD_SUPPORT + int ret = 0; + int iov_len = 0; + char iovbuf[128]; + + if (dhd == NULL) return; + + dhd_os_proto_block(dhd); + + iov_len = bcm_mkiovar("arp_hostip_clear", 0, 0, iovbuf, sizeof(iovbuf)); + if ((ret = dhdcdc_set_ioctl(dhd, 0, WLC_SET_VAR, iovbuf, iov_len)) < 0) + DHD_ERROR(("%s failed code %d\n", __FUNCTION__, ret)); + + iov_len = bcm_mkiovar("arp_table_clear", 0, 0, iovbuf, sizeof(iovbuf)); + if ((ret = dhdcdc_set_ioctl(dhd, 0, WLC_SET_VAR, iovbuf, iov_len)) < 0) + DHD_ERROR(("%s failed code %d\n", __FUNCTION__, ret)); + + dhd_os_proto_unblock(dhd); + +#endif /* ARP_OFFLOAD_SUPPORT */ +} + +void dhd_arp_offload_add_ip(dhd_pub_t *dhd, u32 ipaddr) +{ +#ifdef ARP_OFFLOAD_SUPPORT + int iov_len = 0; + char iovbuf[32]; + int retcode; + + dhd_os_proto_block(dhd); + + iov_len = bcm_mkiovar("arp_hostip", (char *)&ipaddr, 4, iovbuf, sizeof(iovbuf)); + retcode = dhdcdc_set_ioctl(dhd, 0, WLC_SET_VAR, iovbuf, iov_len); + + dhd_os_proto_unblock(dhd); + + if (retcode) + DHD_TRACE(("%s: ARP ip addr add failed, retcode = %d\n", + __FUNCTION__, retcode)); + else + DHD_TRACE(("%s: ARP ipaddr entry added\n", + __FUNCTION__)); +#endif /* ARP_OFFLOAD_SUPPORT */ +} + + +int dhd_arp_get_arp_hostip_table(dhd_pub_t *dhd, void *buf, int buflen) +{ +#ifdef ARP_OFFLOAD_SUPPORT + int retcode; + int iov_len = 0; + if (!buf) + return -1; + + dhd_os_proto_block(dhd); + + iov_len = bcm_mkiovar("arp_hostip", 0, 0, buf, buflen); + retcode = dhdcdc_query_ioctl(dhd, 0, WLC_GET_VAR, buf, buflen); + + dhd_os_proto_unblock(dhd); + + if (retcode) { + DHD_TRACE(("%s: ioctl WLC_GET_VAR error %d\n", + __FUNCTION__, retcode)); + + return -1; + } +#endif /* ARP_OFFLOAD_SUPPORT */ + return 0; +} int dhd_custom_get_mac_address(unsigned char *addr) { int rc = 0; unsigned int data1, data2; + data2 = (1<<31);//for wifi mac rc = msm_proc_comm(PCOM_CUSTOMER_CMD1, &data1, &data2); if(!rc) { @@ -1248,18 +1328,21 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) uint32 bt_wire = 4; #ifdef CONFIG_MACH_SKATE uint bt_mode = 1; - int qosinfo = 0x7; + int qosinfo = 0x0; #else uint bt_mode = 1; int qosinfo = 0x3; #endif + + /* Listen Interval added PENGJI_20110926 */ + uint32 listen_interval = LISTEN_INTERVAL; /* Default Listen Interval in Beacons */ #ifdef GET_CUSTOM_MAC_ENABLE int ret = 0; struct ether_addr ea_addr; #endif /* GET_CUSTOM_MAC_ENABLE */ - int infra = 1; + int infra = 1; ////// add for wapi issue dhd_os_proto_block(dhd); @@ -1288,6 +1371,12 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) DHD_ERROR(("%s: country code setting failed\n", __FUNCTION__)); } } + + /* Listen Interval added PENGJI_20110926 */ + /* Set Listen Interval */ + bcm_mkiovar("assoc_listen", (char *)&listen_interval, 4, iovbuf, sizeof(iovbuf)); + if ((ret = dhdcdc_set_ioctl(dhd, 0, WLC_SET_VAR, iovbuf, sizeof(iovbuf))) < 0) + DHD_ERROR(("%s assoc_listen failed %d\n", __FUNCTION__, ret)); /* query for 'ver' to get version info from firmware */ memset(buf, 0, sizeof(buf)); @@ -1301,10 +1390,10 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) /* Set PowerSave mode */ dhdcdc_set_ioctl(dhd, 0, WLC_SET_PM, (char *)&power_mode, sizeof(power_mode)); - + ////// add for wapi issue dhdcdc_set_ioctl(dhd, 0, WLC_SET_INFRA, (char *)&infra, sizeof(infra)); printk("dhd reset infra mode 1 \n"); - + ////// add for wapi issue /* Match Host and Dongle rx alignment */ bcm_mkiovar("bus:txglomalign", (char *)&dongle_align, 4, iovbuf, sizeof(iovbuf)); @@ -1397,10 +1486,10 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) /* Set and enable ARP offload feature */ if (dhd_arp_enable) dhd_arp_offload_set(dhd, dhd_arp_mode); - dhd_arp_offload_enable(dhd, dhd_arp_enable); + dhd_arp_offload_enable(dhd, ap_fw_loaded ? 0 : 1); #endif /* ARP_OFFLOAD_SUPPORT */ -#ifdef PKT_FILTER_SUPPORT +#if 0 //#ifdef PKT_FILTER_SUPPORT { int i; /* Set up pkt filter */ diff --git a/drivers/net/wireless/bcm4319/dhd_linux.c b/drivers/net/wireless/bcm4319/dhd_linux.c index 2449cd11..87f86070 100644 --- a/drivers/net/wireless/bcm4319/dhd_linux.c +++ b/drivers/net/wireless/bcm4319/dhd_linux.c @@ -43,6 +43,7 @@ #include #include #include +#include #include #include @@ -67,6 +68,10 @@ /* global variant to indicate whether softap is working */ bool g_bSoftapRunning = false; +int g_bEarlySuspendMode = 0; +extern bool g_disableDhcpPktFilter; +/* it is used to indicate whether the FW is downloaded successfully */ +bool DHD_ATTACH_STATE_FW_DONE=false; #if defined(CUSTOMER_HW2) && defined(CONFIG_WIFI_CONTROL_FUNC) #include @@ -185,6 +190,12 @@ void wifi_del_dev(void) } #endif /* defined(CUSTOMER_HW2) && defined(CONFIG_WIFI_CONTROL_FUNC) */ +static int dhd_device_event(struct notifier_block *this, unsigned long event, + void *ptr); + +static struct notifier_block dhd_notifier = { + .notifier_call = dhd_device_event +}; #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) && defined(CONFIG_PM_SLEEP) #include @@ -330,7 +341,7 @@ uint dhd_pkt_filter_init = 0; module_param(dhd_pkt_filter_init, uint, 0); /* Pkt filter mode control */ -uint dhd_master_mode = TRUE; +uint dhd_master_mode = FALSE; module_param(dhd_master_mode, uint, 1); /* Watchdog thread priority, -1 to use kernel timer */ @@ -481,10 +492,10 @@ extern int register_pm_notifier(struct notifier_block *nb); extern int unregister_pm_notifier(struct notifier_block *nb); #endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) && defined(CONFIG_PM_SLEEP) */ /* && defined(DHD_GPL) */ -static void dhd_set_packet_filter(int value, dhd_pub_t *dhd) +void dhd_set_packet_filter(int value, dhd_pub_t *dhd) { #ifdef PKT_FILTER_SUPPORT - DHD_TRACE(("%s: %d\n", __FUNCTION__, value)); + DHD_ERROR(("%s: %d\n", __FUNCTION__, value)); /* 1 - Enable packet filter, only allow unicast packet to send up */ /* 0 - Disable packet filter */ if (dhd_pkt_filter_enable) { @@ -500,6 +511,145 @@ static void dhd_set_packet_filter(int value, dhd_pub_t *dhd) } +#ifdef WLAN_PFN + +#define DHD_PFN(x) printf x + +#if defined(IL_BIGENDIAN) +#include +#define htod32(i) (bcmswap32(i)) +#define htod16(i) (bcmswap16(i)) +#else +#define htod32(i) i +#define htod16(i) i +#endif + +typedef struct pfn_ssid { + char ssid[32]; + int32 ssid_len; +} pfn_ssid_t; + +static pfn_ssid_t pfn_ssid_set; +static int pfn_is_set = 0; +int need_pfn = 0; + + +dhd_pub_t *pfn_dhd = NULL; + +int dhd_set_pfn_ssid(char * ssid, int ssid_len) +{ + if ((ssid_len < 1) || (ssid_len > 32)) { + printk("Invaild ssid length!\n"); + return -1; + } + DHD_PFN(("pfn: set ssid = %s\n", ssid)); + + strncpy(pfn_ssid_set.ssid, ssid, ssid_len); + pfn_ssid_set.ssid_len = ssid_len; + pfn_is_set = 1; + + return 0; +} + +int dhd_clear_pfn_ssid(void) +{ + DHD_PFN(("%s enter \n", __func__)); + + memset(pfn_ssid_set.ssid, 0, 32); + pfn_is_set = 0; + + return 0; +} + +static int dhd_set_pfn(dhd_pub_t *dhd, int enabled) +{ + wl_pfn_param_t pfn_param; + char iovbuf[64]; + int pfn_enabled = 0; + wl_pfn_t pfn_element; + int iov_len = 0; + + + DHD_PFN(("%s: enter. %s\n", __FUNCTION__, (!enabled || !pfn_is_set)?"clear only":"set")); + /* Disable pfn */ + bcm_mkiovar("pfn", (char *)&pfn_enabled, 4, iovbuf, sizeof(iovbuf)); + dhdcdc_set_ioctl(dhd, 0, WLC_SET_VAR, iovbuf, sizeof(iovbuf)); + DHD_PFN((" %s disable pfn: %d\n", __func__, pfn_enabled)); + + if (!enabled || !pfn_is_set) + return 0; + + if(dhd->in_suspend == 0) { + printk("still screen on, skip set pfn ================\n"); + return 0; + } + + if(!need_pfn) { + printk("link remain, no need set pfn \n"); + return 0; + } else { + printk("link down, need pfn enable \n"); + need_pfn = 0; + } + + /* clear pfn */ + iov_len = bcm_mkiovar("pfnclear", NULL, 0, iovbuf, sizeof(iovbuf)); + if (iov_len) + dhdcdc_set_ioctl(dhd, 0, WLC_SET_VAR, iovbuf, iov_len); + + DHD_PFN(("%s clear pfn \n", __func__)); + + + /* set pfn parameters */ + pfn_param.version = htod32(PFN_VERSION); + pfn_param.flags = htod16((PFN_LIST_ORDER << SORT_CRITERIA_BIT)); + /* Scan frequency of 30 sec */ + pfn_param.scan_freq = htod32(PFN_SCAN_FREQ); + /* RSSI margin of 30 dBm */ + pfn_param.rssi_margin = htod16(PFN_RSSI_MARGIN); + /* Network timeout 60 sec */ + pfn_param.lost_network_timeout = htod32(PFN_LOST_NETWORK_TIMEOUT); + + bcm_mkiovar("pfn_set", (char *)&pfn_param, sizeof(pfn_param), iovbuf, sizeof(iovbuf)); + dhdcdc_set_ioctl(dhd, 0, WLC_SET_VAR, iovbuf, sizeof(iovbuf)); + + /* set pfn ssid */ + pfn_element.bss_type = htod32(DOT11_BSSTYPE_INFRASTRUCTURE); + pfn_element.auth = (DOT11_OPEN_SYSTEM); + pfn_element.wpa_auth = htod32(WPA_AUTH_PFN_ANY); + pfn_element.wsec = htod32(0); + pfn_element.infra = htod32(1); + + strncpy((char *)pfn_element.ssid.SSID, pfn_ssid_set.ssid, + sizeof(pfn_element.ssid.SSID)); + pfn_element.ssid.SSID_len = pfn_ssid_set.ssid_len; + + bcm_mkiovar("pfn_add", (char *)&pfn_element, sizeof(pfn_element), iovbuf, sizeof(iovbuf)); + dhdcdc_set_ioctl(dhd, 0, WLC_SET_VAR, iovbuf, sizeof(iovbuf)); + DHD_PFN((" %s add pfn: %s\n", __func__, pfn_ssid_set.ssid)); + + pfn_enabled=1; + bcm_mkiovar("pfn", (char *)&pfn_enabled, 4, iovbuf, sizeof(iovbuf)); + dhdcdc_set_ioctl(dhd, 0, WLC_SET_VAR, iovbuf, sizeof(iovbuf)); + + DHD_PFN((" %s enable pfn: %d\n", __func__, pfn_enabled)); + + return 0; +} + +int dhd_enable_pfn_ssid(int enabled) +{ + DHD_PFN(("%s enter, enabled: %d\n", __func__, enabled)); + + if(pfn_dhd != NULL) { + dhd_set_pfn(pfn_dhd, enabled); + } + + return 0; +} +#endif //WLAN_PFN + + #if defined(KEEP_ALIVE) #define NULL_PKT_STR "null_pkt" static int dhd_keep_alive_onoff(dhd_pub_t *dhd, int ka_on) @@ -560,10 +710,7 @@ static int dhd_set_suspend(int value, dhd_pub_t *dhd) uint roamvar = 1; #endif /* CUSTOMER_HW2 */ -#if defined(KEEP_ALIVE) - int ioc_res; -#endif - + printk("shaohua compare dhd %p \n", dhd); DHD_ERROR(("%s: enter, value = %d in_suspend=%d\n", \ __FUNCTION__, value, dhd->in_suspend)); @@ -578,16 +725,15 @@ static int dhd_set_suspend(int value, dhd_pub_t *dhd) (char *)&power_mode, sizeof(power_mode)); /* Enable packet filter, only allow unicast packet to send up */ - dhd_set_packet_filter(1, dhd); + //dhd_set_packet_filter(1, dhd); /* if dtim skip setup as default force it to wake each thrid dtim * for better power saving. * Note that side effect is chance to miss BC/MC packet */ - if ((dhd->dtim_skip == 0) || (dhd->dtim_skip == 1)) - bcn_li_dtim = 3; - else - bcn_li_dtim = dhd->dtim_skip; + + /* Listen Interval added PENGJI_20110926 */ + bcn_li_dtim = 1; bcm_mkiovar("bcn_li_dtim", (char *)&bcn_li_dtim, 4, iovbuf, sizeof(iovbuf)); dhdcdc_set_ioctl(dhd, 0, WLC_SET_VAR, iovbuf, sizeof(iovbuf)); @@ -600,11 +746,6 @@ static int dhd_set_suspend(int value, dhd_pub_t *dhd) dhdcdc_set_ioctl(dhd, 0, WLC_SET_VAR, iovbuf, sizeof(iovbuf)); #endif /* CUSTOMER_HW2 */ -#if defined(KEEP_ALIVE) - DHD_ERROR(("suspend, KEEP_ALIVE\n")); - if ((ioc_res = dhd_keep_alive_onoff(dhd, 1)) != 0) - DHD_ERROR(("%s result:%d\n", __FUNCTION__, ioc_res)); -#endif } else { /* Kernel resumed */ @@ -615,7 +756,7 @@ static int dhd_set_suspend(int value, dhd_pub_t *dhd) sizeof(power_mode)); /* disable pkt filter */ - dhd_set_packet_filter(0, dhd); + //dhd_set_packet_filter(0, dhd); /* restore pre-suspend setting for dtim_skip */ bcm_mkiovar("bcn_li_dtim", (char *)&dhd->dtim_skip, @@ -628,13 +769,6 @@ static int dhd_set_suspend(int value, dhd_pub_t *dhd) sizeof(iovbuf)); dhdcdc_set_ioctl(dhd, 0, WLC_SET_VAR, iovbuf, sizeof(iovbuf)); #endif /* CUSTOMER_HW2 */ - -#if defined(KEEP_ALIVE) - DHD_ERROR(("resume, KEEP_ALIVE\n")); - if ((ioc_res = dhd_keep_alive_onoff(dhd, 0)) != 0) - DHD_ERROR(("%s result:%d\n", __FUNCTION__, ioc_res)); -#endif - } } @@ -643,6 +777,10 @@ static int dhd_set_suspend(int value, dhd_pub_t *dhd) static void dhd_suspend_resume_helper(struct dhd_info *dhd, int val) { +#if defined(KEEP_ALIVE) + int ioc_res; +#endif + dhd_pub_t *dhdp = &dhd->pub; if(true ==g_bSoftapRunning) @@ -650,12 +788,51 @@ static void dhd_suspend_resume_helper(struct dhd_info *dhd, int val) printk("skip suspend/resume, val: %d\n", val); return; } + + if(dhdp->busstate == DHD_BUS_DOWN) + { + printk("skip because bus is down, val: %d\n", val); + return; + } dhd_os_proto_block(dhdp); /* Set flag when early suspend was called */ dhdp->in_suspend = val; + g_bEarlySuspendMode = dhdp->in_suspend; + if(val) //once need goto suspend mode, filter the package + { + if(false == g_disableDhcpPktFilter) + { + /* Enable packet filter, only allow unicast packet to send up */ + dhd_set_packet_filter(1, dhdp); + } + + #ifdef WLAN_PFN + /* set pfn */ + dhd_enable_pfn_ssid(1); + #endif + + #if defined(KEEP_ALIVE) + DHD_ERROR(("suspend, KEEP_ALIVE\n")); + if ((ioc_res = dhd_keep_alive_onoff(dhdp, 1)) != 0) + DHD_ERROR(("%s result:%d\n", __FUNCTION__, ioc_res)); + #endif + } + else + { + /* disable pkt filter */ + dhd_set_packet_filter(0, dhdp); + + #if defined(KEEP_ALIVE) + DHD_ERROR(("resume, KEEP_ALIVE\n")); + if ((ioc_res = dhd_keep_alive_onoff(dhdp, 0)) != 0) + DHD_ERROR(("%s result:%d\n", __FUNCTION__, ioc_res)); + #endif + } + if (!dhdp->suspend_disable_flag) dhd_set_suspend(val, dhdp); + dhd_os_proto_unblock(dhdp); } @@ -663,10 +840,12 @@ static void dhd_early_suspend(struct early_suspend *h) { struct dhd_info *dhd = container_of(h, struct dhd_info, early_suspend); - DHD_ERROR(("%s: enter\n", __FUNCTION__)); + DHD_ERROR(("%s: enter, dhd fw state=0x%x\n", __FUNCTION__, DHD_ATTACH_STATE_FW_DONE)); - if (dhd) + if (dhd&&DHD_ATTACH_STATE_FW_DONE) dhd_suspend_resume_helper(dhd, 1); + else + printk("%s: dhd is not attach,skip it! dhd_state: 0x%.08x\n", __FUNCTION__, DHD_ATTACH_STATE_FW_DONE);// } @@ -676,8 +855,10 @@ static void dhd_late_resume(struct early_suspend *h) DHD_ERROR(("%s: enter\n", __FUNCTION__)); - if (dhd) + if (dhd&&DHD_ATTACH_STATE_FW_DONE) dhd_suspend_resume_helper(dhd, 0); + else + printk("%s: dhd is not attach,skip it! dhd_state: 0x%.08x\n", __FUNCTION__, DHD_ATTACH_STATE_FW_DONE);// } #endif /* defined(CONFIG_HAS_EARLYSUSPEND) */ @@ -2187,6 +2368,8 @@ dhd_attach(osl_t *osh, struct dhd_bus *bus, uint bus_hdrlen) register_early_suspend(&dhd->early_suspend); #endif + register_inetaddr_notifier(&dhd_notifier); + return &dhd->pub; fail: @@ -2212,6 +2395,13 @@ dhd_bus_start(dhd_pub_t *dhdp) DHD_TRACE(("%s: \n", __FUNCTION__)); +#ifdef WLAN_PFN + if(pfn_dhd == NULL) { + pfn_dhd = dhdp; + printk("shaohua set pfn_dhd %p \n", pfn_dhd); + } +#endif //#ifdef WLAN_PFN + /* try to download image and nvram to the dongle */ if (dhd->pub.busstate == DHD_BUS_DOWN) { WAKE_LOCK_INIT(dhdp, WAKE_LOCK_DOWNLOAD, "dhd_bus_start"); @@ -2282,18 +2472,31 @@ dhd_bus_start(dhd_pub_t *dhdp) setbit(dhdp->eventmask, WLC_E_TXFAIL); setbit(dhdp->eventmask, WLC_E_JOIN_START); setbit(dhdp->eventmask, WLC_E_SCAN_COMPLETE); -#ifdef PNO_SUPPORT +#if defined(PNO_SUPPORT) || defined(WLAN_PFN) setbit(dhdp->eventmask, WLC_E_PFN_NET_FOUND); #endif /* PNO_SUPPORT */ /* enable dongle roaming event */ setbit(dhdp->eventmask, WLC_E_ROAM); +#if 0 dhdp->pktfilter_count = 1; /* Setup filter to allow only unicast */ dhdp->pktfilter[0] = "100 0 0 0 0x01 0x00"; +#endif //#if 0 + + dhdp->pktfilter_count = 2; + /* we have seen OEMs filter out broadcast packets. Might not be relevant, but just showing what others have implemented. */ + dhdp->pktfilter[0] = "100 0 0 0 0x01 0x01"; + /* Setup filter to drop NAT keep alive packets. Filter on the destination port and length only */ + dhdp->pktfilter[1] = "101 0 0 36 0xffffffff 0x11940009"; + #endif /* EMBEDDED_PLATFORM */ + /* here means that FW is downloaded successfully, you can send the command to the firmware */ + DHD_ATTACH_STATE_FW_DONE = true; + printk("%s, dhd fw state: 0x%x\n", __FUNCTION__, DHD_ATTACH_STATE_FW_DONE); + /* Bus is ready, do any protocol initialization */ if ((ret = dhd_prot_init(&dhd->pub)) < 0) return ret; @@ -2344,6 +2547,47 @@ static struct net_device_ops dhd_ops_virt = { .ndo_set_multicast_list = dhd_set_multicast_list }; #endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 31)) */ +static int dhd_device_event(struct notifier_block *this, unsigned long event, + void *ptr) +{ + struct in_ifaddr *ifa = (struct in_ifaddr *)ptr; + dhd_info_t *dhd; + dhd_pub_t *dhd_pub; + + if (!ifa) + return NOTIFY_DONE; + + dhd = *(dhd_info_t **)netdev_priv(ifa->ifa_dev->dev); + dhd_pub = &dhd->pub; + +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 31)) + if (ifa->ifa_dev->dev->netdev_ops == &dhd_ops_pri) { +#else + if (ifa->ifa_dev->dev->open == &dhd_open) { +#endif + switch (event) { + case NETDEV_UP: + DHD_ERROR(("%s: [%s] Up IP: 0x%x\n", + __FUNCTION__, ifa->ifa_label, ifa->ifa_address)); + + dhd_arp_cleanup(dhd_pub); + break; + + case NETDEV_DOWN: + DHD_ERROR(("%s: [%s] Down IP: 0x%x\n", + __FUNCTION__, ifa->ifa_label, ifa->ifa_address)); + + dhd_arp_cleanup(dhd_pub); + break; + + default: + DHD_TRACE(("%s: [%s] Event: %lu\n", + __FUNCTION__, ifa->ifa_label, event)); + break; + } + } + return NOTIFY_DONE; +} int dhd_net_attach(dhd_pub_t *dhdp, int ifidx) { @@ -2485,6 +2729,8 @@ dhd_detach(dhd_pub_t *dhdp) dhd_if_t *ifp; int i; + unregister_inetaddr_notifier(&dhd_notifier); + #if defined(CONFIG_HAS_EARLYSUSPEND) if (dhd->early_suspend.suspend) unregister_early_suspend(&dhd->early_suspend); @@ -2532,6 +2778,9 @@ dhd_detach(dhd_pub_t *dhdp) dhd_bus_detach(dhdp); + /* reset it to false, because driver will be unloaded */ + DHD_ATTACH_STATE_FW_DONE = false; + if (dhdp->prot) dhd_prot_detach(dhdp); diff --git a/drivers/net/wireless/bcm4319/include/wlioctl.h b/drivers/net/wireless/bcm4319/include/wlioctl.h index 345ba34b..6c9e1bdd 100644 --- a/drivers/net/wireless/bcm4319/include/wlioctl.h +++ b/drivers/net/wireless/bcm4319/include/wlioctl.h @@ -857,6 +857,7 @@ typedef struct wl_ioctl { #define PM_MAX 1 #define PM_FAST 2 +#define LISTEN_INTERVAL 5 #define INTERFERE_NONE 0 #define NON_WLAN 1 diff --git a/drivers/net/wireless/bcm4319/wl_iw.c b/drivers/net/wireless/bcm4319/wl_iw.c index c3a64446..069ea474 100644 --- a/drivers/net/wireless/bcm4319/wl_iw.c +++ b/drivers/net/wireless/bcm4319/wl_iw.c @@ -59,6 +59,9 @@ typedef const struct si_pub si_t; #include extern bool g_bSoftapRunning; +extern bool g_bEarlySuspendMode; +bool g_disableDhcpPktFilter = false; + #ifndef IW_ENCODE_ALG_SM4 #define IW_ENCODE_ALG_SM4 0x20 @@ -101,7 +104,7 @@ extern bool g_bSoftapRunning; #define WL_SOFTAP(x) printk x static struct net_device *priv_dev; static bool ap_cfg_running = FALSE; -static bool ap_fw_loaded = FALSE; +bool ap_fw_loaded = FALSE; struct net_device *ap_net_dev = NULL; struct semaphore ap_eth_sema; static int wl_iw_set_ap_security(struct net_device *dev, struct ap_profile *ap); @@ -705,6 +708,10 @@ wl_iw_set_power_mode( return error; } #endif + +extern void dhd_set_packet_filter(int value, dhd_pub_t *dhd); +extern dhd_pub_t *pfn_dhd; + static int wl_iw_set_btcoex_dhcp( struct net_device *dev, @@ -744,7 +751,7 @@ wl_iw_set_btcoex_dhcp( if (strnicmp((char *)&powermode_val, "1", strlen("1")) == 0) { - WL_TRACE(("%s: DHCP session starts\n", __FUNCTION__)); + WL_ERROR(("%s: DHCP session starts\n", __FUNCTION__)); if ((saved_status == FALSE) && @@ -761,6 +768,17 @@ wl_iw_set_btcoex_dhcp( #ifndef CUSTOMER_HW2 dev_wlc_ioctl(dev, WLC_SET_PM, &pm_local, sizeof(pm_local)); + WL_ERROR(("DHCP start, g_disableDhcpPktFilter=%d, g_bEarlySuspendMode=%d\n", g_disableDhcpPktFilter, g_bEarlySuspendMode)); + //if(1 == g_bEarlySuspendMode) + { + if(false == g_disableDhcpPktFilter) + { + g_disableDhcpPktFilter = true; //disbale the filter + WL_ERROR(("Disable filter +\n")); + dhd_set_packet_filter(0, pfn_dhd); + WL_ERROR(("Disable filter -\n")); + } + } #endif @@ -802,11 +820,22 @@ wl_iw_set_btcoex_dhcp( else if (strnicmp((char *)&powermode_val, "0", strlen("0")) == 0) { #endif - WL_TRACE(("%s: DHCP session done\n", __FUNCTION__)); + WL_ERROR(("%s: DHCP session done\n", __FUNCTION__)); #ifndef CUSTOMER_HW2 dev_wlc_ioctl(dev, WLC_SET_PM, &pm, sizeof(pm)); + WL_ERROR(("DHCP end, g_disableDhcpPktFilter=%d, g_bEarlySuspendMode=%d\n", g_disableDhcpPktFilter, g_bEarlySuspendMode)); + if(true == g_disableDhcpPktFilter) + { + if(1 == g_bEarlySuspendMode) + { + WL_ERROR(("Enable filter +\n")); + dhd_set_packet_filter(1, pfn_dhd); + WL_ERROR(("Enable filter -\n")); + } + g_disableDhcpPktFilter = false; //enable the filter + } #endif @@ -1552,11 +1581,11 @@ int init_ap_profile_from_string(char *param_str, struct ap_profile *ap_cfg) ret |= get_parmeter_from_string(&str_ptr, "PREAMBLE=", PTYPE_INTDEC, &ap_cfg->preamble, 5); ret |= get_parmeter_from_string(&str_ptr, "MAX_SCB=", PTYPE_INTDEC, &ap_cfg->max_scb, 5); - + //pengji 20110701 start get_parmeter_from_string(&str_ptr, "HIDDEN=", PTYPE_INTDEC, &ap_cfg->closednet, 5); get_parmeter_from_string(&str_ptr, "COUNTRY=", PTYPE_STRING, &ap_cfg->country_code, 3); - + //pengji 20110701 end return ret; } #endif @@ -2314,6 +2343,11 @@ wl_iw_set_wap( memset(&join_params, 0, sizeof(join_params)); join_params_size = sizeof(join_params.ssid); +#ifdef WLAN_PFN + dhd_set_pfn_ssid(g_ssid.SSID, g_ssid.SSID_len); + dhd_enable_pfn_ssid(0); +#endif + memcpy(join_params.ssid.SSID, g_ssid.SSID, g_ssid.SSID_len); join_params.ssid.SSID_len = htod32(g_ssid.SSID_len); memcpy(&join_params.params.bssid, awrq->sa_data, ETHER_ADDR_LEN); @@ -6157,7 +6191,7 @@ static int wl_iw_set_ap_security(struct net_device *dev, struct ap_profile *ap) wlc_ssid_t ap_ssid; #endif wl_wsec_key_t key; - int hidden_ssid = 0; + int hidden_ssid = 0; //++++++++++++++++++++++++++++++++ WL_SOFTAP(("\nsetting SOFTAP security mode:\n")); WL_SOFTAP(("wl_iw: set ap profile:\n")); @@ -6320,13 +6354,13 @@ static int wl_iw_set_ap_security(struct net_device *dev, struct ap_profile *ap) } #endif - +//++++++++++++++++++++++++++++++++ hidden_ssid = ap->closednet; if ((res = dev_wlc_intvar_set(dev, "closednet", hidden_ssid))) { WL_ERROR(("%s fail to set hidden\n", __FUNCTION__)); } printk("%s success set hidden %d\n", __func__, hidden_ssid); - +//++++++++++++++++++++++++++++++++ return res; } @@ -7411,6 +7445,23 @@ wl_iw_check_conn_fail(wl_event_msg_t *e, char* stringBuf, uint buflen) #define IW_CUSTOM_MAX 256 #endif +#ifdef WLAN_PFN +#include +static struct wake_lock wl_pfn_wake; +extern int need_pfn; + + +static void wl_iw_set_pfn(struct work_struct * work) +{ + msleep(10); + need_pfn = 1; + dhd_enable_pfn_ssid(1); + dhd_clear_pfn_ssid(); +} + +DECLARE_WORK(set_pfn_work, wl_iw_set_pfn); +#endif + void wl_iw_event(struct net_device *dev, wl_event_msg_t *e, void* data) { @@ -7484,6 +7535,14 @@ wl_iw_event(struct net_device *dev, wl_event_msg_t *e, void* data) case WLC_E_REASSOC_IND: #if defined(SOFTAP) WL_SOFTAP(("STA connect received %d\n", event_type)); + +#ifdef WLAN_PFN + if(wake_lock_active(&wl_pfn_wake)){ + wake_unlock(&wl_pfn_wake); + printk("LINK UP, give up the PFN wake lock\n"); + } +#endif //#ifdef WLAN_PFN + if (ap_cfg_running) { wl_iw_send_priv_event(priv_dev, "STA_JOIN"); return; @@ -7520,7 +7579,7 @@ wl_iw_event(struct net_device *dev, wl_event_msg_t *e, void* data) case WLC_E_DEAUTH_IND: case WLC_E_DISASSOC_IND: #if defined(SOFTAP) - WL_SOFTAP(("STA disconnect received %d\n", event_type)); + WL_SOFTAP(("STA disconnect received %d\n", event_type)); if (ap_cfg_running) { wl_iw_send_priv_event(priv_dev, "STA_LEAVE"); return; @@ -7549,6 +7608,11 @@ wl_iw_event(struct net_device *dev, wl_event_msg_t *e, void* data) } else { WL_TRACE(("STA_Link Down\n")); g_ss_cache_ctrl.m_link_down = 1; + +#ifdef WLAN_PFN + schedule_work(&set_pfn_work); +#endif + } #else g_ss_cache_ctrl.m_link_down = 1; @@ -7683,6 +7747,12 @@ wl_iw_event(struct net_device *dev, wl_event_msg_t *e, void* data) WL_ERROR(("%s Event WLC_E_PFN_NET_FOUND, send %s up : find %s len=%d\n", \ __FUNCTION__, PNO_EVENT_UP, ssid->SSID, ssid->SSID_len)); WAKE_LOCK_TIMEOUT(iw->pub, WAKE_LOCK_PNO_FIND_TMOUT, 20 * HZ); + +#ifdef WLAN_PFN + wake_lock_timeout(&wl_pfn_wake, 30*HZ); /* must wake to 20 secs to make sure ip ready */ + printk("PFN found, set 30s PFN wake lock"); +#endif + cmd = IWEVCUSTOM; memset(&wrqu, 0, sizeof(wrqu)); strcpy(extra, PNO_EVENT_UP); @@ -7956,7 +8026,7 @@ int wl_iw_attach(struct net_device *dev, void * dhdp) memset(&g_wl_iw_params, 0, sizeof(wl_iw_extra_params_t)); - + g_disableDhcpPktFilter = false; #ifdef CSCAN params_size = (WL_SCAN_PARAMS_FIXED_SIZE + OFFSETOF(wl_iscan_params_t, params)) + (WL_NUMCHANNELS * sizeof(uint16)) + WL_SCAN_PARAMS_SSID_MAX * sizeof(wlc_ssid_t); @@ -8022,6 +8092,9 @@ int wl_iw_attach(struct net_device *dev, void * dhdp) wl_iw_bt_init(dev); +#ifdef WLAN_PFN + wake_lock_init(&wl_pfn_wake, WAKE_LOCK_SUSPEND, "dhd_wake_lock_pfn_find_event"); +#endif return 0; } @@ -8032,6 +8105,8 @@ void wl_iw_detach(void) iscan_buf_t *buf; iscan_info_t *iscan = g_iscan; + g_disableDhcpPktFilter = false; + if (!iscan) return; if (iscan->sysioc_pid >= 0) { @@ -8067,4 +8142,8 @@ void wl_iw_detach(void) } #endif +#ifdef WLAN_PFN + wake_lock_destroy(&wl_pfn_wake); +#endif + } diff --git a/drivers/net/wireless/bcm4319/wl_iw.h b/drivers/net/wireless/bcm4319/wl_iw.h index ae54b7af..508ec2ea 100644 --- a/drivers/net/wireless/bcm4319/wl_iw.h +++ b/drivers/net/wireless/bcm4319/wl_iw.h @@ -163,10 +163,10 @@ struct ap_profile { uint32 channel; uint32 preamble; uint32 max_scb; - + //pengji 20110701 start uint32 closednet; char country_code[WLC_CNTRY_BUF_SZ]; - + //pengji 20110701 end }; diff --git a/drivers/power/Kconfig b/drivers/power/Kconfig index 79f33554..dfe0d5cc 100644 --- a/drivers/power/Kconfig +++ b/drivers/power/Kconfig @@ -200,6 +200,13 @@ config BATTERY_QCIBAT help Say Y here if you want to use the Quanta battery driver for ST15 platform. + +config CARKIT_FEATURE + tristate "ZTE carkit feature" + depends on BATTERY_MSM + default n + help + Say Y to enable support for the battery in Qualcomm MSM. config TI_GAUGE tristate "ti fuel gauge" diff --git a/drivers/power/msm_battery.c b/drivers/power/msm_battery.c index ed3e84bd..5885dd2c 100644 --- a/drivers/power/msm_battery.c +++ b/drivers/power/msm_battery.c @@ -59,7 +59,1538 @@ when who what, where, why comment tag -------- ---- ------------------------------------- -------------------------- =======================================================================*/ +#ifdef CONFIG_CARKIT_FEATURE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "../../arch/arm/mach-msm/smd_private.h" + +#include +//#include +#define FEATURE_ZTE_APP_ENABLE_USB_CHARGING + +#ifdef CONFIG_SCREEN_ON_WITHOUT_KEYOCDE +#include +static struct wake_lock charger_wake_lock; +static int wl_initialized = 0;//The rpc occur anytime ,so ,we must make sure that the batt driver already initialized +#endif + + +/* liu.yijian@zte.com.cn 20091127 _FILE_INDEX */ +#define MSM_BATTERY_DEBUGX +#ifdef MSM_BATTERY_DEBUG +#define DEBUG_MSM_BATTERY(fmt, args...)\ + do\ + {\ + printk("%s:%s:%d:", __FILE__, __FUNCTION__, __LINE__);\ + printk(fmt "\n", ## args);\ + }\ + while (0) +#else +#define DEBUG_MSM_BATTERY(fmt, args...) do{}while(0) +#endif + +#define FALSE (0) +#define TRUE (1) + +#define BATTERY_LOW 2800 +#define BATTERY_HIGH 4300 + +#define BATTERY_STATUS_POLL_TIME (2*HZ) +#define SUSPEND_EVENT (1UL << 0) +#define RESUME_EVENT (1UL << 1) +#define CLEANUP_EVENT (1UL << 2) +//#define CAPACITY_EVENT (1UL << 3) +#define EVENT_CONDITION (SUSPEND_EVENT | RESUME_EVENT | CLEANUP_EVENT) + + +#define DEBUG 0 + +#if DEBUG +#define DBG(x...) printk(KERN_INFO x) +#else +#define DBG(x...) do {} while (0) +#endif + + + + + +/* + * This enum contains defintions of the charger hardware status + */ +enum chg_charger_status_type +{ + /* The charger is good */ + CHARGER_STATUS_GOOD, + /* The charger is bad */ + CHARGER_STATUS_BAD, + /* The charger is weak */ + CHARGER_STATUS_WEAK, + /* Invalid charger status. */ + CHARGER_STATUS_INVALID +}; + +#ifdef MSM_BATTERY_DEBUGX +static char *charger_status[] = { + "good", "bad", "weak", "invalid" +}; +#endif + +/* + *This enum contains defintions of the charger hardware type + */ +enum chg_charger_hardware_type +{ + /* The charger is removed */ + CHARGER_TYPE_NONE, + /* The charger is a regular wall charger */ + CHARGER_TYPE_WALL, + /* The charger is a PC USB */ + CHARGER_TYPE_USB_PC, + /* The charger is a wall USB charger */ + CHARGER_TYPE_USB_WALL, + /* The charger is a USB carkit */ + CHARGER_TYPE_USB_CARKIT, + /* Invalid charger hardware status. */ + CHARGER_TYPE_INVALID +}; + +#ifdef MSM_BATTERY_DEBUGX +static char *charger_type[] = { + "No charger", "wall", "USB PC", "USB wall", "USB car kit", + "invalid charger" +}; +#endif + +/* + * This enum contains defintions of the battery status + */ +enum chg_battery_status_type +{ + /* The battery is good */ + BATTERY_STATUS_GOOD, + /* The battery is cold/hot */ + BATTERY_STATUS_BAD_TEMP, + /* The battery is bad */ + BATTERY_STATUS_BAD, + /* Invalid battery status. */ + BATTERY_STATUS_INVALID +}; + +#ifdef MSM_BATTERY_DEBUGX +static char *battery_status[] = { + "good ", "bad temperature", "bad", "invalid" +}; +#endif + +/* + *This enum contains defintions of the battery voltage level + */ +enum chg_battery_level_type +{ + /* The battery voltage is dead/very low (less than 3.2V) */ + BATTERY_LEVEL_DEAD, + /* The battery voltage is weak/low (between 3.2V and 3.4V) */ + BATTERY_LEVEL_WEAK, + /* The battery voltage is good/normal(between 3.4V and 4.2V) */ + BATTERY_LEVEL_GOOD, + /* The battery voltage is up to full (close to 4.2V) */ + BATTERY_LEVEL_FULL, + /* Invalid battery voltage level. */ + BATTERY_LEVEL_INVALID +}; +#ifdef MSM_BATTERY_DEBUGX +static char *battery_level[] = { + "dead", "weak", "good", "full", "invalid" +}; +#endif +struct __attribute__((packed)) smem_batt_chg_t +{ + u8 charger_type; + u8 charger_status; + u8 charging; + u8 chg_fulled; + + u8 battery_status; + u8 battery_level; + u16 battery_voltage; + s16 battery_temp; + u8 battery_capacity; +}; + +static struct smem_batt_chg_t rep_batt_chg; + +struct msm_battery_info +{ + u32 voltage_max_design; + u32 voltage_min_design; + u32 chg_api_version; + u32 batt_technology; + + u32 avail_chg_sources; + u32 current_chg_source; + + u32 batt_status; + u32 batt_health; + u32 charger_valid; + u32 batt_valid; + u32 battery_capacity; + + u8 charger_status; + u8 charger_type; + u8 charging; + u8 chg_fulled; + + u8 battery_status; + u8 battery_level; + u16 battery_voltage; + s16 battery_temp; + + + u32(*calculate_capacity) (u32 voltage); + +#ifdef FEATURE_ZTE_APP_ENABLE_USB_CHARGING + s32 batt_handle; + struct msm_rpc_endpoint *chg_ep; +#endif + + spinlock_t lock; + + struct power_supply *msm_psy_ac; + struct power_supply *msm_psy_usb; + struct power_supply *msm_psy_carkit; + struct power_supply *msm_psy_batt; + + struct workqueue_struct *msm_batt_wq; + + wait_queue_head_t wait_q; + + struct early_suspend early_suspend; + + atomic_t handle_event; + + u32 type_of_event; +}; + +static void msm_batt_wait_for_batt_chg_event(struct work_struct *work); + +static DECLARE_WORK(msm_batt_cb_work, msm_batt_wait_for_batt_chg_event); + +static int msm_batt_cleanup(void); + +static struct msm_battery_info msm_batt_info = { + .charger_status = -1, + .charger_type = -1, + .battery_status = -1, + .battery_level = -1, + .battery_voltage = -1, + .battery_temp = -1, +}; + +static enum power_supply_property msm_power_props[] = +{ + POWER_SUPPLY_PROP_ONLINE, +}; + +static char *msm_power_supplied_to[] = { + "battery", +}; + +static int msm_power_get_property(struct power_supply *psy, + enum power_supply_property psp, union power_supply_propval *val) +{ + + switch (psp) + { + case POWER_SUPPLY_PROP_ONLINE: + + if (psy->type == POWER_SUPPLY_TYPE_MAINS) + { + + val->intval = msm_batt_info.current_chg_source & AC_CHG ? 1 : 0; + DEBUG_MSM_BATTERY(KERN_INFO "%s(): power supply = %s online = %d\n", __func__, psy->name, val->intval); + + } + + if (psy->type == POWER_SUPPLY_TYPE_USB) + { + + val->intval = (msm_batt_info.current_chg_source & USB_CHG ? 1 : 0)||(msm_batt_info.charger_type==CHARGER_TYPE_USB_CARKIT); + + DEBUG_MSM_BATTERY(KERN_INFO "%s(): power supply = %s online = %d\n", __func__, psy->name, val->intval); + } + + if (psy->type == POWER_SUPPLY_TYPE_UPS) + { + + val->intval = (msm_batt_info.charger_type==CHARGER_TYPE_USB_CARKIT); + + DEBUG_MSM_BATTERY(KERN_INFO "%s(): power supply = %s online = %d\n", __func__, psy->name, val->intval); + } + + break; + default: + return -EINVAL; + } + return 0; +} + +static struct power_supply msm_psy_ac = { + .name = "ac", + .type = POWER_SUPPLY_TYPE_MAINS, + .supplied_to = msm_power_supplied_to, + .num_supplicants = ARRAY_SIZE(msm_power_supplied_to), + .properties = msm_power_props, + .num_properties = ARRAY_SIZE(msm_power_props), + .get_property = msm_power_get_property, +}; + +static struct power_supply msm_psy_usb = { + .name = "usb", + .type = POWER_SUPPLY_TYPE_USB, + .supplied_to = msm_power_supplied_to, + .num_supplicants = ARRAY_SIZE(msm_power_supplied_to), + .properties = msm_power_props, + .num_properties = ARRAY_SIZE(msm_power_props), + .get_property = msm_power_get_property, +}; + +static struct power_supply msm_psy_carkit = { + .name = "carkit", + .type = POWER_SUPPLY_TYPE_UPS, + .supplied_to = msm_power_supplied_to, + .num_supplicants = ARRAY_SIZE(msm_power_supplied_to), + .properties = msm_power_props, + .num_properties = ARRAY_SIZE(msm_power_props), + .get_property = msm_power_get_property, +}; + +static enum power_supply_property msm_batt_power_props[] = +{ + POWER_SUPPLY_PROP_STATUS, + POWER_SUPPLY_PROP_HEALTH, + POWER_SUPPLY_PROP_PRESENT, + POWER_SUPPLY_PROP_TECHNOLOGY, + POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN, + POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN, + POWER_SUPPLY_PROP_VOLTAGE_NOW, + POWER_SUPPLY_PROP_CAPACITY, + /* ZTE_BATTERY_ZHYF_001, 2009-10-28, zhuyufei add temp property */ + POWER_SUPPLY_PROP_TEMP, + /* end , ZTE_BATTERY_ZHYF_001, 2009-10-28, zhuyufei add temp property */ +}; + +static void msm_batt_external_power_changed(struct power_supply *psy) +{ + DEBUG_MSM_BATTERY(KERN_INFO "%s() : external power supply changed for %s\n", __func__, psy->name); + power_supply_changed(psy); +} + + +#ifndef ZTE_FEATURE_ALLOW_TO_CHG_WHILE_BAD_TEMP //LHX_NLED_20110701_01 allow to charge while bad temperture +#define ZTE_FEATURE_ALLOW_TO_CHG_WHILE_BAD_TEMP +#endif + +#ifdef ZTE_FEATURE_ALLOW_TO_CHG_WHILE_BAD_TEMP +#include "../../arch/arm/mach-msm/proc_comm.h" +#define ZTE_PROC_COMM_CMD3_ALLOW_2_CHG_WHILE_BAD_TEMP_DISABLE 12 +#define ZTE_PROC_COMM_CMD3_ALLOW_2_CHG_WHILE_BAD_TEMP_ENABLE 13 + +void zte_allow_2_chg_while_bad_temp_form_app_proccomm( int allow2chg) +{ + int config_last = 0; + if( allow2chg == 0) + allow2chg = ZTE_PROC_COMM_CMD3_ALLOW_2_CHG_WHILE_BAD_TEMP_ENABLE; + else + allow2chg = ZTE_PROC_COMM_CMD3_ALLOW_2_CHG_WHILE_BAD_TEMP_DISABLE; + pr_info(" enalbe to allow2chg (12dis 13enable):%d\n",allow2chg); + msm_proc_comm(PCOM_CUSTOMER_CMD3, &config_last, &allow2chg); +} +#endif + +#define ZTE_PLATFORM_NOT_SHUTDOWN_WHILE_PERCENTAGE_0 +#ifdef ZTE_PLATFORM_NOT_SHUTDOWN_WHILE_PERCENTAGE_0 +#define NOT_SHUTDOWN_PERCENTAGE_ZERO 0 +#define SHUTDOWN_PERCENTAGE_ZERO 1 +static int shutdown_percentage_zero_enable = SHUTDOWN_PERCENTAGE_ZERO; /*0 not shutdown while percentage 0%,1 shutdown*/ + +static ssize_t lowbattery_shutdown_show_enable(struct device_driver *driver, char *buf) +{ + printk("%s():line:%d %s to shutdown\n", __func__,__LINE__,shutdown_percentage_zero_enable?"enable":"forbid"); + return snprintf(buf, PAGE_SIZE, "%s\n", shutdown_percentage_zero_enable?"enable":"forbid"); +} +/* +function:lowbattery_shutdown_store_enable +usage:take disable for example,type "echo 0 > /sys/bus/platform/drivers/msm-battery/enable_to_shutdown" +usage:take enable for example,type "echo 1 > /sys/bus/platform/drivers/msm-battery/enable_to_shutdown" + +*/ +static ssize_t lowbattery_shutdown_store_enable(struct device_driver *driver, + const char *buf, size_t count) +{ + char *p = (char *)buf; + unsigned int enable= 1; + enable=(unsigned int)simple_strtol(p, NULL, 10); + + printk("%s():enter,get lowbattery_shutdown_enable:%d from \"%s\"\n", __func__,enable,buf); + if(enable==0 ||enable==1) + { + shutdown_percentage_zero_enable=enable; +#ifdef ZTE_FEATURE_ALLOW_TO_CHG_WHILE_BAD_TEMP + zte_allow_2_chg_while_bad_temp_form_app_proccomm(enable); +#endif + } + else + { + printk("%s():get err lowbattery_shutdown_enable value:%d \n", __func__,enable); + } + printk("%s(): exit,line:%d\n", __func__,__LINE__); + return strnlen(buf, count); +} + +static DRIVER_ATTR(enable_to_shutdown, S_IRWXUGO, lowbattery_shutdown_show_enable, lowbattery_shutdown_store_enable); //can read write execute +#endif +static int msm_batt_power_get_property(struct power_supply *psy, + enum power_supply_property psp, union power_supply_propval *val) +{ + switch (psp) + { + case POWER_SUPPLY_PROP_STATUS: + val->intval = msm_batt_info.batt_status; + break; + case POWER_SUPPLY_PROP_HEALTH: + val->intval = msm_batt_info.batt_health; + break; + case POWER_SUPPLY_PROP_PRESENT: + val->intval = msm_batt_info.batt_valid; + break; + case POWER_SUPPLY_PROP_TECHNOLOGY: + val->intval = msm_batt_info.batt_technology; + break; + case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN: + val->intval = msm_batt_info.voltage_max_design; + break; + case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN: + val->intval = msm_batt_info.voltage_min_design; + break; + case POWER_SUPPLY_PROP_VOLTAGE_NOW: + val->intval = msm_batt_info.battery_voltage; + break; + case POWER_SUPPLY_PROP_CAPACITY: +#ifdef ZTE_PLATFORM_NOT_SHUTDOWN_WHILE_PERCENTAGE_0 +if((0 == msm_batt_info.battery_capacity)&&(NOT_SHUTDOWN_PERCENTAGE_ZERO == shutdown_percentage_zero_enable))// percentage is 0% and not allow to shutdown,report 1% instead + val->intval = msm_batt_info.battery_capacity+1; +else + val->intval = msm_batt_info.battery_capacity; + +#else + val->intval = msm_batt_info.battery_capacity; +#endif + break; + /* ZTE_BATTERY_SLF_001 start, 2010-03-08, */ + case POWER_SUPPLY_PROP_TEMP: + val->intval = msm_batt_info.battery_temp*10; + break; + /* ZTE_BATTERY_SLF_001 end, 2010-03-08, */ + default: + return -EINVAL; + } + return 0; +} + +static struct power_supply msm_psy_batt = { + .name = "battery", + .type = POWER_SUPPLY_TYPE_BATTERY, + .properties = msm_batt_power_props, + .num_properties = ARRAY_SIZE(msm_batt_power_props), + .get_property = msm_batt_power_get_property, + .external_power_changed = msm_batt_external_power_changed, +}; + +#ifdef FEATURE_ZTE_APP_ENABLE_USB_CHARGING +#define FEATURE_ZTE_APP_ENABLE_USB_CHARGING_BY_SYS // LHX_PM_20110407_01 set usb_chg_enable by /sys/bus/platform/drivers/msm-battery/usb_chg_enable +#include + +#define USB_CHG_DISABLE 0 +#define USB_CHG_ENABLE 1 +static int usb_charger_enable = USB_CHG_ENABLE; +static int usb_charger_enable_pre = USB_CHG_ENABLE; +//#ifndef FEATURE_ZTE_APP_ENABLE_USB_CHARGING_BY_SYS +module_param_named(usb_chg_enable, usb_charger_enable, int, S_IRUGO | S_IWUSR | S_IWGRP); // set usb_chg_enable by/sys/module/msm_battery/parameters/usb_chg_enable +//#endif +#define CHG_RPC_PROG 0x3000001a +#define CHG_RPC_VERS 0x00010003 + +#define BATTERY_ENABLE_DISABLE_USB_CHG_PROC 6 + + + +/*-------------------------------------------------------------- +msm_batt_handle_control_usb_charging() is added according msm_chg_usb_charger_connected() in rpc_hsusb.c +and the rpc is used to stop or resume usb charging +---------------------------------------------------------------*/ +static int msm_batt_handle_control_usb_charging(u32 usb_enable_disable) +{ + int rc; + + struct batt_modify_client_req { + struct rpc_request_hdr hdr; + u32 usb_chg_enable; + } req; + printk(KERN_INFO "%s: msm_rpc_write usb switch enable/disable = %d start.\n", + __func__,usb_enable_disable); + + req.usb_chg_enable = cpu_to_be32(usb_enable_disable); + rc=msm_rpc_call(msm_batt_info.chg_ep, BATTERY_ENABLE_DISABLE_USB_CHG_PROC, &req, + sizeof(req), 5 * HZ); + + if (rc < 0) { + printk(KERN_ERR + "%s(): msm_rpc_write failed. proc = 0x%08x rc = %d\n", + __func__, BATTERY_ENABLE_DISABLE_USB_CHG_PROC, rc); + return rc; + } + printk(KERN_INFO "%s: msm_rpc_write usb switch enable/disable end rc = %d.\n", + __func__,rc); + + return 0; +} +#endif + +#ifdef FEATURE_ZTE_APP_ENABLE_USB_CHARGING_BY_SYS +static ssize_t zte_usb_chg_show_enable(struct device_driver *driver, char *buf) +{ + printk("%s():line:%d %s usb to chager\n", __func__,__LINE__,usb_charger_enable?"enable":"forbid"); + return snprintf(buf, PAGE_SIZE, "%s\n", usb_charger_enable?"enable":"forbid"); +} +/* +function:zte_usb_chg_store_enable:enable or disable usb charge +usage:take disable for example,type "echo 0 > /sys/bus/platform/drivers/msm-battery/usb_chg_enable" +usage:take enable for example,type "echo 1 > /sys/bus/platform/drivers/msm-battery/usb_chg_enable" + +*/ +static ssize_t zte_usb_chg_store_enable(struct device_driver *driver, + const char *buf, size_t count) +{ + char *p = (char *)buf; + unsigned int enable= 1; + enable=(unsigned int)simple_strtol(p, NULL, 10); + + printk("%s():enter,get usb_charger_enable:%d from \"%s\"\n", __func__,enable,buf); + if(enable==0 ||enable==1) + { + usb_charger_enable=enable; + } + else + { + printk("%s():get err usb_charger_enable value:%d \n", __func__,enable); + } +// printk("%s(): exit,line:%d\n", __func__,__LINE__); + return strnlen(buf, count); +} + +static DRIVER_ATTR(usb_chg_enable, S_IRWXUGO, zte_usb_chg_show_enable, zte_usb_chg_store_enable); //can read write execute +#endif +//#if defined(CONFIG_MACH_JOE) || defined(CONFIG_MACH_V9) || defined(CONFIG_MACH_V9)//YINTIANCI_GAUGE_20100926 +#if defined(CONFIG_TI_GAUGE) +#define ZTE_GAUGE_FEATURE +#define ZTE_GAUGE_OPTIMIZE_FEATURE +#endif +#ifdef ZTE_GAUGE_FEATURE +#define REGADDR_TEMP 0x06//temperature +#define REGADDR_AI 0x14//temperature +#define REGADDR_VOLT 0x08//voltage +#define REGADDR_SOC 0x2c//state of charge +extern int bat_read_gauge(int reg,unsigned int* readvalue) ; +extern int gauge_enabel_it(int flag); +#define ABSM(a,b) ((a)>(b)?((a)-(b)):((b)-(a))) +#endif +/*get the battery information form SMEM*/ +static int msm_batt_get_batt_chg_status_v1(void) +{ + struct smem_batt_chg_t *batt_chg_ptr; +#ifdef ZTE_GAUGE_FEATURE + // static int IT_enable_flag=0;//0:disabled ; 1:enabled + unsigned int gaugereadvalue=0; + static unsigned int low_power_cnt=0; //chenchongbao.2011.5.25 + +#ifdef ZTE_GAUGE_OPTIMIZE_FEATURE + unsigned int gauge_voltage=1234; // + unsigned int gauge_capacity=123; // + unsigned int a9_voltage,a9_capacity; //chenchongbao.2011.5.23 + static unsigned int a9_old_voltage=0; // + static unsigned int a9_old_capacity=0; // + static unsigned int gauge_old_voltage=3456; // + static unsigned int gauge_old_capacity=33; // change init value chenchongbao.20110713_1 + static unsigned int gauge_status_old=0; // + int gauge_current=-1; + volatile unsigned int gauge_status=0;//0 bad, 1 good +#endif + +#endif + + memset(&rep_batt_chg, 0, sizeof(rep_batt_chg)); + + batt_chg_ptr = smem_alloc(SMEM_BATT_INFO, sizeof(struct smem_batt_chg_t)); + if (batt_chg_ptr == NULL) + { + printk("%s: share memery read error!\n", __func__); + return -EIO; + } + + rep_batt_chg = *batt_chg_ptr; /*get the battery information form SMEM*/ + +#ifdef ZTE_GAUGE_FEATURE + +#ifdef ZTE_GAUGE_OPTIMIZE_FEATURE + a9_voltage = rep_batt_chg.battery_voltage; + a9_capacity = rep_batt_chg.battery_capacity; +#endif + + if(!bat_read_gauge(REGADDR_VOLT,&gaugereadvalue)) + { + +#ifdef ZTE_GAUGE_OPTIMIZE_FEATURE + gauge_status++; + gauge_voltage=gaugereadvalue&0xffff; + rep_batt_chg.battery_voltage=gauge_voltage; +#else + rep_batt_chg.battery_voltage=gaugereadvalue&0xffff; +#endif + } + else //chenchongbao.20110713_1 如果读电量计出错,则采用上次电量计数据 + { + gauge_voltage = gauge_old_voltage; + rep_batt_chg.battery_voltage=gauge_voltage; + } + + gaugereadvalue=0; + if(!bat_read_gauge(REGADDR_SOC,&gaugereadvalue)) + { +#ifdef ZTE_GAUGE_OPTIMIZE_FEATURE + gauge_status++; + gauge_capacity=gaugereadvalue&0xff; + if(gauge_capacity == 0 ) //chenchongbao.2011.6.7 + { + if (rep_batt_chg.battery_voltage < 3400) + { + printk( "gauge_capacity is 0 and battery_voltage is %u\n", rep_batt_chg.battery_voltage); // 3.3V //chenchongbao.2011.6.18 + rep_batt_chg.battery_capacity=0; + } + //else use arm9 capacity data! + else //chenchongbao.20110713_1 如果没有如此处理,将导致电量由0跳变到ARM9 的容量值比如3% !!! + { + if(rep_batt_chg.battery_capacity!=0){ + rep_batt_chg.battery_capacity=1; + gauge_capacity = 1; + } + //else use arm9's capacity data 0% + } + } + else + rep_batt_chg.battery_capacity=gauge_capacity; +#else + rep_batt_chg.battery_capacity=gaugereadvalue&0xff; +#endif + } + else //chenchongbao.20110713_1 如果读电量计出错,则采用上次电量计数据 + { + gauge_capacity = gauge_old_capacity; + rep_batt_chg.battery_capacity=gauge_capacity; + } + + gaugereadvalue=0; + if(!bat_read_gauge(REGADDR_AI,&gaugereadvalue)) + { +#ifdef ZTE_GAUGE_OPTIMIZE_FEATURE + gauge_status++; + //gaugereadvalue |= 0xFFFF0000; //chenchongbao.2011.6.7 + if(gaugereadvalue & 0x8000) //chenchongbao.20110713_1 解决负值问题 + gaugereadvalue |= 0xFFFF0000; + gauge_current=(int)gaugereadvalue; +#endif + } + +#ifdef ZTE_GAUGE_OPTIMIZE_FEATURE + + if( (ABSM(a9_voltage,a9_old_voltage)>5) || (a9_capacity!=a9_old_capacity) || (ABSM(gauge_voltage,gauge_old_voltage)>5) || /* chenchongbao.2011.6.7*/ + (gauge_capacity != gauge_old_capacity) || (gauge_status != gauge_status_old) ) + { + printk(KERN_INFO " gauge_voltage = %d ; arm9_voltage = %d ; gauge_capacity = %d ; arm9_capacity= %d ; gauge_current = %d ; gauge_status= %d\n", + gauge_voltage, a9_voltage, gauge_capacity,a9_capacity, gauge_current, gauge_status); + } + + a9_old_voltage = a9_voltage; + a9_old_capacity = a9_capacity; + gauge_old_voltage = gauge_voltage; + gauge_old_capacity = gauge_capacity; + gauge_status_old = gauge_status; + + if((gauge_status && gauge_current==0) + &&(rep_batt_chg.battery_status==0) + &&(rep_batt_chg.battery_voltage>=4100)//bat voltage higher than 4100mv + &&(rep_batt_chg.charger_status==0 ||rep_batt_chg.charger_status==2))//charger good or weak + { + if(rep_batt_chg.chg_fulled==0) + { + rep_batt_chg.chg_fulled=1; + } + if(rep_batt_chg.battery_capacity!=100) + { + rep_batt_chg.battery_capacity=100; + } + //rep_batt_chg.battery_voltage=gauge_voltage; + } + +/* //chenchongbao.2011.5.24 + else + { + if(gauge_status==3) + { + if(ABSM(gauge_voltage,rep_batt_chg.battery_voltage)<400) + { + rep_batt_chg.battery_voltage=gauge_voltage; + } + if((0!= gauge_capacity) && (ABSM(gauge_capacity,rep_batt_chg.battery_capacity)<15)) + { + rep_batt_chg.battery_capacity=gauge_capacity; + } + } + } +*/ + +#endif //ZTE_GAUGE_OPTIMIZE_FEATURE + + +//chenchongbao.2011.5.25 : 用于处理连接USB 时手机大电流造成的掉电关机反复重启问题! + +if( ( (rep_batt_chg.charger_type == CHARGER_TYPE_USB_PC) ||(rep_batt_chg.charger_type == CHARGER_TYPE_USB_WALL) ||(rep_batt_chg.charger_type == CHARGER_TYPE_USB_CARKIT)) + //(rep_batt_chg.charger_type != CHARGER_TYPE_NONE) V9 默认为NONE! 为了避免出现invalid 类型, 因此采用上述两个条件! + && (rep_batt_chg.battery_capacity == 0) && (rep_batt_chg.battery_voltage < 3400) ) +{ + low_power_cnt ++; + if(low_power_cnt > 10) //10*2=20s + { + rep_batt_chg.charger_type = CHARGER_TYPE_NONE; //capacity=0 & no charger , system will power down! + } +} +else +{ + low_power_cnt = 0; +} + +//chenchongbao.2011.5.25 : end + + +#endif //ZTE_GAUGE_FEATURE + + DEBUG_MSM_BATTERY("status read ok!base: %d size: %d\n", SMEM_BATT_INFO, sizeof(struct smem_batt_chg_t)); + + DEBUG_MSM_BATTERY(KERN_INFO "charger_status = %s, charger_type = %s," + " batt_status = %s, batt_level = %s," + " batt_volt = %u, batt_cap = %u, batt_temp = %u, chg_fulled = %d\n", + charger_status[rep_batt_chg.charger_status], + charger_type[rep_batt_chg.charger_type], + battery_status[rep_batt_chg.battery_status], + battery_level[rep_batt_chg.battery_level], + rep_batt_chg.battery_voltage, + rep_batt_chg.battery_capacity, + rep_batt_chg.battery_temp, + rep_batt_chg.chg_fulled); + +#ifndef ZTE_GAUGE_FEATURE + /* ZTE_BATTERY_LYJ_004 start*/ + if (rep_batt_chg.battery_voltage > msm_batt_info.voltage_max_design) + { +// printk("battery voltage overvoltage: %d\n", rep_batt_chg.battery_voltage); + rep_batt_chg.battery_voltage = msm_batt_info.voltage_max_design; + } + else if (rep_batt_chg.battery_voltage < msm_batt_info.voltage_min_design) + { +// printk("battery voltage low: %d\n", rep_batt_chg.battery_voltage); + rep_batt_chg.battery_voltage = msm_batt_info.voltage_min_design; + } + /* ZTE_BATTERY_LYJ_004 end*/ +#endif + + return 0; +} + +void msm_batt_update_psy_status_v1(void) +{ + msm_batt_get_batt_chg_status_v1();/*get battery information for SMEM*/ + + DEBUG_MSM_BATTERY(); + + if (msm_batt_info.charger_status == rep_batt_chg.charger_status && + msm_batt_info.charger_type == rep_batt_chg.charger_type && + msm_batt_info.battery_status == rep_batt_chg.battery_status && + msm_batt_info.battery_level == rep_batt_chg.battery_level && + /*if voltage not change,or changes within the voltage's range, return */ + ((msm_batt_info.battery_voltage == rep_batt_chg.battery_voltage) || + ((msm_batt_info.battery_voltage != rep_batt_chg.battery_voltage) && + ((msm_batt_info.voltage_min_design <= rep_batt_chg.battery_voltage) && + (msm_batt_info.voltage_max_design >= rep_batt_chg.battery_voltage)))) && + msm_batt_info.battery_capacity == rep_batt_chg.battery_capacity && + msm_batt_info.battery_temp == rep_batt_chg.battery_temp && +#ifdef FEATURE_ZTE_APP_ENABLE_USB_CHARGING + (((rep_batt_chg.charger_type == CHARGER_TYPE_USB_WALL || + rep_batt_chg.charger_type == CHARGER_TYPE_USB_PC|| + rep_batt_chg.charger_type == CHARGER_TYPE_USB_CARKIT)&& + usb_charger_enable_pre == usb_charger_enable ) || + (rep_batt_chg.charger_type != CHARGER_TYPE_USB_WALL && + rep_batt_chg.charger_type != CHARGER_TYPE_USB_PC&& + rep_batt_chg.charger_type != CHARGER_TYPE_USB_CARKIT))&& +#endif + msm_batt_info.chg_fulled == rep_batt_chg.chg_fulled && + msm_batt_info.charging == rep_batt_chg.charging) + { + DEBUG_MSM_BATTERY(KERN_NOTICE "%s() : Got unnecessary event from Modem " + "PMIC VBATT driver. Nothing changed in Battery or " "charger status\n", __func__); + return; + } + + /*once one of the following change,such as charger_status,charger_type,battery_status + ,battery_level, battery_voltage,battery_temp,chg_fulled and charging. + , printk the debug information.*/ + printk(KERN_INFO "charger_status= %s, charger_type= %s," + "batt_status= %s, batt_level= %s," + "batt_volt= %u,batt_cap= %u,batt_temp= %u,full= %d,allow2shutdown(1?y;n)= %d\n", + charger_status[rep_batt_chg.charger_status], + charger_type[rep_batt_chg.charger_type], + battery_status[rep_batt_chg.battery_status], + battery_level[rep_batt_chg.battery_level], + rep_batt_chg.battery_voltage, + rep_batt_chg.battery_capacity, + rep_batt_chg.battery_temp, + rep_batt_chg.chg_fulled + #ifdef ZTE_PLATFORM_NOT_SHUTDOWN_WHILE_PERCENTAGE_0 + ,shutdown_percentage_zero_enable + #endif + ); + + if (rep_batt_chg.battery_status != BATTERY_STATUS_INVALID) + { + msm_batt_info.batt_valid = 1; + + if (rep_batt_chg.battery_voltage > msm_batt_info.voltage_max_design) + { + msm_batt_info.batt_health = POWER_SUPPLY_HEALTH_OVERVOLTAGE; + msm_batt_info.batt_status = POWER_SUPPLY_STATUS_NOT_CHARGING; + } + else if (rep_batt_chg.battery_voltage < msm_batt_info.voltage_min_design) + { + msm_batt_info.batt_health = POWER_SUPPLY_HEALTH_DEAD; + msm_batt_info.batt_status = POWER_SUPPLY_STATUS_UNKNOWN; + } + else if (rep_batt_chg.battery_status == BATTERY_STATUS_BAD) + { + printk("battery status bad\n"); + msm_batt_info.battery_capacity = rep_batt_chg.battery_capacity; + msm_batt_info.batt_health = POWER_SUPPLY_HEALTH_DEAD; + msm_batt_info.batt_status = POWER_SUPPLY_STATUS_UNKNOWN; + } + else if (rep_batt_chg.battery_status == BATTERY_STATUS_BAD_TEMP) + { + printk("battery status bad temp\n"); + msm_batt_info.batt_health = POWER_SUPPLY_HEALTH_OVERHEAT; + + if (rep_batt_chg.charger_status == CHARGER_STATUS_BAD + || rep_batt_chg.charger_status == CHARGER_STATUS_INVALID) + msm_batt_info.batt_status = POWER_SUPPLY_STATUS_UNKNOWN; + else + msm_batt_info.batt_status = POWER_SUPPLY_STATUS_NOT_CHARGING; + } + else if ((rep_batt_chg.charger_status == CHARGER_STATUS_GOOD + || rep_batt_chg.charger_status == CHARGER_STATUS_WEAK) + && (rep_batt_chg.battery_status == BATTERY_STATUS_GOOD)) + { + msm_batt_info.batt_health = POWER_SUPPLY_HEALTH_GOOD; + + if (rep_batt_chg.chg_fulled) + { + msm_batt_info.battery_capacity = 100; + msm_batt_info.batt_status = POWER_SUPPLY_STATUS_FULL; + } + else + #ifdef FEATURE_ZTE_APP_ENABLE_USB_CHARGING + { + if ((rep_batt_chg.charger_type == CHARGER_TYPE_USB_WALL || + rep_batt_chg.charger_type == CHARGER_TYPE_USB_PC|| + rep_batt_chg.charger_type == CHARGER_TYPE_USB_CARKIT)) + { + if(USB_CHG_DISABLE == usb_charger_enable)//if disabled usb charging, show discharging + { + msm_batt_info.batt_status = POWER_SUPPLY_STATUS_DISCHARGING; + } + else + { + msm_batt_info.batt_status = POWER_SUPPLY_STATUS_CHARGING; + } + + if((usb_charger_enable_pre != usb_charger_enable)&& + ((usb_charger_enable == USB_CHG_DISABLE && rep_batt_chg.charging) + ||(usb_charger_enable == USB_CHG_ENABLE && !rep_batt_chg.charging))) + { + printk(KERN_INFO "Before RPC charging = %d, usb_charger_enable_pre = %d,usb_charger_enable = %d \n", + rep_batt_chg.charging,usb_charger_enable_pre,usb_charger_enable); + usb_charger_enable_pre = usb_charger_enable; + msm_batt_handle_control_usb_charging(usb_charger_enable); + } + } + else + msm_batt_info.batt_status = POWER_SUPPLY_STATUS_CHARGING; + } + #else + msm_batt_info.batt_status = POWER_SUPPLY_STATUS_CHARGING; + #endif + } + else if ((rep_batt_chg.charger_status == CHARGER_STATUS_BAD + || rep_batt_chg.charger_status == CHARGER_STATUS_INVALID) + && (rep_batt_chg.battery_status == BATTERY_STATUS_GOOD)) + { + msm_batt_info.batt_health = POWER_SUPPLY_HEALTH_GOOD; + msm_batt_info.batt_status = POWER_SUPPLY_STATUS_DISCHARGING; + } + + //msm_batt_info.battery_capacity = msm_batt_info.calculate_capacity(msm_batt_info.battery_voltage); + } + else + { + printk("battery status invalid id\n"); + msm_batt_info.batt_health = POWER_SUPPLY_HEALTH_UNKNOWN; + msm_batt_info.batt_status = POWER_SUPPLY_STATUS_UNKNOWN; + msm_batt_info.battery_capacity = rep_batt_chg.battery_capacity; + msm_batt_info.batt_valid = 0; + } + + if (msm_batt_info.charger_type != rep_batt_chg.charger_type)/*charger's type changes,insert or pull out*/ + { + msm_batt_info.charger_type = rep_batt_chg.charger_type; + + if (msm_batt_info.charger_type == CHARGER_TYPE_WALL)/*AC insert*/ + { + msm_batt_info.current_chg_source &= ~USB_CHG; + msm_batt_info.current_chg_source &= ~CARKIT_CHG; + msm_batt_info.current_chg_source |= AC_CHG; + + DEBUG_MSM_BATTERY(KERN_INFO "%s() : charger_type = WALL\n", __func__); + + power_supply_changed(&msm_psy_ac); + + } + else if (msm_batt_info.charger_type == + CHARGER_TYPE_USB_WALL || msm_batt_info.charger_type == CHARGER_TYPE_USB_PC)/*USB or carkit insert*/ + { + msm_batt_info.current_chg_source &= ~AC_CHG; + msm_batt_info.current_chg_source &= ~CARKIT_CHG; + msm_batt_info.current_chg_source |= USB_CHG; + + DEBUG_MSM_BATTERY(KERN_INFO "%s() : charger_type = %s\n", __func__, charger_type[msm_batt_info.charger_type]); + + power_supply_changed(&msm_psy_usb); + DEBUG_MSM_BATTERY(); + } +#if 1 + else if (msm_batt_info.charger_type ==CHARGER_TYPE_USB_CARKIT)/*carkit insert*/ + { + msm_batt_info.current_chg_source &= ~AC_CHG; + msm_batt_info.current_chg_source &= ~USB_CHG; + msm_batt_info.current_chg_source |= CARKIT_CHG; + + DEBUG_MSM_BATTERY(KERN_INFO "%s() : charger_type = %s\n", __func__, charger_type[msm_batt_info.charger_type]); + + power_supply_changed(&msm_psy_carkit); + DEBUG_MSM_BATTERY(); + } +#endif + else /*pull out charger */ + { + DEBUG_MSM_BATTERY(KERN_INFO "%s() : charger_type = %s\n", __func__, charger_type[msm_batt_info.charger_type]); + + msm_batt_info.batt_status = POWER_SUPPLY_STATUS_DISCHARGING; + + if (msm_batt_info.current_chg_source & AC_CHG) /*the previous charger is AC*/ + { + msm_batt_info.current_chg_source &= ~AC_CHG; + + DEBUG_MSM_BATTERY(KERN_INFO "%s() : AC WALL charger" " removed\n", __func__); + + power_supply_changed(&msm_psy_ac); + + } + else if (msm_batt_info.current_chg_source & USB_CHG)/*the previous charger is USB*/ + { + msm_batt_info.current_chg_source &= ~USB_CHG; + DEBUG_MSM_BATTERY(KERN_INFO "%s() : USB charger removed\n", __func__); + +#ifdef FEATURE_ZTE_APP_ENABLE_USB_CHARGING + usb_charger_enable_pre = USB_CHG_ENABLE; + printk(KERN_INFO "USB remove: usb_charger_enable_pre set2 %d \n",usb_charger_enable_pre); +#endif + + power_supply_changed(&msm_psy_usb); + } + else if (msm_batt_info.current_chg_source & CARKIT_CHG) /*the previous charger is carkit*/ + { + msm_batt_info.current_chg_source &= ~CARKIT_CHG; + + DEBUG_MSM_BATTERY(KERN_INFO "%s() : Carkit charger" " removed\n", __func__); + + power_supply_changed(&msm_psy_carkit); + + } + else /*? unnecessary?*/ + power_supply_changed(&msm_psy_batt); + } + } + else + { + power_supply_changed(&msm_psy_batt); + } + + msm_batt_info.charger_status = rep_batt_chg.charger_status; + msm_batt_info.charger_type = rep_batt_chg.charger_type; + msm_batt_info.battery_status = rep_batt_chg.battery_status; + msm_batt_info.battery_level = rep_batt_chg.battery_level; + msm_batt_info.battery_voltage = rep_batt_chg.battery_voltage; + msm_batt_info.battery_capacity = rep_batt_chg.battery_capacity; + msm_batt_info.battery_temp = rep_batt_chg.battery_temp; + msm_batt_info.chg_fulled = rep_batt_chg.chg_fulled; + msm_batt_info.charging = rep_batt_chg.charging; + + DEBUG_MSM_BATTERY(); +} + + +#define ZTE_CLK_BY_MOD_UART_CLOCK_NO_SLEEP +#ifdef ZTE_CLK_BY_MOD_UART_CLOCK_NO_SLEEP +#include "../../arch/arm/mach-msm/proc_comm.h" + +#define CLK_RECORD_DISABLE 0 +#define CLK_RECORD_ENABLE 1 +static int clk_record_enable = CLK_RECORD_DISABLE; +static int clk_record_enable_pre = CLK_RECORD_DISABLE; +module_param_named(clk_record_enable, clk_record_enable, int, S_IRUGO | S_IWUSR | S_IWGRP); + +#define ZTE_PROC_COMM_CMD3_RECORD_CLK_DISABLE 4 +#define ZTE_PROC_COMM_CMD3_RECORD_CLK_ENABLE 5 + + + +int msm_batt_enable_2_record_clk_proccomm(void) +{ + int config_last = 0; + int record_enable = clk_record_enable + ZTE_PROC_COMM_CMD3_RECORD_CLK_DISABLE; + clk_record_enable_pre = clk_record_enable; + + pr_info(" enalbe to record NO CLOSE CLK (4dis 5enable):%d\n",record_enable); + return msm_proc_comm(PCOM_CUSTOMER_CMD3, &config_last, &record_enable); +} +#endif + + + + + +#ifdef CONFIG_SCREEN_ON_WITHOUT_KEYOCDE +void msm_batt_force_update(void) +{ + if (wl_initialized) + { + printk("No pity! update battery event\n"); + wake_lock_timeout(&charger_wake_lock, 3 * HZ); + msm_batt_update_psy_status_v1(); + #ifdef ZTE_CLK_BY_MOD_UART_CLOCK_NO_SLEEP + if(clk_record_enable_pre != clk_record_enable) + msm_batt_enable_2_record_clk_proccomm(); + #endif + } + else + printk("What a pity! charger driver unintialized\n"); + +} +#endif + +static int msm_batt_handle_suspend(void) +{ + return 0; +} + +static int msm_batt_handle_resume(void) +{ + msm_batt_update_psy_status_v1(); + return 0; +} + +static int msm_batt_handle_status_timeout(void) +{ + msm_batt_update_psy_status_v1(); + return 0; +} + +static int msm_batt_handle_event(void) +{ + int rc; + + if (!atomic_read(&msm_batt_info.handle_event)) + { + printk(KERN_ERR "%s(): batt call back thread while in " + "msm_rpc_read got signal. Signal is not from " + "early suspend or from late resume or from Clean up " "thread.\n", __func__); + return 0; + } + + DEBUG_MSM_BATTERY(KERN_INFO "%s(): batt call back thread" "got signal\n", __func__); + + if (msm_batt_info.type_of_event & SUSPEND_EVENT) + { + DEBUG_MSM_BATTERY(KERN_INFO "%s(): Handle Suspend event. event = %08x\n", __func__, msm_batt_info.type_of_event); + + rc = msm_batt_handle_suspend(); + + msm_batt_info.type_of_event &= ~SUSPEND_EVENT; + + return rc; + } + else if (msm_batt_info.type_of_event & RESUME_EVENT) + { + DEBUG_MSM_BATTERY(KERN_INFO "%s(): Handle Resume event. event = %08x\n", __func__, msm_batt_info.type_of_event); + + rc = msm_batt_handle_resume(); + + msm_batt_info.type_of_event &= ~RESUME_EVENT; + + return rc; + } + else if (msm_batt_info.type_of_event & CLEANUP_EVENT) + { + DEBUG_MSM_BATTERY(KERN_INFO "%s(): Cleanup event occured. event = %08x\n", __func__, msm_batt_info.type_of_event); + + msm_batt_info.type_of_event &= ~CLEANUP_EVENT; + + return 0; + } + else + { + printk(KERN_ERR "%s(): Unknown event occured. event = %08x\n", __func__, msm_batt_info.type_of_event); + return 0; + } +} + + +static void msm_batt_wake_up_waiting_thread(u32 event) +{ + DEBUG_MSM_BATTERY(); + + DEBUG_MSM_BATTERY("wake up wait queue!\n"); + atomic_set(&msm_batt_info.handle_event, 1); + wake_up(&msm_batt_info.wait_q); + + DEBUG_MSM_BATTERY(); +} + + +static void msm_batt_wait_for_batt_chg_event(struct work_struct *work) +{ + int ret; + int rc; + + DEBUG_MSM_BATTERY(KERN_INFO "%s: Batt status call back thread started.(SMEM)\n", __func__); + + DEBUG_MSM_BATTERY(KERN_INFO "%s: First time Update Batt status without waiting for" + " call back event from modem .\n", __func__); + + msm_batt_update_psy_status_v1(); + while (1) + { + ret = wait_event_interruptible_timeout(msm_batt_info.wait_q, + msm_batt_info.type_of_event & EVENT_CONDITION, BATTERY_STATUS_POLL_TIME); + + DEBUG_MSM_BATTERY("ret = %d", ret); + DEBUG_MSM_BATTERY("%s: %d\n", __func__, __LINE__); + + if (ret != 0) + { + rc = msm_batt_handle_event(); + + if (rc != 0) + { + printk("%s: handle event error!\n", __func__); + } + + if (msm_batt_info.type_of_event & EVENT_CONDITION) + { + DEBUG_MSM_BATTERY(); + + continue; + } + + DEBUG_MSM_BATTERY(); + + atomic_set(&msm_batt_info.handle_event, 0); + } + else + { + DEBUG_MSM_BATTERY(); + + msm_batt_handle_status_timeout(); + } + } + DEBUG_MSM_BATTERY(KERN_INFO "%s: Batt status call back thread stopped.(SMEM)\n", __func__); +} + +static int msm_batt_send_event(u32 type_of_event) +{ + int rc; + unsigned long flags; + + rc = 0; + + spin_lock_irqsave(&msm_batt_info.lock, flags); + + if (type_of_event & SUSPEND_EVENT) + DEBUG_MSM_BATTERY(KERN_INFO "%s() : Suspend event ocurred." "events = %08x\n", __func__, type_of_event); + else if (type_of_event & RESUME_EVENT) + DEBUG_MSM_BATTERY(KERN_INFO "%s() : Resume event ocurred." "events = %08x\n", __func__, type_of_event); + else if (type_of_event & CLEANUP_EVENT) + DEBUG_MSM_BATTERY(KERN_INFO "%s() : Cleanup event ocurred." "events = %08x\n", __func__, type_of_event); + else + { + DEBUG_MSM_BATTERY(KERN_ERR "%s() : Unknown event ocurred." "events = %08x\n", __func__, type_of_event); + + spin_unlock_irqrestore(&msm_batt_info.lock, flags); + return -EIO; + } + + msm_batt_info.type_of_event |= type_of_event; + + if (msm_batt_info.type_of_event & CLEANUP_EVENT) + { + msm_batt_wake_up_waiting_thread(CLEANUP_EVENT); + } + else if (msm_batt_info.type_of_event & SUSPEND_EVENT) + { + msm_batt_wake_up_waiting_thread(SUSPEND_EVENT); + } + else if (msm_batt_info.type_of_event & RESUME_EVENT) + { + msm_batt_wake_up_waiting_thread(RESUME_EVENT); + } + else + { + + } + + spin_unlock_irqrestore(&msm_batt_info.lock, flags); + + return rc; +} + +static void msm_batt_start_cb_thread(void) +{ + DEBUG_MSM_BATTERY("task queue start!\n"); + atomic_set(&msm_batt_info.handle_event, 0); + queue_work(msm_batt_info.msm_batt_wq, &msm_batt_cb_work); + DEBUG_MSM_BATTERY("task queue end!\n"); +} + +static void msm_batt_early_suspend(struct early_suspend *h); + +static int msm_batt_cleanup(void) +{ + int rc = 0; + + if (msm_batt_info.msm_batt_wq) + { + msm_batt_send_event(CLEANUP_EVENT); + destroy_workqueue(msm_batt_info.msm_batt_wq); + } + + if (msm_batt_info.msm_psy_ac) + power_supply_unregister(msm_batt_info.msm_psy_ac); + if (msm_batt_info.msm_psy_usb) + power_supply_unregister(msm_batt_info.msm_psy_usb); + if (msm_batt_info.msm_psy_carkit) + power_supply_unregister(msm_batt_info.msm_psy_carkit); + if (msm_batt_info.msm_psy_batt) + power_supply_unregister(msm_batt_info.msm_psy_batt); + +#ifdef CONFIG_HAS_EARLYSUSPEND + if (msm_batt_info.early_suspend.suspend == msm_batt_early_suspend) + unregister_early_suspend(&msm_batt_info.early_suspend); +#endif + return rc; +} + +static u32 msm_batt_capacity(u32 current_voltage) +{ + u32 low_voltage = msm_batt_info.voltage_min_design; + u32 high_voltage = msm_batt_info.voltage_max_design; + + return (current_voltage - low_voltage) * 100 / (high_voltage - low_voltage); +} + +#ifdef CONFIG_HAS_EARLYSUSPEND +void msm_batt_early_suspend(struct early_suspend *h) +{ + DEBUG_MSM_BATTERY(KERN_INFO "%s(): going to early suspend\n", __func__); + //msm_batt_send_event(SUSPEND_EVENT); +} + +void msm_batt_late_resume(struct early_suspend *h) +{ + DEBUG_MSM_BATTERY(KERN_INFO "%s(): going to resume\n", __func__); + //msm_batt_send_event(RESUME_EVENT); +} +#endif + /* ZTE_BATTERY_LYJ_005 start */ +static int msm_batt_suspend(struct platform_device *pdev, pm_message_t state) +{ + msm_batt_handle_suspend(); + return 0; +} + +static int msm_batt_resume(struct platform_device *pdev) +{ + msm_batt_handle_resume(); + return 0; +} + /* ZTE_BATTERY_LYJ_005 end */ + +static int __devinit msm_batt_probe(struct platform_device *pdev) +{ + int rc; + struct msm_psy_batt_pdata *pdata = pdev->dev.platform_data; + + if (pdev->id != -1) + { + dev_err(&pdev->dev, "%s: MSM chipsets Can only support one" " battery ", __func__); + return -EINVAL; + } + + if (pdata->avail_chg_sources & AC_CHG) + { + rc = power_supply_register(&pdev->dev, &msm_psy_ac); + if (rc < 0) + { + dev_err(&pdev->dev, "%s: ac power_supply_register failed " " rc = %d\n", __func__, rc); + msm_batt_cleanup(); + return rc; + } + msm_batt_info.msm_psy_ac = &msm_psy_ac; + msm_batt_info.avail_chg_sources |= AC_CHG; + } + + if (pdata->avail_chg_sources & USB_CHG) + { + rc = power_supply_register(&pdev->dev, &msm_psy_usb); + if (rc < 0) + { + dev_err(&pdev->dev, "%s: usb power_supply_register failed" " rc = %d\n", __func__, rc); + msm_batt_cleanup(); + return rc; + } + msm_batt_info.msm_psy_usb = &msm_psy_usb; + msm_batt_info.avail_chg_sources |= USB_CHG; + } + + if (pdata->avail_chg_sources & CARKIT_CHG) + { + rc = power_supply_register(&pdev->dev, &msm_psy_carkit); + if (rc < 0) + { + dev_err(&pdev->dev, "%s: carkit power_supply_register failed" " rc = %d\n", __func__, rc); + msm_batt_cleanup(); + return rc; + } + msm_batt_info.msm_psy_carkit = &msm_psy_carkit; + msm_batt_info.avail_chg_sources |= CARKIT_CHG; + } + + if (!msm_batt_info.msm_psy_ac && !msm_batt_info.msm_psy_usb&& !msm_batt_info.msm_psy_carkit) + { + + dev_err(&pdev->dev, "%s: No external Power supply(AC or USB or carkit)" "is avilable\n", __func__); + msm_batt_cleanup(); + return -ENODEV; + } + + msm_batt_info.voltage_max_design = pdata->voltage_max_design; + msm_batt_info.voltage_min_design = pdata->voltage_min_design; + msm_batt_info.batt_technology = pdata->batt_technology; + msm_batt_info.calculate_capacity = pdata->calculate_capacity; + + if (!msm_batt_info.voltage_min_design) + msm_batt_info.voltage_min_design = BATTERY_LOW; + if (!msm_batt_info.voltage_max_design) + msm_batt_info.voltage_max_design = BATTERY_HIGH; + + if (msm_batt_info.batt_technology == POWER_SUPPLY_TECHNOLOGY_UNKNOWN) + msm_batt_info.batt_technology = POWER_SUPPLY_TECHNOLOGY_LION; + + if (!msm_batt_info.calculate_capacity) + msm_batt_info.calculate_capacity = msm_batt_capacity; + + rc = power_supply_register(&pdev->dev, &msm_psy_batt); + if (rc < 0) + { + dev_err(&pdev->dev, "%s: power_supply_register failed" " rc=%d\n", __func__, rc); + msm_batt_cleanup(); + return rc; + } + msm_batt_info.msm_psy_batt = &msm_psy_batt; + +#ifdef CONFIG_HAS_EARLYSUSPEND + msm_batt_info.early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN; + msm_batt_info.early_suspend.suspend = msm_batt_early_suspend; + msm_batt_info.early_suspend.resume = msm_batt_late_resume; + register_early_suspend(&msm_batt_info.early_suspend); +#endif + + msm_batt_start_cb_thread(); + + return 0; +} + + + +static struct platform_driver msm_batt_driver; +static int __devinit msm_batt_init_smem(void) +{ + int rc; + + spin_lock_init(&msm_batt_info.lock); + + init_waitqueue_head(&msm_batt_info.wait_q); + + msm_batt_info.msm_batt_wq = create_singlethread_workqueue("msm_battery"); + + if (!msm_batt_info.msm_batt_wq) + { + printk(KERN_ERR "%s: create workque failed \n", __func__); + return -ENOMEM; + } + + rc = platform_driver_register(&msm_batt_driver); + + if (rc < 0) + { + printk(KERN_ERR "%s: platform_driver_register failed for " "batt driver. rc = %d\n", __func__, rc); + return rc; + } + #ifdef FEATURE_ZTE_APP_ENABLE_USB_CHARGING_BY_SYS + rc |= driver_create_file(&msm_batt_driver.driver, &driver_attr_usb_chg_enable); + if (rc < 0) + { + printk(KERN_ERR "%s: driver_create_file failed for usb_chg_enable " "batt driver. rc = %d\n", __func__, rc); + // return rc; + } + #endif + #ifdef ZTE_PLATFORM_NOT_SHUTDOWN_WHILE_PERCENTAGE_0 + rc |= driver_create_file(&msm_batt_driver.driver, &driver_attr_enable_to_shutdown); + if (rc < 0) + { + printk(KERN_ERR "%s: driver_create_file failed for enable_to_shutdown" "batt driver. rc = %d\n", __func__, rc); +// return rc; + } + #endif + + return 0; +} + +static int __devexit msm_batt_remove(struct platform_device *pdev) +{ + int rc; + + rc = msm_batt_cleanup(); + + if (rc < 0) + { + dev_err(&pdev->dev, "%s: msm_batt_cleanup failed rc=%d\n", __func__, rc); + return rc; + } + return 0; +} + +static struct platform_driver msm_batt_driver = { + .probe = msm_batt_probe, + .remove = __devexit_p(msm_batt_remove), + .driver = { + .name = "msm-battery", + .owner = THIS_MODULE, + }, + /* ZTE_BATTERY_LYJ_005 start */ + .suspend = msm_batt_suspend, + .resume = msm_batt_resume, + /* ZTE_BATTERY_LYJ_005 end */ +}; + +static int __init msm_batt_init(void) +{ + int rc; + + rc = msm_batt_init_smem(); + + if (rc < 0) + { + printk(KERN_ERR "%s: msm_batt_init_rpc Failed rc=%d\n", __func__, rc); + msm_batt_cleanup(); + return rc; + } +#ifdef CONFIG_SCREEN_ON_WITHOUT_KEYOCDE + wake_lock_init(&charger_wake_lock, WAKE_LOCK_SUSPEND, "chg_event"); + wl_initialized = 1; +#endif + +#ifdef FEATURE_ZTE_APP_ENABLE_USB_CHARGING + msm_batt_info.chg_ep = + msm_rpc_connect_compatible(CHG_RPC_PROG, CHG_RPC_VERS, 0); + + if (msm_batt_info.chg_ep == NULL) { + return -ENODEV; + } else if (IS_ERR(msm_batt_info.chg_ep)) { + int rc = PTR_ERR(msm_batt_info.chg_ep); + printk(KERN_ERR + "%s: rpc connect failed for CHG_RPC_PROG. rc = %d\n", + __func__, rc); + msm_batt_info.chg_ep = NULL; + return rc; + } +#endif + + return 0; +} + +static void __exit msm_batt_exit(void) +{ +#ifdef CONFIG_SCREEN_ON_WITHOUT_KEYOCDE + wl_initialized = 0; + wake_lock_destroy(&charger_wake_lock); +#endif + platform_driver_unregister(&msm_batt_driver); +} +module_init(msm_batt_init); +module_exit(msm_batt_exit); + +MODULE_LICENSE("Dual BSD/GPL"); +MODULE_AUTHOR("Kiran Kandi, Qualcomm Innovation Center, Inc."); +MODULE_DESCRIPTION("Battery driver for Qualcomm MSM chipsets."); +MODULE_VERSION("1.0"); +MODULE_ALIAS("platform:msm_battery"); +#else #include #include #include @@ -88,8 +1619,8 @@ static int wl_initialized = 0;//The rpc occur anytime ,so ,we must make sure tha /* liu.yijian@zte.com.cn 20091127 _FILE_INDEX */ -//#define MSM_BATTERY_DEBUGX -#ifdef MSM_BATTERY_DEBUGX +#define MSM_BATTERY_DEBUGX +#ifdef MSM_BATTERY_DEBUG #define DEBUG_MSM_BATTERY(fmt, args...)\ do\ {\ @@ -232,10 +1763,6 @@ struct __attribute__((packed)) smem_batt_chg_t static struct smem_batt_chg_t rep_batt_chg; -#if defined(CONFIG_MACH_BLADE) -static long last_resume_secs; -#endif - struct msm_battery_info { u32 voltage_max_design; @@ -384,7 +1911,7 @@ static void msm_batt_external_power_changed(struct power_supply *psy) } -#ifndef ZTE_FEATURE_ALLOW_TO_CHG_WHILE_BAD_TEMP +#ifndef ZTE_FEATURE_ALLOW_TO_CHG_WHILE_BAD_TEMP //LHX_NLED_20110701_01 allow to charge while bad temperture #define ZTE_FEATURE_ALLOW_TO_CHG_WHILE_BAD_TEMP #endif @@ -465,13 +1992,13 @@ static int msm_batt_power_get_property(struct power_supply *psy, val->intval = msm_batt_info.batt_technology; break; case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN: - val->intval = msm_batt_info.voltage_max_design*1000; + val->intval = msm_batt_info.voltage_max_design; break; case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN: - val->intval = msm_batt_info.voltage_min_design*1000; + val->intval = msm_batt_info.voltage_min_design; break; case POWER_SUPPLY_PROP_VOLTAGE_NOW: - val->intval = msm_batt_info.battery_voltage*1000; + val->intval = msm_batt_info.battery_voltage; break; case POWER_SUPPLY_PROP_CAPACITY: #ifdef ZTE_PLATFORM_NOT_SHUTDOWN_WHILE_PERCENTAGE_0 @@ -484,11 +2011,11 @@ else val->intval = msm_batt_info.battery_capacity; #endif break; - + /* ZTE_BATTERY_SLF_001 start, 2010-03-08, */ case POWER_SUPPLY_PROP_TEMP: val->intval = msm_batt_info.battery_temp*10; break; - + /* ZTE_BATTERY_SLF_001 end, 2010-03-08, */ default: return -EINVAL; } @@ -505,7 +2032,7 @@ static struct power_supply msm_psy_batt = { }; #ifdef FEATURE_ZTE_APP_ENABLE_USB_CHARGING -#define FEATURE_ZTE_APP_ENABLE_USB_CHARGING_BY_SYS +#define FEATURE_ZTE_APP_ENABLE_USB_CHARGING_BY_SYS // LHX_PM_20110407_01 set usb_chg_enable by /sys/bus/platform/drivers/msm-battery/usb_chg_enable #include #define USB_CHG_DISABLE 0 @@ -519,7 +2046,6 @@ module_param_named(usb_chg_enable, usb_charger_enable, int, S_IRUGO | S_IWUSR | #define CHG_RPC_VERS 0x00010003 #define BATTERY_ENABLE_DISABLE_USB_CHG_PROC 6 -#define BATTERY_MAX_TEMP 68 @@ -656,7 +2182,7 @@ static int msm_batt_get_batt_chg_status_v1(void) rep_batt_chg.battery_voltage=gaugereadvalue&0xffff; #endif } - else //chenchongbao.20110713_1 濡傛灉璇荤數閲忚鍑洪敊锛屽垯閲囩敤涓婃鐢甸噺璁℃暟鎹 + else //chenchongbao.20110713_1 如果读电量计出错,则采用上次电量计数据 { gauge_voltage = gauge_old_voltage; rep_batt_chg.battery_voltage=gauge_voltage; @@ -676,7 +2202,7 @@ static int msm_batt_get_batt_chg_status_v1(void) rep_batt_chg.battery_capacity=0; } //else use arm9 capacity data! - else //chenchongbao.20110713_1 濡傛灉娌℃湁濡傛澶勭悊锛屽皢瀵艰嚧鐢甸噺鐢0璺冲彉鍒癆RM9 鐨勫閲忓兼瘮濡3% !!! + else //chenchongbao.20110713_1 如果没有如此处理,将导致电量由0跳变到ARM9 的容量值比如3% !!! { if(rep_batt_chg.battery_capacity!=0){ rep_batt_chg.battery_capacity=1; @@ -691,7 +2217,7 @@ static int msm_batt_get_batt_chg_status_v1(void) rep_batt_chg.battery_capacity=gaugereadvalue&0xff; #endif } - else //chenchongbao.20110713_1 濡傛灉璇荤數閲忚鍑洪敊锛屽垯閲囩敤涓婃鐢甸噺璁℃暟鎹 + else //chenchongbao.20110713_1 如果读电量计出错,则采用上次电量计数据 { gauge_capacity = gauge_old_capacity; rep_batt_chg.battery_capacity=gauge_capacity; @@ -703,7 +2229,7 @@ static int msm_batt_get_batt_chg_status_v1(void) #ifdef ZTE_GAUGE_OPTIMIZE_FEATURE gauge_status++; //gaugereadvalue |= 0xFFFF0000; //chenchongbao.2011.6.7 - if(gaugereadvalue & 0x8000) //chenchongbao.20110713_1 瑙e喅璐熷奸棶棰 + if(gaugereadvalue & 0x8000) //chenchongbao.20110713_1 解决负值问题 gaugereadvalue |= 0xFFFF0000; gauge_current=(int)gaugereadvalue; #endif @@ -760,10 +2286,10 @@ static int msm_batt_get_batt_chg_status_v1(void) #endif //ZTE_GAUGE_OPTIMIZE_FEATURE -//chenchongbao.2011.5.25 : 鐢ㄤ簬澶勭悊杩炴帴USB 鏃舵墜鏈哄ぇ鐢垫祦閫犳垚鐨勬帀鐢靛叧鏈哄弽澶嶉噸鍚棶棰! +//chenchongbao.2011.5.25 : 用于处理连接USB 时手机大电流造成的掉电关机反复重启问题! if( ( (rep_batt_chg.charger_type == CHARGER_TYPE_USB_PC) ||(rep_batt_chg.charger_type == CHARGER_TYPE_USB_WALL) ) - //(rep_batt_chg.charger_type != CHARGER_TYPE_NONE) V9 榛樿涓篘ONE! 涓轰簡閬垮厤鍑虹幇invalid 绫诲瀷, 鍥犳閲囩敤涓婅堪涓や釜鏉′欢! + //(rep_batt_chg.charger_type != CHARGER_TYPE_NONE) V9 默认为NONE! 为了避免出现invalid 类型, 因此采用上述两个条件! && (rep_batt_chg.battery_capacity == 0) && (rep_batt_chg.battery_voltage < 3400) ) { low_power_cnt ++; @@ -846,7 +2372,6 @@ void msm_batt_update_psy_status_v1(void) return; } -#ifdef MSM_BATTERY_DEBUGX /*once one of the following change,such as charger_status,charger_type,battery_status ,battery_level, battery_voltage,battery_temp,chg_fulled and charging. , printk the debug information.*/ @@ -865,7 +2390,6 @@ void msm_batt_update_psy_status_v1(void) ,shutdown_percentage_zero_enable #endif ); -#endif if (rep_batt_chg.battery_status != BATTERY_STATUS_INVALID) { @@ -1028,20 +2552,7 @@ void msm_batt_update_psy_status_v1(void) msm_batt_info.battery_level = rep_batt_chg.battery_level; msm_batt_info.battery_voltage = rep_batt_chg.battery_voltage; msm_batt_info.battery_capacity = rep_batt_chg.battery_capacity; - /* Battery temperature measurements on blade are unreliable for some time after resume. */ - /* Ignore high battery temp if battery status is still good. 0=good 1=bad temp. */ - /* Android shuts down if any one temperature reading is above 68 C (see BatteryService.java). */ - /* Blade temperature readings are especially high after using GPS. */ -#if defined(CONFIG_MACH_BLADE) - if(!rep_batt_chg.battery_status && rep_batt_chg.battery_temp > BATTERY_MAX_TEMP) - { - printk("%s(): ignoring battery temperature reading (%u) - status is still good. Time since resume is %li seconds. status=%u.\n", __func__, rep_batt_chg.battery_temp,current_kernel_time().tv_sec - last_resume_secs, rep_batt_chg.battery_status); - msm_batt_info.battery_temp = BATTERY_MAX_TEMP; - } - else -#endif - msm_batt_info.battery_temp = rep_batt_chg.battery_temp; - + msm_batt_info.battery_temp = rep_batt_chg.battery_temp; msm_batt_info.chg_fulled = rep_batt_chg.chg_fulled; msm_batt_info.charging = rep_batt_chg.charging; @@ -1105,9 +2616,6 @@ static int msm_batt_handle_suspend(void) static int msm_batt_handle_resume(void) { -#if defined(CONFIG_MACH_BLADE) - last_resume_secs = current_kernel_time().tv_sec; -#endif msm_batt_update_psy_status_v1(); return 0; } @@ -1553,3 +3061,5 @@ MODULE_AUTHOR("Kiran Kandi, Qualcomm Innovation Center, Inc."); MODULE_DESCRIPTION("Battery driver for Qualcomm MSM chipsets."); MODULE_VERSION("1.0"); MODULE_ALIAS("platform:msm_battery"); + +#endif diff --git a/drivers/power/ti_gauge.c b/drivers/power/ti_gauge.c index fa622a5d..12171e52 100644 --- a/drivers/power/ti_gauge.c +++ b/drivers/power/ti_gauge.c @@ -791,9 +791,9 @@ static DRIVER_ATTR(enable, S_IRWXUGO, gauge_show_enable, gauge_store_enable); // static DRIVER_ATTR(upmode, S_IRWXUGO, gauge_show_upmode, gauge_store_upmode); //can read write execute static DRIVER_ATTR(Control, S_IRWXUGO, gauge_show_Control, gauge_store_Control); //can read write execute #else -static DRIVER_ATTR(enable, S_IRWXU|S_IRWXG, gauge_show_enable, gauge_store_enable); //can read write execute -static DRIVER_ATTR(upmode, S_IRWXU|S_IRWXG, gauge_show_upmode, gauge_store_upmode); //can read write execute -static DRIVER_ATTR(Control, S_IRWXU|S_IRWXG, gauge_show_Control, gauge_store_Control); //can read write execute +static DRIVER_ATTR(enable, S_IRWXU|S_IRWXG|S_IRUGO, gauge_show_enable, gauge_store_enable); //can read write execute +static DRIVER_ATTR(upmode, S_IRWXU|S_IRWXG|S_IRUGO, gauge_show_upmode, gauge_store_upmode); //can read write execute +static DRIVER_ATTR(Control, S_IRWXU|S_IRWXG|S_IRUGO, gauge_show_Control, gauge_store_Control); //can read write execute #endif static DRIVER_ATTR(batTemperature, S_IRUGO, gauge_show_temperature, NULL); //显示实时电流 static DRIVER_ATTR(batVoltage, S_IRUGO, gauge_show_voltage, NULL); diff --git a/drivers/usb/gadget/f_mass_storage.c b/drivers/usb/gadget/f_mass_storage.c index 7fe60d87..de803a37 100644 --- a/drivers/usb/gadget/f_mass_storage.c +++ b/drivers/usb/gadget/f_mass_storage.c @@ -304,6 +304,12 @@ int os_switch_is_enable(void); //static int default_lunstype[MAX_LUNS] = {0,1}; //end +int scsicmd_start_adbd(void); +int scsicmd_stop_adbd(void); +//#if defined(CONFIG_MACH_ROAMER) +#define ENUM_ADB_FROM_MSC +//#endif + #ifdef CONFIG_USB_ANDROID_MASS_STORAGE #include #include @@ -1552,6 +1558,48 @@ static int do_read_toc(struct fsg_common *common, struct fsg_buffhd *bh) return reply_size; } +#ifdef ENUM_ADB_FROM_MSC +//xingbeilei_20110801 +static int do_start_stop_usb_debug(struct fsg_common *common, struct fsg_buffhd *bh) +{ + int call_us_ret = -1; + char *envp[] = { + "HOME=/", + "PATH=/sbin:/system/sbin:/system/bin:/system/xbin", + NULL, + }; + char *exec_path = "/sbin/do_scsi_command"; + char *argv[] = { exec_path, NULL, NULL, }; + + if(common->cmnd[1]=='z' && common->cmnd[2]=='t' && common->cmnd[3]=='e'){ + /* No special options */ + switch(common->cmnd[5]){ + case 0x00://disable adbd ---for 736T + argv[1] = "stop_adbd"; + call_us_ret = call_usermodehelper(exec_path, argv, envp, UMH_WAIT_PROC); + break; + case 0x01://enable adbd ---for 736T + argv[1] = "start_adbd"; + call_us_ret = call_usermodehelper(exec_path, argv, envp, UMH_WAIT_PROC); + break; + case 0x02: //disable adbd ---for All except 736T + call_us_ret = scsicmd_stop_adbd(); + break; + case 0x03: //enable adbd ---for All except 736T + call_us_ret = scsicmd_start_adbd(); + break; + default: + printk(KERN_DEBUG "Unknown ZTE specific command...(0x%2.2X)\n", common->cmnd[5]); + break; + } + } + printk(KERN_NOTICE "%s adb daemon from mass_storage %s(%d)\n", + (common->cmnd[5] == 0x01)?"Enable":(common->cmnd[5] == 0x00)?"Disable":"Unknown", + (call_us_ret == 0)?"DONE":"FAIL", call_us_ret); + return 0; + +} +#endif /*--------------------------------------- scsi response data type @@ -2389,6 +2437,7 @@ static int do_scsi_command(struct fsg_common *common) int reply = -EINVAL; int i; static char unknown[16]; + //int j; dump_cdb(common); @@ -2404,6 +2453,11 @@ static int do_scsi_command(struct fsg_common *common) common->short_packet_received = 0; down_read(&common->filesem); /* We're using the backing file */ + + /*for(j=0; jcmnd[j]); + }*/ + switch (common->cmnd[0]) { case SC_INQUIRY: @@ -2647,6 +2701,11 @@ static int do_scsi_command(struct fsg_common *common) if (reply==0) reply=do_get_configuration(common,bh); break; +#ifdef ENUM_ADB_FROM_MSC + case SC_START_STOP_USB_DEBUG: + reply=do_start_stop_usb_debug(common,bh); + break; +#endif /* Some mandatory commands that we recognize but don't implement. * They don't mean much in this setting. It's left as an exercise * for anyone interested to implement RESERVE and RELEASE in terms diff --git a/drivers/usb/gadget/msm72k_udc.c b/drivers/usb/gadget/msm72k_udc.c index 478b988b..fe69c6a7 100644 --- a/drivers/usb/gadget/msm72k_udc.c +++ b/drivers/usb/gadget/msm72k_udc.c @@ -48,6 +48,16 @@ #include #include #include +#if defined(CONFIG_TOUCHSCREEN_MXT224)||defined(CONFIG_TOUCHSCREEN_MXT224_NEW) +#include //huangjinyu add 20110722 +#endif + +#if defined (CONFIG_TS_NOTIFIER) +extern int ts_notifier_call_chain(unsigned long val); +#endif +#if defined (CONFIG_FTS_USB_NOTIFY) +extern int Ft5x0x_ts_notifier_call_chain(unsigned long val); +#endif void schedule_usb_plug(void); @@ -212,6 +222,11 @@ struct usb_info { struct usb_gadget gadget; struct usb_gadget_driver *driver; struct switch_dev sdev; + //xingbeilei + struct switch_dev scsi_sdev; + int start_adbd; + struct work_struct scsi_work; + //end #define ep0out ept[0] #define ep0in ept[16] @@ -279,6 +294,58 @@ static ssize_t print_switch_state(struct switch_dev *sdev, char *buf) { return sprintf(buf, "%s\n", sdev->state ? "online" : "offline"); } +//xingbeilei +int scsicmd_start_adbd(void) +{ + struct usb_info *ui = the_usb_info; + if (NULL == ui) { + return -1; + } + ui->start_adbd = 1; + switch_set_state(&ui->scsi_sdev, 1); + printk(KERN_ERR"usb_xbl: %s, %d %d\n",__FUNCTION__, __LINE__, ui->start_adbd); + return 0; +} +EXPORT_SYMBOL(scsicmd_start_adbd); + +int scsicmd_stop_adbd(void) +{ + struct usb_info *ui = the_usb_info; + if (NULL == ui) { + return -1; + } + ui->start_adbd = 0; + switch_set_state(&ui->scsi_sdev, 2); + printk(KERN_ERR"usb_xbl: %s, %d %d\n",__FUNCTION__, __LINE__, ui->start_adbd); + return 0; +} +EXPORT_SYMBOL(scsicmd_stop_adbd); + +static void scsicmd_usbstate_offline(struct work_struct *w) +{ + struct usb_info *ui = container_of(w, struct usb_info, scsi_work); + if (NULL == ui) { + return; + } + + if (ui->start_adbd == 1) { + printk(KERN_ERR"usb_xbl: %s, %d %d\n",__FUNCTION__, __LINE__, ui->start_adbd); + switch_set_state(&ui->scsi_sdev, 0); + } + ui->start_adbd = 0; + return; +} + +static ssize_t scsicmd_print_switch_name(struct switch_dev *sdev, char *buf) +{ + return sprintf(buf, "%s\n", "usb_scsi_command"); +} + +static ssize_t scsicmd_print_switch_state(struct switch_dev *sdev, char *buf) +{ + return sprintf(buf, "%d\n", sdev->state); +} +//end #ifdef ARM11_DETECT_CHG static inline enum chg_type usb_get_chg_type(struct usb_info *ui) @@ -1290,7 +1357,10 @@ static void usb_prepare(struct usb_info *ui) usb_ept_alloc_req(&ui->ep0in, SETUP_BUF_SIZE, GFP_KERNEL); INIT_WORK(&ui->work, usb_do_work); - #ifdef ARM11_DETECT_CHG + //xingbeilei + INIT_WORK(&ui->scsi_work, scsicmd_usbstate_offline); + //end + #ifdef ARM11_DETECT_CHG INIT_DELAYED_WORK(&ui->chg_det, usb_chg_detect); INIT_DELAYED_WORK(&ui->chg_stop, usb_chg_stop); #endif @@ -1403,6 +1473,7 @@ static void usb_do_work_check_vbus(struct usb_info *ui) spin_unlock_irqrestore(&ui->lock, iflags); } + static void usb_do_work(struct work_struct *w) { struct usb_info *ui = container_of(w, struct usb_info, work); @@ -1471,6 +1542,14 @@ static void usb_do_work(struct work_struct *w) pm_runtime_resume(&ui->pdev->dev); dev_info(&ui->pdev->dev, "msm72k_udc: IDLE -> ONLINE\n"); + +#if defined (CONFIG_TS_NOTIFIER) + ts_notifier_call_chain(1); +#endif +#if defined (CONFIG_FTS_USB_NOTIFY) + Ft5x0x_ts_notifier_call_chain(1); +#endif + usb_reset(ui); ret = request_irq(otg->irq, usb_interrupt, IRQF_SHARED, @@ -1519,9 +1598,9 @@ static void usb_do_work(struct work_struct *w) "msm72k_udc: ONLINE -> STOP\n"); - //atomic_set(&ui->running, 0); - //atomic_set(&ui->remote_wakeup, 0); - //atomic_set(&ui->configured, 0); + atomic_set(&ui->running, 0); + atomic_set(&ui->remote_wakeup, 0); + atomic_set(&ui->configured, 0); if (ui->driver) { dev_dbg(&ui->pdev->dev, @@ -1583,8 +1662,14 @@ static void usb_do_work(struct work_struct *w) #endif dev_info(&ui->pdev->dev, "msm72k_udc: ONLINE -> OFFLINE\n"); - - + +#if defined (CONFIG_TS_NOTIFIER) + ts_notifier_call_chain(0); +#endif +#if defined(CONFIG_FTS_USB_NOTIFY) + Ft5x0x_ts_notifier_call_chain(0); +#endif + atomic_set(&ui->running, 0); atomic_set(&ui->remote_wakeup, 0); atomic_set(&ui->configured, 0); @@ -1705,7 +1790,13 @@ static void usb_do_work(struct work_struct *w) pm_runtime_resume(&ui->pdev->dev); dev_info(&ui->pdev->dev, "msm72k_udc: OFFLINE -> ONLINE\n"); - + +#if defined (CONFIG_TS_NOTIFIER) + ts_notifier_call_chain(1); +#endif +#if defined(CONFIG_FTS_USB_NOTIFY) + Ft5x0x_ts_notifier_call_chain(1); +#endif usb_reset(ui); ui->state = USB_STATE_ONLINE; usb_do_work_check_vbus(ui); @@ -1767,6 +1858,9 @@ void msm_hsusb_set_vbus_state(int online) } else { ui->gadget.speed = USB_SPEED_UNKNOWN; ui->usb_state = USB_STATE_NOTATTACHED; + //xingbeilei + schedule_work(&ui->scsi_work); + //end ui->flags |= USB_FLAG_VBUS_OFFLINE; } if (in_interrupt()) { @@ -2502,11 +2596,21 @@ static int msm72k_probe(struct platform_device *pdev) ui->sdev.name = DRIVER_NAME; ui->sdev.print_name = print_switch_name; ui->sdev.print_state = print_switch_state; - retval = switch_dev_register(&ui->sdev); if (retval) return usb_free(ui, retval); + //xingbeilei + ui->scsi_sdev.name = "usb_scsi_command"; + ui->scsi_sdev.print_name = scsicmd_print_switch_name; + ui->scsi_sdev.print_state = scsicmd_print_switch_state; + retval = switch_dev_register(&ui->scsi_sdev); + if (retval) { + switch_dev_unregister(&ui->sdev); + return usb_free(ui, retval); + } + //end + the_usb_info = ui; wake_lock_init(&ui->wlock, @@ -2532,6 +2636,9 @@ static int msm72k_probe(struct platform_device *pdev) "%s: Cannot bind the transceiver, retval:(%d)\n", __func__, retval); switch_dev_unregister(&ui->sdev); + //xingbeilei + switch_dev_unregister(&ui->scsi_sdev); + //end wake_lock_destroy(&ui->wlock); return usb_free(ui, retval); } diff --git a/drivers/usb/gadget/storage_common.c b/drivers/usb/gadget/storage_common.c index 48f253b8..5b0b6187 100644 --- a/drivers/usb/gadget/storage_common.c +++ b/drivers/usb/gadget/storage_common.c @@ -242,7 +242,8 @@ struct interrupt_data { //SCSI Command for OS X #define SC_GET_CONFIGRATION 0x46 #define SC_SET_CD_SPEED 0xbb - +// xingbeilei_20110801 start_stop usb debug +#define SC_START_STOP_USB_DEBUG 0x86 /* SCSI Sense Key/Additional Sense Code/ASC Qualifier values */ diff --git a/drivers/video/msm/lcdc.c b/drivers/video/msm/lcdc.c index 8e337c5d..6bdc6403 100644 --- a/drivers/video/msm/lcdc.c +++ b/drivers/video/msm/lcdc.c @@ -16,7 +16,13 @@ * */ - +/*histstory: + when who what, where, why comment tag + -------- ---- --------------------------------------------------- ---------------------------------- + 2009-12-21 luya disable clk set for the 1st time LCD_LUYA_20100610_01 + 2010-03-08 luya not config LCDC_MUX_CTL to 0 when sleep ZTE_LCD_LUYA_20100308_001 + 2010-08-10 lht 729 lead panel VCI keep when sleep ZTE_LCD_LHT_20100810_001 +*/ #include #include #include @@ -44,7 +50,7 @@ static int lcdc_remove(struct platform_device *pdev); static int lcdc_off(struct platform_device *pdev); static int lcdc_on(struct platform_device *pdev); -#ifdef CONFIG_FB_MSM_LCDC_OLED_WVGA +#ifdef CONFIG_FB_MSM_LCDC_OLED_WVGA //ZTE_LCD_LHT_20100810_001 extern u32 LcdPanleID; #endif static struct platform_device *pdev_list[MSM_FB_MAX_DEV_LIST]; @@ -53,7 +59,7 @@ static int pdev_list_cnt; static struct clk *pixel_mdp_clk; /* drives the lcdc block in mdp */ static struct clk *pixel_lcdc_clk; /* drives the lcdc interface */ -static boolean be_firsttime = true; +static boolean be_firsttime = true; ///LCD_LUYA_20100610_01 static struct platform_driver lcdc_driver = { .probe = lcdc_probe, .remove = lcdc_remove, @@ -77,19 +83,19 @@ static int lcdc_off(struct platform_device *pdev) clk_disable(pixel_mdp_clk); clk_disable(pixel_lcdc_clk); -#ifdef CONFIG_FB_MSM_LCDC_OLED_WVGA +#ifdef CONFIG_FB_MSM_LCDC_OLED_WVGA //ZTE_LCD_LHT_20100810_001 if(LcdPanleID!=42) { if (lcdc_pdata && lcdc_pdata->lcdc_power_save) lcdc_pdata->lcdc_power_save(0); } #elif defined(CONFIG_FB_MSM_LCDC_SKATE_WVGA) - +/// #else if (lcdc_pdata && lcdc_pdata->lcdc_power_save) lcdc_pdata->lcdc_power_save(0); #endif - + ///ZTE_LCD_LUYA_20100308_001 /* if (lcdc_pdata && lcdc_pdata->lcdc_gpio_config) ret = lcdc_pdata->lcdc_gpio_config(0);*/ @@ -171,7 +177,7 @@ static int lcdc_on(struct platform_device *pdev) return ret; #else - +///ZTE_LCD_LUYA_20091221_001 LCD_LUYA_20100610_01 if(!be_firsttime) { ret = clk_set_rate(pixel_mdp_clk, mfd->fbi->var.pixclock); diff --git a/drivers/video/msm/lcdc_panel_hvga_roamer.c b/drivers/video/msm/lcdc_panel_hvga_roamer.c index 724cbc1a..5a605185 100644 --- a/drivers/video/msm/lcdc_panel_hvga_roamer.c +++ b/drivers/video/msm/lcdc_panel_hvga_roamer.c @@ -64,11 +64,12 @@ static int spi_sdo; static int panel_reset; static bool onewiremode = true; + static struct msm_panel_common_pdata * lcdc_tft_pdata; static void gpio_lcd_9bit_emuspi_write_one_index(unsigned short addr); static void gpio_lcd_9bit_emuspi_write_one_data(unsigned short data); static void gpio_lcd_eR61581_emuspi_read_id_para(unsigned short addr, unsigned int *data1); -//static void gpio_lcd_ILI9481_emuspi_read_id_para(unsigned short addr, unsigned int *data1); +static void gpio_lcd_ILI9481_emuspi_read_id_para(unsigned short addr, unsigned int *data1); static void lcdc_lead_init(void); static void lcdc_truly_er_init(void); static void lcdc_truly_ili_init(void); @@ -294,7 +295,7 @@ static void gpio_lcd_eR61581_emuspi_read_id_para(unsigned short addr, unsigned i } -/* + static void gpio_lcd_ILI9481_emuspi_read_id_para(unsigned short addr, unsigned int *data1) { @@ -315,7 +316,7 @@ static void gpio_lcd_ILI9481_emuspi_read_id_para(unsigned short addr, unsigned i i <<= 1; } bits1=0; - for (j = 0; j < 33; j++) {//read 4 byte + for (j = 0; j < 8; j++) {//read 4 byte gpio_direction_output(GPIO_SPI_SCLK, 0); dbit=gpio_get_value(GPIO_SPI_SDI); @@ -327,30 +328,114 @@ static void gpio_lcd_ILI9481_emuspi_read_id_para(unsigned short addr, unsigned i printk("read_lcd ili9481 PID:0x%x\n!",bits1); } -*/ + static void lcdc_lead_init(void) { + unsigned int id1,id2; + + gpio_lcd_9bit_emuspi_write_one_index(0xB4); + gpio_lcd_9bit_emuspi_write_one_data(0x11); + gpio_lcd_9bit_emuspi_write_one_index(0xC6); + gpio_lcd_9bit_emuspi_write_one_data(0x1B); //0x9B + + gpio_lcd_9bit_emuspi_write_one_index(0xD0); + gpio_lcd_9bit_emuspi_write_one_data(0x07); + gpio_lcd_9bit_emuspi_write_one_data(0x41); //0x47 + gpio_lcd_9bit_emuspi_write_one_data(0x1D); + + gpio_lcd_9bit_emuspi_write_one_index(0xD1); + gpio_lcd_9bit_emuspi_write_one_data(0x00); + gpio_lcd_9bit_emuspi_write_one_data(0x39);//10 + gpio_lcd_9bit_emuspi_write_one_data(0x14); + + gpio_lcd_9bit_emuspi_write_one_index(0xD2); + gpio_lcd_9bit_emuspi_write_one_data(0x01); + gpio_lcd_9bit_emuspi_write_one_data(0x22); + + gpio_lcd_9bit_emuspi_write_one_index(0xC0); + gpio_lcd_9bit_emuspi_write_one_data(0x10);//04 //0x00 + gpio_lcd_9bit_emuspi_write_one_data(0x3B); + gpio_lcd_9bit_emuspi_write_one_data(0x00); + gpio_lcd_9bit_emuspi_write_one_data(0x02); + gpio_lcd_9bit_emuspi_write_one_data(0x11); + + gpio_lcd_9bit_emuspi_write_one_index(0xC5); + gpio_lcd_9bit_emuspi_write_one_data(0x03); + + gpio_lcd_9bit_emuspi_write_one_index(0xC8); + gpio_lcd_9bit_emuspi_write_one_data(0x00); + gpio_lcd_9bit_emuspi_write_one_data(0x53); + gpio_lcd_9bit_emuspi_write_one_data(0x17); + gpio_lcd_9bit_emuspi_write_one_data(0x45); + gpio_lcd_9bit_emuspi_write_one_data(0x0A); + gpio_lcd_9bit_emuspi_write_one_data(0x1A); + gpio_lcd_9bit_emuspi_write_one_data(0x06); + gpio_lcd_9bit_emuspi_write_one_data(0x42); + gpio_lcd_9bit_emuspi_write_one_data(0x77); + gpio_lcd_9bit_emuspi_write_one_data(0x54); + gpio_lcd_9bit_emuspi_write_one_data(0x12); + gpio_lcd_9bit_emuspi_write_one_data(0x0C); + + gpio_lcd_9bit_emuspi_write_one_index(0x36); + gpio_lcd_9bit_emuspi_write_one_data(0x09); // MX,MY0x88ZTE_LCD_LKEJ_20110225_001,ZTE_LCD_LKEJ_20110307_001 + gpio_lcd_9bit_emuspi_write_one_index(0x3A); + gpio_lcd_9bit_emuspi_write_one_data(0x66); //18bit + + gpio_lcd_9bit_emuspi_write_one_index(0xF6); + gpio_lcd_9bit_emuspi_write_one_data(0xC0); + + gpio_lcd_9bit_emuspi_write_one_index(0xF3); + gpio_lcd_9bit_emuspi_write_one_data(0x24); + + gpio_lcd_9bit_emuspi_write_one_index(0xF4); + gpio_lcd_9bit_emuspi_write_one_data(0x24); + + msleep(120); + gpio_lcd_9bit_emuspi_write_one_index(0x11); //display_on + msleep(120); + gpio_lcd_9bit_emuspi_write_one_index(0x29); //display_on + msleep(100); + gpio_lcd_9bit_emuspi_write_one_index(0x10); //display_on + msleep(120); + gpio_lcd_9bit_emuspi_write_one_index(0x11); //display_on + msleep(120); + printk("lcd module TFT LEAD init finish\n!"); + return; + + gpio_lcd_ILI9481_emuspi_read_id_para(0x0A,&id1); + printk("gequn lead kernel after inital :0x%x\n!",id1); + if((id1&0xFF) != 0x1C) + { + gpio_direction_output(panel_reset, 1); + msleep(10); + gpio_direction_output(panel_reset, 0); + msleep(20); + gpio_direction_output(panel_reset, 1); + msleep(120); + gpio_lcd_9bit_emuspi_write_one_index(0x11); msleep(120); + gpio_lcd_9bit_emuspi_write_one_index(0xB4); + gpio_lcd_9bit_emuspi_write_one_data(0x11); gpio_lcd_9bit_emuspi_write_one_index(0xC6); - gpio_lcd_9bit_emuspi_write_one_data(0x9B); + gpio_lcd_9bit_emuspi_write_one_data(0x1B); //0x9B gpio_lcd_9bit_emuspi_write_one_index(0xD0); gpio_lcd_9bit_emuspi_write_one_data(0x07); - gpio_lcd_9bit_emuspi_write_one_data(0x47); + gpio_lcd_9bit_emuspi_write_one_data(0x44); //0x47 gpio_lcd_9bit_emuspi_write_one_data(0x1D); gpio_lcd_9bit_emuspi_write_one_index(0xD1); gpio_lcd_9bit_emuspi_write_one_data(0x00); - gpio_lcd_9bit_emuspi_write_one_data(0x3F);//10 + gpio_lcd_9bit_emuspi_write_one_data(0x39);//10 gpio_lcd_9bit_emuspi_write_one_data(0x14); gpio_lcd_9bit_emuspi_write_one_index(0xD2); gpio_lcd_9bit_emuspi_write_one_data(0x01); - gpio_lcd_9bit_emuspi_write_one_data(0x11); + gpio_lcd_9bit_emuspi_write_one_data(0x22); gpio_lcd_9bit_emuspi_write_one_index(0xC0); - gpio_lcd_9bit_emuspi_write_one_data(0x00);//04 + gpio_lcd_9bit_emuspi_write_one_data(0x10);//04 //0x00 gpio_lcd_9bit_emuspi_write_one_data(0x3B); gpio_lcd_9bit_emuspi_write_one_data(0x00); gpio_lcd_9bit_emuspi_write_one_data(0x02); @@ -377,6 +462,84 @@ static void lcdc_lead_init(void) gpio_lcd_9bit_emuspi_write_one_data(0x09); // MX,MY0x88ZTE_LCD_LKEJ_20110225_001,ZTE_LCD_LKEJ_20110307_001 gpio_lcd_9bit_emuspi_write_one_index(0x3A); gpio_lcd_9bit_emuspi_write_one_data(0x66); //18bit + msleep(120); + + gpio_lcd_9bit_emuspi_write_one_index(0x29); + msleep(100); + + printk("lcd module TFT LEAD init finish\n!"); + gpio_lcd_ILI9481_emuspi_read_id_para(0x0A,&id2); + printk("gequn lead kernel twice after inital :0x%x\n!",id2); + } + +} +//ZTE_LCD_LKEJ_20110127_001,start +static void lcdc_boe_init(void) +{ + gpio_lcd_9bit_emuspi_write_one_index(0xFF); + gpio_lcd_9bit_emuspi_write_one_index(0xFF); + mdelay(5); + gpio_lcd_9bit_emuspi_write_one_index(0xFF); + gpio_lcd_9bit_emuspi_write_one_index(0xFF); + gpio_lcd_9bit_emuspi_write_one_index(0xFF); + gpio_lcd_9bit_emuspi_write_one_index(0xFF); + mdelay(10); + + gpio_lcd_9bit_emuspi_write_one_index(0xB0); + gpio_lcd_9bit_emuspi_write_one_data(0x00); + gpio_lcd_9bit_emuspi_write_one_index(0xB3); + gpio_lcd_9bit_emuspi_write_one_data(0x02); + gpio_lcd_9bit_emuspi_write_one_data(0x00); + gpio_lcd_9bit_emuspi_write_one_data(0x00); + gpio_lcd_9bit_emuspi_write_one_data(0x10); + + gpio_lcd_9bit_emuspi_write_one_index(0xB4); + gpio_lcd_9bit_emuspi_write_one_data(0x11); + gpio_lcd_9bit_emuspi_write_one_index(0xC0); //Panel Driving Setting + gpio_lcd_9bit_emuspi_write_one_data(0x16); //13 + gpio_lcd_9bit_emuspi_write_one_data(0x3B); + gpio_lcd_9bit_emuspi_write_one_data(0x00); + gpio_lcd_9bit_emuspi_write_one_data(0x00); + gpio_lcd_9bit_emuspi_write_one_data(0x00); + gpio_lcd_9bit_emuspi_write_one_data(0x01); + gpio_lcd_9bit_emuspi_write_one_data(0x00); + gpio_lcd_9bit_emuspi_write_one_data(0x43); + gpio_lcd_9bit_emuspi_write_one_index(0xC1); + gpio_lcd_9bit_emuspi_write_one_data(0x08); + gpio_lcd_9bit_emuspi_write_one_data(0x12); //0x15 + gpio_lcd_9bit_emuspi_write_one_data(0x08); + gpio_lcd_9bit_emuspi_write_one_data(0x08); + gpio_lcd_9bit_emuspi_write_one_index(0xC4); + gpio_lcd_9bit_emuspi_write_one_data(0x15); + gpio_lcd_9bit_emuspi_write_one_data(0x03); + gpio_lcd_9bit_emuspi_write_one_data(0x03); + gpio_lcd_9bit_emuspi_write_one_data(0x01); + gpio_lcd_9bit_emuspi_write_one_index(0xC6); + gpio_lcd_9bit_emuspi_write_one_data(0x33);//0x02 + + gpio_lcd_9bit_emuspi_write_one_index(0xC8); + gpio_lcd_9bit_emuspi_write_one_data(0x0C); + gpio_lcd_9bit_emuspi_write_one_data(0x05); + gpio_lcd_9bit_emuspi_write_one_data(0x0A); + gpio_lcd_9bit_emuspi_write_one_data(0x6B); + gpio_lcd_9bit_emuspi_write_one_data(0x04); + gpio_lcd_9bit_emuspi_write_one_data(0x06); + gpio_lcd_9bit_emuspi_write_one_data(0x15); + gpio_lcd_9bit_emuspi_write_one_data(0x10); + gpio_lcd_9bit_emuspi_write_one_data(0x00); + gpio_lcd_9bit_emuspi_write_one_data(0x31); + gpio_lcd_9bit_emuspi_write_one_data(0x10); + gpio_lcd_9bit_emuspi_write_one_data(0x15); + gpio_lcd_9bit_emuspi_write_one_data(0x06); + gpio_lcd_9bit_emuspi_write_one_data(0x64); + gpio_lcd_9bit_emuspi_write_one_data(0x0B); + gpio_lcd_9bit_emuspi_write_one_data(0x0A); + gpio_lcd_9bit_emuspi_write_one_data(0x05); + gpio_lcd_9bit_emuspi_write_one_data(0x0C); + gpio_lcd_9bit_emuspi_write_one_data(0x31); + gpio_lcd_9bit_emuspi_write_one_data(0x00); + mdelay(100); + gpio_lcd_9bit_emuspi_write_one_index(0x2A); gpio_lcd_9bit_emuspi_write_one_data(0x00); gpio_lcd_9bit_emuspi_write_one_data(0x00); @@ -387,20 +550,40 @@ static void lcdc_lead_init(void) gpio_lcd_9bit_emuspi_write_one_data(0x00); gpio_lcd_9bit_emuspi_write_one_data(0x01); gpio_lcd_9bit_emuspi_write_one_data(0xDF); - msleep(120); - gpio_lcd_9bit_emuspi_write_one_index(0xB4); - gpio_lcd_9bit_emuspi_write_one_data(0x11); //DPI Interface (RGB),Internal system clock,ZTE_LCD_LKEJ_20110307_001 - gpio_lcd_9bit_emuspi_write_one_index(0x29); //display_on - gpio_lcd_9bit_emuspi_write_one_index(0x21); //Enter_invert_mode//0x20 - gpio_lcd_9bit_emuspi_write_one_index(0x2C); //Write_memory_start - msleep(100); + gpio_lcd_9bit_emuspi_write_one_index(0x35); + gpio_lcd_9bit_emuspi_write_one_data(0x00);//00 + gpio_lcd_9bit_emuspi_write_one_index(0x36); + gpio_lcd_9bit_emuspi_write_one_data(0x00); //set_address_modeZTE_LCD_LKEJ_20110225_001,ZTE_LCD_LKEJ_20110307_001 + gpio_lcd_9bit_emuspi_write_one_index(0x3A); + gpio_lcd_9bit_emuspi_write_one_data(0x66); //18bit + gpio_lcd_9bit_emuspi_write_one_index(0x44); + gpio_lcd_9bit_emuspi_write_one_data(0x00); + gpio_lcd_9bit_emuspi_write_one_data(0x01); //01 - printk("lcd module TFT LEAD init finish\n!"); -} -//ZTE_LCD_LKEJ_20110127_001,start -static void lcdc_boe_init(void) -{ + gpio_lcd_9bit_emuspi_write_one_index(0x11); + mdelay(150); + + gpio_lcd_9bit_emuspi_write_one_index(0xD0); + gpio_lcd_9bit_emuspi_write_one_data(0x07); + gpio_lcd_9bit_emuspi_write_one_data(0x07); + gpio_lcd_9bit_emuspi_write_one_data(0x14); + gpio_lcd_9bit_emuspi_write_one_data(0xA2); + gpio_lcd_9bit_emuspi_write_one_index(0xD1); + gpio_lcd_9bit_emuspi_write_one_data(0x03); + gpio_lcd_9bit_emuspi_write_one_data(0x2D); //0x39 //0x35 //0x2D + gpio_lcd_9bit_emuspi_write_one_data(0x0A); + gpio_lcd_9bit_emuspi_write_one_index(0xD2); + gpio_lcd_9bit_emuspi_write_one_data(0x03); + gpio_lcd_9bit_emuspi_write_one_data(0x04); + gpio_lcd_9bit_emuspi_write_one_data(0x04); + + gpio_lcd_9bit_emuspi_write_one_index(0x29); + gpio_lcd_9bit_emuspi_write_one_index(0x2C); + + printk("[hp@lcd&fb]:lcd module BOE init exit\n!"); + +#if 0 gpio_lcd_9bit_emuspi_write_one_index(0xB0); gpio_lcd_9bit_emuspi_write_one_data(0x00); gpio_lcd_9bit_emuspi_write_one_index(0xB3); @@ -422,7 +605,7 @@ static void lcdc_boe_init(void) gpio_lcd_9bit_emuspi_write_one_data(0x43); gpio_lcd_9bit_emuspi_write_one_index(0xC1); gpio_lcd_9bit_emuspi_write_one_data(0x08); - gpio_lcd_9bit_emuspi_write_one_data(0x15); + gpio_lcd_9bit_emuspi_write_one_data(0x12); //0x15 gpio_lcd_9bit_emuspi_write_one_data(0x08); gpio_lcd_9bit_emuspi_write_one_data(0x08); gpio_lcd_9bit_emuspi_write_one_index(0xC4); @@ -484,7 +667,7 @@ static void lcdc_boe_init(void) gpio_lcd_9bit_emuspi_write_one_data(0xA2); gpio_lcd_9bit_emuspi_write_one_index(0xD1); gpio_lcd_9bit_emuspi_write_one_data(0x03); - gpio_lcd_9bit_emuspi_write_one_data(0x39); + gpio_lcd_9bit_emuspi_write_one_data(0x35); //0x39 gpio_lcd_9bit_emuspi_write_one_data(0x0A); gpio_lcd_9bit_emuspi_write_one_index(0xD2); gpio_lcd_9bit_emuspi_write_one_data(0x03); @@ -499,6 +682,7 @@ static void lcdc_boe_init(void) msleep(100); printk("[hp@lcd&fb]:lcd module BOE init exit\n!"); + #endif } void lcdc_truly_er_init(void) { diff --git a/drivers/video/msm/lcdc_panel_qvga725A.c b/drivers/video/msm/lcdc_panel_qvga725A.c index 62550301..d4f0b3f7 100644 --- a/drivers/video/msm/lcdc_panel_qvga725A.c +++ b/drivers/video/msm/lcdc_panel_qvga725A.c @@ -114,9 +114,9 @@ static void lcdc_set_bl(struct msm_fb_data_type *mfd) { new_bl_level = 0; } - if (new_bl_level > 15) //ZTE_LCD_LKEJ_20110422_001 + if (new_bl_level > 12) //ZTE_LCD_LKEJ_20110422_001 { - new_bl_level = 15;//ZTE_LCD_LKEJ_20110425_001 + new_bl_level = 12;//ZTE_LCD_LKEJ_20110425_001 } if(0 == new_bl_level) @@ -519,7 +519,7 @@ void lcd_panel_init(void) } static struct msm_fb_panel_data lcdc_tft_panel_data = { - .panel_info = {.bl_max = 15},//ZTE_LCD_LKEJ_20110425_001 + .panel_info = {.bl_max = 12},//ZTE_LCD_LKEJ_20110425_001 .on = lcdc_panel_on, .off = lcdc_panel_off, .set_backlight = lcdc_set_bl, diff --git a/drivers/video/msm/lcdc_panel_qvga_himax.c b/drivers/video/msm/lcdc_panel_qvga_himax.c index cd776acb..cd97c3f9 100644 --- a/drivers/video/msm/lcdc_panel_qvga_himax.c +++ b/drivers/video/msm/lcdc_panel_qvga_himax.c @@ -210,6 +210,7 @@ static void lcdc_himax_init(void) gpio_lcd_emuspi_write_one_para(0x31, 0x03); /* RGB interface control */ gpio_lcd_emuspi_write_one_para(0x32, 0xCE); + msleep(150); pr_debug("lcd module himax init exit\n!"); diff --git a/drivers/video/msm/lcdc_panel_qvga_lead.c b/drivers/video/msm/lcdc_panel_qvga_lead.c index 32b9a1a5..4320139e 100644 --- a/drivers/video/msm/lcdc_panel_qvga_lead.c +++ b/drivers/video/msm/lcdc_panel_qvga_lead.c @@ -189,6 +189,7 @@ static void lcdc_lead_init(void) gpio_lcd_emuspi_write_one_para(0x0007,0x0133); /* 262K color and display ON */ gpio_lcd_emuspi_write_one_para(0x000C,0x0100); /* RGB interface setting */ + msleep(150); pr_debug("lcd module lead init exit\n!"); } diff --git a/drivers/video/msm/lcdc_panel_qvga_samsung.c b/drivers/video/msm/lcdc_panel_qvga_samsung.c index 132c7b5c..b4338cf8 100644 --- a/drivers/video/msm/lcdc_panel_qvga_samsung.c +++ b/drivers/video/msm/lcdc_panel_qvga_samsung.c @@ -149,6 +149,7 @@ static void lcdc_samsung_init(void) //display on gpio_lcd_emuspi_write_more_para(0,0x29); + msleep(150); pr_debug("lcd module samsung init exit!\n"); diff --git a/drivers/video/msm/lcdc_panel_wvga_oled.c b/drivers/video/msm/lcdc_panel_wvga_oled.c index 6fed82a0..91b95207 100644 --- a/drivers/video/msm/lcdc_panel_wvga_oled.c +++ b/drivers/video/msm/lcdc_panel_wvga_oled.c @@ -1996,7 +1996,7 @@ void lcdc_leadcmi_init(void) SPI_Start(); //Set_CYC gpio_lcd_truly_emuspi_write_one_index(0xB4); - gpio_lcd_truly_emuspi_write_one_data(0x08); + gpio_lcd_truly_emuspi_write_one_data(0x00); gpio_lcd_truly_emuspi_write_one_data(0x12); gpio_lcd_truly_emuspi_write_one_data(0x72); gpio_lcd_truly_emuspi_write_one_data(0x12); @@ -2228,7 +2228,7 @@ void lcdc_leadcasio_init(void) SPI_Start(); gpio_lcd_truly_emuspi_write_one_index(0xB4); //Set_CYC - gpio_lcd_truly_emuspi_write_one_data(0x08); // + gpio_lcd_truly_emuspi_write_one_data(0x00); // gpio_lcd_truly_emuspi_write_one_data(0x08); //03 gpio_lcd_truly_emuspi_write_one_data(0x6E); gpio_lcd_truly_emuspi_write_one_data(0x07); @@ -2574,7 +2574,7 @@ void lcdc_trulylg_init(void) SPI_Start(); gpio_lcd_truly_emuspi_write_one_index(0xb4); // set display 480x800 - gpio_lcd_truly_emuspi_write_one_data(0x01); + gpio_lcd_truly_emuspi_write_one_data(0x00); gpio_lcd_truly_emuspi_write_one_data(0x0c); gpio_lcd_truly_emuspi_write_one_data(0xa0); gpio_lcd_truly_emuspi_write_one_data(0x0e); diff --git a/drivers/video/msm/lcdc_panel_wvga_p736v.c b/drivers/video/msm/lcdc_panel_wvga_p736v.c index 5d8b2e7c..190c5097 100644 --- a/drivers/video/msm/lcdc_panel_wvga_p736v.c +++ b/drivers/video/msm/lcdc_panel_wvga_p736v.c @@ -1042,6 +1042,289 @@ void lcdc_truly_init(void) { //intial code for HX8369-A+hydis 7-5 #if 1 + mdelay(10); + + SPI_Start(); + gpio_lcd_truly_emuspi_write_one_index(0xB9); // SET password + gpio_lcd_truly_emuspi_write_one_data(0xFF); + gpio_lcd_truly_emuspi_write_one_data(0x83); + gpio_lcd_truly_emuspi_write_one_data(0x69); + SPI_Stop(); + + SPI_Start(); + gpio_lcd_truly_emuspi_write_one_index(0x36); + gpio_lcd_truly_emuspi_write_one_data(0x00); // GBR MODE + SPI_Stop(); + + SPI_Start(); + gpio_lcd_truly_emuspi_write_one_index(0xB1); //Set Power + gpio_lcd_truly_emuspi_write_one_data(0x85); + gpio_lcd_truly_emuspi_write_one_data(0x00); + gpio_lcd_truly_emuspi_write_one_data(0x34); + gpio_lcd_truly_emuspi_write_one_data(0x0A); + gpio_lcd_truly_emuspi_write_one_data(0x00); + gpio_lcd_truly_emuspi_write_one_data(0x0F); + gpio_lcd_truly_emuspi_write_one_data(0x0F); + gpio_lcd_truly_emuspi_write_one_data(0x2A); + gpio_lcd_truly_emuspi_write_one_data(0x32); + gpio_lcd_truly_emuspi_write_one_data(0x3F); + gpio_lcd_truly_emuspi_write_one_data(0x3F); + gpio_lcd_truly_emuspi_write_one_data(0x01); + gpio_lcd_truly_emuspi_write_one_data(0x23); + gpio_lcd_truly_emuspi_write_one_data(0x01); + gpio_lcd_truly_emuspi_write_one_data(0xE6); + gpio_lcd_truly_emuspi_write_one_data(0xE6); + gpio_lcd_truly_emuspi_write_one_data(0xE6); + gpio_lcd_truly_emuspi_write_one_data(0xE6); + gpio_lcd_truly_emuspi_write_one_data(0xE6); + SPI_Stop(); + SPI_Start(); + gpio_lcd_truly_emuspi_write_one_index(0xB2); // SET Display 480x800 + gpio_lcd_truly_emuspi_write_one_data(0x00); + gpio_lcd_truly_emuspi_write_one_data(0x23); + gpio_lcd_truly_emuspi_write_one_data(0x05); + gpio_lcd_truly_emuspi_write_one_data(0x05); + gpio_lcd_truly_emuspi_write_one_data(0x70); + gpio_lcd_truly_emuspi_write_one_data(0x00); + gpio_lcd_truly_emuspi_write_one_data(0xFF); + gpio_lcd_truly_emuspi_write_one_data(0x00); + gpio_lcd_truly_emuspi_write_one_data(0x00); + gpio_lcd_truly_emuspi_write_one_data(0x00); + gpio_lcd_truly_emuspi_write_one_data(0x00); + gpio_lcd_truly_emuspi_write_one_data(0x03); + gpio_lcd_truly_emuspi_write_one_data(0x03); + gpio_lcd_truly_emuspi_write_one_data(0x00); + gpio_lcd_truly_emuspi_write_one_data(0x01); + SPI_Stop(); + SPI_Start(); + gpio_lcd_truly_emuspi_write_one_index(0xB4); // SET Display waveform cycles + gpio_lcd_truly_emuspi_write_one_data(0x00); + gpio_lcd_truly_emuspi_write_one_data(0x18); + gpio_lcd_truly_emuspi_write_one_data(0x80); + gpio_lcd_truly_emuspi_write_one_data(0x06); + gpio_lcd_truly_emuspi_write_one_data(0x02); + SPI_Stop(); + SPI_Start(); + gpio_lcd_truly_emuspi_write_one_index(0xB6); // SET VCOM + gpio_lcd_truly_emuspi_write_one_data(0x3A); + gpio_lcd_truly_emuspi_write_one_data(0x3A); + SPI_Stop(); + SPI_Start(); + gpio_lcd_truly_emuspi_write_one_index(0xD5); // SET GIP + gpio_lcd_truly_emuspi_write_one_data(0x00); + gpio_lcd_truly_emuspi_write_one_data(0x03); + gpio_lcd_truly_emuspi_write_one_data(0x03); + gpio_lcd_truly_emuspi_write_one_data(0x00); + gpio_lcd_truly_emuspi_write_one_data(0x01); + gpio_lcd_truly_emuspi_write_one_data(0x04); + gpio_lcd_truly_emuspi_write_one_data(0x28); + gpio_lcd_truly_emuspi_write_one_data(0x70); + gpio_lcd_truly_emuspi_write_one_data(0x11); + gpio_lcd_truly_emuspi_write_one_data(0x13); + gpio_lcd_truly_emuspi_write_one_data(0x00); + gpio_lcd_truly_emuspi_write_one_data(0x00); + gpio_lcd_truly_emuspi_write_one_data(0x40); + gpio_lcd_truly_emuspi_write_one_data(0x06); + gpio_lcd_truly_emuspi_write_one_data(0x51); + gpio_lcd_truly_emuspi_write_one_data(0x07); + gpio_lcd_truly_emuspi_write_one_data(0x00); + gpio_lcd_truly_emuspi_write_one_data(0x00); + gpio_lcd_truly_emuspi_write_one_data(0x41); + gpio_lcd_truly_emuspi_write_one_data(0x06); + gpio_lcd_truly_emuspi_write_one_data(0x50); + gpio_lcd_truly_emuspi_write_one_data(0x07); + gpio_lcd_truly_emuspi_write_one_data(0x07); + gpio_lcd_truly_emuspi_write_one_data(0x0F); + gpio_lcd_truly_emuspi_write_one_data(0x04); + gpio_lcd_truly_emuspi_write_one_data(0x00); + SPI_Stop(); + + SPI_Start(); + gpio_lcd_truly_emuspi_write_one_index(0xE0); //SET GAMMA 2.2 + gpio_lcd_truly_emuspi_write_one_data(0x00); + gpio_lcd_truly_emuspi_write_one_data(0x13); + gpio_lcd_truly_emuspi_write_one_data(0x19); + gpio_lcd_truly_emuspi_write_one_data(0x38); + gpio_lcd_truly_emuspi_write_one_data(0x3D); + gpio_lcd_truly_emuspi_write_one_data(0x3F); + gpio_lcd_truly_emuspi_write_one_data(0x28); + gpio_lcd_truly_emuspi_write_one_data(0x46); + gpio_lcd_truly_emuspi_write_one_data(0x07); + gpio_lcd_truly_emuspi_write_one_data(0x0D); + gpio_lcd_truly_emuspi_write_one_data(0x0E); + gpio_lcd_truly_emuspi_write_one_data(0x12); + gpio_lcd_truly_emuspi_write_one_data(0x15); + gpio_lcd_truly_emuspi_write_one_data(0x12); + gpio_lcd_truly_emuspi_write_one_data(0x14); + gpio_lcd_truly_emuspi_write_one_data(0x0F); + gpio_lcd_truly_emuspi_write_one_data(0x17); + gpio_lcd_truly_emuspi_write_one_data(0x00); + gpio_lcd_truly_emuspi_write_one_data(0x13); + gpio_lcd_truly_emuspi_write_one_data(0x19); + gpio_lcd_truly_emuspi_write_one_data(0x38); + gpio_lcd_truly_emuspi_write_one_data(0x3D); + gpio_lcd_truly_emuspi_write_one_data(0x3F); + gpio_lcd_truly_emuspi_write_one_data(0x28); + gpio_lcd_truly_emuspi_write_one_data(0x46); + gpio_lcd_truly_emuspi_write_one_data(0x07); + gpio_lcd_truly_emuspi_write_one_data(0x0D); + gpio_lcd_truly_emuspi_write_one_data(0x0E); + gpio_lcd_truly_emuspi_write_one_data(0x12); + gpio_lcd_truly_emuspi_write_one_data(0x15); + gpio_lcd_truly_emuspi_write_one_data(0x12); + gpio_lcd_truly_emuspi_write_one_data(0x14); + gpio_lcd_truly_emuspi_write_one_data(0x0F); + gpio_lcd_truly_emuspi_write_one_data(0x17); + SPI_Stop(); + SPI_Start(); + gpio_lcd_truly_emuspi_write_one_index(0xC1); //SET DGC + gpio_lcd_truly_emuspi_write_one_data(0x01); + gpio_lcd_truly_emuspi_write_one_data(0x04); + gpio_lcd_truly_emuspi_write_one_data(0x13); + gpio_lcd_truly_emuspi_write_one_data(0x1A); + gpio_lcd_truly_emuspi_write_one_data(0x20); + gpio_lcd_truly_emuspi_write_one_data(0x27); + gpio_lcd_truly_emuspi_write_one_data(0x2C); + gpio_lcd_truly_emuspi_write_one_data(0x32); + gpio_lcd_truly_emuspi_write_one_data(0x36); + gpio_lcd_truly_emuspi_write_one_data(0x3F); + gpio_lcd_truly_emuspi_write_one_data(0x47); + gpio_lcd_truly_emuspi_write_one_data(0x50); + gpio_lcd_truly_emuspi_write_one_data(0x59); + gpio_lcd_truly_emuspi_write_one_data(0x60); + gpio_lcd_truly_emuspi_write_one_data(0x68); + gpio_lcd_truly_emuspi_write_one_data(0x71); + gpio_lcd_truly_emuspi_write_one_data(0x7B); + gpio_lcd_truly_emuspi_write_one_data(0x82); + gpio_lcd_truly_emuspi_write_one_data(0x89); + gpio_lcd_truly_emuspi_write_one_data(0x91); + gpio_lcd_truly_emuspi_write_one_data(0x98); + gpio_lcd_truly_emuspi_write_one_data(0xA0); + gpio_lcd_truly_emuspi_write_one_data(0xA8); + gpio_lcd_truly_emuspi_write_one_data(0xB0); + gpio_lcd_truly_emuspi_write_one_data(0xB8); + gpio_lcd_truly_emuspi_write_one_data(0xC1); + gpio_lcd_truly_emuspi_write_one_data(0xC9); + gpio_lcd_truly_emuspi_write_one_data(0xD0); + gpio_lcd_truly_emuspi_write_one_data(0xD7); + gpio_lcd_truly_emuspi_write_one_data(0xE0); + gpio_lcd_truly_emuspi_write_one_data(0xE7); + gpio_lcd_truly_emuspi_write_one_data(0xEF); + gpio_lcd_truly_emuspi_write_one_data(0xF7); + gpio_lcd_truly_emuspi_write_one_data(0xFE); + gpio_lcd_truly_emuspi_write_one_data(0xCF); + gpio_lcd_truly_emuspi_write_one_data(0x52); + gpio_lcd_truly_emuspi_write_one_data(0x34); + gpio_lcd_truly_emuspi_write_one_data(0xF8); + gpio_lcd_truly_emuspi_write_one_data(0x51); + gpio_lcd_truly_emuspi_write_one_data(0xF5); + gpio_lcd_truly_emuspi_write_one_data(0x9D); + gpio_lcd_truly_emuspi_write_one_data(0x75); + gpio_lcd_truly_emuspi_write_one_data(0x00); + gpio_lcd_truly_emuspi_write_one_data(0x04); + gpio_lcd_truly_emuspi_write_one_data(0x13); + gpio_lcd_truly_emuspi_write_one_data(0x1A); + gpio_lcd_truly_emuspi_write_one_data(0x20); + gpio_lcd_truly_emuspi_write_one_data(0x27); + gpio_lcd_truly_emuspi_write_one_data(0x2C); + gpio_lcd_truly_emuspi_write_one_data(0x32); + gpio_lcd_truly_emuspi_write_one_data(0x36); + gpio_lcd_truly_emuspi_write_one_data(0x3F); + gpio_lcd_truly_emuspi_write_one_data(0x47); + gpio_lcd_truly_emuspi_write_one_data(0x50); + gpio_lcd_truly_emuspi_write_one_data(0x59); + gpio_lcd_truly_emuspi_write_one_data(0x60); + gpio_lcd_truly_emuspi_write_one_data(0x68); + gpio_lcd_truly_emuspi_write_one_data(0x71); + gpio_lcd_truly_emuspi_write_one_data(0x7B); + gpio_lcd_truly_emuspi_write_one_data(0x82); + gpio_lcd_truly_emuspi_write_one_data(0x89); + gpio_lcd_truly_emuspi_write_one_data(0x91); + gpio_lcd_truly_emuspi_write_one_data(0x98); + gpio_lcd_truly_emuspi_write_one_data(0xA0); + gpio_lcd_truly_emuspi_write_one_data(0xA8); + gpio_lcd_truly_emuspi_write_one_data(0xB0); + gpio_lcd_truly_emuspi_write_one_data(0xB8); + gpio_lcd_truly_emuspi_write_one_data(0xC1); + gpio_lcd_truly_emuspi_write_one_data(0xC9); + gpio_lcd_truly_emuspi_write_one_data(0xD0); + gpio_lcd_truly_emuspi_write_one_data(0xD7); + gpio_lcd_truly_emuspi_write_one_data(0xE0); + gpio_lcd_truly_emuspi_write_one_data(0xE7); + gpio_lcd_truly_emuspi_write_one_data(0xEF); + gpio_lcd_truly_emuspi_write_one_data(0xF7); + gpio_lcd_truly_emuspi_write_one_data(0xFE); + gpio_lcd_truly_emuspi_write_one_data(0xCF); + gpio_lcd_truly_emuspi_write_one_data(0x52); + gpio_lcd_truly_emuspi_write_one_data(0x34); + gpio_lcd_truly_emuspi_write_one_data(0xF8); + gpio_lcd_truly_emuspi_write_one_data(0x51); + gpio_lcd_truly_emuspi_write_one_data(0xF5); + gpio_lcd_truly_emuspi_write_one_data(0x9D); + gpio_lcd_truly_emuspi_write_one_data(0x75); + gpio_lcd_truly_emuspi_write_one_data(0x00); + gpio_lcd_truly_emuspi_write_one_data(0x04); + gpio_lcd_truly_emuspi_write_one_data(0x13); + gpio_lcd_truly_emuspi_write_one_data(0x1A); + gpio_lcd_truly_emuspi_write_one_data(0x20); + gpio_lcd_truly_emuspi_write_one_data(0x27); + gpio_lcd_truly_emuspi_write_one_data(0x2C); + gpio_lcd_truly_emuspi_write_one_data(0x32); + gpio_lcd_truly_emuspi_write_one_data(0x36); + gpio_lcd_truly_emuspi_write_one_data(0x3F); + gpio_lcd_truly_emuspi_write_one_data(0x47); + gpio_lcd_truly_emuspi_write_one_data(0x50); + gpio_lcd_truly_emuspi_write_one_data(0x59); + gpio_lcd_truly_emuspi_write_one_data(0x60); + gpio_lcd_truly_emuspi_write_one_data(0x68); + gpio_lcd_truly_emuspi_write_one_data(0x71); + gpio_lcd_truly_emuspi_write_one_data(0x7B); + gpio_lcd_truly_emuspi_write_one_data(0x82); + gpio_lcd_truly_emuspi_write_one_data(0x89); + gpio_lcd_truly_emuspi_write_one_data(0x91); + gpio_lcd_truly_emuspi_write_one_data(0x98); + gpio_lcd_truly_emuspi_write_one_data(0xA0); + gpio_lcd_truly_emuspi_write_one_data(0xA8); + gpio_lcd_truly_emuspi_write_one_data(0xB0); + gpio_lcd_truly_emuspi_write_one_data(0xB8); + gpio_lcd_truly_emuspi_write_one_data(0xC1); + gpio_lcd_truly_emuspi_write_one_data(0xC9); + gpio_lcd_truly_emuspi_write_one_data(0xD0); + gpio_lcd_truly_emuspi_write_one_data(0xD7); + gpio_lcd_truly_emuspi_write_one_data(0xE0); + gpio_lcd_truly_emuspi_write_one_data(0xE7); + gpio_lcd_truly_emuspi_write_one_data(0xEF); + gpio_lcd_truly_emuspi_write_one_data(0xF7); + gpio_lcd_truly_emuspi_write_one_data(0xFE); + gpio_lcd_truly_emuspi_write_one_data(0xCF); + gpio_lcd_truly_emuspi_write_one_data(0x52); + gpio_lcd_truly_emuspi_write_one_data(0x34); + gpio_lcd_truly_emuspi_write_one_data(0xF8); + gpio_lcd_truly_emuspi_write_one_data(0x51); + gpio_lcd_truly_emuspi_write_one_data(0xF5); + gpio_lcd_truly_emuspi_write_one_data(0x9D); + gpio_lcd_truly_emuspi_write_one_data(0x75); + gpio_lcd_truly_emuspi_write_one_data(0x00); + SPI_Stop(); + SPI_Start(); + gpio_lcd_truly_emuspi_write_one_index(0xB3); // SET Display 480x800 + gpio_lcd_truly_emuspi_write_one_data(0x0f); + SPI_Stop(); + SPI_Start(); + gpio_lcd_truly_emuspi_write_one_index(0x3A); //SET pixel format 24-bit + gpio_lcd_truly_emuspi_write_one_data(0x66); + SPI_Stop(); + SPI_Start(); + gpio_lcd_truly_emuspi_write_one_index(0x11); // sleep out command + mdelay(120); + SPI_Stop(); + SPI_Start(); + gpio_lcd_truly_emuspi_write_one_index(0x29); // display on command + SPI_Stop(); +printk(" gequn lcd module hydis 736v init finish\n!"); +#endif + +#if 0 SPI_Start(); gpio_lcd_truly_emuspi_write_one_index(0xB9); // SET password gpio_lcd_truly_emuspi_write_one_data(0xFF); @@ -1939,7 +2222,7 @@ SPI_Start(); //gamma 1 printk("lcd module TFT TRULY init finish\n!"); } -#if 1 //yashi + void lcdc_leadcpt_init(void) { #if 1 @@ -2056,1284 +2339,17 @@ void lcdc_leadcpt_init(void) mdelay(10); #endif -#if 0 - - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xB9); //Set_EXTC - gpio_lcd_truly_emuspi_write_one_data(0xFF); // - gpio_lcd_truly_emuspi_write_one_data(0x83); // - gpio_lcd_truly_emuspi_write_one_data(0x63); // - - SPI_Stop(); - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xB1); //Set_POWER - gpio_lcd_truly_emuspi_write_one_data(0x78); // - gpio_lcd_truly_emuspi_write_one_data(0x24); // - gpio_lcd_truly_emuspi_write_one_data(0x04); // - gpio_lcd_truly_emuspi_write_one_data(0x02); // - gpio_lcd_truly_emuspi_write_one_data(0x02); // - gpio_lcd_truly_emuspi_write_one_data(0x03); // - gpio_lcd_truly_emuspi_write_one_data(0x10); // - gpio_lcd_truly_emuspi_write_one_data(0x10); // - gpio_lcd_truly_emuspi_write_one_data(0x34); // - gpio_lcd_truly_emuspi_write_one_data(0x3C); // - gpio_lcd_truly_emuspi_write_one_data(0x3F); // - gpio_lcd_truly_emuspi_write_one_data(0x3F); // - - SPI_Stop(); - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0x11); - - SPI_Stop(); - mdelay(150); - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0x3A); //COLMOD - //gpio_lcd_truly_emuspi_write_one_data(0x77); //24bit - gpio_lcd_truly_emuspi_write_one_data(0x66); //18bit +} - SPI_Stop(); - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xB3); //Set_RGBIF - gpio_lcd_truly_emuspi_write_one_data(0x0f); // - SPI_Stop(); - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xB4); //Set_CYC - gpio_lcd_truly_emuspi_write_one_data(0x00); // - gpio_lcd_truly_emuspi_write_one_data(0x08); //03 - gpio_lcd_truly_emuspi_write_one_data(0x6E); - gpio_lcd_truly_emuspi_write_one_data(0x07); - gpio_lcd_truly_emuspi_write_one_data(0x01); - gpio_lcd_truly_emuspi_write_one_data(0x01); - gpio_lcd_truly_emuspi_write_one_data(0x62); - gpio_lcd_truly_emuspi_write_one_data(0x01); - gpio_lcd_truly_emuspi_write_one_data(0x57); - - SPI_Stop(); - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xB6); //Set_VCOM - //gpio_lcd_truly_emuspi_write_one_data(0x3C); // - gpio_lcd_truly_emuspi_write_one_data(0x42); - - SPI_Stop(); - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xCC); //Set_PANEL - gpio_lcd_truly_emuspi_write_one_data(0x0B); // - - SPI_Stop(); - mdelay(50); - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xE0); //Gamma 2.2 - gpio_lcd_truly_emuspi_write_one_data(0x01); // - gpio_lcd_truly_emuspi_write_one_data(0x48); // 1E - gpio_lcd_truly_emuspi_write_one_data(0x4D); //23 - gpio_lcd_truly_emuspi_write_one_data(0x4E); // - gpio_lcd_truly_emuspi_write_one_data(0x58); // - gpio_lcd_truly_emuspi_write_one_data(0xF6); // - gpio_lcd_truly_emuspi_write_one_data(0x0B); // - gpio_lcd_truly_emuspi_write_one_data(0x4E); // - gpio_lcd_truly_emuspi_write_one_data(0x12); // - gpio_lcd_truly_emuspi_write_one_data(0xD5); // - gpio_lcd_truly_emuspi_write_one_data(0x15); // - gpio_lcd_truly_emuspi_write_one_data(0x95); // - gpio_lcd_truly_emuspi_write_one_data(0x55); // - gpio_lcd_truly_emuspi_write_one_data(0x8E); // - gpio_lcd_truly_emuspi_write_one_data(0x11); // - gpio_lcd_truly_emuspi_write_one_data(0x01); // - gpio_lcd_truly_emuspi_write_one_data(0x48); // - gpio_lcd_truly_emuspi_write_one_data(0x4D); // - gpio_lcd_truly_emuspi_write_one_data(0x55); // - gpio_lcd_truly_emuspi_write_one_data(0x5F); // - gpio_lcd_truly_emuspi_write_one_data(0xFD); // - gpio_lcd_truly_emuspi_write_one_data(0x0A); // - gpio_lcd_truly_emuspi_write_one_data(0x4E); // - gpio_lcd_truly_emuspi_write_one_data(0x51); // - gpio_lcd_truly_emuspi_write_one_data(0xD3); // - gpio_lcd_truly_emuspi_write_one_data(0x17); // - gpio_lcd_truly_emuspi_write_one_data(0x95); // - gpio_lcd_truly_emuspi_write_one_data(0x96); // - gpio_lcd_truly_emuspi_write_one_data(0x4E); // - gpio_lcd_truly_emuspi_write_one_data(0x11); // - - - SPI_Stop(); - mdelay(50); - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0x21); //INVON - SPI_Stop(); - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0x36); - //gpio_lcd_truly_emuspi_write_one_data(0x08); - gpio_lcd_truly_emuspi_write_one_data(0x09); //09:GS=1 - SPI_Stop(); - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0x29); - SPI_Stop(); - #endif -} -#else -static void lcdc_leadcpt_init(void) -{ -#if 0 - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xB9); - gpio_lcd_truly_emuspi_write_one_data(0xFF); - gpio_lcd_truly_emuspi_write_one_data(0x83); - gpio_lcd_truly_emuspi_write_one_data(0x63); - -//Set_POWER - SPI_Stop(); - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xB1); - gpio_lcd_truly_emuspi_write_one_data(0x81); - gpio_lcd_truly_emuspi_write_one_data(0x30); - gpio_lcd_truly_emuspi_write_one_data(0x07); - gpio_lcd_truly_emuspi_write_one_data(0x33); - gpio_lcd_truly_emuspi_write_one_data(0x02); - gpio_lcd_truly_emuspi_write_one_data(0x13); - gpio_lcd_truly_emuspi_write_one_data(0x11); - gpio_lcd_truly_emuspi_write_one_data(0x00); - gpio_lcd_truly_emuspi_write_one_data(0x35); - gpio_lcd_truly_emuspi_write_one_data(0x3E); - gpio_lcd_truly_emuspi_write_one_data(0x16); - gpio_lcd_truly_emuspi_write_one_data(0x16); - -//Sleep Out - SPI_Stop(); - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0x11); -//Set COLMOD - SPI_Stop(); - mdelay(150); - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0x3A); - gpio_lcd_truly_emuspi_write_one_data(0x60); - -//Set_RGBIF - SPI_Stop(); - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xB3); - gpio_lcd_truly_emuspi_write_one_data(0x0f); - -//Set_CYC - SPI_Stop(); - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xB4); - gpio_lcd_truly_emuspi_write_one_data(0x00); - gpio_lcd_truly_emuspi_write_one_data(0x03); - gpio_lcd_truly_emuspi_write_one_data(0x7E); - gpio_lcd_truly_emuspi_write_one_data(0x02); - gpio_lcd_truly_emuspi_write_one_data(0x01); - gpio_lcd_truly_emuspi_write_one_data(0x12); - gpio_lcd_truly_emuspi_write_one_data(0x64); - gpio_lcd_truly_emuspi_write_one_data(0x01); - gpio_lcd_truly_emuspi_write_one_data(0x60); - -//Set_VCOM - SPI_Stop(); - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xB6); - gpio_lcd_truly_emuspi_write_one_data(0x42); - -//Set_PANEL - SPI_Stop(); - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xCC); - gpio_lcd_truly_emuspi_write_one_data(0x0B); -//Set Gamma 2.2 - SPI_Stop(); - mdelay(5); - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xE0); - gpio_lcd_truly_emuspi_write_one_data(0x00); - gpio_lcd_truly_emuspi_write_one_data(0x45); - gpio_lcd_truly_emuspi_write_one_data(0x0A); - gpio_lcd_truly_emuspi_write_one_data(0xB2); - gpio_lcd_truly_emuspi_write_one_data(0xB6); - gpio_lcd_truly_emuspi_write_one_data(0x3F); - gpio_lcd_truly_emuspi_write_one_data(0x07); - gpio_lcd_truly_emuspi_write_one_data(0x8D); - gpio_lcd_truly_emuspi_write_one_data(0x0F); - gpio_lcd_truly_emuspi_write_one_data(0x14); - gpio_lcd_truly_emuspi_write_one_data(0x17); - gpio_lcd_truly_emuspi_write_one_data(0xD5); - gpio_lcd_truly_emuspi_write_one_data(0xD7); - gpio_lcd_truly_emuspi_write_one_data(0x95); - gpio_lcd_truly_emuspi_write_one_data(0x19); - gpio_lcd_truly_emuspi_write_one_data(0x00); - gpio_lcd_truly_emuspi_write_one_data(0x45); - gpio_lcd_truly_emuspi_write_one_data(0x0A); - gpio_lcd_truly_emuspi_write_one_data(0xB2); - gpio_lcd_truly_emuspi_write_one_data(0xB6); - gpio_lcd_truly_emuspi_write_one_data(0x3F); - gpio_lcd_truly_emuspi_write_one_data(0x07); - gpio_lcd_truly_emuspi_write_one_data(0x8D); - gpio_lcd_truly_emuspi_write_one_data(0x0F); - gpio_lcd_truly_emuspi_write_one_data(0x14); - gpio_lcd_truly_emuspi_write_one_data(0x17); - gpio_lcd_truly_emuspi_write_one_data(0xD5); - gpio_lcd_truly_emuspi_write_one_data(0xD7); - gpio_lcd_truly_emuspi_write_one_data(0x95); - gpio_lcd_truly_emuspi_write_one_data(0x19); -//Display On - SPI_Stop(); - mdelay(5); - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0x29); - SPI_Stop(); -#endif -#if 1 - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xB9); //Set_EXTC - gpio_lcd_truly_emuspi_write_one_data(0xFF); // - gpio_lcd_truly_emuspi_write_one_data(0x83); // - gpio_lcd_truly_emuspi_write_one_data(0x63); // - - SPI_Stop(); - - SPI_Start(); - - gpio_lcd_truly_emuspi_write_one_index(0xB1); //Set_POWER - gpio_lcd_truly_emuspi_write_one_data(0x81); // - gpio_lcd_truly_emuspi_write_one_data(0x30); // - gpio_lcd_truly_emuspi_write_one_data(0x07); // - gpio_lcd_truly_emuspi_write_one_data(0x33); // - gpio_lcd_truly_emuspi_write_one_data(0x01); // 02 - gpio_lcd_truly_emuspi_write_one_data(0x10); // 10 - gpio_lcd_truly_emuspi_write_one_data(0x11); // - gpio_lcd_truly_emuspi_write_one_data(0x00); // - gpio_lcd_truly_emuspi_write_one_data(0x35); // - gpio_lcd_truly_emuspi_write_one_data(0x3E); // - gpio_lcd_truly_emuspi_write_one_data(0x1A); // 16 - gpio_lcd_truly_emuspi_write_one_data(0x1A); // 16 - SPI_Stop(); - - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0x11); - SPI_Stop(); - - mdelay(150); - - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xB6); //Set_VCOM - gpio_lcd_truly_emuspi_write_one_data(0x42); // - SPI_Stop(); - - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xB3); //Set_RGBIF - gpio_lcd_truly_emuspi_write_one_data(0x0f); // - SPI_Stop(); - - - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xB4); // - gpio_lcd_truly_emuspi_write_one_data(0x08); // - gpio_lcd_truly_emuspi_write_one_data(0x03); // - gpio_lcd_truly_emuspi_write_one_data(0x7E); // - gpio_lcd_truly_emuspi_write_one_data(0x02); // - gpio_lcd_truly_emuspi_write_one_data(0x01); // - gpio_lcd_truly_emuspi_write_one_data(0x12); // - gpio_lcd_truly_emuspi_write_one_data(0x64); // - gpio_lcd_truly_emuspi_write_one_data(0x01); // - gpio_lcd_truly_emuspi_write_one_data(0x60); // - SPI_Stop(); - - - SPI_Start(); - - gpio_lcd_truly_emuspi_write_one_index(0xE0); //Gamma 2.2 - gpio_lcd_truly_emuspi_write_one_data(0x00); // - gpio_lcd_truly_emuspi_write_one_data(0x45); // - gpio_lcd_truly_emuspi_write_one_data(0x0A); // - gpio_lcd_truly_emuspi_write_one_data(0xB2); // - gpio_lcd_truly_emuspi_write_one_data(0xB6); // - gpio_lcd_truly_emuspi_write_one_data(0x3F); // - gpio_lcd_truly_emuspi_write_one_data(0x07); // - gpio_lcd_truly_emuspi_write_one_data(0x8D); // - gpio_lcd_truly_emuspi_write_one_data(0x0F); // - gpio_lcd_truly_emuspi_write_one_data(0x14); // - gpio_lcd_truly_emuspi_write_one_data(0x17); // - gpio_lcd_truly_emuspi_write_one_data(0xD5); // - gpio_lcd_truly_emuspi_write_one_data(0xD7); // - gpio_lcd_truly_emuspi_write_one_data(0x95); // - gpio_lcd_truly_emuspi_write_one_data(0x19); // - gpio_lcd_truly_emuspi_write_one_data(0x00); // - gpio_lcd_truly_emuspi_write_one_data(0x45); // - gpio_lcd_truly_emuspi_write_one_data(0x0A); // - gpio_lcd_truly_emuspi_write_one_data(0xB2); // - gpio_lcd_truly_emuspi_write_one_data(0xB6); // - gpio_lcd_truly_emuspi_write_one_data(0x3F); // - gpio_lcd_truly_emuspi_write_one_data(0x07); // - gpio_lcd_truly_emuspi_write_one_data(0x8D); // - gpio_lcd_truly_emuspi_write_one_data(0x0F); // - gpio_lcd_truly_emuspi_write_one_data(0x14); // - gpio_lcd_truly_emuspi_write_one_data(0x17); // - gpio_lcd_truly_emuspi_write_one_data(0xD5); // - gpio_lcd_truly_emuspi_write_one_data(0xD7); // - gpio_lcd_truly_emuspi_write_one_data(0x95); // - gpio_lcd_truly_emuspi_write_one_data(0x19); // - - SPI_Stop(); - mdelay(5); - - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xCC); //Set_PANEL - gpio_lcd_truly_emuspi_write_one_data(0x0B); // - SPI_Stop(); - - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0x3A); //COLMOD - gpio_lcd_truly_emuspi_write_one_data(0x60); // - SPI_Stop(); - - mdelay(20); - - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0x29); - SPI_Stop(); - - mdelay(10); -#endif -#if 0 -SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xB9); - gpio_lcd_truly_emuspi_write_one_data(0xFF); - gpio_lcd_truly_emuspi_write_one_data(0x83); - gpio_lcd_truly_emuspi_write_one_data(0x63); - SPI_Stop(); - //Power Voltage Setting -SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xB1); - gpio_lcd_truly_emuspi_write_one_data(0x81); - gpio_lcd_truly_emuspi_write_one_data(0x30); - gpio_lcd_truly_emuspi_write_one_data(0x07); - gpio_lcd_truly_emuspi_write_one_data(0x33); - gpio_lcd_truly_emuspi_write_one_data(0x02); - gpio_lcd_truly_emuspi_write_one_data(0x13); - gpio_lcd_truly_emuspi_write_one_data(0x11); - gpio_lcd_truly_emuspi_write_one_data(0x00); - gpio_lcd_truly_emuspi_write_one_data(0x35); - gpio_lcd_truly_emuspi_write_one_data(0x3E); - gpio_lcd_truly_emuspi_write_one_data(0x16); - gpio_lcd_truly_emuspi_write_one_data(0x16); - /* - gpio_lcd_truly_emuspi_write_one_index(0xB1); - gpio_lcd_truly_emuspi_write_one_data(0x81); - gpio_lcd_truly_emuspi_write_one_data(0x30); - gpio_lcd_truly_emuspi_write_one_data(0x03); - gpio_lcd_truly_emuspi_write_one_data(0x34); - gpio_lcd_truly_emuspi_write_one_data(0x02); - gpio_lcd_truly_emuspi_write_one_data(0x13); - gpio_lcd_truly_emuspi_write_one_data(0x11); - gpio_lcd_truly_emuspi_write_one_data(0x00); - gpio_lcd_truly_emuspi_write_one_data(0x3a); - gpio_lcd_truly_emuspi_write_one_data(0x42); - gpio_lcd_truly_emuspi_write_one_data(0x14); - gpio_lcd_truly_emuspi_write_one_data(0x14); - */ - /* - gpio_lcd_truly_emuspi_write_one_index(0xB1); - gpio_lcd_truly_emuspi_write_one_data(0x81); - gpio_lcd_truly_emuspi_write_one_data(0x30); - gpio_lcd_truly_emuspi_write_one_data(0x04); - gpio_lcd_truly_emuspi_write_one_data(0x33); - gpio_lcd_truly_emuspi_write_one_data(0x02); - gpio_lcd_truly_emuspi_write_one_data(0x13); - gpio_lcd_truly_emuspi_write_one_data(0x11); - gpio_lcd_truly_emuspi_write_one_data(0x00); - gpio_lcd_truly_emuspi_write_one_data(0x35); - gpio_lcd_truly_emuspi_write_one_data(0x3E); - gpio_lcd_truly_emuspi_write_one_data(0x3F); - gpio_lcd_truly_emuspi_write_one_data(0x3F); - */ - SPI_Stop(); - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0x11); // Sleep Out - mdelay(120) ;//Min:120ms - SPI_Stop(); - //Display Setting -SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xB6); //Set_VCOM - gpio_lcd_truly_emuspi_write_one_data(0x3D); // - gpio_lcd_truly_emuspi_write_one_index(0xB3); //Set_VCOM - gpio_lcd_truly_emuspi_write_one_data(0x0f); //Hsysc : high, Vsyc : high, VD: high, - SPI_Stop(); -SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xB4); - gpio_lcd_truly_emuspi_write_one_data(0x00); - gpio_lcd_truly_emuspi_write_one_data(0x03); - gpio_lcd_truly_emuspi_write_one_data(0x7E); - gpio_lcd_truly_emuspi_write_one_data(0x02); - gpio_lcd_truly_emuspi_write_one_data(0x01); - gpio_lcd_truly_emuspi_write_one_data(0x12); - gpio_lcd_truly_emuspi_write_one_data(0x64); - gpio_lcd_truly_emuspi_write_one_data(0x01); - gpio_lcd_truly_emuspi_write_one_data(0xFF); - SPI_Stop(); - mdelay(1) ; -SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xE0); - gpio_lcd_truly_emuspi_write_one_data(0x00); - gpio_lcd_truly_emuspi_write_one_data(0x45); - gpio_lcd_truly_emuspi_write_one_data(0x0A); - gpio_lcd_truly_emuspi_write_one_data(0xB2); - gpio_lcd_truly_emuspi_write_one_data(0xB6); - gpio_lcd_truly_emuspi_write_one_data(0x3F); - gpio_lcd_truly_emuspi_write_one_data(0x07); - gpio_lcd_truly_emuspi_write_one_data(0x8D); - gpio_lcd_truly_emuspi_write_one_data(0x0F); - gpio_lcd_truly_emuspi_write_one_data(0x14); - gpio_lcd_truly_emuspi_write_one_data(0x17); - gpio_lcd_truly_emuspi_write_one_data(0xD5); - gpio_lcd_truly_emuspi_write_one_data(0xD7); - gpio_lcd_truly_emuspi_write_one_data(0x95); - gpio_lcd_truly_emuspi_write_one_data(0x19); - gpio_lcd_truly_emuspi_write_one_data(0x00); - gpio_lcd_truly_emuspi_write_one_data(0x45); - gpio_lcd_truly_emuspi_write_one_data(0x0A); - gpio_lcd_truly_emuspi_write_one_data(0xB2); - gpio_lcd_truly_emuspi_write_one_data(0xB6); - gpio_lcd_truly_emuspi_write_one_data(0x3F); - gpio_lcd_truly_emuspi_write_one_data(0x07); - gpio_lcd_truly_emuspi_write_one_data(0x8D); - gpio_lcd_truly_emuspi_write_one_data(0x0F); - gpio_lcd_truly_emuspi_write_one_data(0x14); - gpio_lcd_truly_emuspi_write_one_data(0x17); - gpio_lcd_truly_emuspi_write_one_data(0xD5); - gpio_lcd_truly_emuspi_write_one_data(0xD7); - gpio_lcd_truly_emuspi_write_one_data(0x95); - gpio_lcd_truly_emuspi_write_one_data(0x19); - - /* - gpio_lcd_truly_emuspi_write_one_index(0xE0); //Gamma 2.2 - gpio_lcd_truly_emuspi_write_one_data(0x03); - gpio_lcd_truly_emuspi_write_one_data(0x28); - gpio_lcd_truly_emuspi_write_one_data(0x2F); - gpio_lcd_truly_emuspi_write_one_data(0x32); - gpio_lcd_truly_emuspi_write_one_data(0x36); - gpio_lcd_truly_emuspi_write_one_data(0x3F); - gpio_lcd_truly_emuspi_write_one_data(0x05); - gpio_lcd_truly_emuspi_write_one_data(0xC2); - gpio_lcd_truly_emuspi_write_one_data(0x0E); - gpio_lcd_truly_emuspi_write_one_data(0x8E);//10 - gpio_lcd_truly_emuspi_write_one_data(0x57); - gpio_lcd_truly_emuspi_write_one_data(0x15); - gpio_lcd_truly_emuspi_write_one_data(0x58); - gpio_lcd_truly_emuspi_write_one_data(0xCF); - gpio_lcd_truly_emuspi_write_one_data(0x19);//15 - gpio_lcd_truly_emuspi_write_one_data(0x03); - gpio_lcd_truly_emuspi_write_one_data(0x28); - gpio_lcd_truly_emuspi_write_one_data(0x2F); - gpio_lcd_truly_emuspi_write_one_data(0x32); - gpio_lcd_truly_emuspi_write_one_data(0x36); - gpio_lcd_truly_emuspi_write_one_data(0x3F); - gpio_lcd_truly_emuspi_write_one_data(0x05); - gpio_lcd_truly_emuspi_write_one_data(0xC2); - gpio_lcd_truly_emuspi_write_one_data(0x0E); - gpio_lcd_truly_emuspi_write_one_data(0x8E);//10 - gpio_lcd_truly_emuspi_write_one_data(0x57); - gpio_lcd_truly_emuspi_write_one_data(0x15); - gpio_lcd_truly_emuspi_write_one_data(0x58); - gpio_lcd_truly_emuspi_write_one_data(0xCF); - gpio_lcd_truly_emuspi_write_one_data(0x19);//15 -*/ - SPI_Stop(); - mdelay(1) ; -SPI_Start(); -/* -gpio_lcd_truly_emuspi_write_one_index(0xC1); //DGC -gpio_lcd_truly_emuspi_write_one_data(0x01); - -gpio_lcd_truly_emuspi_write_one_data(0x01);//R009 -gpio_lcd_truly_emuspi_write_one_data(0x07); -gpio_lcd_truly_emuspi_write_one_data(0x0E); -gpio_lcd_truly_emuspi_write_one_data(0x19); -gpio_lcd_truly_emuspi_write_one_data(0x20); -gpio_lcd_truly_emuspi_write_one_data(0x29); -gpio_lcd_truly_emuspi_write_one_data(0x30); -gpio_lcd_truly_emuspi_write_one_data(0x36); -gpio_lcd_truly_emuspi_write_one_data(0x3F); -gpio_lcd_truly_emuspi_write_one_data(0x48); -gpio_lcd_truly_emuspi_write_one_data(0x50); -gpio_lcd_truly_emuspi_write_one_data(0x58); -gpio_lcd_truly_emuspi_write_one_data(0x60); -gpio_lcd_truly_emuspi_write_one_data(0x67); -gpio_lcd_truly_emuspi_write_one_data(0x70); -gpio_lcd_truly_emuspi_write_one_data(0x77); -gpio_lcd_truly_emuspi_write_one_data(0x7F); -gpio_lcd_truly_emuspi_write_one_data(0x87); -gpio_lcd_truly_emuspi_write_one_data(0x8F); -gpio_lcd_truly_emuspi_write_one_data(0x98); -gpio_lcd_truly_emuspi_write_one_data(0xA0); -gpio_lcd_truly_emuspi_write_one_data(0xA9); -gpio_lcd_truly_emuspi_write_one_data(0xB0); -gpio_lcd_truly_emuspi_write_one_data(0xB8); -gpio_lcd_truly_emuspi_write_one_data(0xC1); -gpio_lcd_truly_emuspi_write_one_data(0xC9); -gpio_lcd_truly_emuspi_write_one_data(0xCF); -gpio_lcd_truly_emuspi_write_one_data(0xD8); -gpio_lcd_truly_emuspi_write_one_data(0xE1); -gpio_lcd_truly_emuspi_write_one_data(0xE7); -gpio_lcd_truly_emuspi_write_one_data(0xF0); -gpio_lcd_truly_emuspi_write_one_data(0xF8); -gpio_lcd_truly_emuspi_write_one_data(0xFF); - -gpio_lcd_truly_emuspi_write_one_data(0x04);//R001 -gpio_lcd_truly_emuspi_write_one_data(0xEA); -gpio_lcd_truly_emuspi_write_one_data(0xEE); -gpio_lcd_truly_emuspi_write_one_data(0x11); -gpio_lcd_truly_emuspi_write_one_data(0x5D); -gpio_lcd_truly_emuspi_write_one_data(0x86); -gpio_lcd_truly_emuspi_write_one_data(0x98); -gpio_lcd_truly_emuspi_write_one_data(0x24); -gpio_lcd_truly_emuspi_write_one_data(0x03); - -gpio_lcd_truly_emuspi_write_one_data(0x00);//G009 -gpio_lcd_truly_emuspi_write_one_data(0x01); -gpio_lcd_truly_emuspi_write_one_data(0x07); -gpio_lcd_truly_emuspi_write_one_data(0x0E); -gpio_lcd_truly_emuspi_write_one_data(0x19); -gpio_lcd_truly_emuspi_write_one_data(0x20); -gpio_lcd_truly_emuspi_write_one_data(0x29); -gpio_lcd_truly_emuspi_write_one_data(0x30); -gpio_lcd_truly_emuspi_write_one_data(0x36); -gpio_lcd_truly_emuspi_write_one_data(0x3F); -gpio_lcd_truly_emuspi_write_one_data(0x48); -gpio_lcd_truly_emuspi_write_one_data(0x50); -gpio_lcd_truly_emuspi_write_one_data(0x58); -gpio_lcd_truly_emuspi_write_one_data(0x60); -gpio_lcd_truly_emuspi_write_one_data(0x67); -gpio_lcd_truly_emuspi_write_one_data(0x70); -gpio_lcd_truly_emuspi_write_one_data(0x77); -gpio_lcd_truly_emuspi_write_one_data(0x7F); -gpio_lcd_truly_emuspi_write_one_data(0x87); -gpio_lcd_truly_emuspi_write_one_data(0x8F); -gpio_lcd_truly_emuspi_write_one_data(0x98); -gpio_lcd_truly_emuspi_write_one_data(0xA0); -gpio_lcd_truly_emuspi_write_one_data(0xA9); -gpio_lcd_truly_emuspi_write_one_data(0xB0); -gpio_lcd_truly_emuspi_write_one_data(0xB8); -gpio_lcd_truly_emuspi_write_one_data(0xC1); -gpio_lcd_truly_emuspi_write_one_data(0xC9); -gpio_lcd_truly_emuspi_write_one_data(0xCF); -gpio_lcd_truly_emuspi_write_one_data(0xD8); -gpio_lcd_truly_emuspi_write_one_data(0xE1); -gpio_lcd_truly_emuspi_write_one_data(0xE7); -gpio_lcd_truly_emuspi_write_one_data(0xF0); -gpio_lcd_truly_emuspi_write_one_data(0xF8); - -gpio_lcd_truly_emuspi_write_one_data(0x04);//G001 -gpio_lcd_truly_emuspi_write_one_data(0xEA); -gpio_lcd_truly_emuspi_write_one_data(0xEE); -gpio_lcd_truly_emuspi_write_one_data(0x11); -gpio_lcd_truly_emuspi_write_one_data(0x5D); -gpio_lcd_truly_emuspi_write_one_data(0x86); -gpio_lcd_truly_emuspi_write_one_data(0x98); -gpio_lcd_truly_emuspi_write_one_data(0x24); -gpio_lcd_truly_emuspi_write_one_data(0x03); - -gpio_lcd_truly_emuspi_write_one_data(0x00);//B009 -gpio_lcd_truly_emuspi_write_one_data(0x01); -gpio_lcd_truly_emuspi_write_one_data(0x07); -gpio_lcd_truly_emuspi_write_one_data(0x0E); -gpio_lcd_truly_emuspi_write_one_data(0x19); -gpio_lcd_truly_emuspi_write_one_data(0x20); -gpio_lcd_truly_emuspi_write_one_data(0x29); -gpio_lcd_truly_emuspi_write_one_data(0x30); -gpio_lcd_truly_emuspi_write_one_data(0x36); -gpio_lcd_truly_emuspi_write_one_data(0x3F); -gpio_lcd_truly_emuspi_write_one_data(0x48); -gpio_lcd_truly_emuspi_write_one_data(0x50); -gpio_lcd_truly_emuspi_write_one_data(0x58); -gpio_lcd_truly_emuspi_write_one_data(0x60); -gpio_lcd_truly_emuspi_write_one_data(0x67); -gpio_lcd_truly_emuspi_write_one_data(0x70); -gpio_lcd_truly_emuspi_write_one_data(0x77); -gpio_lcd_truly_emuspi_write_one_data(0x7F); -gpio_lcd_truly_emuspi_write_one_data(0x87); -gpio_lcd_truly_emuspi_write_one_data(0x8F); -gpio_lcd_truly_emuspi_write_one_data(0x98); -gpio_lcd_truly_emuspi_write_one_data(0xA0); -gpio_lcd_truly_emuspi_write_one_data(0xA9); -gpio_lcd_truly_emuspi_write_one_data(0xB0); -gpio_lcd_truly_emuspi_write_one_data(0xB8); -gpio_lcd_truly_emuspi_write_one_data(0xC1); -gpio_lcd_truly_emuspi_write_one_data(0xC9); -gpio_lcd_truly_emuspi_write_one_data(0xCF); -gpio_lcd_truly_emuspi_write_one_data(0xD8); -gpio_lcd_truly_emuspi_write_one_data(0xE1); -gpio_lcd_truly_emuspi_write_one_data(0xE7); -gpio_lcd_truly_emuspi_write_one_data(0xF0); -gpio_lcd_truly_emuspi_write_one_data(0xF8); - -gpio_lcd_truly_emuspi_write_one_data(0x04); //B001 -gpio_lcd_truly_emuspi_write_one_data(0xEA); -gpio_lcd_truly_emuspi_write_one_data(0xEE); -gpio_lcd_truly_emuspi_write_one_data(0x11); -gpio_lcd_truly_emuspi_write_one_data(0x5D); -gpio_lcd_truly_emuspi_write_one_data(0x86); -gpio_lcd_truly_emuspi_write_one_data(0x98); -gpio_lcd_truly_emuspi_write_one_data(0x24); -gpio_lcd_truly_emuspi_write_one_data(0x03); -*/ - gpio_lcd_truly_emuspi_write_one_index(0xC1); //DGC - gpio_lcd_truly_emuspi_write_one_data(0x01); - - gpio_lcd_truly_emuspi_write_one_data(0x04 );//R009 - gpio_lcd_truly_emuspi_write_one_data(0x0A ); - gpio_lcd_truly_emuspi_write_one_data(0x11 ); - gpio_lcd_truly_emuspi_write_one_data(0x1A ); - gpio_lcd_truly_emuspi_write_one_data(0x22 ); - gpio_lcd_truly_emuspi_write_one_data(0x2A ); - gpio_lcd_truly_emuspi_write_one_data(0x30 ); - gpio_lcd_truly_emuspi_write_one_data(0x36 ); - gpio_lcd_truly_emuspi_write_one_data(0x3E ); - gpio_lcd_truly_emuspi_write_one_data(0x47 ); - gpio_lcd_truly_emuspi_write_one_data(0x50 ); - gpio_lcd_truly_emuspi_write_one_data(0x58 ); - gpio_lcd_truly_emuspi_write_one_data(0x60 ); - gpio_lcd_truly_emuspi_write_one_data(0x68 ); - gpio_lcd_truly_emuspi_write_one_data(0x70 ); - gpio_lcd_truly_emuspi_write_one_data(0x78 ); - gpio_lcd_truly_emuspi_write_one_data(0x80 ); - gpio_lcd_truly_emuspi_write_one_data(0x88 ); - gpio_lcd_truly_emuspi_write_one_data(0x90 ); - gpio_lcd_truly_emuspi_write_one_data(0x99 ); - gpio_lcd_truly_emuspi_write_one_data(0xA0 ); - gpio_lcd_truly_emuspi_write_one_data(0xA7 ); - gpio_lcd_truly_emuspi_write_one_data(0xAE ); - gpio_lcd_truly_emuspi_write_one_data(0xB7 ); - gpio_lcd_truly_emuspi_write_one_data(0xC0 ); - gpio_lcd_truly_emuspi_write_one_data(0xC8 ); - gpio_lcd_truly_emuspi_write_one_data(0xCD ); - gpio_lcd_truly_emuspi_write_one_data(0xD5 ); - gpio_lcd_truly_emuspi_write_one_data(0xE0 ); - gpio_lcd_truly_emuspi_write_one_data(0xE7 ); - gpio_lcd_truly_emuspi_write_one_data(0xF0 ); - gpio_lcd_truly_emuspi_write_one_data(0xF8 ); - gpio_lcd_truly_emuspi_write_one_data(0xFF ); - - gpio_lcd_truly_emuspi_write_one_data(0xA7 );//R001 - gpio_lcd_truly_emuspi_write_one_data(0x98 ); - gpio_lcd_truly_emuspi_write_one_data(0x79 ); - gpio_lcd_truly_emuspi_write_one_data(0x66 ); - gpio_lcd_truly_emuspi_write_one_data(0x9D ); - gpio_lcd_truly_emuspi_write_one_data(0xAD ); - gpio_lcd_truly_emuspi_write_one_data(0xC9 ); - gpio_lcd_truly_emuspi_write_one_data(0x13 ); - gpio_lcd_truly_emuspi_write_one_data(0x02 ); - - gpio_lcd_truly_emuspi_write_one_data(0x00 );//G009 - gpio_lcd_truly_emuspi_write_one_data(0x06 ); - gpio_lcd_truly_emuspi_write_one_data(0x0a ); - gpio_lcd_truly_emuspi_write_one_data(0x16 ); - gpio_lcd_truly_emuspi_write_one_data(0x1e ); - gpio_lcd_truly_emuspi_write_one_data(0x26 ); - gpio_lcd_truly_emuspi_write_one_data(0x2b ); - gpio_lcd_truly_emuspi_write_one_data(0x32 ); - gpio_lcd_truly_emuspi_write_one_data(0x3a ); - gpio_lcd_truly_emuspi_write_one_data(0x43 ); - gpio_lcd_truly_emuspi_write_one_data(0x4c ); - gpio_lcd_truly_emuspi_write_one_data(0x55 ); - gpio_lcd_truly_emuspi_write_one_data(0x5c ); - gpio_lcd_truly_emuspi_write_one_data(0x64 ); - gpio_lcd_truly_emuspi_write_one_data(0x6c ); - gpio_lcd_truly_emuspi_write_one_data(0x74 ); - gpio_lcd_truly_emuspi_write_one_data(0x7b ); - gpio_lcd_truly_emuspi_write_one_data(0x81 ); - gpio_lcd_truly_emuspi_write_one_data(0x88 ); - gpio_lcd_truly_emuspi_write_one_data(0x8f ); - gpio_lcd_truly_emuspi_write_one_data(0x96 ); - gpio_lcd_truly_emuspi_write_one_data(0x9e ); - gpio_lcd_truly_emuspi_write_one_data(0xA5 ); - gpio_lcd_truly_emuspi_write_one_data(0xAC ); - gpio_lcd_truly_emuspi_write_one_data(0xB6 ); - gpio_lcd_truly_emuspi_write_one_data(0xBC ); - gpio_lcd_truly_emuspi_write_one_data(0xC6 ); - gpio_lcd_truly_emuspi_write_one_data(0xCC ); - gpio_lcd_truly_emuspi_write_one_data(0xD1 ); - gpio_lcd_truly_emuspi_write_one_data(0xD6 ); - gpio_lcd_truly_emuspi_write_one_data(0xDD ); - gpio_lcd_truly_emuspi_write_one_data(0xE4 ); - gpio_lcd_truly_emuspi_write_one_data(0xEb ); - - gpio_lcd_truly_emuspi_write_one_data(0xA7 );//G001 - gpio_lcd_truly_emuspi_write_one_data(0x98 ); - gpio_lcd_truly_emuspi_write_one_data(0x79 ); - gpio_lcd_truly_emuspi_write_one_data(0x66 ); - gpio_lcd_truly_emuspi_write_one_data(0x9D ); - gpio_lcd_truly_emuspi_write_one_data(0xAD ); - gpio_lcd_truly_emuspi_write_one_data(0xC9 ); - gpio_lcd_truly_emuspi_write_one_data(0x13 ); - gpio_lcd_truly_emuspi_write_one_data(0x02 ); - - gpio_lcd_truly_emuspi_write_one_data(0x00 );//B009 - gpio_lcd_truly_emuspi_write_one_data(0x06 ); - gpio_lcd_truly_emuspi_write_one_data(0x0B ); - gpio_lcd_truly_emuspi_write_one_data(0x17 ); - gpio_lcd_truly_emuspi_write_one_data(0x1C ); - gpio_lcd_truly_emuspi_write_one_data(0x22 ); - gpio_lcd_truly_emuspi_write_one_data(0x28 ); - gpio_lcd_truly_emuspi_write_one_data(0x2E ); - gpio_lcd_truly_emuspi_write_one_data(0x34 ); - gpio_lcd_truly_emuspi_write_one_data(0x3A ); - gpio_lcd_truly_emuspi_write_one_data(0x41 ); - gpio_lcd_truly_emuspi_write_one_data(0x47 ); - gpio_lcd_truly_emuspi_write_one_data(0x4E ); - gpio_lcd_truly_emuspi_write_one_data(0x55 ); - gpio_lcd_truly_emuspi_write_one_data(0x5C ); - gpio_lcd_truly_emuspi_write_one_data(0x64 ); - gpio_lcd_truly_emuspi_write_one_data(0x6B ); - gpio_lcd_truly_emuspi_write_one_data(0x73 ); - gpio_lcd_truly_emuspi_write_one_data(0x7A ); - gpio_lcd_truly_emuspi_write_one_data(0x82 ); - gpio_lcd_truly_emuspi_write_one_data(0x88 ); - gpio_lcd_truly_emuspi_write_one_data(0x8E ); - gpio_lcd_truly_emuspi_write_one_data(0x94 ); - gpio_lcd_truly_emuspi_write_one_data(0x9B ); - gpio_lcd_truly_emuspi_write_one_data(0xA6 ); - gpio_lcd_truly_emuspi_write_one_data(0xAB ); - gpio_lcd_truly_emuspi_write_one_data(0xB6 ); - gpio_lcd_truly_emuspi_write_one_data(0xBD ); - gpio_lcd_truly_emuspi_write_one_data(0xC1 ); - gpio_lcd_truly_emuspi_write_one_data(0xC3 ); - gpio_lcd_truly_emuspi_write_one_data(0xC9 ); - gpio_lcd_truly_emuspi_write_one_data(0xCE ); - gpio_lcd_truly_emuspi_write_one_data(0xD5 ); - - gpio_lcd_truly_emuspi_write_one_data(0xA7 );//009 - gpio_lcd_truly_emuspi_write_one_data(0x98 ); - gpio_lcd_truly_emuspi_write_one_data(0x79 ); - gpio_lcd_truly_emuspi_write_one_data(0x66 ); - gpio_lcd_truly_emuspi_write_one_data(0x9D ); - gpio_lcd_truly_emuspi_write_one_data(0xAD ); - gpio_lcd_truly_emuspi_write_one_data(0xC9 ); - gpio_lcd_truly_emuspi_write_one_data(0x13 ); - gpio_lcd_truly_emuspi_write_one_data(0x02 ); - - SPI_Stop(); - - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0x36); - gpio_lcd_truly_emuspi_write_one_data(0x02); // GBR MODE - SPI_Stop(); - - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xCC); //Set_PANEL - gpio_lcd_truly_emuspi_write_one_data(0x03); // - SPI_Stop(); - mdelay(1) ; - - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0x3A); //Set_PANEL - gpio_lcd_truly_emuspi_write_one_data(0x60); // - SPI_Stop(); - mdelay(1) ; - - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0x29); - SPI_Stop(); - -#endif -#if 0 - mdelay(60); //After Internal mechanism Program (load OTP) - - //Set_EXTC - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xB9); - gpio_lcd_truly_emuspi_write_one_data(0xFF); - gpio_lcd_truly_emuspi_write_one_data(0x83); - gpio_lcd_truly_emuspi_write_one_data(0x63); - - //Set_POWER - SPI_Stop();SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xB1); - gpio_lcd_truly_emuspi_write_one_data(0x81); - gpio_lcd_truly_emuspi_write_one_data(0x30); - gpio_lcd_truly_emuspi_write_one_data(0x07); - gpio_lcd_truly_emuspi_write_one_data(0x33); - gpio_lcd_truly_emuspi_write_one_data(0x02); - gpio_lcd_truly_emuspi_write_one_data(0x13); - gpio_lcd_truly_emuspi_write_one_data(0x11); - gpio_lcd_truly_emuspi_write_one_data(0x00); - gpio_lcd_truly_emuspi_write_one_data(0x2C); - gpio_lcd_truly_emuspi_write_one_data(0x34); - gpio_lcd_truly_emuspi_write_one_data(0x16); - gpio_lcd_truly_emuspi_write_one_data(0x16); - - //Sleep Out - SPI_Stop();SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0x11); - mdelay(100); - - //Set COLMOD - SPI_Stop();SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0x3A); - gpio_lcd_truly_emuspi_write_one_data(0x60); - - //Set_RGBIF - SPI_Stop();SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xB3); - gpio_lcd_truly_emuspi_write_one_data(0x0f); - - //Set_CYC - SPI_Stop();SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xB4); - gpio_lcd_truly_emuspi_write_one_data(0x00); - gpio_lcd_truly_emuspi_write_one_data(0x03); - gpio_lcd_truly_emuspi_write_one_data(0x7E); - gpio_lcd_truly_emuspi_write_one_data(0x02); - gpio_lcd_truly_emuspi_write_one_data(0x01); - gpio_lcd_truly_emuspi_write_one_data(0x12); - gpio_lcd_truly_emuspi_write_one_data(0x64); - gpio_lcd_truly_emuspi_write_one_data(0x01); - gpio_lcd_truly_emuspi_write_one_data(0x60); - - //Set_VCOM - SPI_Stop();SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xB6); - gpio_lcd_truly_emuspi_write_one_data(0x42); - - //Set_PANEL - SPI_Stop();SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xCC); - gpio_lcd_truly_emuspi_write_one_data(0x0B); - mdelay(50); - - //Set Gamma 2.2 - SPI_Stop();SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xE0); - gpio_lcd_truly_emuspi_write_one_data(0x00); - gpio_lcd_truly_emuspi_write_one_data(0x45); - gpio_lcd_truly_emuspi_write_one_data(0x0A); - gpio_lcd_truly_emuspi_write_one_data(0xB2); - gpio_lcd_truly_emuspi_write_one_data(0xB6); - gpio_lcd_truly_emuspi_write_one_data(0x3F); - gpio_lcd_truly_emuspi_write_one_data(0x07); - gpio_lcd_truly_emuspi_write_one_data(0x8D); - gpio_lcd_truly_emuspi_write_one_data(0x0F); - gpio_lcd_truly_emuspi_write_one_data(0x14); - gpio_lcd_truly_emuspi_write_one_data(0x17); - gpio_lcd_truly_emuspi_write_one_data(0xD5); - gpio_lcd_truly_emuspi_write_one_data(0xD7); - gpio_lcd_truly_emuspi_write_one_data(0x95); - gpio_lcd_truly_emuspi_write_one_data(0x19); - gpio_lcd_truly_emuspi_write_one_data(0x00); - gpio_lcd_truly_emuspi_write_one_data(0x45); - gpio_lcd_truly_emuspi_write_one_data(0x0A); - gpio_lcd_truly_emuspi_write_one_data(0xB2); - gpio_lcd_truly_emuspi_write_one_data(0xB6); - gpio_lcd_truly_emuspi_write_one_data(0x3F); - gpio_lcd_truly_emuspi_write_one_data(0x07); - gpio_lcd_truly_emuspi_write_one_data(0x8D); - gpio_lcd_truly_emuspi_write_one_data(0x0F); - gpio_lcd_truly_emuspi_write_one_data(0x14); - gpio_lcd_truly_emuspi_write_one_data(0x17); - gpio_lcd_truly_emuspi_write_one_data(0xD5); - gpio_lcd_truly_emuspi_write_one_data(0xD7); - gpio_lcd_truly_emuspi_write_one_data(0x95); - gpio_lcd_truly_emuspi_write_one_data(0x19); - mdelay(50); - - //Display On - SPI_Stop();SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0x36); - gpio_lcd_truly_emuspi_write_one_data(0x00); - SPI_Stop();SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0x29); - SPI_Stop(); - -#endif -#if 0 -//mdelay(10*150); - //StartSPI(); - - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xB9); //Set_EXTC - gpio_lcd_truly_emuspi_write_one_data(0xFF); // - gpio_lcd_truly_emuspi_write_one_data(0x83); // - gpio_lcd_truly_emuspi_write_one_data(0x63); // - //StopSPI(); - //StartSPI(); - SPI_Stop();SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xB1); //Set_POWER - gpio_lcd_truly_emuspi_write_one_data(0x81); // - gpio_lcd_truly_emuspi_write_one_data(0x30); // - gpio_lcd_truly_emuspi_write_one_data(0x03); // - gpio_lcd_truly_emuspi_write_one_data(0x34); // - gpio_lcd_truly_emuspi_write_one_data(0x02); // - gpio_lcd_truly_emuspi_write_one_data(0x13); // - gpio_lcd_truly_emuspi_write_one_data(0x11); // - gpio_lcd_truly_emuspi_write_one_data(0x00); // - gpio_lcd_truly_emuspi_write_one_data(0x35); // - gpio_lcd_truly_emuspi_write_one_data(0x3E); // - gpio_lcd_truly_emuspi_write_one_data(0x16); // - gpio_lcd_truly_emuspi_write_one_data(0x16); // - - SPI_Stop();SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0x11); - mdelay(10*120); - SPI_Stop();SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0x3A); //COLMOD - //gpio_lcd_truly_emuspi_write_one_data(0x77); //24bit - gpio_lcd_truly_emuspi_write_one_data(0x66); //18bit - - SPI_Stop();SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xB3); //Set_RGBIF - gpio_lcd_truly_emuspi_write_one_data(0x0f); // - - SPI_Stop();SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xB4); //Set_CYC - gpio_lcd_truly_emuspi_write_one_data(0x00); // - gpio_lcd_truly_emuspi_write_one_data(0x03); - gpio_lcd_truly_emuspi_write_one_data(0x7E); - gpio_lcd_truly_emuspi_write_one_data(0x02); - gpio_lcd_truly_emuspi_write_one_data(0x01); - gpio_lcd_truly_emuspi_write_one_data(0x12); - gpio_lcd_truly_emuspi_write_one_data(0x64); - gpio_lcd_truly_emuspi_write_one_data(0x01); - gpio_lcd_truly_emuspi_write_one_data(0x60); - - SPI_Stop();SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xB6); //Set_VCOM - gpio_lcd_truly_emuspi_write_one_data(0x3C); // - - SPI_Stop();SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xCC); //Set_PANEL - gpio_lcd_truly_emuspi_write_one_data(0x0B); // - mdelay(10*5); - SPI_Stop();SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xE0); //Gamma 2.2 - gpio_lcd_truly_emuspi_write_one_data(0x00); // - gpio_lcd_truly_emuspi_write_one_data(0x1E); // - gpio_lcd_truly_emuspi_write_one_data(0x23); // - gpio_lcd_truly_emuspi_write_one_data(0x32); // - gpio_lcd_truly_emuspi_write_one_data(0x36); // - gpio_lcd_truly_emuspi_write_one_data(0x3F); // - gpio_lcd_truly_emuspi_write_one_data(0x08); // - gpio_lcd_truly_emuspi_write_one_data(0xCC); // - gpio_lcd_truly_emuspi_write_one_data(0x0E); // - gpio_lcd_truly_emuspi_write_one_data(0x92); // - gpio_lcd_truly_emuspi_write_one_data(0x54); // - gpio_lcd_truly_emuspi_write_one_data(0x15); // - gpio_lcd_truly_emuspi_write_one_data(0x18); // - gpio_lcd_truly_emuspi_write_one_data(0x4F); // - gpio_lcd_truly_emuspi_write_one_data(0x19); // - gpio_lcd_truly_emuspi_write_one_data(0x00); // - gpio_lcd_truly_emuspi_write_one_data(0x1E); // - gpio_lcd_truly_emuspi_write_one_data(0x23); // - gpio_lcd_truly_emuspi_write_one_data(0x32); // - gpio_lcd_truly_emuspi_write_one_data(0x36); // - gpio_lcd_truly_emuspi_write_one_data(0x3F); // - gpio_lcd_truly_emuspi_write_one_data(0x08); // - gpio_lcd_truly_emuspi_write_one_data(0xCC); // - gpio_lcd_truly_emuspi_write_one_data(0x0E); // - gpio_lcd_truly_emuspi_write_one_data(0x92); // - gpio_lcd_truly_emuspi_write_one_data(0x54); // - gpio_lcd_truly_emuspi_write_one_data(0x15); // - gpio_lcd_truly_emuspi_write_one_data(0x18); // - gpio_lcd_truly_emuspi_write_one_data(0x4F); // - gpio_lcd_truly_emuspi_write_one_data(0x19); // - mdelay(10*5); - - - SPI_Stop();SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0x36); - gpio_lcd_truly_emuspi_write_one_data(0x00); - SPI_Stop();SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0x29); - SPI_Stop(); - //StopSPI(); -#endif -#if 0 - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xB9); // SET password - gpio_lcd_truly_emuspi_write_one_data(0xFF); - gpio_lcd_truly_emuspi_write_one_data(0x83); - gpio_lcd_truly_emuspi_write_one_data(0x63); - SPI_Stop(); - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0x36); - gpio_lcd_truly_emuspi_write_one_data(0x00); // GBR MODE - SPI_Stop(); - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xB2); // SET Display 480x800 - gpio_lcd_truly_emuspi_write_one_data(0x00); - gpio_lcd_truly_emuspi_write_one_data(0x23); - gpio_lcd_truly_emuspi_write_one_data(0x03); - gpio_lcd_truly_emuspi_write_one_data(0x03); - gpio_lcd_truly_emuspi_write_one_data(0x70); - gpio_lcd_truly_emuspi_write_one_data(0x00); - gpio_lcd_truly_emuspi_write_one_data(0xFF); - gpio_lcd_truly_emuspi_write_one_data(0x00); - gpio_lcd_truly_emuspi_write_one_data(0x00); - gpio_lcd_truly_emuspi_write_one_data(0x00); - gpio_lcd_truly_emuspi_write_one_data(0x00); - gpio_lcd_truly_emuspi_write_one_data(0x03); - gpio_lcd_truly_emuspi_write_one_data(0x03); - gpio_lcd_truly_emuspi_write_one_data(0x00); - gpio_lcd_truly_emuspi_write_one_data(0x01); - SPI_Stop(); - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xB4); // SET Display waveform cycles - gpio_lcd_truly_emuspi_write_one_data(0x00); - gpio_lcd_truly_emuspi_write_one_data(0x18); - gpio_lcd_truly_emuspi_write_one_data(0x80); - gpio_lcd_truly_emuspi_write_one_data(0x06); - gpio_lcd_truly_emuspi_write_one_data(0x02); - SPI_Stop(); - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xB6); // SET VCOM - gpio_lcd_truly_emuspi_write_one_data(0x42); - gpio_lcd_truly_emuspi_write_one_data(0x42); - SPI_Stop(); - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xD5); // SET GIP - gpio_lcd_truly_emuspi_write_one_data(0x00); - gpio_lcd_truly_emuspi_write_one_data(0x04); - gpio_lcd_truly_emuspi_write_one_data(0x03); - gpio_lcd_truly_emuspi_write_one_data(0x00); - gpio_lcd_truly_emuspi_write_one_data(0x01); - gpio_lcd_truly_emuspi_write_one_data(0x05); - gpio_lcd_truly_emuspi_write_one_data(0x28); - gpio_lcd_truly_emuspi_write_one_data(0x70); - gpio_lcd_truly_emuspi_write_one_data(0x01); - gpio_lcd_truly_emuspi_write_one_data(0x03); - gpio_lcd_truly_emuspi_write_one_data(0x00); - gpio_lcd_truly_emuspi_write_one_data(0x00); - gpio_lcd_truly_emuspi_write_one_data(0x40); - gpio_lcd_truly_emuspi_write_one_data(0x06); - gpio_lcd_truly_emuspi_write_one_data(0x51); - gpio_lcd_truly_emuspi_write_one_data(0x07); - gpio_lcd_truly_emuspi_write_one_data(0x00); - gpio_lcd_truly_emuspi_write_one_data(0x00); - gpio_lcd_truly_emuspi_write_one_data(0x41); - gpio_lcd_truly_emuspi_write_one_data(0x06); - gpio_lcd_truly_emuspi_write_one_data(0x50); - gpio_lcd_truly_emuspi_write_one_data(0x07); - gpio_lcd_truly_emuspi_write_one_data(0x07); - gpio_lcd_truly_emuspi_write_one_data(0x0F); - gpio_lcd_truly_emuspi_write_one_data(0x04); - gpio_lcd_truly_emuspi_write_one_data(0x00); - SPI_Stop(); - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xB1); //Set Power - gpio_lcd_truly_emuspi_write_one_data(0x85); - gpio_lcd_truly_emuspi_write_one_data(0x00); - gpio_lcd_truly_emuspi_write_one_data(0x34); - gpio_lcd_truly_emuspi_write_one_data(0x07); - gpio_lcd_truly_emuspi_write_one_data(0x00); - gpio_lcd_truly_emuspi_write_one_data(0x0F); - gpio_lcd_truly_emuspi_write_one_data(0x0F); - gpio_lcd_truly_emuspi_write_one_data(0x2A); - gpio_lcd_truly_emuspi_write_one_data(0x32); - gpio_lcd_truly_emuspi_write_one_data(0x3F); - gpio_lcd_truly_emuspi_write_one_data(0x3F); - gpio_lcd_truly_emuspi_write_one_data(0x01); - gpio_lcd_truly_emuspi_write_one_data(0x3A); - gpio_lcd_truly_emuspi_write_one_data(0x01); - gpio_lcd_truly_emuspi_write_one_data(0xE6); - gpio_lcd_truly_emuspi_write_one_data(0xE6); - gpio_lcd_truly_emuspi_write_one_data(0xE6); - gpio_lcd_truly_emuspi_write_one_data(0xE6); - gpio_lcd_truly_emuspi_write_one_data(0xE6); - SPI_Stop(); - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xE0); //SET GAMMA 2.2 - gpio_lcd_truly_emuspi_write_one_data(0x00); - gpio_lcd_truly_emuspi_write_one_data(0x13); - gpio_lcd_truly_emuspi_write_one_data(0x19); - gpio_lcd_truly_emuspi_write_one_data(0x38); - gpio_lcd_truly_emuspi_write_one_data(0x3D); - gpio_lcd_truly_emuspi_write_one_data(0x3F); - gpio_lcd_truly_emuspi_write_one_data(0x28); - gpio_lcd_truly_emuspi_write_one_data(0x46); - gpio_lcd_truly_emuspi_write_one_data(0x07); - gpio_lcd_truly_emuspi_write_one_data(0x0D); - gpio_lcd_truly_emuspi_write_one_data(0x0E); - gpio_lcd_truly_emuspi_write_one_data(0x12); - gpio_lcd_truly_emuspi_write_one_data(0x15); - gpio_lcd_truly_emuspi_write_one_data(0x12); - gpio_lcd_truly_emuspi_write_one_data(0x14); - gpio_lcd_truly_emuspi_write_one_data(0x0F); - gpio_lcd_truly_emuspi_write_one_data(0x17); - gpio_lcd_truly_emuspi_write_one_data(0x00); - gpio_lcd_truly_emuspi_write_one_data(0x13); - gpio_lcd_truly_emuspi_write_one_data(0x19); - gpio_lcd_truly_emuspi_write_one_data(0x38); - gpio_lcd_truly_emuspi_write_one_data(0x3D); - gpio_lcd_truly_emuspi_write_one_data(0x3F); - gpio_lcd_truly_emuspi_write_one_data(0x28); - gpio_lcd_truly_emuspi_write_one_data(0x46); - gpio_lcd_truly_emuspi_write_one_data(0x07); - gpio_lcd_truly_emuspi_write_one_data(0x0D); - gpio_lcd_truly_emuspi_write_one_data(0x0E); - gpio_lcd_truly_emuspi_write_one_data(0x12); - gpio_lcd_truly_emuspi_write_one_data(0x15); - gpio_lcd_truly_emuspi_write_one_data(0x12); - gpio_lcd_truly_emuspi_write_one_data(0x14); - gpio_lcd_truly_emuspi_write_one_data(0x0F); - gpio_lcd_truly_emuspi_write_one_data(0x17); - SPI_Stop(); - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xC1); //SET DGC - gpio_lcd_truly_emuspi_write_one_data(0x01); - gpio_lcd_truly_emuspi_write_one_data(0x04); - gpio_lcd_truly_emuspi_write_one_data(0x0A); - gpio_lcd_truly_emuspi_write_one_data(0x13); - gpio_lcd_truly_emuspi_write_one_data(0x1A); - gpio_lcd_truly_emuspi_write_one_data(0x21); - gpio_lcd_truly_emuspi_write_one_data(0x29); - gpio_lcd_truly_emuspi_write_one_data(0x31); - gpio_lcd_truly_emuspi_write_one_data(0x37); - gpio_lcd_truly_emuspi_write_one_data(0x3E); - gpio_lcd_truly_emuspi_write_one_data(0x47); - gpio_lcd_truly_emuspi_write_one_data(0x4F); - gpio_lcd_truly_emuspi_write_one_data(0x56); - gpio_lcd_truly_emuspi_write_one_data(0x5E); - gpio_lcd_truly_emuspi_write_one_data(0x65); - gpio_lcd_truly_emuspi_write_one_data(0x6E); - gpio_lcd_truly_emuspi_write_one_data(0x78); - gpio_lcd_truly_emuspi_write_one_data(0x80); - gpio_lcd_truly_emuspi_write_one_data(0x88); - gpio_lcd_truly_emuspi_write_one_data(0x8F); - gpio_lcd_truly_emuspi_write_one_data(0x98); - gpio_lcd_truly_emuspi_write_one_data(0xA0); - gpio_lcd_truly_emuspi_write_one_data(0xA8); - gpio_lcd_truly_emuspi_write_one_data(0xB1); - gpio_lcd_truly_emuspi_write_one_data(0xBA); - gpio_lcd_truly_emuspi_write_one_data(0xC3); - gpio_lcd_truly_emuspi_write_one_data(0xCB); - gpio_lcd_truly_emuspi_write_one_data(0xD3); - gpio_lcd_truly_emuspi_write_one_data(0xDB); - gpio_lcd_truly_emuspi_write_one_data(0xE4); - gpio_lcd_truly_emuspi_write_one_data(0xEB); - gpio_lcd_truly_emuspi_write_one_data(0xF3); - gpio_lcd_truly_emuspi_write_one_data(0xFA); - gpio_lcd_truly_emuspi_write_one_data(0xFF); - gpio_lcd_truly_emuspi_write_one_data(0x20); - gpio_lcd_truly_emuspi_write_one_data(0x35); - gpio_lcd_truly_emuspi_write_one_data(0xE6); - gpio_lcd_truly_emuspi_write_one_data(0x2D); - gpio_lcd_truly_emuspi_write_one_data(0x8C); - gpio_lcd_truly_emuspi_write_one_data(0x29); - gpio_lcd_truly_emuspi_write_one_data(0xE3); - gpio_lcd_truly_emuspi_write_one_data(0x2F); - gpio_lcd_truly_emuspi_write_one_data(0xC0); - gpio_lcd_truly_emuspi_write_one_data(0x04); - gpio_lcd_truly_emuspi_write_one_data(0x0A); - gpio_lcd_truly_emuspi_write_one_data(0x13); - gpio_lcd_truly_emuspi_write_one_data(0x1A); - gpio_lcd_truly_emuspi_write_one_data(0x21); - gpio_lcd_truly_emuspi_write_one_data(0x29); - gpio_lcd_truly_emuspi_write_one_data(0x31); - gpio_lcd_truly_emuspi_write_one_data(0x37); - gpio_lcd_truly_emuspi_write_one_data(0x3E); - gpio_lcd_truly_emuspi_write_one_data(0x47); - gpio_lcd_truly_emuspi_write_one_data(0x4F); - gpio_lcd_truly_emuspi_write_one_data(0x56); - gpio_lcd_truly_emuspi_write_one_data(0x5E); - gpio_lcd_truly_emuspi_write_one_data(0x65); - gpio_lcd_truly_emuspi_write_one_data(0x6E); - gpio_lcd_truly_emuspi_write_one_data(0x78); - gpio_lcd_truly_emuspi_write_one_data(0x80); - gpio_lcd_truly_emuspi_write_one_data(0x88); - gpio_lcd_truly_emuspi_write_one_data(0x8F); - gpio_lcd_truly_emuspi_write_one_data(0x98); - gpio_lcd_truly_emuspi_write_one_data(0xA0); - gpio_lcd_truly_emuspi_write_one_data(0xA8); - gpio_lcd_truly_emuspi_write_one_data(0xB1); - gpio_lcd_truly_emuspi_write_one_data(0xBA); - gpio_lcd_truly_emuspi_write_one_data(0xC3); - gpio_lcd_truly_emuspi_write_one_data(0xCB); - gpio_lcd_truly_emuspi_write_one_data(0xD3); - gpio_lcd_truly_emuspi_write_one_data(0xDB); - gpio_lcd_truly_emuspi_write_one_data(0xE4); - gpio_lcd_truly_emuspi_write_one_data(0xEB); - gpio_lcd_truly_emuspi_write_one_data(0xF3); - gpio_lcd_truly_emuspi_write_one_data(0xFA); - gpio_lcd_truly_emuspi_write_one_data(0xFF); - gpio_lcd_truly_emuspi_write_one_data(0x20); - gpio_lcd_truly_emuspi_write_one_data(0x35); - gpio_lcd_truly_emuspi_write_one_data(0xE6); - gpio_lcd_truly_emuspi_write_one_data(0x2D); - gpio_lcd_truly_emuspi_write_one_data(0x8C); - gpio_lcd_truly_emuspi_write_one_data(0x29); - gpio_lcd_truly_emuspi_write_one_data(0xE3); - gpio_lcd_truly_emuspi_write_one_data(0x2F); - gpio_lcd_truly_emuspi_write_one_data(0xC0); - gpio_lcd_truly_emuspi_write_one_data(0x04); - gpio_lcd_truly_emuspi_write_one_data(0x0A); - gpio_lcd_truly_emuspi_write_one_data(0x13); - gpio_lcd_truly_emuspi_write_one_data(0x1A); - gpio_lcd_truly_emuspi_write_one_data(0x21); - gpio_lcd_truly_emuspi_write_one_data(0x29); - gpio_lcd_truly_emuspi_write_one_data(0x31); - gpio_lcd_truly_emuspi_write_one_data(0x37); - gpio_lcd_truly_emuspi_write_one_data(0x3E); - gpio_lcd_truly_emuspi_write_one_data(0x47); - gpio_lcd_truly_emuspi_write_one_data(0x4F); - gpio_lcd_truly_emuspi_write_one_data(0x56); - gpio_lcd_truly_emuspi_write_one_data(0x5E); - gpio_lcd_truly_emuspi_write_one_data(0x65); - gpio_lcd_truly_emuspi_write_one_data(0x6E); - gpio_lcd_truly_emuspi_write_one_data(0x78); - gpio_lcd_truly_emuspi_write_one_data(0x80); - gpio_lcd_truly_emuspi_write_one_data(0x88); - gpio_lcd_truly_emuspi_write_one_data(0x8F); - gpio_lcd_truly_emuspi_write_one_data(0x98); - gpio_lcd_truly_emuspi_write_one_data(0xA0); - gpio_lcd_truly_emuspi_write_one_data(0xA8); - gpio_lcd_truly_emuspi_write_one_data(0xB1); - gpio_lcd_truly_emuspi_write_one_data(0xBA); - gpio_lcd_truly_emuspi_write_one_data(0xC3); - gpio_lcd_truly_emuspi_write_one_data(0xCB); - gpio_lcd_truly_emuspi_write_one_data(0xD3); - gpio_lcd_truly_emuspi_write_one_data(0xDB); - gpio_lcd_truly_emuspi_write_one_data(0xE4); - gpio_lcd_truly_emuspi_write_one_data(0xEB); - gpio_lcd_truly_emuspi_write_one_data(0xF3); - gpio_lcd_truly_emuspi_write_one_data(0xFA); - gpio_lcd_truly_emuspi_write_one_data(0xFF); - gpio_lcd_truly_emuspi_write_one_data(0x20); - gpio_lcd_truly_emuspi_write_one_data(0x35); - gpio_lcd_truly_emuspi_write_one_data(0xE6); - gpio_lcd_truly_emuspi_write_one_data(0x2D); - gpio_lcd_truly_emuspi_write_one_data(0x8C); - gpio_lcd_truly_emuspi_write_one_data(0x29); - gpio_lcd_truly_emuspi_write_one_data(0xE3); - gpio_lcd_truly_emuspi_write_one_data(0x2F); - gpio_lcd_truly_emuspi_write_one_data(0xC0); - SPI_Stop(); - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xB3); // SET Display 480x800 - gpio_lcd_truly_emuspi_write_one_data(0x0f); - SPI_Stop(); - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0x3A); //SET pixel format 24-bit - gpio_lcd_truly_emuspi_write_one_data(0x66); - SPI_Stop(); - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0x11); // sleep out command - mdelay(120); - SPI_Stop(); - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0x29); // display on command - SPI_Stop(); - #endif - //dprintf(1,"[hp@lcd&fb]:lcd module init exit\n!"); - -} -#endif - -void lcdc_trulylg_init(void) -{ - SPI_Start(); - gpio_lcd_truly_emuspi_write_one_index(0xb9); // set password - gpio_lcd_truly_emuspi_write_one_data(0xff); - gpio_lcd_truly_emuspi_write_one_data(0x83); - gpio_lcd_truly_emuspi_write_one_data(0x69); - SPI_Stop(); +void lcdc_trulylg_init(void) +{ + SPI_Start(); + gpio_lcd_truly_emuspi_write_one_index(0xb9); // set password + gpio_lcd_truly_emuspi_write_one_data(0xff); + gpio_lcd_truly_emuspi_write_one_data(0x83); + gpio_lcd_truly_emuspi_write_one_data(0x69); + SPI_Stop(); SPI_Start(); gpio_lcd_truly_emuspi_write_one_index(0xb1); //set power @@ -3379,7 +2395,7 @@ void lcdc_trulylg_init(void) SPI_Start(); gpio_lcd_truly_emuspi_write_one_index(0xb4); // set display 480x800 - gpio_lcd_truly_emuspi_write_one_data(0x01); + gpio_lcd_truly_emuspi_write_one_data(0x00); //0x01 gpio_lcd_truly_emuspi_write_one_data(0x0c); gpio_lcd_truly_emuspi_write_one_data(0xa0); gpio_lcd_truly_emuspi_write_one_data(0x0e); @@ -3516,6 +2532,8 @@ void lcdc_truly_sleep(void) gpio_lcd_truly_emuspi_write_one_index(0x10); SPI_Stop(); mdelay(120); + printk(" gequn lcd module hydis 736v sleep finish\n!"); + } void lcdc_lead_sleep(void) { @@ -3782,12 +2800,12 @@ static int __init lcdc_panel_probe(struct platform_device *pdev) if(g_lcd_panel_type==LCD_PANEL_HYDIS_WVGA) { pinfo = &lcdc_tft_panel_data.panel_info; - pinfo->lcdc.h_back_porch = 5; - pinfo->lcdc.h_front_porch = 5; - pinfo->lcdc.h_pulse_width = 1; - pinfo->lcdc.v_back_porch = 5; - pinfo->lcdc.v_front_porch = 5; - pinfo->lcdc.v_pulse_width = 1; + pinfo->lcdc.h_back_porch = 10; + pinfo->lcdc.h_front_porch = 10; + pinfo->lcdc.h_pulse_width = 10; + pinfo->lcdc.v_back_porch = 3; + pinfo->lcdc.v_front_porch = 3; + pinfo->lcdc.v_pulse_width = 4; pinfo->lcdc.border_clr = 0; /* blk */ pinfo->lcdc.underflow_clr = 0xffff; /* blue */ pinfo->lcdc.hsync_skew = 0; @@ -3854,7 +2872,7 @@ static int __init lcdc_panel_probe(struct platform_device *pdev) switch(g_lcd_panel_type) { case LCD_PANEL_HYDIS_WVGA: - LcdPanleID=(u32)41; //ZTE_LCD_LHT_20100611_001 + LcdPanleID=(u32)101; //ZTE_LCD_LHT_20100611_001 pinfo->clk_rate = 24576000; ret = platform_device_register(&this_device); break; @@ -3864,7 +2882,7 @@ static int __init lcdc_panel_probe(struct platform_device *pdev) ret = platform_device_register(&this_device); break; case LCD_PANEL_TRULYLG_WVGA: - LcdPanleID=(u32)44; //ZTE_LCD_LHT_20100611_001 + LcdPanleID=(u32)100; //ZTE_LCD_LHT_20100611_001 pinfo->clk_rate = 24576000; ret = platform_device_register(&this_device); break; diff --git a/drivers/video/msm/lcdc_panel_wvga_skate.c b/drivers/video/msm/lcdc_panel_wvga_skate.c index acf2fa7f..45a94a75 100644 --- a/drivers/video/msm/lcdc_panel_wvga_skate.c +++ b/drivers/video/msm/lcdc_panel_wvga_skate.c @@ -47,6 +47,7 @@ typedef enum LCD_PANEL_NONE = 0, LCD_PANEL_LEAD_WVGA, LCD_PANEL_TRULY_WVGA, + LCD_PANEL_BOE_WVGA, }LCD_PANEL_TYPE; static LCD_PANEL_TYPE g_lcd_panel_type = LCD_PANEL_NONE; @@ -66,11 +67,13 @@ static void gpio_lcd_truly_emuspi_write_one_index(unsigned short addr); static void gpio_lcd_truly_emuspi_write_one_data(unsigned short data); static void gpio_lcd_lead_emuspi_write_one_index(unsigned int addr,unsigned short data); static void lcdc_lead_init(void); +static void lcdc_boe_init(void); static void lcdc_truly_init(void); static void lcd_panel_init(void); static void lcdc_set_bl(struct msm_fb_data_type *mfd); void lcdc_lead_sleep(void); void lcdc_truly_sleep(void); +void lcdc_boe_sleep(void); static void spi_init(void); static int lcdc_panel_on(struct platform_device *pdev); static int lcdc_panel_off(struct platform_device *pdev); @@ -535,10 +538,465 @@ static void gpio_lcd_truly_emuspi_read_one_para(unsigned short addr, unsigned in } *data1 = bits1; +} +static void lcdc_boe_init(void) +{ +gpio_lcd_lead_emuspi_write_cmd(0x1100,0x00); //Sleep out +msleep(120); + +gpio_lcd_lead_emuspi_write_one_index(0xF000,0x55);//Enable Page 1 +gpio_lcd_lead_emuspi_write_one_index(0xF001,0xAA); +gpio_lcd_lead_emuspi_write_one_index(0xF002,0x52); +gpio_lcd_lead_emuspi_write_one_index(0xF003,0x08); +gpio_lcd_lead_emuspi_write_one_index(0xF004,0x01); + + +gpio_lcd_lead_emuspi_write_one_index(0xB600,0x34);//AVDD Setting +gpio_lcd_lead_emuspi_write_one_index(0xB601,0x34); +gpio_lcd_lead_emuspi_write_one_index(0xB602,0x34); +gpio_lcd_lead_emuspi_write_one_index(0xB000,0x0c); +gpio_lcd_lead_emuspi_write_one_index(0xB001,0x0c); +gpio_lcd_lead_emuspi_write_one_index(0xB002,0x0c); + +gpio_lcd_lead_emuspi_write_one_index(0xB700,0x24);//AVEE Setting +gpio_lcd_lead_emuspi_write_one_index(0xB701,0x24); +gpio_lcd_lead_emuspi_write_one_index(0xB702,0x24); +gpio_lcd_lead_emuspi_write_one_index(0xB100,0x0c); +gpio_lcd_lead_emuspi_write_one_index(0xB101,0x0c); +gpio_lcd_lead_emuspi_write_one_index(0xB102,0x0c); + +gpio_lcd_lead_emuspi_write_one_index(0xB800,0x34);//VCL Setting +gpio_lcd_lead_emuspi_write_one_index(0xB200,0x00); + +gpio_lcd_lead_emuspi_write_one_index(0xB900,0x34);//VGH Setting +gpio_lcd_lead_emuspi_write_one_index(0xB901,0x34); +gpio_lcd_lead_emuspi_write_one_index(0xB902,0x34); +gpio_lcd_lead_emuspi_write_one_index(0xB300,0x08); +gpio_lcd_lead_emuspi_write_one_index(0xB301,0x08); +gpio_lcd_lead_emuspi_write_one_index(0xB302,0x08); + +gpio_lcd_lead_emuspi_write_one_index(0xBA00,0x14);//VGL Setting +gpio_lcd_lead_emuspi_write_one_index(0xBA01,0x14); +gpio_lcd_lead_emuspi_write_one_index(0xBA02,0x14); +gpio_lcd_lead_emuspi_write_one_index(0xB500,0x08); +gpio_lcd_lead_emuspi_write_one_index(0xB501,0x08); +gpio_lcd_lead_emuspi_write_one_index(0xB502,0x08); + + +gpio_lcd_lead_emuspi_write_one_index(0xBC00,0x00);//VGMP Setting +gpio_lcd_lead_emuspi_write_one_index(0xBC01,0x90); +gpio_lcd_lead_emuspi_write_one_index(0xBC02,0x00); + +gpio_lcd_lead_emuspi_write_one_index(0xBD00,0x00);//VGMN Setting +gpio_lcd_lead_emuspi_write_one_index(0xBD01,0x90); +gpio_lcd_lead_emuspi_write_one_index(0xBD02,0x00); + +gpio_lcd_lead_emuspi_write_one_index(0xBE00,0x00);//Vcom Setting +gpio_lcd_lead_emuspi_write_one_index(0xBE01,0x2F);//2 + +gpio_lcd_lead_emuspi_write_one_index(0xD100,0x00);//Gamma setting R+ +gpio_lcd_lead_emuspi_write_one_index(0xD101,0X37); +gpio_lcd_lead_emuspi_write_one_index(0xD102,0x00); +gpio_lcd_lead_emuspi_write_one_index(0xD103,0xB2); +gpio_lcd_lead_emuspi_write_one_index(0xD104,0x00); +gpio_lcd_lead_emuspi_write_one_index(0xD105,0xE2); +gpio_lcd_lead_emuspi_write_one_index(0xD106,0x00); +gpio_lcd_lead_emuspi_write_one_index(0xD107,0xFE); +gpio_lcd_lead_emuspi_write_one_index(0xD108,0x01); +gpio_lcd_lead_emuspi_write_one_index(0xD109,0x0D); +gpio_lcd_lead_emuspi_write_one_index(0xD10A,0X01); +gpio_lcd_lead_emuspi_write_one_index(0xD10B,0x30); +gpio_lcd_lead_emuspi_write_one_index(0xD10C,0x01); +gpio_lcd_lead_emuspi_write_one_index(0xD10D,0x50); +gpio_lcd_lead_emuspi_write_one_index(0xD10E,0x01); +gpio_lcd_lead_emuspi_write_one_index(0xD10F,0x7B); +gpio_lcd_lead_emuspi_write_one_index(0xD110,0x01); +gpio_lcd_lead_emuspi_write_one_index(0xD111,0x9E); +gpio_lcd_lead_emuspi_write_one_index(0xD112,0x01); +gpio_lcd_lead_emuspi_write_one_index(0xD113,0xD3); +gpio_lcd_lead_emuspi_write_one_index(0xD114,0x01); +gpio_lcd_lead_emuspi_write_one_index(0xD115,0xFC); +gpio_lcd_lead_emuspi_write_one_index(0xD116,0x02); +gpio_lcd_lead_emuspi_write_one_index(0xD117,0x3D); +gpio_lcd_lead_emuspi_write_one_index(0xD118,0x02); +gpio_lcd_lead_emuspi_write_one_index(0xD119,0x74); +gpio_lcd_lead_emuspi_write_one_index(0xD11A,0x02); +gpio_lcd_lead_emuspi_write_one_index(0xD11B,0x75); +gpio_lcd_lead_emuspi_write_one_index(0xD11C,0x02); +gpio_lcd_lead_emuspi_write_one_index(0xD11D,0xA5); +gpio_lcd_lead_emuspi_write_one_index(0xD11E,0x02); +gpio_lcd_lead_emuspi_write_one_index(0xD11F,0xD9); +gpio_lcd_lead_emuspi_write_one_index(0xD120,0x02); +gpio_lcd_lead_emuspi_write_one_index(0xD121,0xFB); +gpio_lcd_lead_emuspi_write_one_index(0xD122,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD123,0x25); +gpio_lcd_lead_emuspi_write_one_index(0xD124,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD125,0x41); +gpio_lcd_lead_emuspi_write_one_index(0xD126,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD127,0x65); +gpio_lcd_lead_emuspi_write_one_index(0xD128,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD129,0x7B); +gpio_lcd_lead_emuspi_write_one_index(0xD12A,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD12B,0x99); +gpio_lcd_lead_emuspi_write_one_index(0xD12C,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD12D,0xA9); +gpio_lcd_lead_emuspi_write_one_index(0xD12E,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD12F,0xBA); +gpio_lcd_lead_emuspi_write_one_index(0xD130,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD131,0xC1); +gpio_lcd_lead_emuspi_write_one_index(0xD132,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD133,0XC1); + + + +gpio_lcd_lead_emuspi_write_one_index(0xD200,0x00);//Gamma setting G+ +gpio_lcd_lead_emuspi_write_one_index(0xD201,0X37); +gpio_lcd_lead_emuspi_write_one_index(0xD202,0x00); +gpio_lcd_lead_emuspi_write_one_index(0xD203,0xB2); +gpio_lcd_lead_emuspi_write_one_index(0xD204,0x00); +gpio_lcd_lead_emuspi_write_one_index(0xD205,0xE2); +gpio_lcd_lead_emuspi_write_one_index(0xD206,0x00); +gpio_lcd_lead_emuspi_write_one_index(0xD207,0xFE); +gpio_lcd_lead_emuspi_write_one_index(0xD208,0x01); +gpio_lcd_lead_emuspi_write_one_index(0xD209,0x0D); +gpio_lcd_lead_emuspi_write_one_index(0xD20A,0X01); +gpio_lcd_lead_emuspi_write_one_index(0xD20B,0x30); +gpio_lcd_lead_emuspi_write_one_index(0xD20C,0x01); +gpio_lcd_lead_emuspi_write_one_index(0xD20D,0x50); +gpio_lcd_lead_emuspi_write_one_index(0xD20E,0x01); +gpio_lcd_lead_emuspi_write_one_index(0xD20F,0x7B); +gpio_lcd_lead_emuspi_write_one_index(0xD210,0x01); +gpio_lcd_lead_emuspi_write_one_index(0xD211,0x9E); +gpio_lcd_lead_emuspi_write_one_index(0xD212,0x01); +gpio_lcd_lead_emuspi_write_one_index(0xD213,0xD3); +gpio_lcd_lead_emuspi_write_one_index(0xD214,0x01); +gpio_lcd_lead_emuspi_write_one_index(0xD215,0xFC); +gpio_lcd_lead_emuspi_write_one_index(0xD216,0x02); +gpio_lcd_lead_emuspi_write_one_index(0xD217,0x3D); +gpio_lcd_lead_emuspi_write_one_index(0xD218,0x02); +gpio_lcd_lead_emuspi_write_one_index(0xD219,0x74); +gpio_lcd_lead_emuspi_write_one_index(0xD21A,0x02); +gpio_lcd_lead_emuspi_write_one_index(0xD21B,0x75); +gpio_lcd_lead_emuspi_write_one_index(0xD21C,0x02); +gpio_lcd_lead_emuspi_write_one_index(0xD21D,0xA5); +gpio_lcd_lead_emuspi_write_one_index(0xD21E,0x02); +gpio_lcd_lead_emuspi_write_one_index(0xD21F,0xD9); +gpio_lcd_lead_emuspi_write_one_index(0xD220,0x02); +gpio_lcd_lead_emuspi_write_one_index(0xD221,0xFB); +gpio_lcd_lead_emuspi_write_one_index(0xD222,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD223,0x25); +gpio_lcd_lead_emuspi_write_one_index(0xD224,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD225,0x41); +gpio_lcd_lead_emuspi_write_one_index(0xD226,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD227,0x65); +gpio_lcd_lead_emuspi_write_one_index(0xD228,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD229,0x7B); +gpio_lcd_lead_emuspi_write_one_index(0xD22A,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD22B,0x99); +gpio_lcd_lead_emuspi_write_one_index(0xD22C,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD22D,0xA9); +gpio_lcd_lead_emuspi_write_one_index(0xD22E,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD22F,0xBA); +gpio_lcd_lead_emuspi_write_one_index(0xD230,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD231,0xC1); +gpio_lcd_lead_emuspi_write_one_index(0xD232,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD233,0XC1); + + +gpio_lcd_lead_emuspi_write_one_index(0xD300,0x00);//Gamma setting B+ +gpio_lcd_lead_emuspi_write_one_index(0xD301,0X37); +gpio_lcd_lead_emuspi_write_one_index(0xD302,0x00); +gpio_lcd_lead_emuspi_write_one_index(0xD303,0xB2); +gpio_lcd_lead_emuspi_write_one_index(0xD304,0x00); +gpio_lcd_lead_emuspi_write_one_index(0xD305,0xE2); +gpio_lcd_lead_emuspi_write_one_index(0xD306,0x00); +gpio_lcd_lead_emuspi_write_one_index(0xD307,0xFE); +gpio_lcd_lead_emuspi_write_one_index(0xD308,0x01); +gpio_lcd_lead_emuspi_write_one_index(0xD309,0x0D); +gpio_lcd_lead_emuspi_write_one_index(0xD30A,0X01); +gpio_lcd_lead_emuspi_write_one_index(0xD30B,0x30); +gpio_lcd_lead_emuspi_write_one_index(0xD30C,0x01); +gpio_lcd_lead_emuspi_write_one_index(0xD30D,0x50); +gpio_lcd_lead_emuspi_write_one_index(0xD30E,0x01); +gpio_lcd_lead_emuspi_write_one_index(0xD30F,0x7B); +gpio_lcd_lead_emuspi_write_one_index(0xD310,0x01); +gpio_lcd_lead_emuspi_write_one_index(0xD311,0x9E); +gpio_lcd_lead_emuspi_write_one_index(0xD312,0x01); +gpio_lcd_lead_emuspi_write_one_index(0xD313,0xD3); +gpio_lcd_lead_emuspi_write_one_index(0xD314,0x01); +gpio_lcd_lead_emuspi_write_one_index(0xD315,0xFC); +gpio_lcd_lead_emuspi_write_one_index(0xD316,0x02); +gpio_lcd_lead_emuspi_write_one_index(0xD317,0x3D); +gpio_lcd_lead_emuspi_write_one_index(0xD318,0x02); +gpio_lcd_lead_emuspi_write_one_index(0xD319,0x74); +gpio_lcd_lead_emuspi_write_one_index(0xD31A,0x02); +gpio_lcd_lead_emuspi_write_one_index(0xD31B,0x75); +gpio_lcd_lead_emuspi_write_one_index(0xD31C,0x02); +gpio_lcd_lead_emuspi_write_one_index(0xD31D,0xA5); +gpio_lcd_lead_emuspi_write_one_index(0xD31E,0x02); +gpio_lcd_lead_emuspi_write_one_index(0xD31F,0xD9); +gpio_lcd_lead_emuspi_write_one_index(0xD320,0x02); +gpio_lcd_lead_emuspi_write_one_index(0xD321,0xFB); +gpio_lcd_lead_emuspi_write_one_index(0xD322,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD323,0x25); +gpio_lcd_lead_emuspi_write_one_index(0xD324,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD325,0x41); +gpio_lcd_lead_emuspi_write_one_index(0xD326,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD327,0x65); +gpio_lcd_lead_emuspi_write_one_index(0xD328,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD329,0x7B); +gpio_lcd_lead_emuspi_write_one_index(0xD32A,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD32B,0x99); +gpio_lcd_lead_emuspi_write_one_index(0xD32C,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD32D,0xA9); +gpio_lcd_lead_emuspi_write_one_index(0xD32E,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD32F,0xBA); +gpio_lcd_lead_emuspi_write_one_index(0xD330,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD331,0xC1); +gpio_lcd_lead_emuspi_write_one_index(0xD332,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD333,0XC1); + + + +gpio_lcd_lead_emuspi_write_one_index(0xD400,0x00);//Gamma setting R- +gpio_lcd_lead_emuspi_write_one_index(0xD401,0X37); +gpio_lcd_lead_emuspi_write_one_index(0xD402,0x00); +gpio_lcd_lead_emuspi_write_one_index(0xD403,0xB2); +gpio_lcd_lead_emuspi_write_one_index(0xD404,0x00); +gpio_lcd_lead_emuspi_write_one_index(0xD405,0xE2); +gpio_lcd_lead_emuspi_write_one_index(0xD406,0x00); +gpio_lcd_lead_emuspi_write_one_index(0xD407,0xFE); +gpio_lcd_lead_emuspi_write_one_index(0xD408,0x01); +gpio_lcd_lead_emuspi_write_one_index(0xD409,0x0D); +gpio_lcd_lead_emuspi_write_one_index(0xD40A,0X01); +gpio_lcd_lead_emuspi_write_one_index(0xD40B,0x30); +gpio_lcd_lead_emuspi_write_one_index(0xD40C,0x01); +gpio_lcd_lead_emuspi_write_one_index(0xD40D,0x50); +gpio_lcd_lead_emuspi_write_one_index(0xD40E,0x01); +gpio_lcd_lead_emuspi_write_one_index(0xD40F,0x7B); +gpio_lcd_lead_emuspi_write_one_index(0xD410,0x01); +gpio_lcd_lead_emuspi_write_one_index(0xD411,0x9E); +gpio_lcd_lead_emuspi_write_one_index(0xD412,0x01); +gpio_lcd_lead_emuspi_write_one_index(0xD413,0xD3); +gpio_lcd_lead_emuspi_write_one_index(0xD414,0x01); +gpio_lcd_lead_emuspi_write_one_index(0xD415,0xFC); +gpio_lcd_lead_emuspi_write_one_index(0xD416,0x02); +gpio_lcd_lead_emuspi_write_one_index(0xD417,0x3D); +gpio_lcd_lead_emuspi_write_one_index(0xD418,0x02); +gpio_lcd_lead_emuspi_write_one_index(0xD419,0x74); +gpio_lcd_lead_emuspi_write_one_index(0xD41A,0x02); +gpio_lcd_lead_emuspi_write_one_index(0xD41B,0x75); +gpio_lcd_lead_emuspi_write_one_index(0xD41C,0x02); +gpio_lcd_lead_emuspi_write_one_index(0xD41D,0xA5); +gpio_lcd_lead_emuspi_write_one_index(0xD41E,0x02); +gpio_lcd_lead_emuspi_write_one_index(0xD41F,0xD9); +gpio_lcd_lead_emuspi_write_one_index(0xD420,0x02); +gpio_lcd_lead_emuspi_write_one_index(0xD421,0xFB); +gpio_lcd_lead_emuspi_write_one_index(0xD422,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD423,0x25); +gpio_lcd_lead_emuspi_write_one_index(0xD424,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD425,0x41); +gpio_lcd_lead_emuspi_write_one_index(0xD426,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD427,0x65); +gpio_lcd_lead_emuspi_write_one_index(0xD428,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD429,0x7B); +gpio_lcd_lead_emuspi_write_one_index(0xD42A,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD42B,0x99); +gpio_lcd_lead_emuspi_write_one_index(0xD42C,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD42D,0xA9); +gpio_lcd_lead_emuspi_write_one_index(0xD42E,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD42F,0xBA); +gpio_lcd_lead_emuspi_write_one_index(0xD430,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD431,0xC1); +gpio_lcd_lead_emuspi_write_one_index(0xD432,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD433,0XC1); + + +gpio_lcd_lead_emuspi_write_one_index(0xD500,0x00);//Gamma setting G- +gpio_lcd_lead_emuspi_write_one_index(0xD501,0X37); +gpio_lcd_lead_emuspi_write_one_index(0xD502,0x00); +gpio_lcd_lead_emuspi_write_one_index(0xD503,0xB2); +gpio_lcd_lead_emuspi_write_one_index(0xD504,0x00); +gpio_lcd_lead_emuspi_write_one_index(0xD505,0xE2); +gpio_lcd_lead_emuspi_write_one_index(0xD506,0x00); +gpio_lcd_lead_emuspi_write_one_index(0xD507,0xFE); +gpio_lcd_lead_emuspi_write_one_index(0xD508,0x01); +gpio_lcd_lead_emuspi_write_one_index(0xD509,0x0D); +gpio_lcd_lead_emuspi_write_one_index(0xD50A,0X01); +gpio_lcd_lead_emuspi_write_one_index(0xD50B,0x30); +gpio_lcd_lead_emuspi_write_one_index(0xD50C,0x01); +gpio_lcd_lead_emuspi_write_one_index(0xD50D,0x50); +gpio_lcd_lead_emuspi_write_one_index(0xD50E,0x01); +gpio_lcd_lead_emuspi_write_one_index(0xD50F,0x7B); +gpio_lcd_lead_emuspi_write_one_index(0xD510,0x01); +gpio_lcd_lead_emuspi_write_one_index(0xD511,0x9E); +gpio_lcd_lead_emuspi_write_one_index(0xD512,0x01); +gpio_lcd_lead_emuspi_write_one_index(0xD513,0xD3); +gpio_lcd_lead_emuspi_write_one_index(0xD514,0x01); +gpio_lcd_lead_emuspi_write_one_index(0xD515,0xFC); +gpio_lcd_lead_emuspi_write_one_index(0xD516,0x02); +gpio_lcd_lead_emuspi_write_one_index(0xD517,0x3D); +gpio_lcd_lead_emuspi_write_one_index(0xD518,0x02); +gpio_lcd_lead_emuspi_write_one_index(0xD519,0x74); +gpio_lcd_lead_emuspi_write_one_index(0xD51A,0x02); +gpio_lcd_lead_emuspi_write_one_index(0xD51B,0x75); +gpio_lcd_lead_emuspi_write_one_index(0xD51C,0x02); +gpio_lcd_lead_emuspi_write_one_index(0xD51D,0xA5); +gpio_lcd_lead_emuspi_write_one_index(0xD51E,0x02); +gpio_lcd_lead_emuspi_write_one_index(0xD51F,0xD9); +gpio_lcd_lead_emuspi_write_one_index(0xD520,0x02); +gpio_lcd_lead_emuspi_write_one_index(0xD521,0xFB); +gpio_lcd_lead_emuspi_write_one_index(0xD522,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD523,0x25); +gpio_lcd_lead_emuspi_write_one_index(0xD524,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD525,0x41); +gpio_lcd_lead_emuspi_write_one_index(0xD526,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD527,0x65); +gpio_lcd_lead_emuspi_write_one_index(0xD528,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD529,0x7B); +gpio_lcd_lead_emuspi_write_one_index(0xD52A,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD52B,0x99); +gpio_lcd_lead_emuspi_write_one_index(0xD52C,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD52D,0xA9); +gpio_lcd_lead_emuspi_write_one_index(0xD52E,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD52F,0xBA); +gpio_lcd_lead_emuspi_write_one_index(0xD530,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD531,0xC1); +gpio_lcd_lead_emuspi_write_one_index(0xD532,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD533,0XC1); + +gpio_lcd_lead_emuspi_write_one_index(0xD600,0x00);//Gamma setting B- +gpio_lcd_lead_emuspi_write_one_index(0xD601,0X37); +gpio_lcd_lead_emuspi_write_one_index(0xD602,0x00); +gpio_lcd_lead_emuspi_write_one_index(0xD603,0xB2); +gpio_lcd_lead_emuspi_write_one_index(0xD604,0x00); +gpio_lcd_lead_emuspi_write_one_index(0xD605,0xE2); +gpio_lcd_lead_emuspi_write_one_index(0xD606,0x00); +gpio_lcd_lead_emuspi_write_one_index(0xD607,0xFE); +gpio_lcd_lead_emuspi_write_one_index(0xD608,0x01); +gpio_lcd_lead_emuspi_write_one_index(0xD609,0x0D); +gpio_lcd_lead_emuspi_write_one_index(0xD60A,0X01); +gpio_lcd_lead_emuspi_write_one_index(0xD60B,0x30); +gpio_lcd_lead_emuspi_write_one_index(0xD60C,0x01); +gpio_lcd_lead_emuspi_write_one_index(0xD60D,0x50); +gpio_lcd_lead_emuspi_write_one_index(0xD60E,0x01); +gpio_lcd_lead_emuspi_write_one_index(0xD60F,0x7B); +gpio_lcd_lead_emuspi_write_one_index(0xD610,0x01); +gpio_lcd_lead_emuspi_write_one_index(0xD611,0x9E); +gpio_lcd_lead_emuspi_write_one_index(0xD612,0x01); +gpio_lcd_lead_emuspi_write_one_index(0xD613,0xD3); +gpio_lcd_lead_emuspi_write_one_index(0xD614,0x01); +gpio_lcd_lead_emuspi_write_one_index(0xD615,0xFC); +gpio_lcd_lead_emuspi_write_one_index(0xD616,0x02); +gpio_lcd_lead_emuspi_write_one_index(0xD617,0x3D); +gpio_lcd_lead_emuspi_write_one_index(0xD618,0x02); +gpio_lcd_lead_emuspi_write_one_index(0xD619,0x74); +gpio_lcd_lead_emuspi_write_one_index(0xD61A,0x02); +gpio_lcd_lead_emuspi_write_one_index(0xD61B,0x75); +gpio_lcd_lead_emuspi_write_one_index(0xD61C,0x02); +gpio_lcd_lead_emuspi_write_one_index(0xD61D,0xA5); +gpio_lcd_lead_emuspi_write_one_index(0xD61E,0x02); +gpio_lcd_lead_emuspi_write_one_index(0xD61F,0xD9); +gpio_lcd_lead_emuspi_write_one_index(0xD620,0x02); +gpio_lcd_lead_emuspi_write_one_index(0xD621,0xFB); +gpio_lcd_lead_emuspi_write_one_index(0xD622,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD623,0x25); +gpio_lcd_lead_emuspi_write_one_index(0xD624,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD625,0x41); +gpio_lcd_lead_emuspi_write_one_index(0xD626,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD627,0x65); +gpio_lcd_lead_emuspi_write_one_index(0xD628,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD629,0x7B); +gpio_lcd_lead_emuspi_write_one_index(0xD62A,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD62B,0x99); +gpio_lcd_lead_emuspi_write_one_index(0xD62C,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD62D,0xA9); +gpio_lcd_lead_emuspi_write_one_index(0xD62E,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD62F,0xBA); +gpio_lcd_lead_emuspi_write_one_index(0xD630,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD631,0xC1); +gpio_lcd_lead_emuspi_write_one_index(0xD632,0x03); +gpio_lcd_lead_emuspi_write_one_index(0xD633,0XC1); + + +gpio_lcd_lead_emuspi_write_one_index(0xF000,0x55);//Enable Page 0 +gpio_lcd_lead_emuspi_write_one_index(0xF001,0xAA); +gpio_lcd_lead_emuspi_write_one_index(0xF002,0x52); +gpio_lcd_lead_emuspi_write_one_index(0xF003,0x08); +gpio_lcd_lead_emuspi_write_one_index(0xF004,0x00); + +gpio_lcd_lead_emuspi_write_one_index(0xB000,0x08); //RGB I/F Setting +gpio_lcd_lead_emuspi_write_one_index(0xB001,0x05); +gpio_lcd_lead_emuspi_write_one_index(0xB002,0x02); +gpio_lcd_lead_emuspi_write_one_index(0xB003,0x05); +gpio_lcd_lead_emuspi_write_one_index(0xB004,0x02); + +gpio_lcd_lead_emuspi_write_one_index(0xB600,0x05);//SDT + + +gpio_lcd_lead_emuspi_write_one_index(0xB700,0x70);//Gate EQ +gpio_lcd_lead_emuspi_write_one_index(0xB701,0x70);//Gate EQ + +gpio_lcd_lead_emuspi_write_one_index(0xB800,0x01);//Source EQ +gpio_lcd_lead_emuspi_write_one_index(0xB801,0x05); +gpio_lcd_lead_emuspi_write_one_index(0xB802,0x05); +gpio_lcd_lead_emuspi_write_one_index(0xB803,0x05); + + +//gpio_lcd_lead_emuspi_write_one_index(0xB100,0xCC);//RAM Keep + + + +gpio_lcd_lead_emuspi_write_one_index(0xBC00,0x00);//Column Inversion +gpio_lcd_lead_emuspi_write_one_index(0xBC01,0x00); +gpio_lcd_lead_emuspi_write_one_index(0xBC02,0x00); + +gpio_lcd_lead_emuspi_write_one_index(0xCC00,0x03);//BOE Setting +gpio_lcd_lead_emuspi_write_one_index(0xCC01,0x50); +gpio_lcd_lead_emuspi_write_one_index(0xCC02,0x50); + + +gpio_lcd_lead_emuspi_write_one_index(0xBD00,0x01);//Porch Lines +gpio_lcd_lead_emuspi_write_one_index(0xBD01,0x00); +gpio_lcd_lead_emuspi_write_one_index(0xBD02,0x07); +gpio_lcd_lead_emuspi_write_one_index(0xBD03,0x31); +gpio_lcd_lead_emuspi_write_one_index(0xBD04,0x00); + +/* +gpio_lcd_lead_emuspi_write_one_index(0xBD02,0x07);//Porch Lines +gpio_lcd_lead_emuspi_write_one_index(0xBD03,0x31); +gpio_lcd_lead_emuspi_write_one_index(0xBE02,0x07); +gpio_lcd_lead_emuspi_write_one_index(0xBE03,0x31); +gpio_lcd_lead_emuspi_write_one_index(0xBF02,0x07); +gpio_lcd_lead_emuspi_write_one_index(0xBF03,0x31); +*/ + +gpio_lcd_lead_emuspi_write_one_index(0xFF00,0xAA); +gpio_lcd_lead_emuspi_write_one_index(0xFF01,0x55); +gpio_lcd_lead_emuspi_write_one_index(0xFF02,0x25); +gpio_lcd_lead_emuspi_write_one_index(0xFF03,0x01); + +//gpio_lcd_lead_emuspi_write_one_index(0xF304,0x11); +//gpio_lcd_lead_emuspi_write_one_index(0xF306,0x10); +//gpio_lcd_lead_emuspi_write_one_index(0xF408,0x00); + +gpio_lcd_lead_emuspi_write_one_index(0x3500,0x00); +//gpio_lcd_lead_emuspi_write_one_index(0x3600,0XD4); +gpio_lcd_lead_emuspi_write_one_index(0x3A00,0x66); +//gpio_lcd_lead_emuspi_write_one_index(0x3B00,0x28); + +gpio_lcd_lead_emuspi_write_cmd(0x2900,0x00); //Display on +msleep(60); +gpio_lcd_lead_emuspi_write_cmd(0x2c00,0x00); + + } static void lcdc_lead_init(void) { - gpio_lcd_lead_emuspi_write_one_index(0xF000,0x55);//Enable Page 1 +gpio_lcd_lead_emuspi_write_cmd(0x1100,0x00); //Sleep out +msleep(120); + +gpio_lcd_lead_emuspi_write_one_index(0xF000,0x55);//Enable Page 1 gpio_lcd_lead_emuspi_write_one_index(0xF001,0xAA); gpio_lcd_lead_emuspi_write_one_index(0xF002,0x52); gpio_lcd_lead_emuspi_write_one_index(0xF003,0x08); @@ -869,10 +1327,13 @@ gpio_lcd_lead_emuspi_write_one_index(0xD630,0x03); gpio_lcd_lead_emuspi_write_one_index(0xD631,0xC7); gpio_lcd_lead_emuspi_write_one_index(0xD632,0x03); gpio_lcd_lead_emuspi_write_one_index(0xD633,0XCC); + +gpio_lcd_lead_emuspi_write_one_index(0xB600,0X44); //Add for AVDD Pump +gpio_lcd_lead_emuspi_write_one_index(0xB700,0X34); //Add for AVEE Pump -gpio_lcd_lead_emuspi_write_one_index(0xB000,0X12);//AVDD Voltage Setting -gpio_lcd_lead_emuspi_write_one_index(0xB001,0X12); -gpio_lcd_lead_emuspi_write_one_index(0xB002,0X12); +gpio_lcd_lead_emuspi_write_one_index(0xB000,0X0A);//0x12 AVDD Voltage Setting +gpio_lcd_lead_emuspi_write_one_index(0xB001,0X0A); +gpio_lcd_lead_emuspi_write_one_index(0xB002,0X0A); gpio_lcd_lead_emuspi_write_one_index(0xB100,0X0A);//AVEE Voltage Setting gpio_lcd_lead_emuspi_write_one_index(0xB101,0X0A); @@ -901,8 +1362,8 @@ gpio_lcd_lead_emuspi_write_one_index(0xBC02,0x05); gpio_lcd_lead_emuspi_write_one_index(0xB800,0x01);//Source EQ -gpio_lcd_lead_emuspi_write_one_index(0xB700,0x55);//Source EQ -gpio_lcd_lead_emuspi_write_one_index(0xB701,0x55);//Source EQ +gpio_lcd_lead_emuspi_write_one_index(0xB700,0x70);//Gate EQ +gpio_lcd_lead_emuspi_write_one_index(0xB701,0x70);//Gate EQ gpio_lcd_lead_emuspi_write_one_index(0xBD02,0x07);//Porch Lines gpio_lcd_lead_emuspi_write_one_index(0xBD03,0x31); @@ -924,9 +1385,7 @@ gpio_lcd_lead_emuspi_write_one_index(0x3500,0x00); //gpio_lcd_lead_emuspi_write_one_index(0x3600,0XD4); gpio_lcd_lead_emuspi_write_one_index(0x3A00,0x66); //gpio_lcd_lead_emuspi_write_one_index(0x3B00,0x28); - -gpio_lcd_lead_emuspi_write_cmd(0x1100,0x00); //Sleep out -msleep(80); + gpio_lcd_lead_emuspi_write_cmd(0x2900,0x00); //Display on msleep(60); gpio_lcd_lead_emuspi_write_cmd(0x2c00,0x00); @@ -1277,6 +1736,13 @@ void lcdc_lead_sleep(void) msleep(200); //gpio_lcd_lead_emuspi_write_cmd(0x2800,0x00); } +void lcdc_boe_sleep(void) +{ + gpio_lcd_lead_emuspi_write_cmd(0x2800,0x00); + gpio_lcd_lead_emuspi_write_cmd(0x1000,0x00); + msleep(200); + //gpio_lcd_lead_emuspi_write_cmd(0x2800,0x00); +} static int lcdc_panel_off(struct platform_device *pdev) { printk("lcdc_panel_off , g_lcd_panel_type is %d(1 LEAD. 2 TRULY. 3 OLED. )\n",g_lcd_panel_type); @@ -1288,6 +1754,9 @@ static int lcdc_panel_off(struct platform_device *pdev) case LCD_PANEL_LEAD_WVGA: // lcdc_lead_sleep(); break; + case LCD_PANEL_BOE_WVGA: + lcdc_boe_sleep(); + break; default: break; } @@ -1339,7 +1808,16 @@ static LCD_PANEL_TYPE lcd_panel_detect(void) } else { - panel_type=LCD_PANEL_LEAD_WVGA; + gpio_lcd_lead_emuspi_read_one_index(0xDA00,&id_h); + printk("lead id 0xDA00 is 0x%x\n",id_h); + if(id_h==0xb0) + { + panel_type=LCD_PANEL_BOE_WVGA; + } + else + { + panel_type=LCD_PANEL_LEAD_WVGA; + } return panel_type; } @@ -1360,6 +1838,9 @@ void lcd_panel_init(void) case LCD_PANEL_LEAD_WVGA: lcdc_lead_init(); break; + case LCD_PANEL_BOE_WVGA: + lcdc_boe_init(); + break; default: break; } @@ -1394,10 +1875,10 @@ static int __init lcdc_panel_probe(struct platform_device *pdev) pinfo = &lcdc_tft_panel_data.panel_info; pinfo->lcdc.h_back_porch = 5; pinfo->lcdc.h_front_porch = 5; - pinfo->lcdc.h_pulse_width = 1; - pinfo->lcdc.v_back_porch = 5; - pinfo->lcdc.v_front_porch = 5; - pinfo->lcdc.v_pulse_width = 1; + pinfo->lcdc.h_pulse_width = 5; + pinfo->lcdc.v_back_porch = 8; + pinfo->lcdc.v_front_porch = 8; + pinfo->lcdc.v_pulse_width = 4; pinfo->lcdc.border_clr = 0; /* blk */ pinfo->lcdc.underflow_clr = 0xffff; /* blue */ pinfo->lcdc.hsync_skew = 0; @@ -1434,6 +1915,11 @@ static int __init lcdc_panel_probe(struct platform_device *pdev) LcdPanleID=(u32)60; //ZTE_LCD_LHT_20100611_001 ret = platform_device_register(&this_device); break; + case LCD_PANEL_BOE_WVGA: + pinfo->clk_rate = 24576000; + LcdPanleID=(u32)62; //ZTE_LCD_LHT_20100611_001 + ret = platform_device_register(&this_device); + break; default: break; } diff --git a/drivers/video/msm/mdp_dma_lcdc.c b/drivers/video/msm/mdp_dma_lcdc.c index b061ba59..916ecd95 100644 --- a/drivers/video/msm/mdp_dma_lcdc.c +++ b/drivers/video/msm/mdp_dma_lcdc.c @@ -37,7 +37,7 @@ #include "mdp.h" #include "msm_fb.h" #include "mdp4.h" -#if (defined CONFIG_FB_MSM_LCDC_OLED_WVGA)||(defined CONFIG_FB_MSM_LCDC_SKATE_WVGA) //ZTE_LCD_LHT_20100810_001 +#if (defined CONFIG_FB_MSM_LCDC_OLED_WVGA)||(defined CONFIG_FB_MSM_LCDC_SKATE_WVGA) ||(defined CONFIG_FB_MSM_LCDC_BLADE2_WVGA) //ZTE_LCD_LHT_20100810_001 extern void lcdc_lead_sleep(void); extern void lcdc_truly_sleep(void); extern u32 LcdPanleID; @@ -332,7 +332,11 @@ int mdp_lcdc_off(struct platform_device *pdev) if(LcdPanleID==61) lcdc_truly_sleep(); #endif +#ifdef CONFIG_FB_MSM_LCDC_BLADE2_WVGA //ZTE_LCD_LHT_20100810_001 + if(LcdPanleID==101) + lcdc_truly_sleep(); +#endif /* MDP cmd block enable */ mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE); MDP_OUTP(MDP_BASE + timer_base, 0); diff --git a/drivers/video/msm/msm_fb.c b/drivers/video/msm/msm_fb.c index 096180ae..33c66052 100644 --- a/drivers/video/msm/msm_fb.c +++ b/drivers/video/msm/msm_fb.c @@ -14,7 +14,24 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ - + /* +====================================================== +when who what, where, why comment tag +-------- ---- ------------------------------------- ------------------------------ +2011-02-25 lkej modify the code for read lcd information ZTE_LCD_LKEJ_20110225_001 +2010-06-29 luya modify mdelay to msleep ZTE_LCD_LUYA_20100629_001 +2010-06-22 lht 支持工程模式读屏信息 ZTE_LCD_LHT_20100622_001 +2010-06-17 lht decrease FTM backlight level ZTE_LCD_LHT_20100617_001 +2010-06-11 lht 支持工程模式读屏信息 ZTE_LCD_LHT_20100611_001 +2010-06-10 luya 修改BKL level LCD_LUYA_20100610_01 +2010-05-05 lht 修改fix-linelength,开机图片 ZTE_LCD_LHT_20100505_001 +2010-03-25 luya 修改开机背光亮度 ZTE_LCD_LUYA_20100325_001 +2010-02-21 luya change delay when wakeup ZTE_LCD_LUYA_20100221_001 +2009-12-21 luya change logo file name ZTE_LCD_LUYA_20091221_001 +2009-11-28 hp decrease initial brightness of backlight ZTE_BACKLIGHT_HP_002 + +======================================================= +*/ #include #include #include @@ -348,7 +365,7 @@ static int msm_fb_probe(struct platform_device *pdev) #ifdef CONFIG_ZTE_FTM_FLAG_SUPPORT if(zte_get_ftm_flag()) { - mfd->bl_level = 3; + mfd->bl_level = 2; } #endif #endif @@ -2889,58 +2906,58 @@ static int msm_lcd_read_proc( { case LCD_PANEL_P726_ILI9325C: strcpy(module_name,"1"); - //len = sprintf(page, "%s\n","1"); break; case LCD_PANEL_P726_HX8347D: strcpy(module_name,"2"); - //len = sprintf(page, "%s\n","2"); break; case LCD_PANEL_P726_S6D04M0X01: strcpy(module_name,"3"); - //len = sprintf(page, "%s\n","3"); break; case LCD_PANEL_P722_HX8352A: strcpy(module_name,"10"); - //len = sprintf(page, "%s\n","10"); break; case LCD_PANEL_P727_HX8352A: strcpy(module_name,"20"); - //len = sprintf(page, "%s\n","20"); break; case LCD_PANEL_R750_ILI9481_1: strcpy(module_name,"30"); - //len = sprintf(page, "%s\n","30"); break; case LCD_PANEL_R750_ILI9481_2: strcpy(module_name,"31"); - //len = sprintf(page, "%s\n","31"); break; case LCD_PANEL_R750_ILI9481_3: strcpy(module_name,"32"); - //len = sprintf(page, "%s\n","32"); break; case LCD_PANEL_P729_TL2796: strcpy(module_name,"40"); - //len = sprintf(page, "%s\n","40"); break; case LCD_PANEL_P729_TFT_LEAD: strcpy(module_name,"42"); - //len = sprintf(page, "%s\n","40"); break; case LCD_PANEL_P729_TFT_TRULY: strcpy(module_name,"41"); - //len = sprintf(page, "%s\n","40"); + break; + case LCD_PANEL_P729_TFT_LEAD_CMI: + strcpy(module_name,"zteLEAD(Himax8363+CMI)_480*800_3.5Inch"); + break; + case LCD_PANEL_P729_TFT_TRULY_LG: + strcpy(module_name,"zteTRULY(Himax8369+LG)_480*800_3.5Inch"); + break; + case LCD_PANEL_P729_TFT_LEAD_CASIO: + strcpy(module_name,"zteLEAD(Himax8363+CASIO)_480*800_3.5Inch"); break; case LCD_PANEL_V9_NT39416I: strcpy(module_name,"50"); - //len = sprintf(page, "%s\n","40"); break; case LCD_PANEL_4P3_NT35510: - strcpy(module_name,"60");//ZTE_LCD_LKEJ_20110225_001 + strcpy(module_name,"60"); break; case LCD_PANEL_4P3_HX8369A: strcpy(module_name,"61"); break; + case 62: + strcpy(module_name,"zteBOE(NT35510+HYDIS)_WVGA_4.3Inch"); + break; case LCD_PANEL_3P8_NT35510_1: strcpy(module_name,"70"); break; @@ -2965,6 +2982,14 @@ static int msm_lcd_read_proc( case LCD_PANEL_2P6_HX8368A_2: strcpy(module_name,"91"); break; + case LCD_PANEL_3P5_HX8369_LG: + strcpy(module_name,"zteLEAD(Himax8369+LG)_480*800_3.5Inch"); + break; + case LCD_PANEL_3P5_HX8369_HYDIS: + strcpy(module_name,"zteTRULYorYS(Himax8369+HYDIS)_480*800_3.5Inch"); + case LCD_PANEL_MAX: + case LCD_PANEL_NOPANEL: + break; default: strcpy(module_name,"0"); //len = sprintf(page, "%s\n","0"); diff --git a/drivers/video/msm/msm_fb.h b/drivers/video/msm/msm_fb.h index b5692520..b7050ee6 100644 --- a/drivers/video/msm/msm_fb.h +++ b/drivers/video/msm/msm_fb.h @@ -79,6 +79,9 @@ typedef enum { LCD_PANEL_P729_TL2796 =40, LCD_PANEL_P729_TFT_TRULY, LCD_PANEL_P729_TFT_LEAD, + LCD_PANEL_P729_TFT_LEAD_CMI, + LCD_PANEL_P729_TFT_TRULY_LG, + LCD_PANEL_P729_TFT_LEAD_CASIO, LCD_PANEL_V9_NT39416I =50, LCD_PANEL_4P3_NT35510 =60, LCD_PANEL_4P3_HX8369A, @@ -90,6 +93,8 @@ typedef enum { LCD_PANEL_3P5_R61581, LCD_PANEL_2P6_HX8368A_1 =90, LCD_PANEL_2P6_HX8368A_2, + LCD_PANEL_3P5_HX8369_LG =100, + LCD_PANEL_3P5_HX8369_HYDIS, LCD_PANEL_MAX } LCD_PANEL_ID; diff --git a/firmware/Makefile b/firmware/Makefile index 99955ed8..f0e8d633 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -26,6 +26,8 @@ fw-shipped- += acenic/tg1.bin else acenic-objs := acenic/tg1.bin acenic/tg2.bin endif +fw-shipped-$(CONFIG_ATMEL_FW_UPDATE_224) += mXT224C23_v1.1.09.enc +fw-shipped-$(CONFIG_ATMEL_FW_UPDATE_140) += mXT140C27_v1.0.01.enc fw-shipped-$(CONFIG_3C359) += 3com/3C359.bin fw-shipped-$(CONFIG_ACENIC) += $(acenic-objs) fw-shipped-$(CONFIG_ADAPTEC_STARFIRE) += adaptec/starfire_rx.bin \ @@ -199,6 +201,12 @@ $(objtree)/$$(%) $(objtree)/$(obj)/$$(%): $(firmware-dirs) $(patsubst %,$(obj)/%.gen.S, $(fw-shipped-y)): %: $(wordsize_deps) \ | $(objtree)/$$(dir %) +ifdef CONFIG_ATMEL_FW_UPDATE_224 + cp $(srctree)/$(src)/mXT224C23_v1.1.09.enc $(objtree)/$(obj)/mXT224C23_v1.1.09.enc +endif +ifdef CONFIG_ATMEL_FW_UPDATE_140 + cp $(srctree)/$(src)/mXT140C27_v1.0.01.enc $(objtree)/$(obj)/mXT140C27_v1.0.01.enc +endif $(call cmd,fwbin,$(patsubst %.gen.S,%,$@)) $(patsubst %,$(obj)/%.gen.S, $(fw-external-y)): %: $(wordsize_deps) \ include/config/extra/firmware/dir.h | $(objtree)/$$(dir %) diff --git a/firmware/mXT140C27_v1.0.01.enc b/firmware/mXT140C27_v1.0.01.enc new file mode 100644 index 00000000..401c630f --- /dev/null +++ b/firmware/mXT140C27_v1.0.01.enc @@ -0,0 +1 @@ +00E2CF9C55A5E03BE96E38210E8A64B04B51CA3C261AC7B2CF061A2557CA84D41F3C9EE9318CE1508BED5565B4B22A338FBD2D9E3AF6ED9FB81B2718EFCFBD6CF2CC96EAAFD7B5D303BB3EF3936CE1E581EA65E84038B6DFC56C0F0E1525451D700304F9B8B2C01CB9EEC6F662C98BE2F6DB7FB17CD445DE8EE90F7E842065CB47DAF52EB6863631AC3C8519A2F162B32566EF6BC38BC7E4782387DEDC766FF6A1606770125027304F7E0CAAC6D2CB9546BF73E235F4730422BF0BB92F17E11E640242AA47DEAA280683B59BD5ECCCAAB298BDB7B3EAD6BCB6A2C901B5D87A3A7D461B940112CA9B4C49ED0EA7CD45231FED8B305EB72737D3549A18ADA52CC42B9A19D279CF7F7C4D846F5A8EC3DCABC76C897EC8AA9ECFC3AFAE5C3D611575BA28B3A253D0043F33069CE3010FF0D635847DDB12AF5746C4B75A43324E0B2A140D56D789B801FC28A0DB4E751D3663D3827D5C1290F9CAB912D2370CABD2A7185C9C28C08869A0F1A0C6B0E95BAC55110B5099B96EFFE6601BC16265034F6633BF19389AB50718FB8BE6CF0643E137CB5ABA8F291CE310C7BB3927019B32557060833D352B7F859128D6A1DEAF71E4BF0B1300D09D304FE8C5648D1C046CB78DDFAB721C31A8F455493EE3445685F10B7E5C16C03F5E886DE0F4C0E74BA15D0C30B728E473092A10CF91D2D9AC76E6B101E0B446987DEC001246605990127BDD568380DBA9E11CA517A67201129884EA2DD71A3B5AD8669A75173B666EA18ED796007770E0155CAD6B4BB84923D632893BF94AECB7A86FD695FA7AE61B206CD6413C0966F228DCE7E00717A42AC6AF7C3E00BBC9EEEC979C946526FCD30D75D805EA89F8EA7B5DA450C46626328F28B495C8AB10882B9DB60834D8355494AF89746B6BF80D90193F7C127F7C39E85AB802ACB3D2D802E4D49FF11D657109668EF56000D3580ABA71DD998B648A9FD6D6819C22CE1D09EEB936FD65BA94D224B2F958AD927C3466B8710DD1B6FA7F7E3EE37C4D1451608B5C6D23E95121BFE1D5D12B38FB5F8A470172B62DEBB53520DD581185EA105C7822C051E8E78F0C8265D19060B3346BE8645669C1E921BEF493CE66CC60FE8B210D651B0F8703A7E100120A399FEBE6B1443D54005C3E77C37CC7104C0112354EEC7D7D1A1A89603E9C651CF0DE3B5236E275831F965A8B2587E7D70F1F961C8D13D4D1F2EC41CD97FF749967D2476F75112095BA9DACF4DB2D497F6629F3271692FEF5A3708C7DF94D6A4EC759E48B28C83CD85ECBAEC4B5A1254C2BE68E9D9D0823B822555C7E13E2681EA746983A2F7026AF50D72CED2CFBB07078D31E64B2B824D5F6B182B01E2C7F2B3D5D19063855D3572D39EEECFC037304603F15B34249B1A0CA32302A222EBAD288371009CBBE44D6B7E9FC8CA888DB05220D40D1D52D6BC3B3D588765009321072A84FC40B41158BE90C712BBA72BAC8D1133427BFA6574C1E0891142C67E5AFD7D1E5A0D49DFEA4E8BCEA820EEC90A0C513ACF04DF4B061802771F327AB66F4EAB32EC3300012A3041A343113EA7E97DD6A55BB547548B7AB01126512245B00659E2AAD5CA4EA06037CD56E295A18A8502D62AD24E571803BF2CDE1C8E8904C579726FF86A1736255E4F0F8F21FCE66D7A3AE5D82FAFD9F19D0C3AA6908D74A10AC6574E24E25FC14FA97112078A3B96F987BA129536BF016B1C79A2FE6B9E3815AC0BBE035E63FCEF6B725F06EC1C6F37C1299122E8AD60B85F6EBC573F6A5E4B9E10CF2BEA3553AFEE66FD3067687D8AE11AA51898A8AA12AFE7884DD906DEEBFCBE74D6417C828653C74DCAD6704AF08BA8D9B7E4089DE18A53E052FACFBADB6935A86C6EF35645253908D47EB19AED810ACE89A7F90BEB0FAB6D84FC587C54C482CDCEBF2CAB111AF07B60817B288E9C538324A01BA871EFC3906855068BE18FC82D8C89B92BEEC94A9DC0012018AFB26CF9E1FDEA1B9D9575249D59B1E8801128F601F7894156071D9FF25FC4C921C423774C0A7FB9D21C6994FA6E1A7ECEADF22ED1F2794C914BAB70A3E52C6E1FD5668CE76F46D1EC76A81384BF3CA26E5FE6C44D0BFCADCB7FBBF4D8E341ED9DA933AA6372B98EF8AFFA3D1B46C2F7C5971E199B292655DD3145FE75F223EE1374971CA2D0B37901CD83994A9BF67BE4DB89A6318127F64041780E564958A703DA51234C9A0AA4E49956AD8DFA65CDB41EF56B14423DF26174BD5000673A20A66AC6DA33D59D002E4C058DA6299E6B68A415E24CA2A4AC64890C9D647929E168010B3A083EC5A6DED327E23679BF633DCCF7C48CE46BC1B8CBE25AD62845C1D7CB737E104E7A59AC8FBF0480BB9498690017F0B8FB859D4C8A47E77429556952C48D3B1001251DE8EB1AB0C38820296941C88809E97065E0112BC40E0850E455CFDA396BCBC6330E59A8617969D433ECE96E90657E704A8C58253314D36204B08137C1A2DF0664F754FC98AFC460C4261C5EF8EF4DD6C8C8F7FF774D89B1DDBDA75DB4424FD5556D459A8E8C8E2B1B0B1D86AF34AA3A8B8DF3F5B6809FEBB3EAB52654EE5B47BE5DCDE0912331331A7C3557F8AF37D6DB6E330CD0194BD0ACFD4B1C3570773C92FBC1EDD5C9541EC1861FAB4BFAFCD0EF5D1E70A0481FEF77906F56083478E5843DC6BA8D45DB82C1EF6A50013EF1E88E470A7D91F42320A2E847FCB104161380486BBC0BB23625F9057027BC50B25C3FFAE06B795B5E3F9310E7AF91F6872E89CE9A817805FE179F40A55E6A5926F7C822C42B3E6FF9231A8AA56058E5B0C564CE32D4DE10012F8231FC506A04A382F8DBA31A84A711114C001128D21D83091031B917B64D1B19C64EB6E51F7B476C9C6CFF17BA23B948E8B79B7EA3B95420DFD35A0628FFD45CB921A040070F574E3E34B576A7BB42E994CFC27385E1FC66846654B21682F59D853BBBB6E521C00F3D9436BB57DB65823920AEA38147F1D98DBA62DE7CDAB0B1B1A3A6D634170B4F7E4F9CA3805F6B6B10B1A840026C2D86032C2E6788DAE723AEC094FB7889BC22E2993766DC1853CFF4B513897A07E1A0A263275254908E4F211144FB45058A811A93916B29200A4DE18D08374095AB162071DBEBAC71AD3F3D831B2513C1053A1136F3FD92878C82CAF4EA7A5182BE8E5015E0D966EBEA92A26FAAFB7D9BBF2D200513DAECE6A9426EF098C011CAAA4C53AC66F3D986C7E246186F5A5F60012E16AF9EC6BB959E2F06BBE746597153A2188011209B7113C419324074A4416373AF763B092FB79C3A9C07F5F2FB9507BD36D2BC140A089D4D4028072D8AA7BC637C384AD5D3AB6E653F0A9DCC388DF3F4D1131297CD2DEC636626AD99D5439EAA94401B2535B6C4C88F2BB3961D9CD45DE9321414A35816A75A8DBDCC73B3EB765E38AB6F431D204FA04A1A88CA582049C6129D17A0513BAB9120109D2CF31044A5AE01FFEFE45F571C1153340A2EA201F98FEEE5269FB5A232200BF1BA7DACF483C8D89529C48FEE7BD431BADA4877ECC8B17E2B166AE03296D28DF7AEFB87B850C11E296A5F70F67BA5DC0447FF4F98857FD51F1A702F3E81787847AB6A29895A681E8786A19AE74749B8AAD7164B20CDF8EC2CC61555B1DA54E1DC19A3C890905C5166CBB00D24A42ED2FCE91C592EBBCC39C519C582F1B41350673555CA8F521B36569B1D9FA93ECC92E7FFCB5FD6CBD7A657346132E9AA7A4999365C02A83B2E559D24354014687CA9A19CCF401EA1F6D93937BB99A60B41698B1C3B6D091B0C307101231D375177EEDBDF021775FBD8AFC8EE95FA3DBED6FA34DB28DEB890BE9854198D661C16BC988C876124876BEAB5CCA7C9E8CFCE06462584DB2614B88F6D9CDAA228233C580F58ACF70B40721D874482517D97C906BEB397D45CC88296528E458833D7037A1A162F86271650BAB010945C7A68ECC00720D1A9986E7BB24ADA144ABB1DC34D38B2B531103A364BB73AB47F3E25AFDA2C28285DD08E078200FF3570A9476C22FC42140C2F0777B3202BAB1602BE12E6B193A9D8ADBE79EAED746A4A8072D4D4099F47B9AD5D00C9A2F7E8ECC8A79B315C18337E35D06085774D1E56E4A3CF82BD7EDBB0112CA3556130B14B86BD1F42C56124243C48E9F5C7665A251D1A11A78DC26E7D4EE480DA78C585B6A5D6533152A0389B9DD6574BFD035E9AD4E82C170AF43602A23203C6B46C54E4522F47072F13679BB8D3C2B9900E1CC5B7B8848FC907C48DDD2A78D7808F65294D2DF418C0DED42A235E1FE51E277FFC6D625B27B713006CB158754191381264178F00C6C51B2FD1883013C994E4F896B1139F64C0FCAE12DA187602B299D12E4DBBCA90BE513C13DE73B5AF4D38CCF6D32CC7C7511F8292E6366A14CB3D9700A705E76FD48F78982B50556FAE254064F5339F1F81235DCCFD69A01F93C6D020C2AE05104326D334477ABB64A81170BCA65A52B376EF7F9743FD721BC2CA138FB630302A50B61EC2E026C820012256CAA4FAE40B06645F9890A0954EF061FB40112A086AE7E77EE4BA3B240379F896F3612BD118803FEAAB1EA78599143D265B3DB6B9D92FFED1D7827D04ED915461849F3D43B61E62008808A50EC1AFB541C043F89631118295F40DD0363E61207C6752B6EBF1485D956BDDA2C4CF1802C46A13A7035C7FB0A8EC9534E030A8BC7A5FA55D752048C42B99C088CA1D7C38CB00402A33572A86D018DE059F97EB77CA8B40DA043EDD3A3E662413BD0EA163FF285DAF0AA96260113C38D8E2547347BA5986216B7480CA48B20644F5683074C47069CBB5C3F7F19891CD893EE7384CB00F09A5A5AB4386A7E3CC3385C1886CE286772F511F5E9272014775533B53CC8B77FEBF85F4BAE194BC5735B43D0F3202095C833B588E968CF8F892CFFB5874A40AC3EBE8C0012712AA6BE788920FA49A871858D104255348E0112CDE2AB6634596FBDF43D4B98CD96E3535779A4F5CB9EECE925FE424FDEF7FBD1473F77CC2ED69B97A468E0665AADACC5B942E5D94CF670BAA50A41AA8C7E43E007DA991DBFE26DEF29BA1B8C136F22D44986809BB499B7E605D12C0390A110A468AA2068D520E0E0D1C7A809A3E0BE3A2BC23EB7D6E45E397A76236BF6661C72F4C67882D7309FCFF0E75FE4FCB03B203F9C7E09B022F602807EE62F96ED42D33EC28BA23AEADE6F307AC173281253DBEFDD140114000F44961950630DD045ADA8C15ECF0D29D305AED31255337543C85036F4B3EBE13080203A6FFAF8EBABB4DFED5E92443114EF3049B7D514C95A3D419FC3CE1A3AC57A7DC79548A24500DE21C00FA0E81A2ED055E2B47F874691A340880012F0EC8791F1353BB6DC1486697685A19FD664011239B2854EBCC20ED6A0F887DDFEB27D9DF44A08BDBF51FA052347AE2C3F2F01554252FD290B02E533CC5FE3A12827011BF6E2CF189D6BBF257D5B9A716BA2B3847516803D4CE5ED3E576828C5B5A481A26ADB5F86536B891EBE5C14E1F22A45D4DC7C1B0E35FB3525388CC23C5978FBE44312E8FB7EAF5E1D40424CE5EDE122C65E0DCCEFD8F280402FFC07689839A6923DED9D3416632580DD3096C3E5EE622F3A57290990A36EE77CD67B946929DDE0A422001C976CECC44F6594431D8AEF2C352F475F57B8B5D5B70136261B81A3E3650E2415825399CA8DF92495585853A2547D5686485CA9BC46B100407AEBDBD909D30544A07EC6D5B4A3A63D7150F5A9D88DB30A251663A255AE786D5C9603449CC1001241E3FAE54A737184AAD06F36FEE89C590EBC0112EBBE095657BF16B9883B15C30BE21F5809AAF1E1EEC8A914C69BCB576892CAB6888EBCEA35E2F9E530DABF09A8C98234F70AB2A5F1B5A3DB8E9D483AD9C04E051491C7A9A374C374D6B8E692EB7EDB3B8FB3387938CDFA59D819083505D1D0FBFDB464D2D333342B75A958743C5595A5C5EE41A119B61BA8C39A3A504383677FFB51B3017D99FF62AB245274F284A6FD4E881C12AD80C8F9BD84C550D452CB3086A42846283D9F02C9EC48BC76B4427F8B62B141E23BDBA4581212721F0D457BF185586E9E46BAE0271F302631440F73861B7E0BDF22261096DB6F44DF00FE93DC089CA3DF0657C14D8BF0E88BCA9D5731AFE60169F7E694B3868AD30825E334FADFEE2E9E9452C3D1E152EBB2158A3714E8001271902851F454F16CB809E1D358300EC0836C0112C00BA61CF307B0E5B4CDBCFBE56BB6D16DDA438993F10FFFD56881CC8F76CD8E67AA71D208CAD891A4325FE6E40D0DE68F4F36DCD7D80513B8E87F7BA899FCC28028F30778DD37CF56356C12AD9BEB0D14368FE991F94B655424C6C154725E8F49E816F36B2A4B55B6C7F6E57C1916682A15589860045625A972A69E36362254AD5497ADA60CC2924176FCCC16FA810920E6E2644799990AD3BDE427DA5A3757EC4719CF02D9F4CA6D11D0048474FAB9EEFCDE44B17092D9037AE6337C56D17709A7CACCC2CF76D6B87170B557D6FEF01D91FB657F258DA0CDAE26BCDBD132878B938FAF9E848A4177E17C2CEE5E117B23B4ED267E718ED69AD9E52D3D01FAC34FC6149D5E2CB09C80B3DCD1BA4AD3799DEB00120A7772A6B9E0A230547408F9E11EC83FB93201122393113A9285A5B9932B178EE9A6020168F14393A043861710CAB903528405B2609AE264F9A19E9B626B423BB73C2E5C14A71B059952931698A94B81AC72B0DA2B6A183BA183012F2260F38CB7254B387A2F7C0FDEDA50988A5BB09186EFDF070C5FBDFD49B877386943BC33FB9D939BA91866C8E459BE764C83923475262C14993A2BB8895F8D7AB0E3285E641B9E57B86F639232CB94035E7358D92B7D71506BAACD31FBAEC3FB40C8392F19C2C3EFB953EBA45DE85118E0D4CB86546A3499E5161E409EC043AAFD223524B7FD5F296E31BB9E11F15FC1091555129F098CAC07BA048ACD2BBBAE085F68392D9ABE0EF11961C587A1AE74E8AA880BB037AC7C7737697BE161DC1B4F9FC71E5D7DD0F1F18A00120F7A0FBE524A82921FF6F24E5C50C06F6B8A011234BAB58C5198CA27461ACAEAADB88DD8EB2CC3B4B4FC5CC3D5FA8DDE7828635521A74E51B9040D67A361D678E39A7418150F18E19A80CD9CAB78D6813D5EDF61365B565B4A2600BAE5D5C7A5C8A6202EE8D14A6C58295FC78B09D1061397FA5D16CDE5E9D57F29849F0488053A12F540D66C3DF8215E45A44900CB56F4C0DE45EF71FD31D64E088071EE777B7ADA7D7DBBC85BE745EF992E329625983A4D503E45E5999B94043B3522544AB7FF10C9B28BF6E6D08C5552E02D1AF4F5B69968DBB76F5F6CAE879A7D7672391E9F5036DC922328E677F224F19ECF2DDF5A61FF8EFC4930B3C852845E3A6612E08756261ED22AE1FE70ED884781ADBBC1009FF7369DAEABE4349536978990385D6DFF4AB9BB2300123E4F602ECCCCF22A344809015938666FA3D00112BA3EA830C097B9ECEAF70EACE5F5F56D1691BD98A6A2AB0C27438D32061F9ECEC9CEF0694DAD06C2310B5856B23BF872785977D6C2C30F13B320BAB4257B20CFD6E5A7F800AFF63808D4AE8CCB8BAC68C73569D372702CA03F2CC341221497A87724ED5773E839630EE425E365432FA6E9895F5D23B181BBD4B382381658C25695FDC2F09583AB972C355FBF345292E0491901EF376941DF717BD9CE1FC50B6395C147A6AB78A8BCE472A5D0A3D601B9DCCF01E4F359E0CE703191875294D7D6837741BC7F6677D4C21526F885B2FD94EE82AA0BCECBFAB632F888B7E3634F45BF9A870D9B2E2606AB25F73C86D1E09C793DB66436501A8B748EC120306332617C95231FB447A7A89983377CF609A9A7F68C0012039BBBC2A26334C7554060378168298343CB011293321B24C44DCA2382D0E01605AB3D0944FCAF70F6D3B6364D6AF1B6F1FCCB72E84BEAE66A43F62D45F4DA44E6079178E39A234FAC2D56881B844CAA3D4A28CD9D3CD851E2D85F367AACCC92913AD47278A4ACFA46939AD302B23E38B9538FC1B08DFDC2D8180C8D1008017CF71F5A76D1B1FBBFC102D9382E589B18B8E5967DA4677BBEEE01E8054CC3839A40A6009F29CCF7B3348D79D6D7DB6771C6205A53D0D87CD16ACFF91E279B789C1CD18D2D15B3A33797EDA9DF7306555C36478B42EF4544CBD532461CB3E989A4B58A2289366DA22763984882452D489B6E9C9EC312793B74CD4487C1FB6288D69DABE5C75A7F640F0BE1F6F9B6E7855FBCCA760133FC1568957C5977C49215AD4A639FF7C3AE001219A60B1FA323482CD86F699A80F8442BF961011220109BFC5D2E540FD17D15CB56E1FBDDA42A7CD7BEFF71B31A2446B7FA1319BE440C0B1A527DC1F6096932E2FA622873900AF013682172EB309EDC85D8A5D711386ED243E2FF9F80C27A75BE84C1D75EC2BAE2C47196667BA447477AE9E0D71F243CBCF34070A04A86D5621F1EF21E33CD430BFE0E2F7AD68142A26038DC454435D7BA3BA65A32397A69F6ABE53D2C04B372AAB67E08B858DC2A161E365A593EBDA4BEAD6F679A3AE7B76EC507BE897E6D14457A8B941A39FBBC397EE329C61880B5873AD2FA28B2A2336193EA353831B3F344DC41F490D05A2D7C05AD878B46D682AECA9136615C53CA31C88616D108852C6E6BFB2920B6C299FA3B90C3EF5101B2B568239C769420F8C324D3994B7FD70E001274012A7B112EB9CF58D2BA4A706D749952620112FA3A33D1F30BDF70C0A8E2F270DB16835B2ED0F7B899E9922CEDE3350D6249804A8ACEFC04B0EC7373E9DF683714FB9402561701977EB3DB3904FB71584959C4010D4A7F71AA9E4C93BEE1588A82E97649764EA3A2807AB311ED25E25BC1346C46B4DA99EA0BA505D67034A6C21E6AF63D956223E5F4084CB650E80DD90425BB26B81A56240393B341CA321303E0AE3E9CF62971F8A2BC0A0E70270929402F8F1C7E6093F668314D9B3769C39A8C3D2139B944F68A7A9F54234907EC786FDA228B24D9DB5C711024C5CEFBBCA656459783A7A6B225D27089637E6EAAACAA1396BE930D71806061FC8C5F0673113D385A0386426541E3FC85F8B55816747ECE31537CA8B47E5374182D92016578BC6A5677D000125547EF040968079D250D0AFB283A94477D8C0112AA4383927FDDF2A83D96F2434911831663DA3041254DEF168D27349A1658697E0203D5CF474F3D82FD21A30937FADF50E80BBED5DC48C9E30408D2E00D29FDEE0AD0CCC36B55E41D54F7DC4DE973FC728272466A1C75E20960355282C6278E25CA436A47D4651DA1B9D54D40711FDFDE8F127498F7B28BFBD6F47135C8568930D9EC6B5E5326824A00A137FB22C88548C9E0D3A8EB50B4778A1C5E253B4B9C4AE07254023D74A5DF34469A099793533DA54ED53C2466250C722A963E257C5F9D309CF5DE8F69E3CF3B56CE5EB90E93DC72B91654916D157750429748E81CAD102E6DDD48148900D5EC5784F420CC3E188D3D19CDF91DDB5677EFF799E880EF4DE492EF08B0470316369BC415F6630D45A6060012B451C093E9E61EBD24FD9F0AAE9856C793F7011276B6012ED4C492F69720932C32B38E5D09576E61BF9167743A9E5977734B02ECD780FAB7BCF18092A1C42EB3BEDD98F6F9D796CDF50DA0899E6074917A75C94A1E037CB19FF2BDB8240336F5CFEA245C13570B65EE273C8D1662C5EBACC9D7422C228257A23F981910058ADAE9F854AA406A8340CB47D4FE0D11508AD73E8A9F0C8BEA2F6F7C2CA00CAAD5848CB11F77ADFDCE4A41753F45DBB72764D16FEF4895EF72313B87B71F9132C35807472CCB5573860F802244ECF89E11E7DCD612E30036424B57DE79526610DDC71E055287C901624AAB9D76191C87BE0DE31970E99C40FD2DD5E433E43BA5D19EAA84DA4FA3B0DAD27B26FA12A52FB300982A7FE94F600B5C51CF74C690C6F6A923AFA8EC4ECE001202C7CCFC7EB146BA645292A65E8A94CBAFEC0112C652CC2D3A3ED01DB2F9DA12AA4D78D4F55BB9D06E0271D583DF5CE8BF73BDB6E5F5F609E1C965E146F0E3AA33B37223E864AAE62D76E32DB98A0835423E11C3215D91AEA12ACC3960C50D31965334131B424965697487F46D611028D44BF7F90668073D79C6654AF504C8BBF61CA9639F9851117F3FA89B55EA9C99F40CB3EF0CC360320786CB46BA3B0D3058F3AB604E73DC10EDFFA4F292AC78A134AA0E226FA2EC8EC93279FAD283476FC4FF68741879DA83CB91462944B9B697AF6F4C0B8C49576624A303200FA70B21470D55A9C6101C1F4E68A3ED8E223ECDC43B3289D1B48C980A7C23267BFACB9DBA9CC46A021CED91BE68317EF705A52E0CEFB1A27BAB9E0DBD01CB56FACB29335D34AB5F83CB00122899A5D034BEBA2DA42DFFD84B93CA6D762801126B2786FDC5EA4283D828A8735D6AE5219CFF7209F6A90A11687C9F90283D1B9AA171326A0F0F81F35A7AAEDB9CB72233E301714CDB54EA6412702FE4C471DB58C82A2B092801CCD9BFE148021084A34932F10780C1CBA9F3BB5E8530ABAAB4D920D91B479FA686FA3D2EB85BB4F4B761AB8B18B06EA4F2E952571B7DC9A97917D2BBE8E6CDFFEE290A8BFC63F0151D4457667C98E84DCC8ED5123A493046895CFD51633FD8CA75718E912D3EE7B37645B872F8E14CF5A4D932CF81680AF966D2D1B2D1F5870A7F24064A610DB49CFCABFC11ADBB57BA63EB4E9A3BBF7AEFB7C2B013D1E7B3EB69059D85A663BED76A1E5A1870F54FF77F439B0B34550442AD596C750DEBE6271B8E1D94C956D79A58B91EBC0012A2E25ADEF21EE50AB1FCF093229F773CE12301120D9C5DB0CCE7954EC835B7588716C4421B261EE75F91BDFDC7A2F1738EA8A2A14BDDE36570F5114F3050AD70D5FB9119DD3CDB29D4400EA277DD365D502F535A45F6722D0C751596CC7BAD852481423B44FE1A5EB7F2242E416572F5D9A1D63E2EE14A1C3B90D91EE394301DAE9DE2791D4A862E3F9DA39D02FC31B2B6464E98A9DB27BAA1DE4115ACFD210AEF5688CDE417B5E9652C32E2662FD36E24F9EEF79FDDFFB6C7E70209A15FC68618265EED4622264E39BB84F608827E371356E25D55DD0041286AF0DA470F758CC90EDBEFC856238BC4A6B727C2F55EE21EA0F8FDEED5D2729A461E0E58B7395391A93E4F7D6DCAF00D8A52589B4FA603D5DB54D207B15FA3814A7ECB9B70D3D62A467A3C035D00121FD33F42CA53AD0D7848226E2957C55E6EB50112AC55B80F02AAA14E40CD97B6339B54A4E6B7644826388F12CF76C64AA09C2015C8D05290EA8D08F06F7BC4B181868C1EB22085F7D119B174375B7BD01B28F7BCCD11E549735FDFF77465CF6D41138679DFA2C779955629C79975A045A31E9C4D42FA938D8FDA9A6CBB3136756984AAB9811AA37AFB049E719F37B3456EC88C8C947E22FB2082E8886E9E35784D2DA6B03BE0ED261C0FB7280F84AD7781E21DD3EA9D1EB54DA9C1F7AAD927F99E9F57D2663818F90A7690C22652B42682B0E5B040650B03B64BC798E479AA63700EFBBCEE470602E2016D85CE9F4302DD3C75769A28F5CE62BCCB2E18026D739BAE5207AFDE69F8576F4E6A85EDA6453724AA9FF0CB345FF19EB403A79073B6F86028F45BC6001236745D7F78727F486323C2DA93CBF8BECFFA0112C92C611AD3C70DC13959AF69622F1200C7AF4F4C8E976AAC03FC299841C16A505AE57C97FE67CAF7FA4321DCC321622EC51ACF8682E3409E1DCBBA2CCBACD76AB2D70A7A8309CDE80536A735BFB38A8494F9508247F4ADBFAD9A4995592BCC7326A24E2D22FC00C4B9BAF737A0621B851AC18142679BF3A2DAB8FF3C81F41FC2B9E7646CA60CA2C2BB8CB83ADFBC22D3A0B106F344F26FE5FC7EC1FC7A758543ED02F4901D6ACB055675A98D225C8CA6B245ACA9D7CC4F2E541E80555B9FEF6EC3756FE27474CD67F4AB90882B881A6941D4A34405E297948024EBF5C66C823C98A9FDCA938D49BBAE86CF5F12F0219D7C5259D30A11C966956DA4D15E04D40FE7E2BF77C80FCDCF18ABA44FD132FFA01CA100122E715CBDF7C53A27B4F87267195E80F11E640112B304CE9D5EF991269F0038C512F35B2C2C78206B400B6563BA6F1967E6FCF88F390C39E568EE3C115198A393802E918DB7519B4A65A5185A865D05E7B6DD0F69DA67E3A59D411606F1613D8C7BF5E14C28799426231593016D684596AB4BD29DCC09A4475DFF358E64E7DFC5E4831F6FD0974972DEFB04498FBA06613EB6B0FA851FAD3F66A33AE59B95019F320AF6028E062F9A3E2601DE98629312B743D4ABFAAB0917CD4C0E416C9ED42D088A51D34F2EE62EA61494CB3A662B6DE92FED8E84DBBB1EB68964E6C1AB306FDF16CBEBD365575B0C571CAF7DEE822D276C4C588458F75767402AC0ADB31551870A5BFEBF96711CC36C264BFDD09D4B00B10B4C17FD32FB2D05CA4F570A5109B41ED6BF4D060012EF85495F600ACA99A2534A72870F3909205601125D4C609A166524927A227A289519798EAC7D7DA6758A0350974CCC1C665EE1BAC457D9602AC9C54E9E0C709164A07E50D879D34614B559048CBFE4EDCF5C5787651C0345C98AB479D1020D02F11F619E63909EA6411F113D954F89CDB29049F03287DC3C321AFEEB416EA90462B927EBB87CBFEF6E66BAF877820360D47D35AC4998F7155717C9B18B0935A142C0E4DB41A793A927D5AB1258A6EEFABF28131C17F677823D7D76F42F75D991E8735F5F23DA22D5F6175F01FCA089A26D9119BB561E0059E8656316A0FEEC35568DCADD5A1C07A31FD23F03DBC8B6B0A121E42E286B69A67727EECCB965724AC3F1037F9372B7B22DE418378471FB0ECB2FB462A872F9C449AED5AF452B0AFFCF3CB3B03D8E00123C4FF92FAFA02330729A8A822B6184E100510112A6A8E85DC92D1292E02A4D0E404B1380602D48A922589722D26C86BEB4F118D4412DF4F9078F6C973AC5F8D94F4E3A4FE49AD78640A2E5A1C14DFD763B0FFB4A9BE49828B0497A2A81CC826C7180C675F12BABEF78F6FCB25BDFB029D5D53B723BF2772976B3731508A210427BDAECC0288822F0E7FA7C6A8062EBF3423C9C7DA296F2ACAB542A45AD74B30F44FD51564E5A31C3F997C1C5D2F213684D88EF67C4DC2F2F864AEB391B6016CC6E5EF2B2276D2CAFD9202CC275459E919BD28DF0CFECBA3266336444774747D67E0EB5AF76B98900A6050F6E0347BA85E14E06B8D052E0C26E7F6F085BD699CBEE359EC750379F88CFF9C7CB8261449B8367BC58B406E19EDF119FAE44F64F527EE589EF84E1001232843FF267E3AE61BDB5EF081E42D2BBDB3D0112ECE1D9EA00176DD35B0760418B402543172C93BB6444F11DA888187A53FF5E7996B4FD0853C7447828ABC94FFA5D696862971AFF3FC1E00EB114CE6C484D5306515A7A9A25293671785EF841DC105A89F50295E1223E64417658999BAC2DA5457473988AD2BA5A95573476A6B314FDD580C46B765141F7F37EAE5E4BCE5568B317FD6475DAEB36DEC8CB81CD50481EFC28045340BDF9C5BD46C0D3F843809C2BC3CABE215FFB90DA80D71449611623F4209411B1DB29C49A39A11609DBF1CE4E93D5BDEA41E3B57C69E3FD80EEA8E24DB869C835629393D56D34B2B5BB57160719DD22685F9BA356891B18BABF265A92194FD3FAD970854A47D1308483BC24145B1F0AE54A26D6F349AE41E2554560EB83730012454E9FD8E939EC127BC4A36C18EFAF934DEF0112B67B1B0C252B83802F6A9E816147737F3EA7DBEE9060594AF5518636188F648ABF01C9588EA5276302E8280F0D39C9FCD31DCE3FC246E54F9477557D851E5AE0955B74CDFC9001CDA88A6781CFB10D1BD4346C588017D4FDBF105504E68A76AF3B04174554EE67E6210BB1F3771C47AFD6ECBFD6E82D2C1A08575672506AC898B17F6B4AA6C3CB18F5B8425CA0CEB08D92629A8733CD6E925CF5A316AB07FB548B288E5C3CD5FC2F171F6A099E74DFF7BE111A83DC6F4B252F06EBA9B50FE46AC74357BA58E40D519688E1A05F58E5B94B453FD4876412C6D9A1A48F2F7E75DEAB832F94C4EBEAD99FFE11175B88EDF84080A7856760758BDA776B55AA3D8EFF77F61F6A9BFA07E11EFF51EFDE35D54630CE00121249AF26EDF4FED2CFBB8BDB95C8F8E5F579011219BDA1C73ED44C3618D62CDF018EEFD77042B5ECAABD92C2235EE2C74EC4D445B5DFE84EDFFEB57EFFA720A9E3D983C92D0112220AF017E7C6928012B16F74DCF0682D73939D2800C70132228AFEB0D33A8F8FB7A1F82EEF45F61EC21B37ADFFD07232F90F83B5F09DF16B5EBB7C684CB8A48D391929160D5237BD24C0966BC01AE7A3D5E5BA0F0D1BA487987D297E60788C3D02CEA156DCAC300DEA4C89222D11F3BDB2FAECF7B05F6FDA64FA0BCC95F76777B13596F50155BFEF48FD643DC07DADBFC4303DA8FF2ED5A29175D1022387DCF2961872EB7E8A70C5BDC233C6F20EF4CFC4E3B5DEA014A60FEFA8C7F8B88B24A31EB8F301B9C51BC06E98B0F4834E5E47F4D7C8232CC06CA616D5BCDCC6C6A50012DB208644C2F5E07D22A80DBAFE28EEA80FD60112B0B5F85E2F0B877F0595A1138F619F8F4D9D8089FA78E26FA485B6834007E71FF261E28A4C50D34E75AB4665300CF789F72ECF8A941FD0A17ACCE35026FEF17DA114E6F79D5F5FB3CAD78B2F91B6D6F79F0950C47C44976DD9C8BF3C87A045C8B1087DB11FA166C705C578E18864F568C891612C3547045276CA9E88CDA04727C94D05E4FDE3318F7192373C12ED12F9FCE66ECCC3B59988B7EE5FC827E0B1E213FD347A0DFB74E6090A401E3F30DE687C5403B44BC307F459F7BF846C8EB71763C9DA58E1F28E040023428145B1159DB60EB732B61510B9A2ACBF14CBE98077C313E58CFA18D6C782783483621E16E2E5516EABF0531ECF812CFB1BEC5AE208D8697F26937BB8330FFAA85C30E1F1347C840012AC4916A9B4A1733165AA84497AA0D0098BAC011251C2EF0254F3D78AACD2FB8ABA35F741E0AD9CB6D829C2E3F6BF865958CA75214922C8E5F3B0EF1D82C4AEA3745722F7865A9A7082746986D459870A35C45F896D0CC16C978C948C89B700174A805397867D45CBC3F78256E752A9F3EE4FB2AFD1BEBC183FD8612C53FE727E92DFD4AF6EBD35D7BDE1BD424B6A7854303D3FB4F7FC5A1D7E4910013CF76ECAA9026DBA899BAD43446893AFA6A0626613C06680EEE316E2313AB60D11034874B002273DE09DA87FA859A76328B19B65D3A947440553B8EBA02CC53206F914F785CE96AC09B330D5CE488EC8B5FF00CABCBB3220EC6CC1D3343B5A03D99EEAB3C39B5146324F6D2323BCC78FE7FFCCE4A3AB09BB29CA1FF79A5D6BC4BF1F7C2C75BCC6A8C6490012104B28B527469775A8CDFF599C33C6A9F8440112826D0E6DEC46E5D50877A2812E7951221805A6C639215D3BDA23BBD2409590170D04D9F8690C3086E3B2A83188F056FE35997DF751ACA7F4C1F1FD25C32E82A42F3E4A9F2FCD877E00308C03CB62FBCE03CC056D4C2249CE8BD4B5DC95FE5BA22A4BC858BEEB3C6C9AE14EC45FC309FCC596A9A7D29E01402BD491E337EECD5BEEEA4BC808A7301516E26F81D3DF5D59A70E6FC4F5794C8390729CC5D813C04C92D40C3F2E67A76940557010D60F0332A289D6B2B023BD3C22D40F9B1363CA167293704D6F366F9757FC84B083A8C4AA78D0A7A4E4CDA13A25EACEB6BAF7F167036A10530F6E423D1499DED380045BCD87395F3B7A635AB0763C9E5988D71E23BE532B13AD1F83FCB2086CD9CDDB2C0580270012F20EE572F0A72B337594FACF59760A6D892A0112C3FE6BAB0AD7B23C098ACA124E5DB1B79242E90FD304CF517DD52B96E9B0218A8AA260FB5EA6256F4658E1B379AB27A360D452FFA2E3190BF5AD99C53403D9FAA29C0526EAB3D32F48480CA522A4FD74CBC255E1B571EA069AE1DB7E0AAC0232AFCE0D79DFFAEFC6C9E3F5C759F9C90A3FED770024BFC7CD5804C4207FB1D9CC2BB6CFF05BC50639D40F1713AFAA83FF7789E907F12FDB4CD5130C6721C95D08EE1269D9BA4C28BBB503CC04909F3EA85A1F7512B3281EB3382D3EDA9A9CD490D033BB95070E8C3D6B720DB68F14CC34C12C4B2271AFBDE0FE8830C0485053AE1D683AF40EA529BD16A05393719B69F993893464BC068CB7CF4E8F29B204580CCD40C09AC5A1EB88B70AEFF2EB9C1DE3E37E001218E646D13F6D39ACFBD2D10183089BB4C89201127C29727996ED94ABDDD1ABF46D76BD6B323B43E947B15ADD58AB7649E75808F414A186060A6AB6A462EBD16A49A2C427DA1E0A86AA96DEAA4D3424273E2481E0239176E862F7F08FBF637689AFCC47839F1EC0AD7B6B02A6AABE73AFA69712236BED60206EE5FFC5A545BA8D699A81E4A74199AE026F216FC2E1F49C5CE86B957B56A3094F3530BDA4CAB5D55367DA32FA79B92DF2BD219A33824ED90FDB732B7D415E974DC2DD6C27EFEE76AB25B54BC218800DF186202F5EF5B471CD0AEABD82E2320BB9CE953358B6E1067041E45511956320F59CADE3B5E1DB6751127653169FEC67A0D62A797F8370F2AAF9C8052233EF65ACA6A048C0343B9315B078EA00E822D0AEB8C2C06A854CED0CA695092D6A00127867AEADD08CFEB1C8BC5B35FDB3A7E73500011283E0E27ED1231AF11EE372E479A4B4C06124CBF0A679049EFE9511EB6F3DBABADE670262DFAEB0158C9C3D80BB33BE6B83C6A625E8C9351AD4575841BDCE32EE2E071889B8AAC0F95197DF399AA4AC40A94471F51B940A9DA6673FB6828D0DD1F0EC8EE96540107A98EE0FC9EFAD847003DDA4DC525A2FB3856B5FFDDB8C6989302DB512E1E755191D42AB64E7175774545C448C7447C1310548B748CC04E9A868B24942F18D25EBE476384FF24193F8434FD5458079AC5B89FADFE25282C47D28171F3480B29BFCD9CAB2223FEF8DE441C0DF16CB8C356D6FF3D9715099BB88C145BAB28A101C52636B52AA56F786216E9F0E972F6A588EFFC04CE79B558BB454EE012086B9A5BC812F14AAC914991E130F0012E165C50185B6535A3FF6B4A17946A6325DBD011278F3CE4435D2232B84D61A8949A9545D7EE065B7F392C5C101C7A14E737F9DC8F218E0F5DD5F0BD77EE405C6BCDA73776D3148D8C6231887C9B34AAD6030948392328A9F72F5405D866615339FEEC3AA7303C5BD0712024302DD6DB16D03E6B2401F3EE0661A8EE4421956841D3CBA36187494FD73A6966C8C6333BABBD55AFBBB12349E9E845BC4183725D8048C2A7DA8A0D4AFA8CCF49BBF83B893FCE7D8525110ECAC5466EA1575CA5C4254C55CEBB3452D332005F410E5B6F5857A2A2A5AD5DFCE7CF5D5D12BFA143660856E0BA3798EC3319CA8BE9902C5329FF980174BDE8203EEF39E3658BD35E45E72EECC1C4E1017AF53DC63BDBE9966FD3A4E70329591F4A409BF10CB45FDE13F99056D4B82F10012E2184A92C03FE301E29770A767CDDB705AFA01126AD298A9A916018F034FFF33C5112282A77C0B89F4B28AB981215AF0E521732AF93D690F082605ED0171460F63E46F02D18D3639446CCA1A3469770F205FE8C13A7C508C5F9C295D5750FEFCDAA161DE3388161E423D098A1DEEF0E83C0DE4E1250D039DFDBBD18270843469062AFAA718D6C1AF763472DEB94A4C906B77839C02BA4063F902ECC531BDBA09261B04115E91C072D9793CE9E290C34F5FC1DE671C309C9CFFB1AEE3F099794F77C84DD815233B66C261458B8EC0DE013779E218E2F52C1338B83527CAA0ACE8D6C4E8D2D66AECC649161CDA356B6B1D96887AC048111B7216CF232213BCA71DED54106EFAEA8E79776901B9D4B3B765E400D6A0E8AD1AE31B51542649B406A795035B9DE5C50012C26839A4C5E3D9D7AE09300AC935A81A8BAF011298E77DAD5D9B5D904F56CC5FE3A07DB3C8803D547F87A0E076F1ADFBCF6CD135E13BBAA6D5D3A4CF779BACBBC0800588874C3A65649FBD26E0C4C0FE675C3F9571B179FD029A56ECAA363EC7715290F602BB3163395FED7DBB8CE868B0A0428D3F65ED1338BF64027CEE6FB9B555CA584FE0C2162A65D6E85CEF000BE8D7E06B3F167FE92AB6E45AA1A967A5C90377C7489FC3FE30CFB87BB49D4A05E0C14B84C6C95936946FA14842B5D018FCF4525FE90A53A3F0FA9B26F1A2B888A2A20CC8DC7EB70F4D44D02E1E72408C888F3F80BB10E951CB81953F7A82C1D15CC61A2379B3CA539FD17BEF2730F30F664C5F0A8D8F12E036A9A50E0B9A066424C06566D0B074EC7D30CEC7B026276AA6ED7801E1A1001276AD7D0185706C2B4C30F7AEB699F0A082450112B9110E882D530C8C9C7118750DFCF4B81AB67EE30738323DC16F8A4490D610F5991472A8EADFCB95CDE42A77301C057A5EE6AA33486ED8CD375294D1DE562181D2C2E1AE43B284C0F5FAF892D68806E4180ED8DDEDEC6A2FE77EB36F2FB31601E2D0E4808D7CEC59C8083D042BAF1E9D8D109CD05530E499F24FF53EC46BDABA6336AAF12418EDEA6A483686FCCE6265833E19D2740553E004972725DB35A10862A0DE7A99F37FDF49A79436DD31B5A56BD304E567B11275395B520B1E5B53116E044F18204E8D38D54BEB0431C19892F801E25B3E420FA8FB657D8BA2F7ED04E2343EB5435A8EE79F981761B341B9F256CD9D8D3BCDB42D56E79430AAAD86C987B9975DDDF7E17F664E258F674AD4B4CA4D0012564B9512ECAC377E90B4A5D38F25B5B5320001127563943B3FC74B3BE366E6A54B3D2BB13402C7854C14D9F86E3D1AE1CFB2BAFA10FC4D4384462324224A1D97B8B6D97717D7B7F27BF6A502984A2A27230D2EEFB8441417DCE5F007C9EEB0AD3D68C1C3E8B27906DAF85179C59A950C7525E434CB6107418546029F2B258F4CF1B1D87FC5EA94504289FDF67AEFAD9E55209E58C453B8683CBAC7CA6E56316D233A0E753603D5FA57A2EBD4A860B137F4E8FBA6B2A9A471A01B661C0F5F3597A706BCD86099E9ED66A7DF23C23AE7CADD34C0B59B60E4A700154AD699B79471779CE25DCB58A3C0602AF6B24119644144AC5A13AFA0DB8F82F974563E2F5997A4884E0EC15861DA073CB0A7316EEBDF54EA4A0FBB4FE34D41C4CEAC02C5C103B057E208A7410012922514779E57A11B166DF730F7031600183601128055CF59372400A409AE5047F2AD87712FF82DD7810A62819FED79C7F0FAA0E4E97D7F1045339C160B849601AD0DA20EB656F8F9229C717F7661057DB48759CE2DC547566F2E8924556725762EE64DEF1EA6FAA83FA9D0C668C025617F2B1BDCA39A10CF6FBE72AA4CCCC4E4FDAA5E84F83C6BC8BC6AB0FFFC8DA91B03C16F690A3E2EDAC00822DB34D15ADE438B825A05BEDA3FEB5174E856B327B6AC63A47BCD9286E8C8654160EEC35E1E89059968A41D90A25B3EABF5D86C6378C7139AF4DDC2D049377710DC5A92FD1A42AD04CBD95890A14D197008F831BC12D1915187DB8033AE52AFFD3837AA86E32DC44A96ABDA4B3A34EDB4760439B1552AEB831ACFC8A83E6178461F89EE79AF06600B289EB80012478AA81ED5497AA02F3B7C866F13028B935D0112755DA2136D7E925E92D2208F35B5FE75F68464BB6C32AA06EFF9942E19727BBB3C6B7DEFE81458932B17232A8A9C139CA13EC8B2F7A0B1D512E9D345DD98D56DC838217561581CFA6F300948AD874591B43F3DA9D1CFE79EAF933C236624735556760BA72D6669A639D06EF7A7E07F185EC84D7F4D9908C08E9B0E680113980BAB9B42B4579E9B63180D3E80748ED5DC602E31E2E4DBD4088DB7E972F1491A3F78B47F1FB77602EBC8F4DE5F28BCB92999E755BF5D4CE32FE9D8B0D9536707EDD20FD6C707CBF8C6123030C4F08AEB594078356E30D3855AE0A97B0D187BA7B8735A125EC63805949DD665D46166733BDC8616D9C0A840052C647270566453FC8792F313DE8DF4142C9816D6202960FFBA8C001280C01CF02C7D864384454E4E9F8538D23CC901120A1C3451AC3893BEE5241B44C5E28C08D27C9D753885B04A64B7CEBBAE7ED479A34726DE633162CF9B39CF6B4F31078D57E86851C6D9875B0E9E15EE018EC5657401B3758599434BECA75BBDA88EFCC3198E822A0FCB9920ACD813EF1429CB0D0CFA1E7419E71EE148A93D0BF691E78DDFD861675CC95B06D56355C39B73D1A6D87A9982EF7F75CF5258E7AD55DBC53C3F20B64815E9F66CBEBFAFFF89CDAE7B12E8DEE12FACDE99E42FEBD0FE8D03A6E52182B44B8DEE6E66C43C9C4B550A014AA75F84566C635AAAE312E937924015B5B1C93F4AAC6A7E9F96E68BF30FBA4FC3F8EF62A356F2477EA2BEDDD48211B39ACCED596901FF4F3485CB9CF9C9EBC032B55BF685A7740EDD8951BE1D4D810F57A000125672DEB5DD43AFF996F3CCC363627060832F01123E490EE688A53C490757429A8EE984C29B0F8F41CA254F175D32F5B9AE64432412BC18C1295276E7535E58E05B04E809BB2E4B21A1DDE32305F78895FCDD468B2D668B3C0F95AC24B21660E899027F9B8A62749933BC892F896416852A8E04740DF1D2B5798DB560C75365834D5F9D2A023FEA6882A34128298643588B608DEBEAA61BA0B1CA605E4FDD9D74481226C3617E51A2F10E7591605AF1EDBAFBF93A34FD3C7092248036E78FD1F17FDDC1D453D1741A540BB53456DE84CB489D814BFE5C615C86C1AB0F0E551C9E7F47B56F511E7F8A50FFAF2F6BC61B22D562B0E647157392468549103EEC2A2A6F7B65585DF4D305834373D821BA1A868E28B164CDE641437FF48C62EC39CC1550FB9EBFD5F60012CD6D7544F78F6375F7777448ADD73B48260901129FA9429170E9907ED071BF45123FC4011BD597096FFE76982EB849F40970E53F07B07BF5744FB162E604697715E7936CB48B6A72585C4133CA7875876D818DEDA62A02B70CFD2F097CD66B770283E8E3CE48278A81CF520AA0742EC5F3DDC85916BE4ADEC9B61088C7EEECDE9F6341DAB3882180106A9E7B61A873A431604433A79CBBC4202A02246D6754D1A727CAA7E7848A3E841CFBEF43BA548C9DF30C29C6D3EDB780A43A55CF94993A72CD27ABD7C590EEE699BF4760CD428BF5F89D3B5ADA2C944D14F9DF7A0B7BA2F9CDFCAB708697C984F9563E81521913A814B48A704F92172F812293A12704CF4225AD0A239D4FC199C849D6D1C7BD927EEC5153BF9AF5532F3F694670717BEB451B1A6ED0130012472D3D7CD2C6FA0561AA077ECC2C62FD632C01129B50F592544DB1E59D017F4568D553B8C8B093A2F628914382C000FB0680DC2E89EB96D36A53D6B0ABC3E493E735F6F664D5B93FD3B39CA3D3321B510A7F7E80D33B27575FDE9851CF83FF77BD785BED3F2AB879C11D76E34B482E2E0AB295410B5CF5AF0E2E63070B6D5DCC904F284878639220465295A4201DBA2D0A3A20F881A24417D3C7B3AFB912B5F466E2320DB25BC7742F9BD1AD1ED5DCCF7A906F15D619CAF8ED705B6306F9DC41B824832762A28CC457C70697034087F79B0EE9298704CEE902233E6077F2559B3F1D0023D41FF25D6F34E9A1662B5DBF372D58B625D0EF2E66905F3C9BBCA91047DE4D12E64F5E2DFA8AD69984517CADB367D52FF7D2135BFE2BFE683730ABFBD8A3687343A70012A4F3FE9C5FE493CA3CBBB0CF9BA343F9899C0112827E3AE2338EE66FA779D5907F8908C7CEB59ABEF429F6D535F4C1FF44ECB0A12DE0A1BCADAF88579A0F8B74268A9AA008230690FEAB6658D9B05E33870144FBB22B05EB576809F6B7EE61ECB3C8891CDA90BA5DBF89DD35041F85B16B93937741ED5BA7D46C939E438C5A9CD62CA3769EC7EC8490969A035CF8D40D647F655DDF04D280ADE11E7043E178068C89D28E5711EB9E70078A9CEB0CC5EE3DB8F3F63B63083A649AE4672AD6EF8BB7CE13B32E08FE3CA75DA20DA624EF5219C77AEA36A3590D8099DCE51CC0B3F3011741A8DF5F17C001642CDFB70DD7630398459241C597613655A98BF1B094D512C904ED6FB0510617556BEAA2DBCE9583828C64E8F3F241C22D7829C55645737424DA51BB2D0012BC90BADD041D2713106AB0895ADAAF4A007C0112B513B02B8EEE252D8237A429DBD976E1BA87209B46E65DDA70F8229CCCF549B6B0B1EB67F636BB029DB5759154DC8B96CC3EF7C0516767A7EEEC5FA6593B87F4B1EAA7509E4DCCFB17378C766C1BD43726D047C22CDD24D15404D5F35C1DF5A240B3B393E58B270072144FE348B1A27DCAE6210E73C03ADF6EB49FBDC91143306E9BDD4F0E94A51AE5FE9C2ED1795638C057B59B752614916CC3FD9ACA683431433F4A953591C4318E13E1E0D4696115161CB8AC1DC4270535932A7C4BA76849EB89FBB52B54D3D8354C2A2F7AAB67FE1607DD726D6ED0C5172E706EFD7900E79DE6822CC99AE5746DEBD1C7742486D6EAC9C032E94F5BDA686CADEBD7CBB92E24A18642FB5DCC9D5C935956BF1C73E44D8A0012FC1AEF8645CD8328FE5666CAD04B3279C716011241FCCF4E6804D0E4E8B8E62365E841C39478C87820C383EF2498E3CF41C93710A972308090A0C76799ACDCFFB2D4BD99BE861D1227DDB380EFA1B4BE9475AB87AFA98EA2FC1CC8BE9AC35843EB73948C1DA38D425ACCABB01041AAA0B3C4D47BFDCF8397E06FEFBB69F5777E0DEB5AE864CCB63BB990248842922303AB260F29425DD04308C78D57B02B1EA7382851D34C129E77F7928512E2601247C935AFBE40CF814C6782175C9870486B0B3EE073D69D1C8B0543DB216781A669C4CF94C5DEE58AC9B59316B43B8755CA730F74BB3C4A981E4E55EBC2A7BC5C02A28D3E45C2AD93AFB1BD186BC96CDCEB80E72ACDD21A2DA4F3124B081E6827BC1EDC7EF07D6AEA7AB09E3F6412F7CAC7AD735C635D070012EDE2AC6AED3F83BC9D06A4F89105EE9D575001122023BBAC45B86CA881A3D1D57EAD163DB752E168BDE954132955EB4E84F439F600DAC2931B8810A1359AD3A79D165BD693EE329EC77561CFC18D32113CEAB8AF858706010E67588D329D646D0500FBFD2AA097E0B26A8189D356B466722F36852061ECA83B7A74E0A494288323DAF38BDDEB7C76C32651771FA22B2E2B1FBC0ECD44455FF6C75675591BDEFD39DE8DC2D879C104893271A08BEF1DB6D54B8DB5D8F86B1C87F82410541FD0BD81ADCDB4E3A048887C20FD81C490718E333D5058C504591A51EEDEE14D7AD9E875A587717A4201199B92D08BB7A1B675E22DDD714BFBA4EC8F9C164427AF09E35B6674BDB636648D547A2D43F16699A7B3AE7F32B564E6DB2177F40B6EDCB2A4C6336D9F680E0012C6F082E2EDB2C5785FDE52C483931BE8A2CF011267AC5125AB32A830F252A313EAA3C2011111FAD85071ABD9ACDEE6879FE81444736D355D0CF67AAFDAB97AE8A1E9D2BD8BD01B1D476F943E90473DCC96B2368F80434E2ECE6157C5E3D6050188A3E7369BCAE62E0AFE81222E959579EFA947010E94CBC287CA29B5D1D32140D262352641328BADC06068E876408241E18CD049AB768F7FEC9A6E7BEF7A21F2C6A998F564FB2A43CABFA2307CC3015EF283438B02A8D44D25C857E9F9E751A5BA3F1B9521AE43A4EE0E4616C858C81617DAC00315B54B7A96CE92E3B6E7A5B0D4538802BAEA2F50D955690093F4D0A107824B3F0A4244D383F892E2DF48DBD5401CE41341D1DC639D2C743C8999F1FBAD499C15A2106AB2ACB1FC7A9B6A4259B16744A68E5F0012D1E1B9C11C73F183513E9F6ED885939435860112572E4A0099EBB82C4BB2F9930795432A306C8952E8B509D7F00AB4E355C83C5852C8B18F657D1EE064D0CA9287C8291DB426C67170B228198E85BB40696D83D83E2A5539D8FD4F325376CD282840D6ABFBD02EC0FB0876695EE6C768CFF2A206EB18DCC627D4E0B13437ACD14B89A9201027BB5662C3721AB2DED450B9A229E43108EA75C1DACCF5CA0F00A3A2FBE38C197EFAEA7576E091C07D84B0F4A75143ED26A8DF0F92ED03B8D9E63370C5B3BAC3044B853585F3D54DA6F1B597709062E63A476AADB0051693738CEC2F021AD19D580F73ADFB11187EC426C932FE6C6CC70D1A209EB588C7575085F4A3A9857B8F44D406922C29F46860E9CDDEA9746A254EE6530020DA65E8C1F617A7C396A132D8001292432C72849414E93BC1CD710E6FF19B907A01129E4E6C5AD5AA6D438639E190B4650C0E7364A54A8A59B4AA3F158A04A59BB328CFA84C94EC0BC6F27F51FD2B4311891EBF5282322CEBEAE8230A59CA1FB13AD1079F98E391DF0BDA182A016532D77AB8CC1BC6F83E4006081057C2B7939E896013E16FB6EF066CB88226342F9D83B8BD3ADC40FCD6A61775AA595279A92AFD27A3DEDABAA01393CC53B635A3FD81E333608CCB43D4FFD889CDFA9CE20A8B02D20C0CA67192B30EE3FF4933FA40E606E0F922ED0103FBB67B53AF8AB43A32D5277626F268877C1991C503D7FD8A42F04AA9676BCA17D9DB634EBE75DA2B487206BC9F94A0503AE06C5D03B77DA4A78B92AB5EFA8DA3FB42B711F7BD6FC0941D4B55AD8D6DBF15FF1B7E12ED96FDC3D23C194100129A3B06D8AA42F321AAE5555B58C5357473830112F3B1A9DA40C53770E0E89F7F2DB17F853E06419DAA78A83B2CFED304F20C44216F08CC84EABF30E2EE00E16D2BCF0F05284DAE161361308D73CE3C09338F7D514621F07CAFEDFECF0FCA4E4E518BC13D73AFEBD7C433AE8A364360C1CA3FDB11CCC0B5F59BCA69D9441AC7C27E0E2F6EB3C26312CC83C80A3FCB8709B3AF0A101E4F3C907EFB9F4B09FC960AC0F3DFCB18CEF219722D7CF4D7F8C4A429FCA80C0C4559D2DFBCCD35B5A09A403AF765D4713E4E6776BBA78C660C7B66EAD3D85137F2E357A4EBEC29CBC1D279DBB496F946F03ED7CC97A609B5A2DE533C600740654EFA3CD7EFF6B0152DC0B3EBBB7E0BFC51858C6283564CA3C4C01F9682831826524BF422BAF3FCE7BDF9B3B50673375A5400126DA9C4FC85EE74390257D2B5974393CB37DD011269DCB910CAE6B2F087D8AB48F317BBD2FD5DBF6813F07E0A99334B7B7C6200AA0CB2F1465074B4B94035836B2328F6A7017CAAF0CDBD88D78FE7A8509A8D3E03C5027F59360CF029AAE754E78F6FB411B7124B403FA08E5AA6C28B650F519187516C3A3C1C278889A162F9F0CBA7112ADBFD059F7CF142F38D831AE0D8056886E363656EF606F6AE840C6DCA9CE2976417C254E270A2F947D4DDABDED77B1F59198D300B5961A476B79386994A74908C7E79761DBC5B9F01455C02C60FB3D28DF2D7C6E4CC188267319B9AFEB5603DBE4C8B6ABC9B29613DEA65AB1A1279C7FC5B65FBCEB842B763BD259FB36CA8655E38C43207797E75F438EDD011029136D50E5A095CEBA54FEA010C17F01AB4A345F83B0012445C2D4A7F003FA47AE59FDB92289A416A7B0112233DD7B8825D5272A93F555DE75377A3E1424AE584F81D75F8C0E18FB092B5867E414C5D873283EBDFD62133D11D1B2CE64BC4CEEAABA44C488EC211CB1CF6859DABE414ACF3E36E1401624E8D8F923DD96DEDB3E4226A15BF94218BE863921FE8691E4697DEA4D366C06FD81F242ADBDAE6CF63A9335E1430010D988B616550F322B218DD2C6BB82DAA1F06BA6927A6BB7EB6E0C097554F7DDE2158D4B78301FA81B74690C20E1587F476719584D130A00CA937E0652D1A8B2C8BE53DD874A51199FE4CE6101EFB52FDAFD6571DB2F6918468233DE31A7519F5BEA74D23CC08644EAA90E9FC1F2A15476BD6259A9B078558585143C3C25B10825396B45C94C46F329A566FB0C9D082D5DE4BA84133990E2D0012C4720670DE24E9A5DFB0589D07F620C8438A01126B623FBFBE9BC94F0E20253FC348955D12BD350A60ECF056FA8972F6BCF5C49746A06010C2742291348DF8B9C2D789FF6136A1A39B5D528D6863672AB2FEF4221A3812257A9A8488C9E36552C86F5797CA422059DB107150237BB5CD89155E6C723831942DEC0AB6AF3555CF7D78C5E9DE662F839738DE4F7BCFEE3A3A764DAE24F0F8C8E1C7EA185ED9FCDC3B5809D8DDC512F6B237BD7E2CFD84C6FD3587D9CDD0D8A1166B82092332D3D8C742F249E0F59FF6A8B029E4650150F6F8EA3798E01E1B7EA4A0F020EECD081C8A0CC13FB7DD109F18A960EF1AF1AB593203A50BEE53993BD10496F562BFFB8339A47B1EFE0FFE0ADFCD378758F9C7690B9617CDC25EFE6F11AAB49F8521CF76F746B47BE8890012689E4460BC8E3DB268CDFE60903AD26EA2E3011281AAB24D768125B00583A8F43B9712C7EF2A32233C796B3C9C020E328F5B2B28CEBF1EB3BB24FB636EC3F0F7404B2E9159DD0C3B6416571877F75DB2D81B49253735C37BE7497FF10B4C6F895C6F517821E04FA3CC681C8B5F6DC25D066D4F260E28BA48E470DDE80D439B37CFA8D99AE4497CE0BA5DE28C19DDE3FF5ECC40DECC585FC99CE3224FC9DB8491B99245A538E78B64A7B0B3552975A5EBD64B2A7D7F876BB706BC57999CC5F476FADE6AACB853403CCFBE5858793DDF20FC21D64FEB894C17928F2C8A13489059C0754223CCBCD02543DCBC9184B5BD2518AFEFDCD6A483915E8591369561609283A008A3EC65F562D63AF8551A09B1C1BB611BC56C581897F9FABA62551D73FA523661E229180012185B7E97B9B668F980E8D75737DB00AF61970112C065E3399F71BEAA95E8632462010AC7F6A4451471A0A20FE312346C6F5B810C0D94AA8A5804E562037BA78D45A71BD36E8BF6DBDC3DBFAF4C36D531FBE8251ED6559305E9590D7A0C1010845EFD26DE287E23A28824A5842BDCF884C88091C8781521E28225AD7A694075CD95F6ABD2D45E6FD5635B6BF5FCA5F04204795091515C018CC08355A5B63243BBDB76EA0CD5D9751F190D4BFA6DD4A05981E4D0E2C807DA690920B1C687E2C694CD63AB0B1F783DA25B6F1D0865F03BEB89036CC63D8E232377B42161BC39EFB0407DA4CF5F0CAE9AA4648036AB1911AA154029B140FAAE792CE4A68019918E755ADBDF029DFE309CF451EA02D4D6741FA0867321F8780FA1F94F10528CA97BB3FA25BA2C4AFE0012C93E9D1F41F3DC2DBC51DD4C243010C78DFD0112F065A3FA968F0F563E292AD02B2A28ECF69488FA832E92334509C47C668F2C699E35A7908A74A047B455DF88E87BA229DFA1932BD95B5474B677758DE5450911F4884BDF9BFA5E647F9FF190C3C12DE8856463F5465AA07B5EEB20331F38681936925182252A4C0A44984891ED07A8C8282ABA870B880A03E7C38BDCBB873B367DFE5CF1BDFEFDA7D55E80B7955952EEE04C3EFF4F86BEB32B1CF4F4DE9AAC2D4506EB127260E5368C374C181CCD49FD0C5E01541951EBC39BEB4640AB6463FED69903A0E6128283246E5AF97B1367E7AFDFBB38CA5D00E3FDDAA3B78CC189DC5D3898AFF04DC39662314D7A05320F023F96AC168759C1EEB1FA5AA56E0AB23A3B5FCF123E169B474D972A5DEF937AA8FB12001258D6C72A52F88B9E0E26502379C86157A2A70112A760B49B7884743382106F5AA916E09D955FB73434D4AFC249D050934578BAD18541B35754473AFA1AF276D63F2F4E1368B8C490232B170EBC89335248E84CBB3E994F96FA31C88598F14D2637F631EE4C214A807897162E02AED3D7255F2D66C7908DA4ADB4DB9061A35E056C2DDB14AFC461472CF0D6A376193C6C78381325BF274995AFAC4493426CF4177F2B47FF4E322259DEF21DCBE989387B55C27BFBF1B2B617F9B1E1A07B311E0586C4D0E4096CB4A1A422F36498C84F39C5BB3659005C3846FB0060AEA9D145537FA52729BC5ACCF6610BA624075E9067A31CBB191535EC82C2F3DC67D61224BD351410F7F296EE1B999F287C8B939572BF8EA7EFF2196B63240BA8E9B2A86A623F13D4FF104200126A1618BFFC7D0D7DA33E35728582C79FF4510112FF78B571000520032470AF9B76428FA7FFC44304E0A4AFFAF4C7D9EE56455F19FD42644DD3601E800B170BB6D76E6673C530A8B586ADC34FDDF64E69EB0D3E2D436EE1F102495E3483CF98F76C6F8446D16806E30066C2D5D01DE1E6BE2B7E87EB7F3A9AB6C1B67AC4D0C1E4E7FA5B2E2F6280EDF21AD351FE4DCD8FAF2DC765BA81F9C2CB94EC99C1117B7962B4DE3B61881287A593E29D3E9FE62B8520A1F573E4909AD8C71BE36D53FC6661A7E5160EB74A9FFF9D12F2A6DCC6924A5D175BD3132E851F1E9DD36173159420F075B77C6E26E44AE809F64B4CFD5E30DB77376B91ADDCB31ED2FEF92BC3E25C6F88EC337292FCA77C02F8F57F2FC3A52AD167D786E016D0E09F11886C8E8DC2E30546ECC300127FCDD5B91DAC77C65CE401D861429978C88F0112F6EB67B701FB4D5424F36D9C7034ADAB9D35C757C9C28F8CC51270807612DD8293C8088CAD1F4FBBF1164F08D0BB62AC228BC3B447C1A932BBA0A0619592310155B02C1899BF4A7C7D4C6177862C6FDA0C5898765590A062042B8BA617FA13F541B5F068B347B652BC570816034CD411491D1FDA1235C98326AC07AE76B9BFFA0D990FE2D909700446C333EFB2B6A7C79911DD5240F0A311BFA69D876CD6E3F3870CF1E1E9D2FAE6CC6B0C5D9A4EB8793E9801AD4AE81243930FC43F9F815E8595A417932B237A9B0FD0A9D36CAFF81A51E5BD945A075D14DD378CDFFE1858517E92B36E267F0301996AD44FBA2D2BDCC3A5758EA101AC0DE6A2B88022D3A0DC7A89271E5104CBC4433D6400114FCBE17C1C00127CDCB0276170F6C97236BBD61685EEFF688601123F3FAF931EE721D585E1F8769B7467E6C3DDFB742758487BF26D3CC9F4919027B6A7B210164ECE1B807C21998E88C939A14F56A623D1AC49DFF4B94AD3C8C4810E983F6C13BE9EBABC2EDEC712CA547B502884D07147BF67974D0E91E13674CD96C854FD8C0FD600285975D6918CEB7DCAA6A830E5D6167A88D056ADECDCF2AFA20F603454E03B7BB15284056B7FCE92CF40A83648C499AA739EB8738B67B844904EFB3D516AE7049A085354C0A9DBFF1AB1A96CB35B5785F2CDF57C5839E05AE98B0067B316B415BF8FE3C2293FEE7B74D5A04ACB1DBE2897D17E7C4C51389894228BFF81E5EF043596CC971B5AFCDF5BD6D27B4261ED513B1CDB773680E04113CFA32F516D73B618157CEEA6AB08B192530012B6A959FB717EA2400A894463F98FC88373CB0112B5E90F634E10C92AEC4D446716BA55E910264764DA5C0E71203BE60A97E1BC0E66D555FF8A7E48EA5DC1B77AD219F01496EFD55B5D41D5C4072BE8D80B5D90544DE00270B31BF53313FE2AB880FE9D85D30449A61349D848B1F770727CDC5945A9BD12E70E506143D0DD2673229EE73AD931B45A6F748D816C8255382A51DF59FDEE237D360A7F88EDE5FB417DC0331F1955C09D4FEA90F6B2AF22FC4DE982C6ACEC23C7984BD14927BC3405179BD7E58E86FA205B53420EEBFAD4296D0B6063F538F6DFCA7FECF707063A4C35C5216798A5DFEE396BE8E6B3EAA8F7E57F8541533938E6D228F106022CF4A2A3E56B1DA4AF56901A9386DC3B1056689D51D996DCA722E0632B4CBA08BB260553115D3C47990012D5F36CD92F518AC30F84240D7090889568770112EFD4814EB38B114331648E0939643D31869E3D6AC8C63F8637F8DD1DA2602D3C85269DBC8500BB0280A8914E4C751A545ABA57BB75C7D5F91320F5C6BC22D12E1DE8E0593B487B9D89C9920D43B3AD2352A7565F9ABB90323F8284B857DAD84AE788891A0BF03A53F3A37A8F3A6B19F1B62A28C63D0776017697E449061DF3E3FAFC9B8DDB206829E18EEC1DD0801BDC78B69CDE3F3131D229B84CC6112CF980DAC00A1CEE84D990C475949D5FB8454597732A25A72FB4C93C89C34015BAEE38BB98C004A2657974FEC4D7128B7F6AEEFED8282BA935BC8A4FBAA82C1B77B694A70337EF9C0BD620CCF6817BEACB7842125EB09C0AFFFBFAA8630A7ACD807C7E23F039F14F8BC4865FD3BADCFE8246EA0D7D001297893A2F21CFBD896999CBD9560C795D604401120F7C6FBD08A957C5B5B609ECA969A8207BB8960C8106BAAFAC797C577AB0521551C77671095E65F72E3D6D4D7C0103F2B4F2E8B417ED585EB747E46F276F30508FEA0872A735C9EF38B96632A3C773426B38EDCB1191214F3519AA8C59C2C879C8CF06E6DB4E81EA648883C46E27FD7B519FC640FCDC34797346FDB3B6972C66DD732C713A5326045F32B74D25A5E58CAB8AB86A7B7E8A3756C1C61B86E6A80E117CA75DF4E4CED547901BB2FE43DA4465333E752BA3ECD8B2F0FB722DD959BC70954A21FD8B50CE1A94CB8E6784C3B194DE6F0C2EC912FFB9EBAAFE0E3325278638B38E9DDF709965DB5BCF885219408E9F62CED484AF584255989061FBB2135DB62CA7E33A008746F58AD1166989B29F8200122786DE27504032183FDB79F16371C4D3CDF00112A58633EF4184B8FB540B9F6AD5CA295A2348C1234E7FC16AC58A215DFCA78265598CDC3F935AF795EDD4BAEC4290BE0F7088C8691FAB92F8FEC4F85CD31C54B694796839223407002904F52C1173D17241F8A36B9FE2E77A8BE179892CDB694F50EDCA06B3633AE407CD027437123195F5210C494FD33016EF2F3DC424B2D34DC9A1375E5B998A87DB7243A2E43AA5FD5F39329E16CC82726BCC0A829C95C357F980B5E40A3FC5165FCAD3AA7C4E1EF412D0215D1EC3B0AC21CC85601160939B8867C76D10864F0A678A091FE8450C6C8C9E3162230635290836D29779969835B258C5FD45F78590B98E7AA57137DF6E12C3A440DA0E6DB4C392E2348487D4DA990F30AA1C3CD6CEDA75E5E9D0963DDE667A0012AB68DED4B72C410A38615828A765AB4828EE01124859748B7A33925C0DE7CBA82CC89940F7B67289322305FE0D4BF7084D6C963A746B4B23F2872051A016622DB978410B8AF04C96F8687DCCC9371B6E50874F7C2A76A6A4B047F574F814D3728033382889D629438A420422D6C0CB0BD528B09C809E47F996F28410676BDAADA70E7F9FFE7516A7177E2B0EB139842B63E568D8572755C66A50E312010E512A46773971CBF9F658CE9F0EE230B2EF425A6D732D89C6C391817FF1C9A17F3E5651C716739862444A03BD0FB2E8C579DCD2632D80119AE4EB77EC99F836E676CE953532D58D847A4931C8579419CCBA05778931929683EA0E2E00978AD1A54D8A7F8B795A5238976E42B241617C8CB8B865B3C8F299BAC03EE709DF4D0DCF2D257AEB61DA83310012DA6FDEA616BA3BA319EA1FBE64062FAE0B76011256514935B717250B3003EC7ADCE6E593C330F226F26C159D94DB572001C639646FE45B0636AB6F053CDDAF45B609E6951ED19963974FB1DFD9B86AE88201FD61EB121A08B31C3692089FF76E235DC65712AC9CD938617B1F2D0433938F55773AA10EEBDEB7762E7794A322103CF89C66CC282B543159E761369987E46D0E2D2EAB56E2580050F264A0BF669BD9460ACEFDE7EDF9001CAD6CC95F52AFF390DB9F7FED7D619455185B2B9C76C92C526F46A471B3653E1C3B20D7AC307901CF968828B11A3EC063B518EE394A56E44B09E0B961C40612A2FCDAAE7C5CFF1ADAABF31109E5433AC3345A639A337FF47743AAD5D00F8C203A6FC39FBAFCE6F891AD04D1D291286A1810B4F79BF15D55B5B17B978600125ECF657663CDFD784A1AE0B1D28E14FBB5940112CECF30686DE131366E93D2FF7629171A6EBFC1F8D747B3E2F3AA9270A9D131BCA53FD7E03775FD339EC255FA545797D37DF55F4244BB60121ABF1F9455C489426AF6A2ABA73CBE3EFD79CF779337ACA59E2ED244EADD36C5B8AD3560FF480F8FDA5B97E4768AE3F74F5420711EFC03258F4AC39798A8F93092286E4115E390CE2334E11A0F9C474616159D26A708E6E383CC1CE3BA88D53ECDD3A21E792C2FBB607A7BBBE5DBE14FADBFE9B4EFFDEAE04EA16CC9C70BB17601FF5F7E8EECCB1DE6FE133626FAF3800C496D3EE4B1F0694B66D9150B1330CACB2FE9A4A80A211982CC2C75212790D7BC39155DAA170B4E08E4F024EA144C052C8CF2E069CF1EFDC777D460155FC2327B3527A381024667D3F50012D840B9B8202B2BFDB998D1229320041333610112AEEF4CC48DABB3D6B7207247CDB7D2EA91CB24D32517C8678FF0D06915BBEED4287BFD6AD5C0827B4AC6721C25A17C6C7E946804F1076343B4AB558EC45AD7053C42022F6C5EEDB791EC486DFE516F61A53CC7F9D28A26D9C18AF346FB24875025774EAE161EAD7BA75C0C4A02C6235966C0B22A9916767CC29547E34AF9F3C86676906847A2110F260CAF9115ECF20B2229CC2A142DB0257E7BCD987A967862730E49CECA33CA991C21759E591DC445F58B556F518B25634F29F277BAE7BB3CB5BFF767EB130D81ED28DAA4C6C4B60AB2D77F8D4423012ABFC397F1F7FE8D0EA5DCEA1E0726A030F11F16BBCBE59ACC6D6237371CD7A567D9A0FAC89222083A28A88ED9AA3E96DBCFCED68D395B8EB05E3C00124F66F87367B76487E962642505BB4402DA380112FF35A9E6BEBC81288442D0AFC0AB3E20AC5C88A10FBDFCCB97B9C9542A75D9724B3590DAD21482A9FD0CCBD56C7CF5B5F24AAAED05FDB22576646AC7EAD27E9626995E0DC8BF4D226C102CA7A01CE260BF964C12041ADC65112F2926D3D868F79B043ADA36EB0F66B5C9E50E19D1485CDD677D06E7262EA5B2B86C040D02AD323DF1CBBCBAF9E71E0703EB5CAC41FD3633B8A21EF000DD15324CAFDEBCD4681A106BFD9B21D6B9FEFE28D8DACD27591FC77318D46A31E2B6CE667C286C84972EB88F768A40B7C00BC2CCF85D7747CD52011BB5262C4CB0B950FC4D61F5FD3A9618A40B1BF15CD1B7779E310D96838C978DBE1860294089C24FD5DFD9CFCF15C1479B515FFC84EA32503EBD8FB68419EE26F2001262C17967CDAE770CF51AAB826FC019C3808E0112F3760AB0B23F0AB476417A97976A999BC377EAA150E1B6DBC15C11ABBB27175831054C119AA9FF7C389568A9564FEAD8B4022A9DCCB312C7A08632AFF46560E875B7E13FB96A03550F62A90C08605E60A68EFC88326CB41C912A4F735DE155E829D069B688540B48642B1E4F6BAE62FBA05F8ED4196C6F2F6E561C4CA2DDC5BA74FB970F255F9EC928321384E71CAABB6057C1B2292F23BBCF02995D41EDC94A247245790C781060E39E4D4329897273B9E6BCE47B819967F4DC6A0EC4092B2184471A69784E8C2F13BF4CAFF65DF535D219E71F09A2D484E72D408D54AE98DE7BFED13CA57FB513CA6A2CBEAAEB1C737911D6ED157A01AC54EF5E96A1036DCEB53F138E959542EC940D93A4FDB78319DA03001268B3F0E999A8888BCB16FD079194055604D9011231B74C2C45480FE2BF71D01C2E32DDBF748777AEA28C5FC6B78778D343A13D7C781EAEBE58B491639A843C5DDAF235E5DF745073BBE9CC80F7D8CE82C27808ADAFF73F782DB461191A42E836428A1547636910182B613104E2B9943A666F70A1929E1200FFD822DDDA3EA1316EE868A5A289BCB87A8CFC00279D13018495C87D297942A24F1922134E18745F62B74FC744369CAAFD0E404BAC640BE64D207F5A74BEB625218451A0373F6D0D4014B7585981D35C088EBA66E68AD3BDA7B9EF3FD5A0C2CDFF9CF7F03464FED104F10C08B5237FD26AFB6A2982335F1B37193BE43D2F5F57246737617F3A824ED6E45F9B3B87FFA47D3020A01D53B711F986219117D01DD90DF4915451BC690DA61F811F8C81001294344EBDD1F8FDD14101839C7E835D172C460112D1F00F2E0CB479FCFDA120F7CA2DC7D5C5B6DD9BC6D99B20F0F8B67B0FCE5F6889A056E129327D700C56EF529D2CC744F1FA99D1FEA3EB31FBC20712293F97F2C7D1627A12C38785D4545DD2A1B8642B941EAB6D551F69AE1DF7BA034D60A8C2FF96E40996A31DA16065C273EE56573C371A9F3E8ADF9AE6745E958CC8918AA73326ADA3B62D5B1F4ACFA4B20D1ABC9DEA2E5B176C12D31E6D325F970C32F2B1A9BB9CD9E651CBF87E659A790A1AEA9D8C3386501BF7237667682C62D0918C583065A56E96B085F5EC84448CCD787755D9BA523AADEE9E6A2A651A1F331A037C99F841C53223941108605AE9215F79B2B900B8FB35A5003FB804FA333FAE46E61AB1FB4B9FD993A04DCDDFFC40927F03857E0012D765675FD8C65C5ECA0E8AB189AF574079DB0112E7EB62B51EBF265412D013A4C4ABB0872689EB1BA76504C85EFDBE52A3B10A58C8251A9654E58E8CDE9376D0FBFC950EBFC9D9619597348EEA6140F75689B7A1B6A313470A9A4CF3516CE55C9E0C873753D661131BDEFCD4F372C0456875A7C084297DD600DF987FF7540214AC30F7ED67D33A82001285D276B156338AD936BC283BB1F634DCC72505304DA0E61B7EC964B3F102A28C3B3C8616A208BFE076F8B9A9D7D21E211A71777E946CB712FC88D488D2C4A85EE4D2FF03AC208AEC38E448148E44F66E4AC5D7DA7E01C13E4700274A9FAFE8A45496D7EA63925CA22214EA61FBDB2CC496594453022CFC97309C0326666677E7757BC631EEA148A9DA007021DA5412FBC1E43528194D813634ADD7040012921F19F0DB413304C74A039AF4CC2EA8AEF7011279189F642976B4FF4750E6317392D3D499C71B0EDE3735391A83F16A113F1529541137CAC41D848A5FB6A21D9F1A487FD87780903E99B3F23E89564E678F50B8CF79A78FA5BB063607EA1A62AD8AC50D42577685286BA6538A0F8C050EEBF9FB2514789AB00492BD5362D461AE4C307D59E42FF04C4293720F238A61DBEF0786187C3B12CEED15339960133125D5B66ECC6C09F0C345F4AE8F4ABFD01A7E03E9816CED67CF86AA8049FAD05EEB705A39FE801F95CE7989949CAC788530ADD7AB7A7A7684507C0E4CFD7338818194E1F67106AB9DDB0F7A9558999DCFDD1D96E5042FEA0754BB70BE34F9ED650B17551B7FDDF21C2ADCC52CD55FDF44DAEF63ACC2A2F0D5FE81B8983F590BB10F6766E60D0C0012254986194DE44D866F88AE13C37559F533F30112E1D74C9CD39D679AC8A534003D61E8C2311AB82B763C8C8E776487FB024F5C224A1AE5F975DFE95536C25E18CB6591CD666903934847244883271ED3444E4EA7C477F9F3D36E6D514744C5D11761C1B07AB4D4F9A24994B0B3333965F5EC00F93E553179BF64D139EE55E8F0A192E09B03895023F3B66B9918FAA6A7D384619A8FD871D021A3D0FA1D5E5EF83E91B3FDA574D9B49BC7D89EEDFE7C90178ABAA0B48722951C809CB9A0C36FDA345EE9AB4A636B2BC516B5EF7A83990534ADCA257906281076B38FAAD118BFE9ECB5C641C8182D7D34C58DDDFF4BCE401DC5E0ACE4C9D045156470B3EF35C46877F98ACE0A8B1C8DC9FB91532CA73253C38E15FC177927405165662D924255A90A9FD7CF7F5400121E3E5F494D82A0A150B8B011E1A6EA0BB6CB0112C398B870B82540E45F055B06EACEC47614751A8D4F20F0D33766DDBA8024B6C015BC08C4934CA60969AC10736AA525A2CCE3E2170F3503CF9F4397264C156F3C078EB05B4614C3238264712CDF19EEF38AF4F607F03B34B8D0C719F3748E7D0E07E867584DAB8323D0418C04CA119E3DBF71C6F0BA6F396F230B445C506CEB6A9053CA180743CDB69A3DAAB0519F50EE120CB1379B9BD439785B0D81C77EE920495C3EFC9A7870A47D493BE0F1E3FBE2077D25CE20B6C576BE07F711A93B85AC1F9C5C39BAF54DE08B393319C647B6C9CFACB1E2E236D7010A39957F27BCB205A8490854A2EDC6563E76DD7734AFDCDD48D053003D9CD221D25E7E21652BC55B0230563BE95EFE50E951B2179F652BD3C38D0012527D7053470700DC8AF094BE3C73D6D3E34401121D70BF70BBCFBD0A54103FCA967E4015ED335ED8EAB68DD3869B019CEA164B6A6E3E90CE3A6EE55EBAF7074A0951F323E4D48ED78E2D25C95F94998E84FC81344AC21543EADC1B37661C90AB1AD2CA586622BF3EA38BFC2CA6FF79BC7077FCCA8CD87C6684C0D380146AF3C26FC11348713E3DE7F6A06EDC4AD25E1998AF7C65E1BA9EC7D6EFA180D8700637C9D2C830769C07E9C6C51CFF9B9055F5309C9C74CED1B5A38A7640498F935A932F7C42A73190008AEE66F6697B8FA6D7E707C392C1D6329859BAA252B5B60AEC930863E560EBD5A741A36A37E99F492A381F812132EE9901538F465D3F74E4196E7848DFDDB5A4E31F894D4C4B86EFDE19348644266346671F55C914F9A00599AC3972D5EC3700126A8762B39D621682A72CCAEF1CECC4BA62A8011212176E4001A1C84F5CB7566C27F0D7FAE961B7501044AFCC84E1F0EAFEC4C9159B052F5384BC813DDF368E43497AF50708F624EDC595DA2E5B1A17E1497D93E6170DA96DABE935B1B1C9C951035F870986319F60F1FCBB131E11D3E2B22D77FC42A207229D8816ACF9516D9389E67BF808245A90EC213A94DF24047D61B201D243D11BF7689AF5644A7407854FFC78BBB35E24AB2CB9B584818BE6735DA4EA830A41420ED44987EF97156992F88317C6A78E4D26DF98B06077BC82F0813B91CA9E55B3E8CA2D22215D80B408B9C97BE3BA663877CC089F4DC0DD98F047266D339F54A882637415E1C8F408CC47BD0C4B7503C9FC64A1DE96C56C38981A87009E3F2C4C742AC30E2D1D9829459BA13A6B98AB001244D454AF7086E5BD25A4E1874B250932A9DB0112F674DBBC2B7F8610707D905603BB568C778EB50896F6FD94AFCD089F6401D10D86A005E1AF4B29AE3E43A846D2D8372EE731E85A0B2BD29425CBC0693E60DE886D1B0BF2F0E4B0E9DA59A3721F39979271692B2E7DF05056E62ADFF634CB4F4FD00D46E20B9A746661B7B4477AEC959031573348FEED35B1D7C2E39BEDB2ACE0EFF78C893E4BD7BA7009B4016257079ABF188CB179088E0EFCB1C1A8F26564548ED7594FB01B73F3AF1A89807FE1850A3BBC1ECEDD53AB3EDE78367DD682F768BE19B4BF5D21B6BB38D079C76CEFF6E382D0E45D218369B69BBC39CBC20B76F300ACDAC45D923046E69A2013391E120CDF6BE605701BC545D8EBE14ECCBB90A03F3AF60AA26791818E016C0694CA491930DE0012EA8D79DCB8C2612F788D7BA04D5FB49112F201127C0443CB1344C1BAC58C72053E43B9363BFD1B06C074393F27940831271B938D003BD32136BA9805F370172896E037C258001C396F9D56C318D735453C49811D0429A44C937CAE88FF1DDD489F06330EA1241246F79A9783A6D0492838144A03896AA75513C1FF4905638389AFADDAFD68ED64BD2A395195F65B6C6D711B909EDF87B1140ED14054542C3D14A5EA66D42492ABC0C71CB2245F6AB7F58ECB4063BFFC8AAF5BFBA51564444A517D3D95F4D72FF76A14270FB1A9FA6FB09A7FC535093BACF9600AF11AD2C561AD8B301A49ECBF670325858286D54BAE9E79EFA48CC7A3166C34A0993F7A9F40955210D25DA5585D9E9B8E9AFF59BEF568F18476A8FB39BD34FE27EFB284D63D498ECD34D9657D001286542B286C4518D36E33870345ACF443EE5601129CD38C6789417C5B5669969136E857819C1D5FAAB1B7C8F5CE5F16DB3CCFEDEF3A063C14944C83050186D8D56F2506BB2323C4B7C2880195D6E5D88DCE94455C2BE4DD0F6F54353DA2D2217357CCF306DDEDF9BB26A9C678ADDFF08C90210DA7C0AF4E3E5B0946A03047BE56D6C7B92E65821633B8F8430C1300E7201135301DBD5B2766BB0C38F9C1FF1BB2B8EAC845EF5467BD08F87CD9D5680EA39E362EB1090A609864F939B3CB41EF5674B07607E6BC1C11A5EA92CD15CA71E5B72EBD6EE095CEA043D22FBC4662DAC6455599688E2E6D5D5EBA45063249B6C38D40C32BC42ECC60AF510201CDF0064311E09A690D5BD675AF9954EFA2EF1CD48A3B62AD7A971F3F47916D76E293DB87FEEAD8AB0F79001213121BB54FD79EADC13BC7ADB0A3F6E7AF3C01127FA0A8FB911C08F46AE366F5397C079CAF042F29D70C3CA70B665DD765EE39CA63112D06129F67C34E46BC8D7501307C89350E9E7D736A7FEAB161922C45ECDE98F5037AEAF2286413FF5AC5DB5AE8F0899EE46058D29F80A2DE910D280BC658841565BC306C23EFBD4B231D54F0B58B7434B751B8A5D53A1F294D49E4EA666145F29545630BA88F3C32AC68A1AB9D794054E3E771CE66A692B5FCDFB2D1346421D32CC61FDAEB0CEC1678200C011BFA0FB092620830F13987EF5E346B3583EFFE450AF9C2A034A3E766F24C7300C2D203FF127BAAA34FAD78DA9E608669B0CE5CF663A2B01E5004967800E44BCA713DD6E6B97428E54CE69B43B62013E5F7FE5A386A60CE71477E3CB459B4343BB2DFF1780012D25032EF75E835422C9C5B36C4DDB87157200112235831792A3EA244951AB7F2FE65640F08256C7EC6DF0834E64DB91B2C631629D27528ACD5756D225F16C7B28C76C88953EE9F6B55DAD6206FA31299DEC3F613A398BDD523940BA1E359BAA2E88A704FCB34DB72864BFFCB5CAF9868D21FC6E6A466D405BA62C6A794399ACC2D8733E8376E810CD948D4C64956A81E277C602B47F939048090844A746B9CDD8D45BDCFAA4DF5A093AE41EFF85FA093CF807948869A59B62A245CD7C0F87F7CC137CE07800429FE0F68D9BEFFC3C5575AF7A23ADEDC4A47CFC153D2F076C614B4CDCCACC282B86B30B4412F8A055551E117C1B298CF387CCBF1FA2143724DC26351C7B31366327C95731228067956DDB0B47C917872CED741E603F6C410C0AE027E85461BE30012EE6BD7240F3BF661B66691DCD3B2673F9B230112C8428915702A27292448692B0CF9A71485AA4EBBD527C7189E190A80A4ECF6D149C749A94086CD03EADE8E3D23C1BF19B71CFC15410BE87BA7E1DC105A65CF2CDC3FE494E3A45520A178E860C715D409759E4E36554369C648F3C0329346F44DDA344BCBE8C9D72B374AD8E1D79827B491C94DB89045C78F709D8FEDB26D0065E9A1FE12009C75A25B74024EA16E932C8F0660ED318B0505AC1FF4598310E3133EF95CC25F0E8062570D0389C774F0B3F8F2EED6266A897D096B291A71B2BCF111309BBDF686CCE781B91DE2F4ED95C95B7067B4605AD84F5B66EDCCCF4D9BED7A2B5B1143CE39CC09C3E210CCC193095E04E84664A621B2B39CA6E0B25221378761C22EBA6F743DDFACD92BC0961E4BA6A5001288EC37D727C5CD61024F43E860C748B07E010112DA7BFFF595661C432023D02A2424A75F3BC426DF66C1A4B5E471795739369E49723B10E968AE2E5D75174C3342072EDF27DC4E18F09D73FF4F986CF3E5DCD8BF2E303F3D42C7F83F0C97E8D0CA273EA4FF6F3D1F372D20D33288F5C79F8EAB7026B960623097A438EC8510741B9E0D3DB7D8D60DD33920DF92E43B02DC4833204F80335C0174D2103429D9BB21FBBF666817517BED4867840BB353A72B1EE83B1C430C467C37F5CF92D2CDC26E3123C0AE8554B1F69D22B6E1D0A6C0AF4E82ADA1C8B4E3CB3CA16705F16D2D6F5C7B48385BDA2A320ABF261341908AA049F120D39F2615FC47BB35BAB4E26E74212852865182ADBD31D60120D0C6DC99C671BC65F180A93796CC62D1FF0D2D360D41B4AE9F00124D312AFC7DE5B76E4961624C5AC4885AE4370112AF33FD5463B78B53A8F0562CFDBF929CEAD84B13E8F09BFC2DE6115C574E1CD746C8F8BAEEF570D5FE7CA48AF4941D16D04AF0867BFE9AE198B043D5D9A34ECC219BF3DFB4734D2752FA341EC52C65BA714E32FB57361317C2A1FE4AD355B8D778E10A91FACC0FBD6FA7E7DEEE50D852658B23563401AA603201C369345444939F5ED506B5AD6C0B2156B107999040AB5CB5B179882935E2207EC8913B906371AD0903E4D61024DE190B354064D7C9EAE14C2EF65B6E9099D291FA2592ABF97806252D8EB7DD3365A135BAAB7D4766706D9C15D2731BE442E0DAC8AE566F04D9C54BD9EED815EF8FEA38D386C4A4A99100314E471F1B521C93FEF794A4F338F80086FD37FA6603460C73733257CED45E9B8A001226BC07B816536A6E9A182527A8A9C389DD650112E56AF21DCD4FE7C6ECBCD3896C81AC94C1248B1ACCA950C799509604845E4DFD8132DA7F207380883F66C8274A3F94B3A541D8DA9246AC5A26BC36C4CACA6111E7BFC612B58B8654A1646D5AD07634AA4EEDD26FAF709A2C35E067FE96D63B1E9F1128E7D32AB05887373544C637DE35EA9D4382ACDD23BFBCB1353C7D2CE9576D24812F1E2EB66068CB71EE274014ED9D82566231FA5B6A6C607F53A7B5646B9A17AB0FAE8ADD8EC6DCF9AD2A6965B88F08A46E139BC40C7B3219A240269540AFD3202623842F775BDF699A3B1C6C6A2C6EEBD11A5316853CA17D2FC123D54FA12AB6B8C238F325B9C462A4A9990FAECF0E5F19EBDDBDB8B9DE5369D17FCEDE684C266154AD604D1057ECA360FE56D96357001273F93CE4AC707F0F7920342D474000D86F2F01129ECCAD073FF311CA553C41080688C95D683B1F2E11D9CBDA251DFF1F9D9188158DF6335593D82ACCAD47E16DE0CF07E55F795D21D13CEC14223E3A6364CEA1A1F4CDDD22337B58591B46831CBF7EE8E6B98463AF64BB1CD4195973B74FE2C584536588923A289798486AED5706042DF9F7FB9D7A01849059CB96C24F150C6A80CE1ECF7BBEB8BB09C5BB85D1E7F4A2CB5E290A5BEB203BFFA984A22020887E20E625FF920EF34125A6CB8FAF2B9DC131BD3A7F368FE317FE021DF64CF09E37CA7D44B89C6BA474C7EB85D17A7453A8BCEAF19DC7D3A92EAD374E4F6DB9186D2B1D1780FE47CCB8CA63FEFE4F0F6BA83DCB49835D5B92DC4442EF278A24270AEF0C9259B21E71FF23106A04289CB1E6A82AA00012D8FAC74D22B633E23DC64671F81B4D26C407011233648227519734FE32DF6B9C4CE6CDDF5FFC2732D136D43031CD4EC45C452D88BD2E864A57FE28BF379C0F2F5BD434D31708CCF0D2C90623CABED7ACE69E89A96C2B751EB4FEDF981744BC698AE454E66F8B533F651FBD453D4ADBB815BAA1592523CA8A5C5256507C519D74C350BCFC490A1D7989577F8ACF82A1C0B9674C55ADEDF75C0454200CDE3AEC8A4E111BFB71D745A8C5CD336E7144D7E44F3342CDA68CFB8641E318E5FE6ACD2A6E8664D75FA0B7F49B08747F3F993B8FD9DE3255914E666E1E11A63301684C2EC314774CD93CF20C20760BFD0EDD0224110D79E8CAA658EB6BCD7FE6FFD47EECEFD32BC6955D8A089D9F124B50EC1630FA9953D44816956F0F135C2ADC400F5754A20AA878CE00120A0CB6C4465A0868FE2CDF78C478D67BF7910112186FA3C83622E8AC4B4F68C05A24306ED446735DF15F0F72CDF2B5F81A75579C113A1D851FFB1866DCA318FFD1EBEC8FE69E37AA89F744B5FCBA4E18176010374E217DB2ECB06945D71C04ADB1E3B0EA8FBA864563172D811F831952BF7804F7769A29CDC68B1DE87A134E174B9444AE39D812EF519B4AD96CA49C592DD697BE68FC7AB6E657D4AE50E220EC30982A4F0F876BF6B520F19AB4897D90BE9CBE58BBEAAA564F4D2EC3F492888E61562403077DAB35EC0C02058341AF03E8B62D15D7DF483951B0ABB43693C16500F7D98F55C9D39A6E6AF448147370FE08520BE4570AD71A4A426937107ADD653CE575FBF3FFD48733264D310158FD366A869AA55EC4FABF8AFA260B000571783833B3143C8E001240E0A68EE9A2D5A9C43556350ECD7739995C0112671EC3E8D087173CDE31E0E3B6DD130785CF035CDAB9C330F6C26B01D0B411D42F7068C5F86975722A5D92AA53574D6BCE1CE7AEA9E8A92F44A27A36C401CC10F312868BFF75757AB4195B8A9A3AFF810665B20FE8D66A3802C9D64D2B59B0FC2C3124064B6DF66CFC8313FC04CBAD20AAC860020036C56EDD8582EF0D66491AEC03BDB8948E38CAD11456870F19B159E36D524643EA5BE0F3CEA1D4A9BA6E56C805BFE24299E0D7522644476BE7D5424FAC9DB3DB2F04D9245AC71728ECDC1E08174B9A36E997D80B7E3518CDA5700C019B08EDF9404355B2C53CF568BA7C84CEFB1D5EED3EDD4A85047F2F059A7F08BAB576B0D693D4EAB5891894195BD96C49BAE91C7514FBD813460F78730217D379F300120B53B14E2A514050B47CE31BCB1FD4C771850112E396E012548898FCEFE1EECF1E8C84F6BD40B7C43203FD6D177DFD30CA3E05CA5B228C557AE86B62D4FFD60F063C0664030B6C9ABCECF70CC2BD41D9D067920C881E19702BA44C44C007AE48C43BB667902F34F7767751C169579737AE47D20A6B048EB1A3E3F708C2E069E1181C91D0DED8F9EAF176E9BBAF0B040C4921055ACCBCF20EEA80F753C463B5428A0F6606EFED7B96FD420934007C8A4B56E326B5DB5FFCBBD5189F7C91647D226AC686B39C8C5C95C1282CEFEEB8C88BAE74B3C7B3933F1AADAB1B1F87775F8750474869CDD37ED0F5BE1435941FA7F614D671BA8593912C5003F7FB3AAA78A92AD7D6BE8E4B416BAFC14509D1C4A854C0103C2D7C8639B852ED71D99A130FFAB066BA25B9A700124C1A0ABDB54569BAB575EC3547816BFFBE7C011269B033ACA408A523149AD67FEDB39B07197EEC39DBBC15608EC37919E10FDFDE78571F638312783FE04D0A82E8BF06192FB7BFF51926FF43621730054E58C48C20610008B0EAD6DC3AC2575C1793CB7BD592A55059367E06BAFE3926DF6DDDB1D864C3A85C05840310C530D0C00C04C1B6F0BA3E3A6EE3CEAE3638F7B16C2846D4964296BF68F83E55C445BDE40A34516AE728A77AB730064617BF613C728421DCCB289311DD5FF62F8CC7083FB003DE0049792B7E0E5A46547A35455E87776F2A24B987684C7076111EFE0402CC40FFBA3E68485E0D20F12A1673FB18565E19440CF68668B858C4365951CAF817198E2C986AD40197E9C237FBE5F5F7ECE29B316C8FEB2EEEF4B261ECB433222D972D63810012B384FDBF39B121EC14908780A25A4141113F0112918EA7CECAB2B7544AF223296545B18C2C73594520B0546B63FEBD15F2EDEFB8D87A224D3ABFDEB36473AE475A8EB42BEE3D8856E89247D7D6C6C227C0F34589C9C74773C8D0762D0E39F02815FBFD408C3E8A9D2053AD389CBB0F0EAD6B5D41B6E84C94D46B0B27C5376ACF875161B2BB3F3FD7E799299AF2AFB3076553C77AAE5F14E46E3C892081C1FA5DFA823486EAD9225703B294FAF430932BDE7FD4872F97A11B72F207FF9E190C759E5F3AD130152DCDF3EECC72C12BBD96DDB84F915CA75CE328DEE7B0C0063BE4802E0A1FB32D84394FD6F59D1E02574D53303436BCBE034C494D1FF235DD0DD50A6D66DDFCD072D2148C57CD0D20B362C4A5E337D32FB4F14D592992F3333E7B7DAEB6E16FC00012BAF39A058CEB487C7F87835D14E51BBA319E0112D482D6B4CE1EB276E7444FFDA6EBF620D6DD36C3C231E77439FCD7D34B2564A70BAE742E5AE9C28F8EBE3D026D8FFA3B1ED9F79D64653B26B08384E61027007526B7EA175D63A0748054F54E752DE6BD91D2D88CCDCD9E607D67F24AC121CAAF2A2D9389A904156A789D2714B9FD40BEEB8879A421F0C1765AB8BE74199C7712976E0F8CAD0DC7C37CE0C984111B5F6AC03FB4ACD5AD07105F108C160038E73DAA8CA05780CE8CB417B64217D0333DF876CE818837DA7BDD938359897A5C76570871C5DAAD17C80168CF15E66C4A3C8D7EC56580CC71F4BEB15B1DF9B2692F650CC575E0953464D93E0830E66E6DAE239B71DA1A7534DFD6E5EA6762483F71EFE6315185DEC0BF72FB4BC1653038191E6F110012F3A0CD28083360BC150810A85DF2354BC22701121A3ACDA5D2ECC36C09F88E1A095A4A1D3139B65978FFB70DCD37CB808407C0AD59695A7B6C96A42EB7CCFA44FEB56ACFD35AA9D5929292E391989DFFCCDC373A1ACEF89D0875C4A369404E440F501B6E78D767635133AE687D305F9DFE4DF9B1856567BC79EC3214BE0AA17AEA1F480B532C83CC8A0F2B7E4676218E7A81842EB69EBEA98C5D7981E785C5C74A234CB7ED5EB60B5077BEC1C46D8EAEF05AC649946DA8E6D06E22072727D02FB81DAF4DBB417BE7E8B47670BFCD9B73F124F98B054B794E95C0085B45D156FE4D0DD91E8D48B92D6048D87381BD7A17DD1E27EB5ABEDA39E8D9B5F9A1C6AFB4094806DC8E61C5B543C2FBFB7CD8661177C4B723E44CC4694F23922C636898198EA0C0AB00C10012D0D134DEC7E134F9CF8A325E8218835301620112F54D2F1A33AB7B2F9EBEB4AFC2BDC824D6C38790F8A590CA72D2C7B1F7DD4DCEACCEFAEAAC0DD0FEEA98919CA2C0CAB853BFF701D8DF8C41693848280426D28993D6C60954C790A6674EC1493CBD6307B86DBE2F524B47AD7FFF50F6857C716FCD28F699D20FAD33A6F558F1F4273346C434589F5DE756B337D65F458B76DD6EFB1DC26A3A4174E81C343DA2BFC44F72826193AD5EECAA624589D7275A5900F8E5BF693F06A39B54926FF4A89A392FDA2274862020AD349E92DD0A8D3C2860BFE721567C425AFB832F95A8D0F8B3E11A9890CC036E4B2D9A0C54DDB14C04E60558D6E6BAA104D3E70D651B2360E4C9C16DD3285B7B4B58B8810F4CA4A7566D8A564864D9EC8932B17290F2FF10D9A76BD8BB0012148AE69456CC723E0C965A14C3D434D46C760112AA61BF460BF42DCED65116F74660BDF257C695B60FF19FE70A75FF0D9230B9734ECF1D60847E5675498E1B1BF75D15608594BF864A870EEB148FFC4036F362728A21DAD1DE32D20B6FAE6FF4F6C425B16CDC0C7F4396AF6481E540B07093D23101E1F5DEB8B39365C998AD8C9A6D2A6F883BA68CA2FD1562B94E7DBC585E89DE7E0B6AFA3E43C6D3E0FD7885D028B8F8F7ABC0E19E47183FFD5F4D8538E26B781CFAC0E4A5EB652072DD848C2F75BFD7C79F689796F646920DC2B7658357CA40251F783AA9734EDC1FFE27E27E0567970FC9DD018C99D0D1BD399BA24E99C4EFD34D68D92D47437FC0933C346BC8A3A7872A7C0099368C3E8CF22301DA2AAD9D4CEBB1D40807732A65A739AA71A78CA14F0E0012F27837B7FCAC4C7C19F32E3182404EFA2990011299714F4D7BEBE159B6343FD0BF52906702B9C41B578C7E075BCE01C6B76E7CA2CCE1E95FACFB7C83B5E96D602BB641D5DB9564AC5BA6436A8C77847141993B2520E5763740989E95E3C9BA4C1BEE1ECFC29927E6D0946DF4EEE77920F8F42C3DAFB28BA36F1FBC072713BA037834387F8267AF2D46D0BFEC1EF379586A3B078221E39C8F6C13068CB1B87ABB5DB0293DE6E9EAA9FBB3CF99ADA337A1446E7200E4EA68FD49907BBED5074D22B445616454A154E8F97AB2CF8DEED70FFCD610C8EED88CC5D28123FED481F88C3F83252F2A328006D5EF3057DC9F1A0091196E157F6465C25F62CBC492A4CB626EF10B3423012B1A18B53867D0933FCC8BBBA14437ED2C1DAB4D130AB760E896C18EF699A34700128B38984FC2283CB63D3AA1733AD09C06DCBE0112A090715B71D34900DF224380B6873DB7380466F5322AE2882D9C9B67C54EECCB64D2EF393A24A68173163B2EA98B48CA19229E764A927C800B6420C8607F07A60F0DA068FB2D0C93D81377ACD33C57790E13BAC0823895B7056B0F7E67444256EBA4D31ABDC0342CF76577B363A7FE6AD6E30B634E8B8BDED2C82310344DA823A6EA4E0F9B1ED3A3E17E1527412A42D630D92E984FEBCC61A0A8BB1230EF8E229179A0BF6FBEA6CDA3A10A4D0569B2F8CDFA811263892F767293908DB4116C30E19847EC4967F557AC0E665FFDB53EDFA1A068E98D2429DD2D47CB84651D35A6BD75D3FAF88EB4EA72EF4DFD21A317A1F9FD7926B1D6E2CCC33486253F06CBD80F398742F02A9943CEE733D5E2DA5591616900127F186AD4E14F78AF6EC39E553D2E302F92C801129475EC2D4DDAC2DF96C2DDD1524FA6AE1C91447FB157ECEC97F47B5D1A2FB5BCFBDB617824E0F484D33EF75F23B140A71F0BCF71BA84BB86F787EBDB0633C43500DE8C599C744A0D6F9F5CEA2E9E8ADFB3E99A1DA7A05439065C9A2830FB2A7F4B9B8E743657BBDA86D1C2D5D6455C015F3E79C94227D9EAF306F7AF127442CE18943B218B38D7487E58EB5886397F50B626AC463AF5DF7600C88E17C6713C1481E96811C4974551F34B32F1C8683FAB455CB7372D493B363C74DD37E4C41520AC100022FF48F561EFA91A7C6BE7332CDB962BDD8CE8C6F0F2ABCE4A492FE9DA96C11961B6E401383E447B125C8DCB07DD012BF24E320BB45898F2DD78D76339DC43100B51E0D96B03BB1C2CCB7E378E52380012FDDE8C53837292620D3C0F6DA0A91F56311F011254B9F841075F3F15E341D7DEC3AED8CB1E61B3D02597ECA6E5CD8291054ED316172375433FD2D807E4F502C5B12794B629802E8E97F681023703C979D209CA0D7C4EB9ECE768B15D4E65AFCEC7649770584D6033D60D2AE339E549D62A043782F0DDF1F94BA4FF5F03A83D179C14E8C041956641121EF56B5C60E333C8B86A34EBBEF77880D6D106602FC57D01BF1D82F6F46452E809A7E95686E91393EC765D27ECAD090E0F1F5B93A005804B2EA5D8AAD11627FA83EE0056749BD2515A95FD51FFDE3A1EF9E3E1DFE599B0DF076C25F0225A689D48DEA61B232626B4BF6D782F9E6BC544620344F28EA9C3EB4BF056F3B0A89C0BC7E111203C47B17BA57A5C771DB3BBE8894D580B31EF4AC2F882B776CA0012D4C1A4D8ACF97EF03DF7E1F070027313ECEA011269336DB1E7E57DA4EAE712BC2E4CD3A4FF62D302BDC420664A2515792C6300DB99AD725929B9AD51ADCC9429BDEFDD301605A894B3B365FFBFA6FBEEC6DD220C025B34DB171DA9CD619FC44099A3879D49964DDDC677D7DEA03DD642D3069CD2E4381EA8FBB113BFC8634E1E5BC022063CD49858EE90AC0DC9DDDC7F16AE2071A3D7A13FAE1076410AFA13C2479CF100D72189F34238554102D9D02D454AEB5FB67499F00EE302D7C06D35E03A3F165E8D46935A61A7C0D4CC11EFFC7580BE007B85117FE2670B373C02B675891ACF23F5A13FEAAFC5C5AB0696C80B50572A89675399B40E5B85E5BC20CDBFD17DF25B2321F46E20702784E61A3C48C28A935C0E8C464510FA8EB806652C3925CD39D6E6410012CA7BFB873A0EAB98D29082B2261D17D1E43D0112BC1C1B613025148395D962273CE997856C383E221CAF8A4497E1594E0E5B0CCADF44664DA751F4FD1AC84744FD61CF173F83A440DA7EA121F7F79017389E23C051CD6EA0EFBDEB806C2A24C08877EAB23772172A6518AD1098828AAD58807D470C681EEDD63CB9B9EA520504BAFC1AA2E4F9B053807F7D111166C0008BAE77EE43933560620E913F6FEE774D13B252CF5D14435B2ED6A50BE9EEE3B711AA8F0C11064BB0138CA2FD30B3B3D16F09ADBC2FDAFC80BA0142C14F887B6D1F1A422949B689657BBE675827BF3B7F0B54AA27CEAA64C71A552CA59164EE0255CCB9C538AB4EB225A64A2BC24F35482AB5E6CC8FA30E46651EFF228ADE8CDD1659FABF39949C65BF82BF47C13104641F124E32A65F0012F666DC9779589F9C3AE0E9AED0C354B615620112780F9551946CD98CBB913448E22119037C39523EA21A8EE2346B0B83775FA80A0A59AAB7CBA6DC6EEE5DC00F4A91ABD6BC32E2A19896701157706526FD478072719B82D3BBFE156E9F5E5199EFFE69943CE148B8081D4DD50A2BC1980D17B002CAA3859F616C66512986B60CB115F26D38FDFBB77719A609136D5965E0A287B444CD3F556A1B3440782F6AEC5C5CFCECA75A1FB1CEAC1E3AB62B72811F255CCD307A58C5522757D4B58C166B60B7D3626490A634F31F593542D8AA5AEDA44CADA552957B152C0C61C7B15B1A6EA7B0CF7276D53EFB9A52F0DAAE943D190336BE51981E521293B85E64539AECFACFFCD11144CED37B4E9CCB434C5C9666F0C094283EB853940C0071B24CFABAB6A67F9A69240012480196C76743537A5F0FC9878E33C988FA510112DDCD0FF405448C7C533032052316CDC8860B23DDF7C1610F3A196DDE12DBBF813CC579E0E27AF681302A35E29C48EEE8EF6666686935B20BB5B2A58BFA170D75A81D68BEB97BBC5C7A7CBD13FE5FDFC61C776975EDC09A52DAD43AC7AAA23F76BC4B6E5E315B815029A97BEFF12FBBB8B7F601A08507C15DE4D74B945269A4BF1D300B6534B18E1CC466E0294FB8313817854F8849A048DBC8EA7712CEE77EB7AF4646447A426EE4C48B2AD020545896209621FE5F9A49F4AEE82F16CF411FBC0B7A59A48AC78211DFC7307F1D6CB494873CD8C757530CD821AD46D542A597A5FCE5EB598A5B4FEFC654D1D569D7A0FA4DE349E10597997844249E9DA5DC85ED7DD6CBC3F5378AE13AEC7208E5878EDF65DA00123DBAC3A48D3986704269BA861DADCD1A3DCE0112C55469D2B103A055915793CD454A0E85B5C54D68B07007DE5FDE74F85ABB6516C3ECC6CEA45D1B67E4845848D4BAC7BC94C4BA035A671FE0BFC681A6B152CFC2B8B36A9FB024EF5340DB645568B08E5F3777761820305B691B752A114512743E5490D9444F1DC46A7DDC5FE918FA3143DA881722113C6FDFEDC9A0CCA51461E5CE316DB334657A9FEEE506CCF0E1F73BBC7420A1E46C3F42381F15EA3706B20F03234A521213E201AA88A49707619BD9A778AA85D236502E1F27FE5C01214C79E3EE5F0A13C464AE97FF7A931B206279436398FA59643DCD4E760128B07C2A2626CA819FB4C9709242517ECD38C7DE7B3D21064C8A38606EC0124B84A9809AB6FEE4C3063172FFFDCACA0FF791653729913300121ADBF8FF332A6AD7F0F54A0D27FA6A667A00011272013C891AF058E52CA83C8F012745A4F1399CCAAC4C6BAFAAAE27071BA1305B3F8F84B61569D5DB5B6B14B041D8EEB4655E050126F065E4618FF7BB968DED89A99F8592B3C6CEB3A1C1D1A5312730A43BDDBCF024A01D49481AD4DA2D3E3F6562225280F0EF9EAEDE943509209E9E6663AD148BA81F3FB11532911FB8A964260404E93568D08526FC35F26CBC42F8B90695907838CD09793CA19227A706C37E06F3001787DA4AF5078E23FD2DCCB663E39D568C7A7B33A2D6F79FAE672E77BF4F54590761F0652E348ECA5319EE7AF9B1B45E801CCE99E7DA34D802019FD743E4979AD034147DF13FC8D76911ACA664B42F464157B1E54BEF4C6635947FF34A706FA95F7E22F668CB3CF73450FB4C4DB8EA00123273AEBDC1AE2E467AEDCAAE91EF0EF88B6C01124CD583278DD13E8F0159186FDD482BBC2890F3F80BD916E7DD3612872F26BE53B0AB3FA1FAA856ECB84CBD3F530EFAC8C1CE31E86FC1CDF4741CE08A643FA52137B9B6325CC6C5C08DE5AA29650AE093B9EA39D0AE36C3071E81579DD8283E5A8D64FF33220BC509AC5726057C748E0DF05DAAFC7E27B1838D0F7E6B5331AAC307A3DED2E7E43461EF19CE1D4449A1A809832D55BF67F79D721A9127E5E8B87517DF3C069FDB05A41CB23274CB4E4EA1B9103D6435682E7A4FB147AB6AD0B9C283B09D78C5CAE4694E0B0202ABD98B4929981C94B703179FCCF62BC52D2922030B630EDF6F9A8E9273D41709351074DE1DF142004622CE7350757A3E7E8D1F0F9578E2074A25919F59CFB709DA1CA99C0E0A0052A35455C9EF9908A9CF4C075BD8C6A65432D543705C9D1190DD55952FEEAC35CC9CD64C4242F7F9125EEDB31C31E1EE7607502184AF8607046FA9D03AA5EDBDEE13B345F45175BC953D79E913EF7E5F6CB2E4 \ No newline at end of file diff --git a/firmware/mXT224C23_v1.1.09.enc b/firmware/mXT224C23_v1.1.09.enc new file mode 100644 index 00000000..06a9ce9a --- /dev/null +++ b/firmware/mXT224C23_v1.1.09.enc @@ -0,0 +1 @@ +00E2C1FF39129BE9A748067A92B4F2F07DA3D844DE4F5172C7418C7234DC67BF32DC89935E52EB9BD53374388B985901976AEA102FE20AE3E7823333627C8DE6384510ACC2CD79F578EA4E0575EF8949AA48F3D27DE29C90AB577BB46B368EFE98CD95B01CEC306403C119552CB82F50626A1E13F9C0199EE0EF3669A03D5EF4B5A026B83C56A53E26EDF9D438F68144B4F846D677DB74BB76F418C0E6FB52874813103450077F0D3E0A9F286E2075A3EE42EB960172D3BC46F08A360C268F615EDB1BAF7AFFA18B10F694967AA9715763713C0CBEBE6F6199215970778F3D587D27D3F7011233F2719489DA93C4737A1BE8C0C2515410CFCCDC59EF20BCB02F01BB04AE5AB1EB5C118078B04AD3AAE7ED85CD51E86F47E09926DD1C03F234F4BA99347195157ED93A0348EF9DB3E43F408A0EC822CA146741E774C975C667F5D1EC1BAF7E4814157195A2B6730E15EAA295ACD9A7DFFF8258057345DA2B976E380FB28340B61A1E1661B807BDCACB6539C1688A8DF29C2FE8A4172AE5B67BBF37FFFE520251D454FF3E721C7240D90B19BCA0F556D3537853C199497C27CC067D32125B88FE805D863DFB54A20DF3F745F38511B90F1B54F040438AA15A70604AE7F261A71FB0F274B998F3F839C8F29FC456E3DC48AA12D0BBEE51727ADE0D94AB6D369618346B189E5BCA4CA1660B22D81E860564544E00127BC984CB1F3F89DBB2D5FB3A8888A12F389001127CEB32CA9822380D3AC44A1F32FFA22980B0B22197B0B3BE902848B35EE3A8D13C69B51F230725330563EDE944EF9AC663F6A6E862584F045C7F1A14977CC3C9E3258473B9D3176366EE1C67E05A21485C038A5FC9B949E32271E8C04E6ABA7EEE30268E9B89F874C7E7BDF15E8C91353A9B272A232AE363A34883702BBF2F66AFD1DF7E8530D84B7846109AEBE150DBD646AFA1F1344D6D3A76ADF7AC9B53E5F0D9DDB9C1B7D273204FC1B81987B5E52CDFB271F8AB875B734B57A079FB53BCF712F88313FC2ECA7D67CC5B1A7D913417D91FC2F3B72C80A435FFAFE4E3AC0E3BFBABEEFBCE28766F574E7A99183CB7A4F1A45E06C198ED66C50700A29C180004468CF20CFD0EFF6597D8CBFD8C46472566001252A2236CDB797033002C50176616A18338C001129A90CA499B93D8208193F5E679753687FBAFE4B2DC44B24FA4B2541A1698FF44E920FADF5715042C3B74F9CD3A7C6322C369B53646ECFC0F58690E3F53B472481769E04A7929A4A15F499F224872861EC266915CDE148E4E5D57D25E2536AD14D8139C0448C32D7D16F2C3859CB4694662D2E400166DF69A6683EB6F035DBCC7EE698A5BB41422EBACC06ADB314F5AE16AAECF72050F39F03C0B65E7F14E1A5D13C4C3F5BCC655A86E76F72150B142AC04D6DD7E81DF47804EAC65CA03DAA32EC911334FAFC4C4A2BE41729865B9A771AA288463A0D21AA8F5AA6E0DB3733EC38B3F2378A724C8C4EF0538CBF561368D6DCA46281C807B10DBE2FE7EF7C0A8E60E30EC1AC87FA175301C5EA40B9406F904DD0012944CE6C3FFE28864ED3B48AB3F94269D655E01126E169107C01C3B5A23E4625B6547A97DB2F4BE986004CBC7E85D249BBD7CEEED194EAB61A54E2F81745912EA49BC7990920FD9EC4C09B670591C1EE79D34EEBFA11F9DD0290EE1BDDC184C63C696010281E752E7032FC3314B1E5723648B1D293FFA8E19D907759E3E96754DBA7F4A71FCFE6E43A49A937789D01AB121CEE07EE1562592B3DDF5B7F2EB1069D539E77EDDA1287D038B9FC1C96733EE4DBB6B9C25B543DE0E3B825DCCB041CA0B7AB894C12577CEAEC2A98F7105FB85CC8A1F43CD66469D4E84D9F17F64C741A2C9A96DF96D50573AC15A772432AC777C9922F261E73D8E61A731B2D727076E682095C9957CC76B83B64D4A476748274327F8DCA6F2D38AE00E6268D43C07A5B382510162BF00122ED593845C16F9DA4D97F4068EF11287273A011255ED7FF27B2EE8567E3E1EA4840BDDCF856F0E2E957F01F35F461097DCC4414D15E45879F48D404014266C342BBC8ED60B1D4BBFCC1425C554B45F501602B88EDF203E98F9A0C579BCE2C4D1000CE24EBA0A46B68FA56C1981E6FA3BD001C2BD7C6324595EBD10047F47952BD4307826865CC503FBA7EA6A0FB4CF0D41EB4730AC03722B8433A81C90072BFB6866C489B6841A0D79360A4C9AB2F7E7886E596F845178DAE12962D569D6E0BB356E12F82B797B8C0673A1967CB9CDDF5094FE3A41E90EC27E82FCB0DA9AFF96F6F5D106099C3D13299A29DC29B2372856F2752468493A5A9D29CFD69844C122B2D69E1A33EE2C87788E265A6CB5FFD77E5F079E8E534C1021DC3F5A049818C28CF56F2F53440012304313E5BFA60315967E0EAC8D67084252A801120142BF0CCC9F877250303F67EBAF45E9575A3DCE5F2EAAA753338D78405467B24024E60F05973F47798A2DE3236A6C817F5536D0230DD9B080152A31E75920E1D4DD3F8CAC6BAEB8CA48E72F87F468D0A5186108120498BAAB85A81E106A9351D777888BAEDBE88C0A785282962210D33130EEA7C0DA4A60AC0650999ACD1272CB6EC2696D2841DDB3F5A8FC902E774AE421AAF3318CE408DB2C6A19F6A75CF2495A49E8434FAA021EF0C8F7168E0FC03A570DCF5EAB52842D208957349734FEB840868F6F9784CE6FAF66ECB6BD220714718F645A8BED29FE3CB6A0153C480B991318C46977C20666F99FC6BE4D868C873368E80856211DB5490A4D12CD5EA1A4F5801CEB058B58256C4D014C3749625CCC0012C0CFD14569A248FF77AC6E5D13264229C7900112142CD07D2C0BE5EAFA4E785767317AE6959442A4DDBBE78669E5B877700A695473D2E1FC62CEB1F2200A66D691A7CA7BD5E4EAC91B4FECD94637139246643BCB72DC516658A6DAAF038772E4EC9B824B58B5CF215FF8549B972B8A15254DCB1BA96ACA38F089DF8E3D863E771E2C3E5320AE9CCB1B923AA03800C64B848228CB2DE40E389E2103CC0B7A0CA7C9F137EEAF0BEBB2A871856304AF9264626E6058A7B1F6ED91D99FE786DA2B401096C9E33D0ADDE457E82C3B7C6CE95A002BAEB544ADCD57CCC7E46D1D5C09D55CA9DD2E35F93B8A5DBD49FB9B4748B0371B0D8979F35DD45A9CC8053079F4ECF6C44395E695E12CD8267E1421D17355F891F45A6DE6F55D1CFFBFBC4262FE70B6B549DD8F9700129D5A9AD4043992336BD4B5A3E4CF18F2CDCB0112ECBB59F393C1C7792C3BBEC5BBDD8D45206E0D46DB76611B48A7C1E12597EC6E17C0758B442471E2933DD20FE5BA41660936AEF4C3617279E8A40BA93CEE8252DD77A33C64D935C686F36F75E6681838508F0ACAC1BB09A5E61F0455EF5B6A65B0E6D894E96EB4641DC4CB09745F8099545C450E942AF46A1CD9BFADA6B26EE9C6670ABFF5E88025A338D29CD1A780B54B1DB5ED36C2631F40DA57E8287E3C97F6554350794C22DA67DADCC42F060A969942AC4AE620E498D3F2FC8EBDB02F97CF4EF2360581962163E6B40FF114FC2B466C828BDBEA52C5C454A72B4D78F9CDF5CD9C0D41D135BA443DC550FE4D796BC1DD4FE2B7152C5D4E6A0EB9F810E61ADF304F8BB068FE164EAF4D327A3476FC80EF00D28CE52E0BB80D6BC2F0C6EE0A2A073F3FEB04336AE21EE800102A92006D336997AA1B9A1E870AF597420444F204CF8C4C7F49C264739B10212F34B518DAB8A6623CF35CB7523EBC28B41940436909165CF9FFD7C484E95542B566259772E87CCAA66809D629076A1AE20A055E04BBDB6C468E5A905543BF7957C6CF48F9D805587FCCA4E824BE001B23D2690CF99B9195F572C6BDE30C396A1A01CFD451632D9D9CBF6593F420D7CD4B12D95865458C6454E9284B761636B1ECAEAFD07449934A975280DD535A4A45998E818AD22DAE5284000062B03D6D88B0FB588F590C2C560A971D9D9BD8A1658BA64BD17E6052CDA752C3F553C6844736507F914C3A1FE2E972EBD84D629A53218A8EA0C347F91F89D1E9CF8EA386632C5F98BE49BAE70E82571CDBB7D0E427E96798AAB4EB7F9207FF1770E9200112B980DBB2BDE18005D4A141E502780EA8060565636D136C1908B390DAA31FC63C57AD0EDC8875523A4DD8FD252F43BF24B279CB3144D23331B119C115F314F441247B0B71D0981D3F8065AD379FC0D76ACDC2E103C679213A97FF530A3C4C501F1B2F1C2374422114AC9CF6D0E7EF0C2D0FC72716DD7F57F7D77CFDF0BDAFB2354780DD07544F19AEE57B36D2CC0011DD8B63EF3301DF44063AE34AE9A98ABB5106C16572B3E72CD2FBB2A088A83B542F8BB9791C1D946D96ADAA381121CE339AAA4681B8A937B1A0F5074B42398FE52F821B3BC8071A0F48D105E075E22F69E7BCF7F1C909E7B65361B77DF130BA6E326D953BA7BED2E1CE113FE7C572FAB7BF9D21AD7CED916A961C28FA770A38E7853B7B0012056E506F174E6DE089C3AB46A0A1F9FFE4EC01127CC519BFB673690AFDAD5E41BEA0BBEC9ACB5D9D0EF94D16350386FC2830B5B6DAF60FA1761AFAA73E4EE95CA269EEA27281EDBF708C8606810797F9B0334203F1E1F88A2AAF67616630D3F25C7E07F1698AEC538C766A57669230C0A47ACE47DF492065A88EF807D1957DA14F449D0F50659868011435A8C24F7286D665BADCCFC09965F581BD332A9C5398D45AEB4C414D03FDF8C6015A212ED577AD7141BA9BB2709395AB869C780841C8EFA21C6A596A52588D286E86C4E1E3A8629E577A950BCC0564856C0FCB8D15815CE33DBE02F94CE7B1D6C612499D67114060C4F449D644591C73453B7281D72BDAB274E4ED4E74C03BD9467F31CB190BB9E4B17FBD7DD5AAC49DCEA7FF5FD5B1084E63655CEB0012CB28AA3173BE19D11E9580906BF2A0A4AE370112F9E2A6C6EAA890ACBBE0F6D3F21674893D8EE0CC5B7C8A858B3DEF348EB27F92F4CA2D8198726A88593F3756286B0D28DFB981922D703894FF315E937FFF8BF87F52A20CE8630B27ADAD5677FC0B7D596E5518D65FB8024DB28CEF59D7CBA6B18C90DFAE7A961AF57CE61EB1091415DB4D9316C97EE634D2AC787BCC6C3FCF74A2B4AFD5C25CB3ED55BB1BB8BD627EFC546E94AD2526BECE033E75711F3DE1830BF05DE1F644880BB0BB28C8BFF5D9984A088B3C8F2E0E203F37D3E486E4D81C08A83672868A9F826DFCF957817D44F49A466F8747DF461E48E16311E9BBB3A0BC7E1A624EA3FD469F20E92ECF78C129E5154AB3AB2F7C41E3315D632F8B3D14933929A72F87ACB7A5624AD3B4291429359A0012C561827EB9F7A4D3E64C043C0352AAF2B3230112B6D863D239671F92C8304B7A16B81CAFA7DE196F93D49BF0E428FD35AABF39BC9B7DA8CA74F41154FFB15B5EDBF914FD298D3FB5D79B46D10AF92063732134FCC467C7A48C5FC16BA3C91AE57C706F08A2C3D9E5AF368BD0ACF63A9B63DD509729D14D7946FC39C63E374C2C37EAA4D608BC8BF023CDF61EC90BA82A064012AA10509FAC44F0505909F8BE4048B63E983C8E142F81B980C2197A030D6ACFCC99C31A35DB8BFF4CF422AE948416BC3FE6A6AF8A29F9CAF8DD3AEB140314C459236D006FDE6E13D254B54434D1DE19037E60A70856A8CFC13C28C75130B2D7BC802DA8D75C45CADD61D586882A2ED69D68EAA2B390B17C10A41B6721B0EA39FE8AFCB4E974731A680F88D58E87D4CD624C928900129315F6F9103DBC919F72C13BAF5748BEE72401127B74FAFF971DF9D14796A61282176CF8F379DBEE48CA2B6B2C63725F1F5167A729DABF91CEB630A3653993C2CB4EC0691F05983CB5A0A811CAD9CC6472C5AEC4D718F08DD3F4C65C715DBFEF652C7A057F65C8FF4E6CB9BB0F3E9337BAB3AF9F58D860583B28D9A56B93E856801B19D3286AD302572D5052347A47B0C7A335A53BDBD603BF25B54F8BE7FFF8CF1E7F7258CCD6BDDB4F06946D0F4904615DF66EE02FC0EABCED92A46E1C6D5922889C4416A677175A7F33968F9CBE24E6CA9CA370294E4DD171351E158888AC31E5BCB2B8B045D96B5E3871E09E04058056C17D9DF37540B9C39ED673C20418ABA50A41BF8314DC9C6FCF123E4DB153E472F8EC43D03D453A5EB723B12D09D3AD3D038A2D9B0012B005B94CABD6214C1964E3F668BA698608B50112AD66DF4D6358CF66437C58946886E8326CA137865C92728D4F6A4A2C09686574382004F6BCA0487C785E38BD13AA8D4EFD016A01DDD2D824345A434B77FF282CEEDA9D22EC04774A0D0FE993A21E6E053CA794A114DFA1B261500BB2A5CE6D7C8193AD37D9F0033D41FE1D7C197C491D4F52717054A30D798DD5362CD4AAA337A4F165E915F2393B78E7B7F7CA1B67C1667A5B34A03078DAA910AB49E2A2B5D1958B272B1902154E158827E473A518CED601930783F91DAB0CABFFC238C227682FA18D1EF3AFF0A65B83E10FD512DF2026797347BC560F471DE586516D1816483401EA417BFF9E069A53F83A3EBEF5418B9CD249A4B81E5701F6928D7930ED62123B6510543BBFCBB463E7D1C4C92196AEF30012AB66609C61ECEAB1E0C5FB20DE970BFC456901127BC1F47B9A50D90E53DA0AACFCBC5B5194DB00F70D607B6A0C4AE8AA059C3AB7DB8946D46D5AD0365D441140CBC989DA77411194311D4014E766CFBD4CADA59C14743FE43D618D4E24520629ED60D09D255748C7098622A050CA67A977EEB28043CF1290908AAF5096E9D1EECAD9442B4D4119487EC389CB03313C715B6673E7405C0F755EC20884623E86FCB146F56049ED1216CD683EE8E58C3D8ACA2D8738DFC8FD42FE73EE6A770E9CA697A318B70EA76B5B28F424FA3D231806089173DE0509596240CDD4FF6682E1E43A9E3798788F4B8431156F139048E9AB1CD4E97BBBACC9DAF7CA54A61442A7242F91BF14DA4B0580D4696FC7EFDF07449729171EE58F4293BC54114D610381C31CAF749316D400121363A9098F385B7BA097BCF500F1DF107EE60112ED8EB6BAE001F5ECA6D8CC656E193536D47397FEFE0C942F4D7D76CC9CEA4F35A3D417325910D497E64CFA3F1F2979A964FB467AC44DDF3A8A0C05B0EFBC021CFB11ABC881ACF1FF0DC5A2294D2B6C5802A453C0E053CF35FEF1F452B85CAC2EBD72D8E49B0725E7136FC3C562B4C78EC74541C942ED66EB29CE16AB1B4884536D667AFCB22C242DCF8D727F33EE592CF6250DB1390772B01B238939916D47A26758E521D287846434C33260BA05FB7C58CF51E58F97A28E20F853899F1CBFD67735E460A9BC2CFA913EE73E7A05A19962490491CF9367493D36FBC416F186A1EEC6507DF8E92C647DC414ABB213755B257F3A337E08C5FE3E5695764D400449F9569B0564FD68886EA20E700E6C2900843A00122B53402238BDAC291EAD049E724D3EEEDE340112D7EA7273263BEB62EB352470B88CEF4D941D6FD3FB6DDEAB45DD33423653DAB7322DCBC236F230901A8514232D9DF8E2852A69E27621FFC6326438A8A13EC6BB5AA414AC27926762740DCB2BCB611BC283D9D70903F8EB8767A7C7E64A581154F5BC475D10E2486F18D3C905FD0395CDE9AE2861ABFC2B5399D0FF7789099FBB84DFF181D7713B6BC6F547AB9A0292AE69BCFC9025FEC21D352DF15141197C9DAC8419D666C322388F8C96BFCF145AD40C1E3EC799773B6919F2853394C0A5D6FC3F7D5F89892E261130B1B986DC0DE96691686CCC47DB538B841987D0C1D9AE71063698DE1393148A1118E0193C9A1BA65E19B49EBDFF53963A7C646DA9ED8CD72236BA07BB5FDEFFC667B49C2961A0E7A2001221D00A1D67F133321C70E573BC64387749CF01124626AB391BEA5DA4AD3E577DA998567C8A488A800B5559FDC766E1629F36870CDFA021CD8AE8950AE01597D478BA46B78BA9B44248B5F20EAC1BAE9921E2AC1AF788C926FFCCE2CC318E69C128DDAD89306A46DEE3845DF1ABD130F836C1CA26BE269D4136C956537370D85F4B1D730FC4A230CA54EF1A39695793CD1A09D6FC5CDAF70B118877B011EC2AA51BED364AB6570D5F823A90C4BE68BE5775B3DF2B021743FC025EF1A6FC1D78A96EE3A3D7845A95401441A7B6D5D4838F42F2697C487ABD9A906FE467EE727905B9DB11AF310B4429A28B1BB6357665B4C326CB4C0C22E880EBD3BDB4F09372F42BFBB674F9E9C8846BCDB3E12B7D795917A766AF366E8F6D7067841A598DD6C62A2D1B5C44F200120BEE6CFCA39133F97C62E55B54DD0AF7923D011252EE5520893D8E02F87B7AD0B2A1595243BB25A5508420013D6D25A786B33F6F17066C1930A5FB4FB86E580D112345CF460B032BD5E1CCE9DFE34141BBADD5DE2F1725A5F9ECC04A2D5A44A7C65320390D029A6E3F2207B02101BB5AEF90C30E93A79C3860A7D82817B48A9DC13B61D9D3ADDD817123238D5C80169A09892601BBFC319EA10803CB5B9B8A48BD69A09A319B13532A3ACE041151CC20CB70D06A997BE7AFBDE01BB61DA0449D257383DA5033534A8FF5FEC400E5ED0B92166103F2A5F440B2A07027269F98D8C17D1BBBDFA967C678DF9A6AB46CAB8E08DF0DE09389C0EDC2AD16D1A936C19F31FF5DF9E099DF23EA9C93D73292A9474C77BA77BF78AFA65A75FB0C5AA8A8D68118B5FE576C001283D3B288B6F3F71FD882A9B91D19B6A42CD20112ED7DAB933269DD3A5219DA9AD8883B68A78CA5939DEA7DBBCDF1F101B915E80C2E55C019259EBD0158BD33443C0B495AA75703F267306B68B2094D792FA83F01E6FDB223FC82AD33C19A24C4A589C634F9C9FCEE2EABBD73DF7F1271FEE1E4C5EDB98F791BBC51AFEB63A68BCEAC4543DD603A03F9A715704E72A631C7E81DF811131EBFB9F3DD15BBC9BB55CD6A90A3027B833B1F2C1D80B29F51A2FE66C017C6FBFFBD7E2FD0DB7D1FC1D32BDD458EB3C16FA758BC1165E4E852D30BE8E4009713E8854649F688959FD6BEBC022D5ADDDBF40E98CB9E90B66B25C0E46CF97A2B924B4279A186534F885D67F6A6FD2370C47E811574604C62280503ADD7537ABE3C71E09C3C1C8E06C86AE32A9412CE51100012751614A89DD4DC6B9B89E5E26AE97BF00388011273F8928F173688271070E6132ABEBFF398332D3BB22605D422EA0F56EAF73D18D47117328B7F98566FD753C8F5B55F44EB936AE2B2376B4A4191E0AA98276F8EF212C24754B09CBD7B5A25F0F65A358D799793654C597AFAE3B58E9564388221DD95D069F1FE2F707DD156C0C066DB3CB312AB282B9734BDCBEF15096913E2B6193C1919DD68FA3ECA5538F66E9E54B298E3C851289EFC38B0113AB2E11196D8C4CE5DE155B255B2026EBEDDACA988B1855203B1AA9170E552BDE48751C46E6BF8D6B99AF87DE3516D0165B9F00FA6D766022A1AB0212CB7C2EDF0B795C15597523B59CBC3E6E3D6D24808CD05ADD5119BC8519EBEC1A4061F6356F3570791E262428FF24490680B6643088FBCF4B394EFE100120AC30E0118C26F5109D64CA67B834EE924960112AD7FF9B367542CD81138573B9D3DDBDCA6112BF8AB9A0CD4E045903C19AAE4D1AABBAD2DD1DCBF809D97AF4B4328EC393983B62AA36E2A56B371DDBFB6A4AFA6371817E985D48762C2AD0763C7AE561D7533EBD67306865866F8B37C68AC21A2391DAA770D802C3D67E20C04E3D4725B1E9ACD26573834F9C4EE15C043129AAE8F7C3E71DA73D659E2D710D7B7FED9C898328E0BA0878F1BD491D7227F4F4885AA32266A33DDD28BEF8057759B4C07DD930368BEEA425CCC7A2FFA629E784FB4D89925247077BC002209D1E576080739AB28F4EF8A038D971935FC9C82B43506A6B827B2EC9285986CC3B450D28EAA25B70B3F8BE0974DFC133D6908CA2B6B23910F1F2A9ECDD9ED8E6B9371E6B1CA55B8E70012415983A0E56A5E9B790519EAE3D9D25B0CBE0112ADB312ADEA9CA2EBA3B8A66D82D69A9DF6AE0F9089D29C86746DFA9D5402C900ADAA395872FAF0A42C9C43563FB7F14499FF1F6332EB0629143C9BDB22AE3E9A27A396871C24F4BC05E43973EC8D20D991A10E1FFD0943A4FCDCEB8B5C9E62862969CA60A66517E425D44A7A7A7B587EC9073D498C1351839DE0605F6866063B3E556A60EA52427DFC39BE8419321A5CB40D50C30BE0F2E39BF25B3751892E612F24829A8E2D21E3E3391A7176D5B669CEC0504AC8E01F081B31F9FAE765AEB5F41D9915E25A9FC033CDB6A1421CC98963D6CF35823F9240F937E3EE719798EBB7630DF1D1E602C7AA564735886D70B886D21C56670F755A3FA2BC03C13A6C21B04A4C24AF4B3C8342E2BC738E8ECF65012A0012AE512B4E2528EC8997EDAB8422742A99F1C1011200850C99B4229003CC256AA03A856A61E28812A7AD11D1135E34F7292D2C6E3DA758B95DFDA53A54781ABFCE6C7B02FF29A03D7A316B9A992BF25FDC7B11858704CDE7F7845B3CDEB68918B83F6457CA5D1005EED84D0166E4961EF3E5B3FF7F265319CD89308F9F3D36E669596CB0245E0B4BAE98DCD581EB6A212FC61731546834A9572002B2FAABEFFD6ABE04F36828F25E2F1F135D1BDC433B1EA9F193B553FF7F51DDE66FE305B737D9B8A6A035AC9621C31AA871738CCA9BDD1FB7E860991CC5B899BF219E4F1A237194C0ABAF6E45E494267B0820F609C92DB9EBEFB722854368EE8BE2117A44A3D8288897CB117A13D3C52D7C9793760D9ECE7CA8F817BDD7310CA78133FC533EF424707CBED9C80012ADA4448D9BF399D6EDCC0EE6E85DD680F6CE0112FF16049F446AB6369AF2A020A9EBF78B0DBC2DCA31C96483124404401367657B0A091E9E3EF9F1B2B1EF9E1F01F98EA8AABF2601A1174D6E96ACD4CEB96FCF5A1101A722C1336FC8B5F60E1C331DF78E72805BD1A5DC2C5D4A350CEF8D7868B5232A1BDCFA7095C13BDFABF9DF7510637E312F2EBDA5E5D0B80D22E96F8688A0B0B1AA2BBE886EC182F54F99D19BB62CCDC57FC85B4252F16751A70DD3747F6FFEC306FC3CDFE20CF6A2BA79D6BF587A92AA5080841714BE1E539670417AF22391683BD42B7CA0B72519378619A4368C25B179BC341B828F1281414C2C0313BE3CE5335FC61FCEF3E927F00FBF977E621F82AC1BFD677EC1CB22DA4148F283BE31032E980F8C5E750ACBDB2B3350B420CBEC00129FF48B03953E2E6245FC8D8E681665D4CF360112ADC27275228DD83C5A7986EA948872B7612C24260945400C08382E7562F87947C178F7305BB89B8A8C9C817A790EAC88E296EAC556180D1F89E83FD8CFFF4EC1575B0A96846FAD459705A99FB77215DFAA0BF9D9FCB9ECF4F3034BC0E0440A08219DAC945234A65599BB67414135876BA3315F17F888F01EFDC74EAA33C29C15221AC955F8A406011ABF65B16052A25673A030099EFE3E4C2AA070A211F948334D7538ADAFBB9E354CF2C0928FBA65B6D9A1248C6BBC6F34BB58D0EE01DA46B8377AA6BEC5F72E622E6AB1C12F8B7B1CFC792773C3E559B519BFC4DB4C8CEDB8A5F9119F21D9E18B0717A861282DB8D52CC9575B91A5AA6654C6C3DAA650BFF4E7D7EB43C443B9B75C12922B085B3B031E630012053F4F8DD82A99CE7725CBD2C27860A46C2901120C0D6906AA44719E8D0589D202F6863C6921353B68040DD6DA01FD7CF2512C10F82B18580A1019D9F0925531A3C82FB88F57D031390BAA100CCD6D0C3DB8C31B30416F86D7FE8936F46AF46DCFCD052EF7E282D28538EE4E98EB997A74C7451362A6971CD7B233C9C5C11DCF74B3E9FC60203B4DFCB20D4C61E656B4BA072B76FB40B999C5B6EB7660E7AAD6AFD866BAC69E27B22EBF585DC555D2B775F82D477473CAA950A422B899D4F0B4FE31AA2801B909488F35B6502BF586B0CC6C78E73E8F0D9F3C0F091E7F65C42DA1D0101D1C50596961E157D398DAB436952B94CA7BE33F8AF41FA5541E8AF4F86F785305BE1B5E6772800C2F2E5AFCB150C4A48F38BEAB2661B1680765FB560DDF4A75B21748001276022320DE33E5DD1508B19E4ECE92022FF60112BB36724FE133BA75182A7C130BFA56340B0526B1AA936EBC48112278551E9D1A9AF9E21769818EE42E4140DE765CE89CB54139355B88D3C4694DFB00EA8B9FC4202DB5132C89AD5282DDB91C816E43765758D1DD81F2B99172516F6EBD1950580C3FAD4377D5CEE23C3341F0F3E2A5CBB9A94F357AC80BACB2B2F44C1EC622FF8A07F1D38B8D134952C6DF99A1533895817D4E94FC0CDB6A6958FD16D3C862AA4E58C7EC8BF2BF15F897712FBA981E1F9C28D007B5ADBEACC37D755D0C316D8E49ED9ACFD74A163F41BFB40C6E0FD49E841F6139A1BADA5F914D2D99E1FA3CD3DDD030D77E98246D6212A7DB2373961E65CAE9DDAC2913D30560E89791FB485CA7DFA5534A783686065531BF5621516AD5DB001214C65D437CA0DE4713F6048E03E8C309753C01127987F5D08849D3982836919A77816704E957EFDAB72B278150D22BD8AA2847F027A8C80DE1E47CA04E98C54D72D662828A2AA3B0E4B3C0F41F7073FD8A162B5C971D455444D64C6E93F11A37F32F36C84BCBEEE3E17B745C489EEF53A7EC0022C1E22415507F7E7AC1611208BC6D85ADA3E31D2094819FDB75DDABAB22FBC24AB6FC1AAE567917C7DF60B6EA5ACFEF95D0D4299C46CAD342E739CE4E19316698C10D2C0E5EAA67E8FE6F498C72802520F4183CEBD56AC66C63E294E59CBBC06F64F3ABEB38B827D0A271EAB21DB30FC84B54BFAAA7AA983FE3731F2C8F8C2EFD5C84F3726F079A7CD48972A4F2F4A2FC39546AF0C8D30451CCF49E250F18D341C9375F23D21C0C487FE42FE61197CE5A5FC80012E666EB782B6AE88BF45502E4773E28BB6CE40112C65D3F8617918C13DCB728E2A1665724BEEEDC2E30A87C528DBACD6A522ED51D942BEBD98080EAEFFFA5F4A757EF7DA86A6C040546A3D2B045D07B0140BADED4080B8812811B03385F70BBBD71FAF5C2D2E70E37BBF79163D120BF88EC3F30D288ABA84B0FB6E68EBFE801104E57CBC509F125F485BE85486B8E15B81760508A2A22CCB0157E7E7A62A28EF45BBD9E09FF61FC966C8C5C2D8891AF651A0060A7B7EE8EEE54F5B01B1635A948070B27353CD25337A7EF81B18C5CC5CDE62F988440A7EF8F1C8E78B3DFEA5907AF707EA61C4DC6A662DAC99D1B90857DA1777B18AD8F91132E0F79132E6DE6B6847BBEA286D8089E673785EA9BFAFBE2EC395EEA1015926791E2B071797D039DDFDE6296DF870012DF8D3DAF67392E9ADD7723F0BF57BE3E74C401123CD07620714A76DEF67E8AD51E746EE1FCADA02999DD0941ED09A0924AAE983AC83CEB000A06B2277CB29BFB8914613252FAA0DC924554C5A78C93E1ABFEB1AECDBB1A63345946031F6C51828513CB150A908607789B2F54D15C68441E394AAEE4F95300338B66E477D19A50460CE7E10132432804CDDD976672AC8F87BE0F6D45610FB4764F47112479251B514C3F1F8D9113248DDC1C79F3C3DF142E3DB1E633EB341CFC93143538D2E0057B932B6F46F5DA5BAE0206564460BBD434BE74FDAAD23B85AAD67D1021C68E370C33E92EDA4715541E30D4917F51DB2694A7A6FA721F944885ED03D24B3D88C1EE1A9F2D84163C2B12535AE2AEBDD39C9BB86732A9061D30E50ED0AC0B77F2E230964B3A6B830012C7E44C805C30D7501625A97F75A6CCAA806501126C9CD25DADDD25B5AF3B75D34B8B3319C2175048087F6ED6A91DC92695D4AD35A4A70E4EC161126578A6FC9B5D91F53C157E8E86F83A0109BE14401B4CC5C168E13A27DE6D6EBDF73D691DD52C7512D7B87E8AAFA8184D07C8DAA1B0AA5205BA48B820D487D3988E11ABA704C6057AA0AEC5E760E4BF362C63EA516C17E393AF427A2D88879C6EE5ECAEE87DAC1B21F09AC8C925B503828F6FAC6510143BD9A8D8368125A58D688E7D9A60CF034168807CFE55E86CF34A8DB4B52CC4F0FAA2EF4662E9978F426A60627A93DFA90B06701EB6B1FF2CBAF3C3402909196FA51F98CD8F19A7073657418E8C9517EA4B58C8FB731DC71B36D8BBB7A2ACC6D629F2CEEB0CA28C7CDF52492E6283E330C8143565EA0012D61F91607045A75F4ACAF45131934F83F9C50112D44CCF4F6D2FE4C56A849711C5219111B9F8CBA916DF206244636934AC731EBB4EDC78F7C8A3850CFAEE68992B4CD062575F4C81E4DC5577BD00DD4B75839B91CCEF70763578758C5B5B5BC5A1F89F10FA64571509C15F415B51195287216953466E02461DC477DE122A402EEE1A8AE71F8802F72A9639B09CD40D21BFA04183FFEA8CA2F5081E790B49F59A5BC521D973BF03C99C61C2F8CAEE954DFC39BA5697904B63912D1A793E2CE1574A386DD7AC4EDF789C861D6F792183DCE51F3148500093C4AC647FA4CD1DC20233FF3D904F5E2AE81D55EA9A466BF47E52DF334FD13F8EAEF20B60A991B4B8CC77E53283FB9CB69225C0382264EF2FB384F022ABE5C87F4E3FF1901E177D8D88BCEAA104B50700124D0C46F01E796C618B729B982C0E97EFB840011226ACD8889BBB4D84BF93BF09D8E291BDAFD4F043D7C0BCD8C42A35952E73F8890EE9CF1FB029B55C26D82581A8CFC268271BE2B7AB05197BC5FE8E0EBBF2BB8EBA4528E95B8FC95955F30470AAE97485018F5A4C142C8BA60A79F8D559748B19D13E96DFAF90FA363A46973FD198ADEBD14515EE3D44C2CA011E93F987EEB19F33769F41AD4F4E8962362CA4F12511645B10D93F3B19E25DA34FB3AF3B69A0AAFBAD96B82D48C9B327575608F2F418A0B5C7661D51D621C127ACEDE821DB0CDB4ABCC40E6950E0D175BAFB40F7C2C9D2B5F2A2626B25B8412D08F2DAE8AE5C240D2EA3F3898829F1A3D4F43EBDE05E3099D850D655B54693B3952BF2EB4694AFF69FC3EAC889F2184C5196981E5F4A47E19D0012202DEA934B9F19B6B2927A34685096D3EA0A01122A1C569FFFD1D245B3B36858363C732CAFEA4765E6345D7A9EF6D9430A0EAF964BE69F6B3736F9FC8A5BEA2ABE738A4537C9D2C85676104FE85DCA7E3E15F0AF8ABD3F8D15605575715FD186A64F1EB40EE8A378941962C17AF9A3BF75350B61138BFEAE7B0BD3259C14FCF1E3FF9E3AC0221B2DD862F87E803EB5F4E708BBD97448477E76277237C7CD4635EC373A50050145FB0DBE3BF10F63A5B27FEBDC373E43C4AA4C214B9DD626E530500E8C1639D46CD91F3F848D125C46514C4D14FBBDC9FA96013E9BA0E369BB811157F110BCC363E5D94E54FAD73275A9B981273F021AE346CB03C98771EC7A2F4D5C807D38038C16D5CE2539E7834BC508C6F02A075BF61532EDEB389C581F86D7FB1EC5085E001278C3D66A829B57C11C4DAB807ABBBB51E67D0112F2E26BDD242CB5F29CADB282D3A20A7BD007BE8CA77BDC48B1D05B6A4DB6DD6B5EB3F6DABD02AAB71C6EA0E0BFBC1C595E610575DEC9451E478A889B9045493B32B10CAC3E74F85436FF3C290C64183A5CBC0EC8A1A8AF4CB3E127AF5765FE824843990BF96C5894D2E2F9799E76B0883DAE76B0B86C7A059B881556C2A7C2436F5CAEFC0E68812B0D36D2B4F1D9524019E12CBB2C735262376B791D68451DE80D68406762FB2B9D56EBCC4DE758D32EE566A53E5FCFCD1DF3FC61B4863D41C380925BE741B1A6CE0A1B81EFD0709DD8ADB0A72DB8FF41941FE7E32685CE3E74D0D95576F759B7EE9D16B9C45A8E14B97035C8EE456202358230684F065D7F42CF79A21FE2C49A90D1E6E51115628E3B3E06001286368F7AA1A756D0B729F37B854BF18DFC3B0112CC58A54D2F536DDAA109EDF3F5901380946B0CD6A6332A46B4E176CDFCF2940610DD75CC8A88390D51CB2FBE2F521DDCA4FDD827C3830C2F721CEDF4167415232E3A8FE566B21A0D919467F646425DDEC553AA19B0089FD101B241E57E301F39E6CE924D75D9ACD7D5CAE087E4972C466EBF174A178217838F775D60D1A5CC67EE90AD253C728F91FD1E205CEE1B83AD90F162DB70958987069ADFD70D8B542F48980FF74829A3B1F23594530518B997A841B78F1F7F6EBEC5636593A8E74DB5FD359DC4EAC92BB5133CB170648DC8E26A76D9103113442B2BB122816824DE5E1E1ECFA0117AA1B8B8297F99CA1382D516E0735D847D1053812F257870ECB73382C0DCF306FEBB1275D7AC82AC3281D918F20012A2F7596877D86358D5574266C5988E80B5890112B66527800B2EE69D81834137D04AE0F3EA5C2414E6CDF947BA406FC87F4155A50C8FBEE03AA5B6D1DD3D52BCEB2D78E4023BBB42E3A90619A913BF95D648E5924394987864DA26665CE846F5719357EB944F6B940FCA5A51890FEFA9D7D70D5ACCD82B9DBC0E038C0912D3C0F6F33D430DB2E47BF9D7E86C34C01E763385DD69094EF7146A465F875EE88FF2F467F15E7392146F0B51DE6C3FFAD644D539CF4E8E9334F38A4195D5800C05C6FED272406FC236001374886956C456A42F7F5B33303E599DBC1B7F522154A53186CA35A69D8F1695BF8FCF69465553446DB0F672C673BB73311F0853E9C57912709147EC140BAE908C8C455F37CF68E944D1D9107C9CC0397EB2312835EA49D4009240A4A6470012FD1B702AFA08C14C1482E20DCAA21EB2B7840112E353B6473B008AB9F585CDD47FB79504D5BAF21F78C2CBAD832D1B8B078C8D677EA9D35130651EB2D56914A0ECBC96CE9F6D77EE6D48180F808D25CD38182C7F6D6D4A669C665D2075C3DF0BF48A3E9E9F347B33220DD3021539B50504BD7343D7D2AD4B5269CE52E42261F633B88145B02617C5B38CE7183435618D487D86216125F4C092089443923E5EFF118D6E2EC1EB0EC289A8F6A47F3E17F614FE291F13C43BB20DE2C6F38C486DF554E2374C16D7BDED5F327F8A644C40A4D5F77459C69E3BBE5DB95DF8365E6A422397B1676DEAB019822BF34136B79DD65723C5D10C276A1D5F18F588F5423364089DBA3F0F22ABA6E3C33F6C9834073DA8E02B1B7DE407AC6C004C5FB7DA22328F7FCEE47ADC0012E995E75F2551AE7068075D031881C6C3189C01124470A6C358FC3CD7A82357C496E49EB63C30BD5E54723213F82784EFE15B8A0D840A92FC6C767F086806CB6D510E9A65C61785288A2C9B107326CF1D9FC952F8719E6B95F82960ADD4668A32C61935C00402AFBF6A7CB6D7790AD9ED9559E909119E762E92C9D9356E2D7B565A93354FE8CC2CA5049FABC3494D391A38B08B212F18FE01F6AA0CD84332E2576FF673D03E29BF0BE5F182043F3CA1CFA2F79C0C4BEA5F265E9FCB272F85AD4D7D96EB5A758817A4453492B251F6DF2056E9413B4C606426F7FE389CB9B0C0262024694933E01B0B5422041A8E747C00E4E65F6B1FF5F69D7807553F6C257867B456803381B75E574D551452A390F9EF4C3142DDE1472689CE7499C6925A99A8683EF5B7FC080012CC1A06A8B4FAE44D941AA26DB241D8A97CE6011299D5EBD07292DA6B204EBB226D77385269DF525C98CED1F811E9A3A376DA81DE10E59D58DC979C3CA2288FDE67A70984C8D6B95F9642EC9EB5E97348B902F150468429955FB92B5B3A545713CE32B73BB27E15AA835EDD8363F5205C5837B87E4D3A6D5A95042F744C8C85310A71310F3D2539D1FFE2A3A4C1BAFBF1BF5EAB4EAE02917E240F06C0491139A18B473E4C4F95D6FAFC3E861A8BEFC88DE2196C72B29DBA59B04163C4BCB7DCE756D86FA02F90625BDA44517D25FF7964B42EE8C6074C36B002091612AD6E8749914B909968660E3110BCF7B1D54D5530DDD377B60B726F4CCEF5BC7D6127EEA2FE59A0A6ED579A8F0E0B0581DA7F8ED5A8943F0E2F554897442CDA900F8162507129D47F04FB00129D024CE843B024804D334E6DF213223E99090112005C966BD301172E365A1447B22C35E1B0EB6ADF985C87756C7A88231845C13F1924FC687C2F02EFF759953AACDA17A0F006041910848A0A83E752A055D14C4AA630D6FBD6CA4E769DC023096661C27F008A55F162430CBA19D399EEE73AEDBAF29167B1837BB0ACCC3F29ED881717FE79C62CCCD2F382B6223740BD8F746988F114EDB5B5B14A10B4E60B8379421BFFDEBA4DD78D576D5296DF8DC2D7DBA966FA5CE4D7417A6045E203DE5EFA841677BC10D0AEB7FB48D53E194A99A806D0C095A33976A81D93E040F8CAE352EFD0452566392BB8DBF5535E70BB164125BF3FD436067967D601934968ABBCC42D13DFA81F5BE21C9B0D22D39B1990955BFE922922476B6086E5D711EE8A62C38E2A8160710012634592B9A5F810B1BB8B680C9D037B88D3B201128FC7115EF6337B65E7B077A78446AC084C15BDA4F5C6ADAF2BE45B0C7B65E26AAC63F94337179B042BBD5CF80D5A301CCF890D3F0AA2DABA7B82CD6C3CD968C1E5F59C67680E32A1107BB0C75181C2819A5B39B0D694542EB758F8525E22AC49FCC527E6592E89759EA0EEB7E275BB0B20C05D481DE64AC794152CB370CC6FBE9DACAAEB6393637B450B19722210E0A7863CF1843CFB842F8C88AF97EDCC50F45C60994D729EC3680079B5FA8C27DFEB3E80AE4876F987F8434D338A8548F1AA8C32B1524DC702527666C291D6DF9C819E9B0BEC534B4A043D3A3B99C114AAE5F1159665A487316C1E599CEABD36E2F172675B866A5541876B42CF48E90458F63ECAB75377C2650080B420440EDF5E9EBCB500121A6FB234CE8ACD8B749CBFF4429B483C56180112E316DABBF4F21704DC121CB37E65A2B629215BACC85E3F9823C57F2F7216319F9D179A9BFD68B7297F08D8B3A14E519AA250A73E97B2714E94BD24AA03478EB5466D43745A0CE20F870AC9EE71D3A42C64690FB10176FBB1AC63B06C9F7A297C03DD5FE3E83D774ECE7F31DF57F72D6C8F3E7A033E5E7DDCF78DA73D3228CF6E2AD7C1973A904F8039FF23A890DAD000AE54209B2632576A9B36402CF2B064DA82747F6DEDC170621FE5B49778A15B62B569EE6EFF1871CB8EDF0FC22177AC376F34D5B7F796D2BFD2588ADA3D4583E56D68F008FA42D6B4427FE4AD8242EBEE13C58D08CE839E59F1652A41F18B12DE157C921168209918A359B01312683DD9A82261C21B074B94F34A987B3B38AAFE33B30012827E2D6253BEAAC9785303BB94E287B3524E011211A05110B6D675C50F22DEA069E9DB494F018F623250D2CE973F3A41981E12569647C73DC074F474A0025813D710A8F05FBB71E94F4127354B057F47DC47964C6E4848E0D54D21B44C94420130CC8AD82740A9C1926E68FBC4009A7A27D50931DBBF89E441B873FFE72A1209736FF462B24B7F86C89C696E3E9E5BCBD11F70E6F5B6298CF39B3A96B5C95ECC22DABB30FEE1171A0E75287B11FBA7F6FEC464D375FF798A4452881914683F6769C1B00987C0C5BEC329BF7BA78B76247F2F74CA527228EBDDFFE19127E39501F4B9F30E92DC259F292DA7FC56C1DF75CFE847C7FD4B0C98E48F8D949040D13893FE07266CC16BFFF99B687D1707F1948C1AF9F904E1BCBAFB8EC3599BE7A33EAFB6BE6C75C80012FA9BA7FC3D8A69AE60AE788824F07C73533C0112D819145CAB04D81BC00676E2D8BE3377FE1776E64A3ED781D280BC1EFC5A1BB474F087B9DDA486169E1AC2BC8C2FEA4173F693E6A5191FC4C8BB61436DDFBEB83A26DAE136ADCE102790DD07C156F06085D222BCBDA973ADD24BBF2FFDA7DADBE1F33CD786105FF6F36F9F37DE1A7AF6A85CEFF17FA55419FB8BF2A226FF766FDD542BA5BB68F1CB47781DD74F488DD2B58CFAB62CB90F5C789CEF32A48D73DF1D2F0120B49420B004C774DC350E96C26B7938AFAFC63B11D3F3A5A05D36BEFE7675F3F845CF96BE04228EB4665391A048B4B3EBD12DE1E73B41AD420C4DF6DF062414A40B6AC5B2F805DE63915773A61C1B525DB3F29A37B2CA1C48446A23DCC0FDEA1815AB146A3FA81E4336CC09C5F8EA001281F32BA9BB70FD8ACE61B4E037E27C70B70D0112E0F5B9B1EE4E269D0A0E31B39989C87C1BF1CB1E45C0D82B65B27E12972C0D9114FC52A4F9142216C9E8D05A7EC9AD15C00EC7E700A87B616CAF05A858E3F58DF23DBA9D65DCC1CE4EF7DD83E825E030A290D1C316C800EB45472653F1BDB6C4A4A62CB95BBC4FF2D3A13A03789087E225FC59E2B7CB90DA22F4D971ED65106680573C4378D985F3DB115B21A7D27A2EF268FC8912E40F5BFC4A1C6E802A70CB2D159A91AB03BAA0231C05582323356960F74EF3478F62A58133503DE3B0D923227335EBF5857E85E5A8583AA911C07A648157E054118AED5BDC2A15BBA465B59F1CDB21835E1C6A62E9A3C14857919293547E4B2E194C42F03B9788A429B9A048E3F85301F5CA499C209EBB7BBDCD775D440012B50C52B29EF090C1742527B07F07E56A2EDF011200B16C643F3C496F10444FDD10DF193AB9E47305B244E32FB8E901CF5AB7EE1407ED70908514573DF3CBA68605269E69BCA5235FCFEA7A0C0301E843C91E14435F024F67F3AD5F0024BF48E6FB683F8810094752C5D6C3998DD14FA413641B1FB616305BE277626CB9207FAB89ABDDA9D1D30BCB4E14A6CF8E555B7589A28381F3D566F73BF18D28D322747731CC22B73544E0BB7168D8232BCC43E406926DB7E36805BE3602C1D347DCD0A9D8DD617E66569E0F719EC07779E9A65D8F53F0C387C3FE15A7C4DAF6E2FF91EA9863B6EEE56FADEC96E5A8D6856739C0973FF3A5E538E86F71BDFB6F1660B84DB738495A1564CA057A78089177B04C597E49861B71E97A3608771210B15392D375081CE0EB350012A4B3627A8B395E08EEC6056CB1843F93D64C011241304FF83415D8E21797BE7503420A4C5ED278ED5691F588B3DCF0CA30C9B05702E6FE1842317FA290A3485508E66BC8503343C5CAA27BCDDF05F7721BD110546110F78D6954D367F1C44E74A413CBDB58A9F63C2B4E2C3147C48D244BDA9BB93A79A9C73ACDC0691B2E7F50567799484BE65015781361F904DCEFD67EC4450DA1D9FBEA49971A4049ECF163CA6A4ACF671D7DA972F63194DFB3118D5CC4F485B64CAC41F86B9FE66AB9432F8F3D7EC7E4B28A07F65DDDC5ACD664B45C8989A9FA1C610273A6ACAA7ACFE3236D4F73CB65DB6C2907FFEB7798FA771AC52C991B11BF566F899A83ED34969888CDA10C817D64070E5734CD390EA9606DB39F9E2FF19AC407A2A7C2F9CBBA01ED93AACBFCFEF500128A3FB43C12A727CA8492A587EA6338E40EC00112AC59DACFA78DEEB5BAE2709E27133736309EC4E711F9B1AD7DC9C3BA9DA3DFD320B5AC36950E102DADA88950FE8B14A63C64A9806E37569420F8A4E814D02D098B103FDB8BF39E515397706515E5C14A8F134D9260BBA6D05B9F4782CB823122ACDC55BBA0DE6F97B77DD9FD0612EDB0C5DB0CFCF40010602051448BBBEB200A8F37002EDB8BEAD6324BE931F8C5AF8420EB34FF1355E2E84E2AD068C2D977FE7CB63FDC152B0E8FC0C2A36B955D62E9CE01ABAE3F99449177A33B12D8992A7E7D8C152DC9D4382694B6220041DDE09A46F80B6394D16AD9AE3A33444AE7A2A5532C50B3789C0AE5A08548F362F348BEADBDF673622EAB24A641DD906B5461C17405EBCB2387BCBE2BC9B72B539CBD3D033200121DA62277484600910896EC4AD5E49857462A0112DFF6A615915EB364FCCBDFA63339656B3B53BDE32282242BB2478ECEDE6F9BB8DD34DABC96072E1AF0F684699816092CB634C755BBE35F65ADE5E4AE925D4AA4EBEE137E6F2D8ED9C2F5AC4E960D4164CA888B0A19077BAA646FAA002E9245A7FC4A9074262E480D939D4C0B08DB3CEAB6ADCBFA1910ADF54F4FE5DA63EFB971E18EFC44E97CAAE676350CF51CF6542178ECA8A61E5895BDB0B3656C8C3011B945970F9A55192E65B22BFD409241555E42436CC734A000F478CD8321AD3D2F7622454673EF741CDB50CC132F7CA161C7673718A8AC0311DF117D329EA45342A099414AED1406709E6720D123A577FC8309467FE60FA236906AEC5373AAC1F0B479EDD87846DDE853E2721198C28ED6929A7C0012732777CEB0DB5E31F33164802FADD1A1B50001121AAFD7665517BB6228A69ECB0A5B3CFBBB2D21B13F65D7695EFBB5246FB7EFBF687F5C8AF6CE1DCCE7AB204598DEF106294793ACECB0E41449F464B596D85C60DD646BED57D85336460845A56A50DFDD27D07098742A4D529A3D44A2063A65970B927B6FD5EA00A2D8ECD208BF99CF8BDABF458513E2DAA13333B3F194B50553BF4BF75063118F979DD264CFEABD950F40612315160E2756E87210DD3A75F04A42719433687DBE1F85FECBB048F5B82118A49E2A77A7563FA145768F7413896D26B8D190106DDFE2A8589B79F8472242C6D50A51A18228626A0586E69342B15CE286AE8E609651FF472A9160EBDDAF8642D858A969A431E14351D7EB46ACC13FFEF1CECCBFADEFE528F78227D9BE9B958FED0012A84FC78869A0A5A95A38A6F59F6C2848E79901129BF3451FEA68BB59A2E8C91C148168319E9BF6DB72B1A2DB2C298302118D5B9356D602B826EA7F61FB87297E12FC509CF587ADBAB81B7FD060CC85C9A2B3874777A5A42A6669289FECE0677F903039FE3B1671F40C585F1554E562291719E09B5C2956D053DAD80E7D5374F514396CE6105F9FE7739EA629E0E1383062DCF140FF70C7663CD66B23C43DACDE7ED1DBC76477EFDBA4A6E68E1EA6E89E2B5ACE9E922FF89AF70146CF8E1CB4CB287BFDD2CDDDF787BC01ACC5383529E1DC2A2B86C26FD3E8C71E9F59DC25682A6C7392795788C13DA38EF99A3323566B5195E62A10F1A36AC502C537CE123BAECA67FEC3BD93EC7D0A995721EAE3DC15229F5F315E8074A4F907679DBFF68ADD04EACC1E7B0D0012B0D9B2660332D55D903EFB027F3A6705DA570112420BAC3C1BA22028698707425E8F4130789B1D26CE6B0AD828E97D19DB34E1EA2BF019D3E04A43FA962AC06C40B279D6EF93652C06E94E5B3363B6AB732775C1D4D3373D2B1D413EEEE292FA722F3561B04996913F300919FC622FD169E022B5AB2D6B114BBCE217EA5FEA166F7E2E3C83F764EC531DB579F186E92986D379B8043F6B4989997EC1CBEE4BC49C2C5FADAE6DC3F0FA8C11CD344B0A16386038B65F6F42A3F6B20422465F96607A17B3E852A36688D301BFF1E0F124600E1A1339F16114F58FA03EFE8C79C8372B338949FB3EAE89EE6FCED0079A9F5A6CE4E0FFFCB34A25DFB2E0D7E7A3F030803772B969E2C565B848D64DA80A95FD12424A8114EEF706F7BF9E52A9DE508385030DD9498300121A83F7A40C379638269B980DE3E0B97E35450112F486EAD3DE1545DED18BF2184D02B43EA68DA59B46DBC373367ED07428A4753645D72D3E3990B47FD1CEB61CE7BFF865E8113DE4D4F76725E24B5D858D3017B86C375CAB4AFDF3E41976E0AABCC0947655C25C5FD29E417C42C9787035320628C828DD38B9C4C79C248C9E3FB6F68BBE0895EC6413297DD4A698D1EF1E1D00769D91238A371D5FB97BC018F4AE6F3FAFD178674D7F0ABC24979540DFB9CCD87463508FB65C4FDDCEC08FB7F4AC2763929E8964C1D6398853C6D1021AEC6C43F638811AE1ADD12E37AC0178C7531A709B7332D6C31F7CF89B7834DD233B81B1CCED75CB4B82477D4BBCE8601A286A90DA48E1F1F7DED0E25FE1DE4051EFF5E0CA886348E9D69F06159E4A12EE3D0FFCA814340012C69175505C438E0865B3D0139692D039580C011286371EB29DF073E5ADFB7D16E7D19CD46D65DF633A1684DFDA6A8058A9652D86FFECC6B0E2F4F627A0FFB7AE3C800BADAEF7C60E6B427F37CD80C3811D32AD402746DB3DBFEA8D322AC59E5CD461C60B0A9F447E15AE4CC830476FA791F6699FDFC2404D4EE2BBDD55473D83425FF47FF0011D9609A958E9FAE7A5396DBF6657732D6D6460C9F6A7D0324A98514CD8CB75B2DB8C3B161EB46D4849550126BE3A53D92F8515266EE9D04514B3009DA9F998AB2D31F5409F7A3E90137E91F44FA26AB064D7A9DE5B73612D7C210B0E47688058F8A13DBC725F68C0CFF3B130D021C617D1C8FE5E18CC78BDD3A902BBCB47D8CC5B8585AA4D2B4EA6935375C12FFE2C73D6152772F54CA713C7D0C4D3C032B8EA001241143AA77DBE0F1FEDE3DD11128CB7D9EF5F0112AD8B965D8B86B7810DFCF64A100A5BDE6DEFE7BDE43139B4F2448941B573949CC0CE1ADF52818FF5DA611E087BA6CE72B1C04E2213516804D7F34ACD9640A41F2114EA9EA7D882D8197E5C49DA66E0CA3AD7EB91992D791E4A09D2737EE464C2C463EC69002148B00522B3DDAD0685001937210E81B4A72935019C563C4BE7592E2633EA5EA8645793AFC254E065535BF203049FC655E879DAD4D05A472DFFB475DBAF037AE10C5AECC92C0B838BB98B80D369E43AB0E2F537174FA710119213BD4BB71E6185ED566F698C45EAF08AD426619DAEDFB9EEC72DC9ADA87D8CA81769C1C94249E93BE42632FB970771CA4B567E1FA6CF5A8AEFF5E3716CF0127B63156F3888453D50993B919478584094858EDE00121D1AC0859560E114D4B2A4EE122333BD310D01125A2A77961E7D1B5B8A43DC8516528847BAFF5E7437AF0422E52ADD833FF2817E8A2E10448C02054639C9E3039BF6999D8292A129D8A9C5D2482654104A7532D487388C1C32B1F4A876695A53E307DE3184A8503F316B5BADC0C111F487641A10D8895FDD6EDE6615E24487817B0DAE84BAD553D13C504D58885A30AAF9C62C4952E54F4C4B0C1744AED2D8EDAF4F4BC6AB9CAE9C32E4D49BF442429E835ABED481CC43D3D04DE95A4216957E1971541071E9CD3DD5F8B0A4F0923CB209267F0BDD15FEFB3B54CD7F78CBD7C9A41B0008AB8F081407BC47A95F16E54620651763C5AEFC8790C05DCEDCE63002C008AA415CA821D464183DCB2C4A97EC3F29D32D649503345EF1717AD8D1E3BEB56E7664587200128EA633C5381E447DAC1A3D293F5E0D14AB0401120B14359178E8B3A4BD935973B59EE1549760E259821A60EEBEC4F297C2F48A4A94D5342B4D8FA6AB7B8B373D748B052E222B757A46A576E915DF53015703940B26314ABCEDB45FDBD1549059E06FE20CBA2578FBE1E7154A128F359E0DEDCA410E6DE1FE91BDFFB01DF224EC1729775221A00308083C7F9BF74A683F598B171FA3234202A02A25DC2150B6600C50A01703850C570942B05A019DA1BD35C39E1B367867D2ABFB73EEDD31A5DE5BCB10CA81CA53E609B97C5DE95E4B118756521358330AEF4E7E82B70E98112D6D263AF9610A83963E2897EB0FB20CDBB21A40359CB0A578E69D1F1A589BDEAA1B7A08C1601F93A249D634850768EF06B5AE8510986D9C1312397C72929BFC7BF53C3DB538BC0012B9FBC369D9DD1F49A9EBCCAE2DB5AB1AEAD4011247FD2089D02A93A61F811E0130640CF72AFDD3EFEFAB0EEAAEF743153CB2B1B57D25D047D64BE2C4FFBAE0E066DEA117C338C9E6D0DB8DE03BD19559D63BF0FDDF9D795301E14BCAA770942DC25B9268C3FAD1C0399C8449F31AA75D1467882E68619AF3374D6BBF074819E7628397568CAEF7250495F9A80B5780040DF75CFF0A3E4ED6206D87B79CFE668AD2B0C1ADB008AC1CBC6C966FC1B889F418A4932FBE2818224B455B70342F5425E93376EE12782D81929D852E15BF3DD326699B9195C23D7690547ABB091BF20F321F25BCCC7B5FA92DF8AE0F04B631E1544994823DF797679D4FB8BF74823CE78EE9768B6F18E2E65393ED9FC80557DDC111F0F0A642256E6575ADCD99EC578C32E9C9DD7BE20012B5218116EA5DC31AE8C626FEFD53BC3008DE0112E8C3B760AEFE9FD6808AD6E1EACB14B8C1876ACA1AE5D803CE60EE4491956783A4ABB9C218BE7743437CAB6E2F2DC86481E4C2703952D4A35C16F60877CDC26ADD44AE51D4BACD5F654B04466A22225201DD5EFBAC5DF2D77EE8B1604AE90DE99821D9C18E545735221587140F81E6C640A5AA95834991943F9597D402DA83D36D91C9A3686CC4E0D1B106D52EFB6487FFBDE48D66DB7A0C0E284E4E625CE368F1231FFD1268520D53E63A5D1CF844B336AE3EBAAF873B09F8191965DC3BDDFA12911A8B43AFCD94274F81C1ED2E3791800B830FDFC813F320B300637F80016D78D932FB8E4AE20E2745512581BD6A2015D08436709B385703BB49EDCDF05293C893DB1653B077AF6AF0EF8ACA4C0EA94F6900120ADDCC17DA99D99EE4BA9B9D60E94934E1570112641EBA28C18DFA6464FA43CB52EE07D07EB99D5DECD39E02531A04F35C48DCE8059BC4809AF8B974DFBD0760971140DB17721FED059970E224B999D21B155E3365CFAE5C5067323437FD638B57AAA80A22D69333370D31E9E69256767E2266CA132653044A8A614357A53B343F2DE01D1DE8BCEA53F7885006C97B447743593255AFD9B185F9478E279EEF1A3A62D27A8300A49629DBB69A6B1FD951F5FAF1EEDD88F02FBA1FFAEB9B67004C71FF67598D5F0999FDA2C9916EF68B8EE117FAB38C0F4F00D45E44DAB708FA6171DC1DDDD6FABB8836FF3E13793BC510D2F6E09ED6223436D1FFEDF70732745E71B1E0C654863D762E99F461A2E0CF077ADF821A3FFE8A1842F29EFD95CB904D0F9C31AB206E0012940F4C49E9C3C402E27217D8E0E285DF7350011229A534EC1D8D319009B1D4D6A6EC83B57F95E5924701CC64D045FE119DB6DB1F505CF3B290C023E16C186F04972B70F23DD46E6ECEA3B070316A1D68F48DF06CA6FBBF5B1C58255E1D903F7818A7E53F69F535422F0590F54D63EDFD556891916B26111732F6867CC923312AAAC48E6E6E3008CD675AA98C09D9FDD6E902DAD3952D229B6FB8B72C12CE97F39DBF08B8EA3C8E4213989E2D8322ACB2FC6D87B8B26FB8AF5D5E13A17B53187D8692DE5D5F775D20B26864B7F2F4C6EEC1475B60F7F552A350964FCCCFCF29595DDDB2227D65FC7EA064B3E3CE8AE4FACC24EFE695A485A51722294E3775AF6446AB1D5FAF888BDCA61048A2892B45393808769C7589C039B599DD9DDE6160A34727DFE48C220012B7A42ACE99AD1FFEF465C8B659DE580C8326011264351FDB255A4B9FDC5D006F28C616D1926755429C9B5F4F092318D974BF81201AC297E60B2B0F6DE4C3D39296DECAAB3F68966D4997E653C338FF5E908CCF84A41746BD4CD9B9E7E2C855FF07B1214C1FFAE62FB3DD930F892358F5239F6A09E9368517AACFBA866D63860B0042F642A621CFF11E0520968954ECD99EF95D603243EF7A77D316738BF18C8CFB2E3C00F7533128FE92488336EFD7545AD01604DE7C113465C111697005DD31E909718C3949E237C6C9CDB2DC47C0B93EA9F34F253A0EA4BA11A9378897D9410B8C1D3D7F8ABF5E0329FA02E2621F934BFA224EFB7142D54FBFC2532D30115827105F67B170723512424FAF8F8004C33068C0E9F8E09C6A17A7C1917E160661BD4A81E8C74A00126A943A3C69936B51FE038B5F972F8DA32C6D01123B30AC8107EB0EF4247A9BB850E9B1110925611BFD83573B8C2E4C9970ED45181C42BB07F7A718710C2FA9E0DC2716F8E19DCC2B42C7C22E43A078693876F733B3CBE594014F0E4A0A7AAF9AF89332B314BDC3875567F6FB51BFCA0B81B36909AB480E9F410A08EA3B6579AC887A99A97E221565A35C1A2BA79ECFD8747572EC12BFF0D60B9384D975C3012D21A6B592D79562CEEB4D789621D35EE213FAFFDD0647C28C2886B8A235B44B3270DC1CBED3C76715AE921A239E3A1781B19F756628DFFFE870F54A648286BDAF235047964900491D740538BC92EA8D749494AA87596DE1052F4E7020FACAE78A57A0D489A7430D10BCCE0847A995927BD81DB2BE9A895C6B64F92960695DCA5AAA14F105D4F6001240947FA7DA3E9DA5B2B0AC61F8634A8753C80112AC244D74E4F3C45BCE95AD73DB2BCBCE94D4789BF86FAD7F01EB7113035379BE5E5B162009D7A6C1DE2D6FFF75ED1581DCACCF56FD3EAE0FC859F8805ED90EDAFD693BD27B65FC5EB2AC92F41C3CDD3A7BA3A429DF1B3A4A0D1E6719F96118AADFC3007CB8B4663D3DB61BC0EC65858BC48AD50FF3443EB503CD3CB1EAF8512616AB93B2DD900D7E7B10F2207C3667CF34CBD8AABE961B209B8938DC20C65B8A98D5001C493064F916DE5C75BDC8458FD74943B66EE2AB9F409E7EF55F2DB49E144302E53F1B9C7886937B6F19104847E52B66F6C0A52F08289F96D9290450DBF154DE2C95647F89F7658204A87045DDD0CB03AAFF5B4FBE8E261E24439DAA1B1CE4BE3E67C4660B23DABADE9B44D08939320012EB1EFB9A8514DFCA814006566EE600DEE83001127A8A9BAEE37B968D4ABAE2B94495F8B9E5F9DC4FD781C001A424D75F8B3DD47851C7E699C1C30AE9C844E25C0E20DA0F9E4F2B97E180C9DCE8864CFAE8134EBF39C42A659079AFF7874E80B663DD04D71D7FE8A97EDD8C939FDE248D933B69ED776189CF214AC62AA07A8808B1A69EDCEA0252266289575748B8F3F4D155AEB50BAB9D58325097AB72C0907BB7BF8CC9530EDA92C362AD467D73C59CF2FBBB2DD528CA1F543F02EB39DD6CF6FD5D789947663B01A5B5D1F9E4AEEAF89FA5C162FEB8B2B6C3797DD2158B7A44B221F7CCDF9D249E0A37EE43C758CED1B62A0A02567F962804CFF9F1F48ED8375E3629FC85E256B5327DF9EF6639AAF5EC94C379B7AE193B1D2C407B751C36E826C7FA6468510012E6DED5CC5D425A5F5F36B366BFB344D504F9011269AEB8A8A50A60F7E92AC8145D1B003FFA26ECC73E437DD6FAF78C0B18E18BABDC848B52E20608227DCF262CE4ED507113D7A9B748A119668ECA031973228CE4990C73DCC9FDC1E9E568648A42921E8C964366FBB14B9167B239AB586D8E8E65C86E10D50B4011A7C38E3F9A5187DBDEE31AC4B9523A01C5414B4C2B8D54C6A6986CEBD6797BCFA7F3E82395F913D057CD0D9A0194EC8A13A4057906176DFA6A5691DE2E1D138C468209C02B19B90B8DA2A66CC618327ABE1FE2DB6748B4921A03B73D0326D0006466F9B8EFCA513322276318954E165D8EBD685972D52383E2444280D732F3AE0AB43CA1925BB6227C8E731EE8624AB4FB9330CC6077CD3AF6D7ACF614191C6F5392693D5F98623BC287F100127DD6A69379716F597D16002693F0FD3DF23D0112EEC062BE8CC82AC8BF45DFFBF4D3CD62B5C40BEA3C753BDAD14FF2860E0899F2A70E2D36C579DDF10D9B2B5AA70FE3BE8CBCE3332B7D10679DCB0E34CEDD5853465C02FA928AAF5A87A182C70E0BB7276FC667FEFAD07698AA899BAC982AF18501D06631C7AE7D778582B1CE8E73FFC58BC7655E4E9CE2AD0434AAA18D4319F0B56E3107EB2D6F3A51A1F18CAFD481390019048EA69C91D331D53E0FAF7999BD74A79C684269C97FCA4E71B6468427EA29407A64DCB869659DC7C7FCC0D71FEE89F87A69B9AC7323C53ED6EC801FC75FFA0DE4A9A3CF318AB0354989231E741DE3235B562AE4B35AD77B26725E89F5054610E3388961E2836A91041410D23B0908AE57EB1EEB75F973C4D111E75184245996001200C762DF0BB57BFF16918074615BC6BC4E700112E3FA36A75EC1C0E7FF932416F5DD17A4A05761400D4EF195BEF2046D69D4C961A53849C7D56B2E9E45FBEAA326F3B8D31C414CC195B8A41EA60016AB52331D15A7DCDADD6CA5D5EAC872B2E3BADD8E4B9B4C6AA587550D4A240AA5AB0BB93E73EB7CEDDCC037712E3B7765FC28A0C976451B3FAA96FBFC4C0B9FF4E718DFCE73863006E32E506A85E4F06A32FD3269FDF1AE60B9B2529438A4CA5BFBBDF49862DAF5DCCA99DB392B3C438437FEA2AA808360BD7800F8E94C46D9134A8DD1093461DE0CD38C6592AEA0084E5A66A50589806AB092535CF036446421D4AFD7FC36EFEB45EC69E3A8C6D83BE474DC73944B102CD9DC86FF713ABBB1C3832C677D73AC74B96F0E4D614096653FEBB2663ADFCF0D00123751527A23D2467988E15414F0505DE1DAEB01125911ACA3BC54B970233144B5AA2E8CECDEF52D0EEB94525A02C229D6401ECB61D5476C8C276916E9126A63672FEDE6B4E7E59191F2A921ED7F498EF5A846FB057222F1B3A726F39E7C622CBDB2C97B0B5A1D846BBA2438811DA8263BE3D42A61FABEE938127E8E1BDE86E07A73659D458FF68D656ED6C3A381428D9748F651262A05906CDE7613961EEC5ACDC2E248CCD7F2C033182EB4EE9C8ED8F1CCEF0380F06DE9387D4616470F5F72364A05B560D403435765A6611D8921D8476D615694198CAF9D0B2EB5DFC79EFE9AF6B0F7F7C38084B3EA30C17F2669E85C0A81CA21065BE69A576ED2B92E02A548F1C796154D9DB3C19D54CE455BAFA8A97FF96780D4A961B88BD403735DA2241AA0AB62A50E3A0012B04FB02E7EF2D5A0F6E60003CDEE6A3AEEDA01121BD26C1E11ED3E03FA5E15A9E046425F53CA148E59E1DCF2281277FD087004F6CB5FE26B8523C1870DDDF21F9C4268550B2C17DE4E846C9FC7B59F5658BC0F43AD4BC40A70E7CA9CAD946E6E0C20DD1AB0B2F21E82C37369D5669BE4BCFA78B4B0400A501D997BCD371FA91AA37E11C13714FB3BC983E75D9C4462734BAAE6C27BEC83EBD6A41E43BCE1670ECBCF24BBF4BA9D26AFBA071F6C8321D1072DD2EC88D97D4F3242F96C296C2B8F8D71F2549D286BDB12811D0DC5D642B6E687DC313A24E2A9CDCDF7B4D26117F566ED149A76F133E6764398D8A3B60726E95AFB7DDC006358FC9ECE1BAB64C404356491E352C37BFB7B51D71163D8A99FFA2202BEA0E36F82308AA77E723DA3D0A4F238CA323D0012742B7A9F9975A74285BDEB4DED9CC85896E80112A82639D79A0804EC64F17CBFA169802F8F646BFED44E94D21A2216FB7E4C9891AED2AC6A5634ECA693D8D49681BF6B74F7A90EEB6769FFD3CED96CD71985202296492A8F4696B88658827D5CBD0378F000D7A427017379E6362A76E4309A870BE7B9888F22D31D2BC08506D21E22BB3C6E14726EA88951D9E12BF1A524FF9BC499D872C113A111E8C52CDD5AB06E0C7D2E4BFB433A4370FB6FF8C8920DBA382C50A7A935CFFC5D3317623C3FC011C282C9536104A5DCE19BC81AD203F0A6B4C3ED73A56F25C406DCB86BE750D07B9D005B3056998FE71B2F159912801151DAEB1EB1B4115E83F52EC7FB28E9B9799CE914B78D929DA523ADCE22386B7AB8324FE9E8CA1A97D3902CE20930531F23FC46EA6400128DD997F16F7CF4DA79D6E59B311D55000BEB0112120BA139237AA0B11EE821421DEE30BB82E0C5F912DDD0078F55058BA53B244C348B06D5422534C9FDAFD90BB4D953119C0550F9415549B22943379BBDF777B109441A4DE9605AC4675A188890A01C18CFE972FE66119FA698163329B3F6033E9DCFE7B0C58CBBEFD3DBA2DAAD1770BD4F1CD5BAEB2F2EBE78111EDE1AA712D7861CEEA1DDDDFB2DE9E1E32CEFAB3D293EFE2F640049936F66D48624269D84B611EC05451C0CAD416065C1AFD182D075DC92A65D5C1085ABE8220F2E1A13102BD3BEC4F6B292CC872CC7D69E3CBE2B66A57482F19902C3FD6A2F20B39D2B29D4166FB8EA74954A6D2A29D0C696B46F39EB14F6A67C9E672FD42081F30F75AB0AB6BC5E9D8940422F8FB3F6437F32F06065B600126F4395FBEDD43FA5218F5BF7B62FF0EA50DB01125FF5876A513F8D7266BFC786534F5CC6797744A31F891B98233AE065C92061E28B4D38F51E3912DD66AD78081E793E5DE495BC537CC235C10DA2208C47DE0C97BD7D40F40A8932F1EA935A283A3A9E9C2588CA9564AB67DB813566D96D8C0A4658CE5BCA20DA5DF3BCAB19C76F351D0E3855549063342D6E3295EB27E1D88E6E4CA196117DD0BD75C73B12DE41767ADA8630D3683B02CCCA4F38A0F63C019A47E9868C47EC8D3B879D7ED4A119D8BC0843F215C3419D140AEE364C6EF5F0012811B1DE8C25CE2838AE243089B6EBED5796F33427F76764B0D95E795487762680103A86FDD74B95DE5DEEA540422B41A812061CFA64CFB91C82DC64C8E3CB5B3EEA5D9EE34CC09EA98F4F0342E2F02BE627B10012FCD0F52E5DCAD2A142B0CB93AEBD9104E04301126D3DFBDC52B576A8B46A8A429F80D4F44150F084430AD786213E9D13CBA20D824B1AB55E0DA5008072B3A29AE164CDC083408B0E497BE2C2DA0122BD9EF0BD0B0186B971C13432EF6DC5A6F047CDB61CBA86181880532B2ED0EED9F65CC4DD84BCDB7E9E6E2432D9E0932D9CC4A7F98B5B4B4F6103C42BB8091BB42B476511066531F7745D67FE179F7C13E7E74FA1644D89335CF8B721B607E6E1651735CEC58DE2CF719FAAA932EAAD7756C81D5E525E3CBE6145313E43A0B8F6606A0C468410F53450EAA5A4032BAF466E62FBA6FC25B3722950C6C38604B7ABEBF3826708D828EA03C0611FA71E53B5DECBF617CDBBE8EAFAED0B06814079A6B80ED3D67ABF95B98779E4F814E09546C637784135079A00127C6ACF17314D6C71FA4ECB29664396334F4D01124A243D1464A11AEFAD552C0021EC1D440F8361852EE89A39DD6F395C54A6F6AE6413194B65B7666CC818004BAED206ADFFF052323BA9781EA84EEDBE0ACFA2B21CD4E7A6555743FF9700146DB32DA8A596D4364DEC5BF0E0C43AD181677366E910D6A44358F7159320A2ECF97DA050379773DCFB2666758F077E36E984D39B859B6A65ED7EF36392A096A5871EC0CE41A8BCCB893339FF42D3641E6AA27A5DB985FC2634ED0E6283490DDA1D9E43CB0EB69317FCB22C239AAB35C14DC0E569BF1983C3171C781DE263A0C487F6ED4D3A413F1312533F97CF5A5B97545B0C971C6C433F8686554D3F2E060ED449798804549C11257BE5F48CCD2D4B06E747CB63DAB36B0B66DAEC882044CEA07148EDD535390012359B528D041E39328879F2AFE8F2496DAB280112E1168A405831FBB3F59A92D6A0CEBB559960364552B619D6D4D38E5E1F0A8A5E3EEEB08995A6C68269717DC6316E762A055F14F752554BE1E74F241A15F22F2F631FE658F675DF0B92D99C62E48BA905E13E75255EA71FBA851B42D0FC0187E2DD05CE6ACB9DCCAA9D57E4B7F4742420F2C83F0D735877926DF85B6675447C67AC0F1963E2AA21542509B526C57B982DA74C339E681588B8FB052F62BA5686410FBAB10A9E569F780655D742BE4A36C5A800372BEDAA9D2861628BBE0B7FEE31C31550469472FC49CC5DA15F9527C46461F2765DCB3744CD7745422D7C9C32C98ABB9162D21A15B29D661CC50ED1F197A856D10523029B4FCC0E14888B8106F26893437268605BA9F54F7DB19B591FC0F8CB001263C05934B57810B1C6BF471B1915DCCDCEA40112A1CB58BFB4226FC1405B6EF4397361F5B42FF3E9777C17B39722BA1656F0FE315B6F5481B233E9B486D4DA9CC095B39765EC7DD2FB875D2289DA5282E7E673AC9A1AB34C1B4B4721F76879CEB6716E9B19ED996E270726A8CF42AF95F8BD3560E31B6368CCDADC125772059E6402A3DC7D2D2F00A083CA0B797E48A8A34E109F975F9E703D692A7D65601D0B1D09D31B17FF5237F6FBDEF9122A71EB3E3FCD3BC15A056FDFDDD6C276C11936054E09033DF7D1F94D6825DE3EEED60EC4769147189EBD3C00E5E3D6FCAF9D140297DF255FBFC001763F70F7ED0DC3CFAAF967BA1C7C848BC05A17392A1E8866F017EF78BFD43EC585A14A2216C10C33D4E8BD745D574D380CF4FDEC023275E94CFF5152613400122B8279C6620DD299BE0CDD22B977F38217C601123545A88489D46DBFF31F645379409F158E1F7BAEBC19BBF8FCACA4B90B2E26487A91BFE3E6B406FA2C07D1AE91E04E739E7E287C21557D37006221697761E2F9C984A80851D5335C27FEF726731751A60EF0CF60004368590DD1BE5B102F79ED115217C14CE13305E1391A1C13DF66CE1A3C9C7591DACCAE7030329871BDCF861D7201FD6B024331988DBEC59C3E24C1F0491AACCAB14BF369DE8F0DC6FC6907E55A65FE8C06CDD1E4447177B4B6BC21B94C7F57EC50528DE6A5E6D28ED49E25946AE28694D70EB4A92DFE9B8B0421570CAFBFDAECFAB84230BB4B2A2CAB7AB40BA1C31594D89A2B50DA8E456847C8C75BFD872AE8E3A81425F9504FC036EED1F938A86AD5790656C39CC73754FB68BBB10D0012F94DB6AFD6123BA6763B37A3F9C8798F22D60112A2686703ACBC8B340C88DEB8F59CDDC8374F2D51522359C0B5DE500DD4ECE6BABC62F5E5ED2C21C1D5C4058AEB73F9FFFE0D77BBEB206E51420773D3C3ADE6E9391E018C95CEF119793773B69A6D66EA4FACF94C4AC0F84CBF84CFD3D6FC0B39D1C5E77E18CCFC0E47B38ABF6756BEA3B1362A2112C04338FDDD0335E77F402B66A70E5FB52DF544D4E33C5D74B23E38A354A543C6097DF0A940DF6778ED39F470C6CBC0BFFFCA45901574B8FCB64D03F7F3CB7FF11F239755F20AF2F22971DF8C05184B3DA1F6ACB45132A030D149A0B368804BEA27CBDF56349F37AEB2D899AA6A8B980DDACDD57FDB8D04160BFF42512434F394B26EC0246FE2C3F06B502EB2B4F581A392ED968DE7E14E257FA784ACAE0012C8564E92EFFFFD779467E20B2F6DDBF742210112018EBF44278AC3503954C6351A9DB17BC2207718495C24F79146A8E0C62D740C9ED22EE2A65F804FCF6E2D4B6F822C3DBA28D0D9761C15830F07F5B6DF5001214A4000BE817B5A9A394227812570DBF98DBC1C712C91BCCF62E673CFA0B83C3F660D7496CCE683904CD221431B5D750BF67B8DA1A32105BC93EF075760D0D0CE169AAAF92AC94E9ED74B100AA330508F215AC70F3A4B43E7ADD98789648080216553217C3B4D60F15954F39FD3C85FE2A720E122A36A3D847949ED77671986B3EA567FC09EC846F065076BFDDE05DD69BE82B63FBF74871CD7E073DF5EFD6C5138CA384EEAD8ADFF2550BDE59AB62F9F11519258B722A17F9A1F56182BC2DD76A7E1E7D6BC90A30894D497E77D72E76B282C0012CD67DE62A321193820546651B255248A2140011224751375F67359AE721D5D1C0C0F1534E07E98C0494934FEF1B10AAAB106FB762A05B3DB1CDD4D05E54647C17738C2F28840E0FE331CCDAA7F2F1E0112C26763F072AE506BF0DB6BB4133B7449F4F190710B09E38AD35EE292A360C774D425A3B3223E399944D346C282C7B9983343AFC75CB6A36253AD96CC8D18B5E5C29091D03E0D50ABA6FEED4934C7A79CD6F7355954BD29B83C0B6DCB1AF3AB9E175A252CABF285283B080422EA83B6CE63C21D44CD8847533DEFF4A063BB7A98473553E2AC8618D7A2B5CABE94A9738B1B82253C8C7ABFE32BC674F0B7396960A393C4EBAF6809A8F3E1503F06FC4A1C7A4FFDEAC0922CF97E4A94EB47CE7C8F25C099E15B34BDB70078A0ECD38FE3F56952DEAAAF00127F4923DF20B29500D1E601F9355566C2DD2B0112CABA4779FE0CDD716B010687B56244D528D138F848F3D06F4FE1F2890A33F3A6069C7288A57E6BB4590A4216E228221F5E6E0FD0872D303EEFED440DACB16139A9C915771A3DD9A4F2537FBEBBA8337E6B4BF26164FA90ECCA5AD2039EDC6CE8E68391355ED64CC67099E4ABCDCC75AC53D400DF54791AB5EB269629E302DF3C519DA9F53085501144DEF01BD3E3A95FF043B308E65ECFFE1C28758A1F004546DF051FAA585CB2D2654894C383B5EAB4C6ED3C9CE4D1F7413C043C674DEB972FB46609BF687195CA5ED4A56A5E5C73C5BC7F824FE92B1E1CCD45EC1AF0EA70D7EA44CC3B6A1CDB874D466C653440BFA8798974D7793B661B9F5107159195C6ED7E05902DC11A7A668B3A73F78CA7DC1B54B30012510146D566CC6B94D83A1AA21CDED2BB669D011278F03DAD0F51739F1D3C6220D3E7AF597BAFC6DF1C4AD055380967F15C3FBABA401737389E0DC89595A2A33AA84DBB9E49145180DC00204382A9C09A50BC2EE3A86E3A6BFB28ED28FCD8A0DCB0DE6910E32F69245F2972EE86EEB467B9B4CD3121887DCACF644D6508FA53077A4F5EF6D8C53C000F1314981D74AC277C05E54EC34B288C90E6A5F55DF222FB19209D0AE7E4B1F0B2560831202903E03EBB9D3F515F9AA622B045D249DE4CF23CC6C1B54BC4C6A96D1D7F59361AD84185BF0783DDD19ED5CE23C31C6FE4EA20B991800517AA906C38773B5A436561513904234E6AE8AC5BAEAD70867B60076DBB9A6863492F865E163B6B18035FE3A76D679B2F16D83AB2CCB9C0AD266159DD97028F79238A0012D964CC37B7FB9446087F33D6612F5E8DE756011276DBB4297C4D76A4447BB84CCA533B9B3098A4FEF6C9E1B1AD4ECD5882405B2A1F2F86B558C6C18E48AC14DDFBA2967036B84AAE44C0ED5C3F877914FB67FBBB2E1860CF4CB9E1FDF724CB354713F31758D27AA08E14EDFCDA30A8335D1F282774389051D5CFECB41285986EFC1A7A49699787D54CD451CF85DCCB4CEA9EAA7BF52D6D6A3C7EEADD534F93FE4D18AFB5618D728032E5A43FB951AB513CD9AFD6254BAC7838587671CCC7028F73D4710CE9681B0FEC227775F618051AEC2BE9E52AC4719C0A737AAC5CB1837C985BEC93D23D6E6A7EE3BBF578CE1FAEC5DEB2C2CF57369D95BFD7F810941048899E3DE0ED1CE5EFDF9269713B08A174A8FC80D34CE6B5F00C6D4716EA42C9218B9ED6A6E24D0012AC7E8C6CF95C1B2CFB864F6594CBC4FE5CD30112F849BF8385C0351051B3FFAE1B733F0199E071043FF24D28841747395F6B5B78506A017B522D5216AEDE96F769FD4A1300C3448771721A1BEDC518CEAB8FF06A36B5E3A9F02D175DBF8484BA6C1F6285C911BBFAE2231A6205BD2A442A48D62FBE9C5FE739B8608985D9C03C31B3B5670328E861015A2AAF970BEED6387A60839474B5DE15CBB901907A94F0D80A0200848F85DC1ADDE9BA30122F53696552C8091423BCCC9DE29C7B46031946709C5BFD4A8EF3100A8DF9D71CE06C3E5CF5AB2FE6CF58639B63B1978FE3E618F1DD7E35782838341AC8720D88992E97FA2F1D4917E1D8E8094C2578C49096A827FE81B068E90F9AFFD243B5779B4840A0CFDDF1BBA8161F52CFDEB0132695BC41E91C22F80012CB9871795D42EC44F627BB4B290A39D7A75E01124DDF92354F2ACC6EBC7B1548456458ADD3FDD04846633F123F30FE6A547B1A7BAEE38C81465AAB7CFB949CE1E0DD04B06BE9B794CF010009D561A887AA0B77F315D2165A1F09EBA95FBBCAD04B7EE43969DEA767D4C06CC926552B45899B8CA688E1D823E9FEFBF0DAF203D16989DD48B9157B32F7A9E57E771B3598E50A01AE6FD9C13EB13F3C807107CA86A215A536FE9779F261FAC67A6784FDAD54B370EFAAB79ECCDF83A76EC2213032BE7A8175E695120061D55B19B0F2CDD19258B3C350147C09BF5B338CA14A132E449F59D0F51DFC48A1F52BB9D0200122848B13B2B07068A64C5040C353317FE425A54BED73C67C66678DD987CCAB4F3D471680B778C58DD23C8C729C989049F28BB5C011BB2A0012A0263A3ABE18993B2D3E2D25421EEA1D89B40112592F1C97DCBE45392453F50488B355F9908F28B2ED20BF3E3A97F9E7D3384FC54E36A242AF5A9DB753A2FEF5AB4FCDFFD865C5B152E6BB1499A6D0074A32ED31C29485AF4DD6FE338AD66E23B305791F8330B33C360A0B5FAE0B5530C78502BE851E460347ABD2DE959B682CA8122D247C7ACB52AAD97B6C4E0365F03FACD9F35A8C2E7AEC05FFB403EA4577CA4E26A46217715F5EE28EB06E0EC76EC36FB8555C529919C068FC1C8164F61EF863FDABD1F314FA02A582FD0AE7F1424F4AFE9DCBCDD7CEED36EEF51E3DA187DC3F905CF46C4E067BB81D3D71B283F89A1B62383CB5636A88948BEF96D420D6643EC5A7413BE807E9A01CE19C33E1102E0F94CA9F04422B1033F0F2410FD21FAB24195CC5940012FE80B8EC88E8836F41536DF1CAA4E1360C8001127E910B6AC0A985ADB7B2103C43E5CEA225794E816E5ADC84E3225D63C47F88F2316DEBE4E5B0BEC2AEA705107BF6DA6B9C88912832DE1A9313EE1E397210AA6C2E96AB7DD8895F837E6ADED4125A6E0E601C9D49E7E6DB2C2A715CE7182626FF9A6E845A3CBA579E4E474C3B847ACC3093932949919ADE2DEC8D684FBC01EDA5025270E778695B758C69E98A5369289C7F12E56212EA8E6E3CD563E8DA18E1CF9B63B4ADEDB8CFF71E797BB6CB310C9928AADB4D7F4DF7AA19F7477B1DFF1EB7AF132AC54FFF52EFC3C9FAE621F92B1925406008AC5613C0FAC55F3F0AE3CFD855E77B3D554C5067DEB5924ED3BDB5AA416E5DF5A49749B0146922D689BDBDC67BF035AF47AD9F22AAFC8480B5F20CDA55010012E35BA5DD5186A169EC5E786EDEBB70B7640A01127D99A9402250AC555316E221CA0701FF0661BD30A44723F86FE21847C122A9CBE9F450F5A4D183837645AA1ABC57A0614E6F910127B81151E3F85C66AA3023ED56AF75E2D104FE3F5D8386D905780B4EBDB7E2E9FBEE68BA89FDA6BCFA3365DEF0F235C534068F1526CF59BDEEF84CCAEF9578919DB2076487A859DA9B1A8597A901ADF6D93B0C8FCCFBE5668D4657A433C14963FE56FAC9C1601E94DE2451811E33A86227B7D7C27ABC0FAB4D49AB2BD720AD3A1A657193A6A047C9CAEF22E1775051E2625C1C0747981C42C2622D57DA12A6367689631408CF6B8522A920C3D38CABB15F1537AF8B3679BB414B08001D9992E753FF8AD7226ED8FFD3F0B716228EDA264D38737B6E1C05542BD741A77BC00012E70AD63619C9E5E2E6CCA245020E6E388A8301121297E7A6A5F5AC3C305E8A9215BD0F05C431BC7E1E074A920EA31645F4F53B01B2CAFA99B8F6DD48FEFF3D76279632D92C3DBAC2BBD8D8000F59E8555EA759B33FB0763826B18D4443F81FE2A5CE52E9BD8733BF969DCBE2A17A579CE39914860E8E5D8DFBC307BC6672BD6D69ABAB8844BD98178F2DF1A0A79FDE08DF9F164689864F07607E095B2D37BF892E3D50750387DA8E0BCB04E0B709C32342FF5D8BCB13BD1D13178E651B63F7974CAFFCAA4EFA4DF2E95D0A190A94D5984E72F0539F5839F1E7D5EA8DCFFCB9C9D53CDF478A8B75123EEF1D09DAFD8E216EF24FF99C0EA159DF295EAA717770CE1561DA183FC907F96CA7E161AFF631A9437E28FA6CACE842130FD6E972DA988D06FE20238F0D001284748B9E6F626A32449B26B4006D9C25F8410112474603E06CD28779DB632DDEA295823D07FF13B5940A973D92F56BB731E04A5C3BC6153CF8F11FA87DAFBC588BDCEEB455349129F6465367C1C4528F75EDDAC2DF19FC31BB5D6141A057F8E2C3451CB57567218B37C36B23D29FC569D7E9311C572B65DDAA8604970CE0B41AF3F65975B89AC8BB4EDBBE6AE354A916C379169E25162CD970305FEB5D6092F4A134BFF49E1AC41245E34B2791001F7D46505BAE6871A5AC28F9403994D4A68339000FBF162158535C6AB5CC168F5FC05026D0CEA9FF2436A8C389CB04A930EE490A22CE4A0E751A9FE6B59FCF5E95381728C873AF248471DB43CBA0911E2BD79941D04CA5B2CEC9DC818D33DF2FCB76D363B84255D3F59566E6759F0FBC659935D28DD4B869001276017D2210103C4266CB4B2EB0602529787E0112ADB3D3B5D6D7C938A02A1C4019EFC410740272422BAC6B29E22602838D11F4821E3FEB8AA81CD7A2DCDC46F0D734F14492082EE3B5BF8682CC7078A8932FBAD3E900DB721C947C85254E8BBEBC57BE75A643A7D2C5F48C4549090D85219E385C0CF4DF0D1C9515384FAA973DA8D2E5940F432146A6383D5606899B763A332BD8B8CB52EC0620217FD007D73939C6E79E22442B274E732B92BCD2257368ADDCC049F507011FC04D17E660F4A9D62B92D37D297C72BFB645E932B4DC2BC86046EB107AD8B7410A63209586A8DA49E8BACEB5938AD397139B92F809DE827898EA274065A7FBB8E201AF347E72B66B882F7A0ACB5778374336EE16F773CBF2C3C2F40569E6192C01B0CEE4D13D8101C2D1834C5400126A71D671FA990346C74D8DDEB09A9C79C70F011213FBC7CF4CD2E5AECEE026A4BE52FD06B0A51AAFBA424D05F17E7B5B174FA22488B189EAAD06E0B83A26D5C812C71CA215BF10C2B2489F99BC4606D7664867BC3EC9C78B658297991A05E3A6F1ED09E8D6D740A85C554DBAF959FF2661CCC8348C2D1998024D13469BF50AEEA65F3DAC8EFB51894C0A6C81EBA9010CD1BB1F5E058496B1820E4DCF7DF9478FA4611544F425636623B81BFF3C29BF35932B4EDA41F6C5456B7355C8297DB8E016757934B82A5EE334171A2B22EF48115EDFAE5FBAB983FDD403609B46C60A68DD67377EA44C7DA878B972821F6443E04CFC9FD34FBF4E2D0294C3AB8DFA5A1BD464E22808CE713E2D38749FDE69EA5C55556CE64999496AA3E62C7352488B4CCD08FB197C8A0012AE9C07A5B80AEB0F738F515F3610EB10614D01128DCC4F4D1F91656B596CDA9F013F0D83873DCC8E0D6F44857FFBD2D0D133EAE9E6CE0ABA72FFE9A7475532EB58F3E00E0C86F0FF112DCE7C9F530768F7095754CE75011D83EDED3A7748145AA692CAF435F539F455BB2CFCD813B90DA5975E26DC805DA84FD001318BF6379778D18951F7D89E91F7BB647722D3F6F9C7EF765308D597F86CA842B5CA34A75E5DA16EC9FDDE6A42D50861A639E1E1365B735F3A4B366E6C11992E40BCA88D3CA115226B1A9657FE8A8B9FEED9D7E11F0AF898188B982E8F928EBBA1E15F27FBC62EA5A78C177772C432FCFBD9177D22BA1790382675361F879E91A4B05164545259322835FC8D127924C6E0C36FBE388781EEA45AE4476916CDF746EA0E2D1688B69E367F33001247F247EAB769A4CE5D2D4482CDCA0D49A64D011212B985B0865698A7635D289F7016EE5AA9A1846B7E22F699664BD4FC95DE988352DEFC48830656794461F457F60A42D51ED637E8A935FCEBE28BA27E30237AE37C81836A17662646DE2B1D8441B19BFF8E26967F31C92656719800AF1239301D03866EC3FD9AD7E8169B65130F75CE39C3ECE909D5A42AC94EF31562DEF63B0A2D0B6834813DCCE99FC42FFEABCD27C8BCC86271A3CA7B3A502346D28BC2CEC220A666EE6C7BA8705CF2E5FD6FCFE763A53BEF89B77D513E680B98D13DCE70A54C0424FCEDCEE05FE085A101EDFFCF188608425EE5954635A19695AC5BC32EBE2BA1E034D5D2BCE7389A9A6934270B3821E7C90E077FB71322E568D60F11224E6D2FB7754AB17A43EF0B45555B8AA727ACD6001230EFCB1535FF24E591FFB5E7CA2B016B59DE011211AAF0C160FFFCE82ACE16656319F866A56B618A078A0D045B7A2804A7A1427AAF792A58E00ED2BC298A2542B1E7B55915417A926B4A68996787120E5A8DD1829460861B8997C368B27037C8E5C924618CED928AB5364310369FE4C7EC7297C2352B7CC3664C80C0FD276BFCF38C15AD736948EAD05B799980687B053C49B4F1C18B5DEA83128A136ABA59E863C3E7DF54206C8A155FF5D81759B9AE32DB780B5FD5BD7E5E1F9E30EAB2DCD33788CC2C7454CF5DE2CDD803CAFFB89AE04113EAB44D4AC6C27FDC8AB285EAF542C7241330461D57EDCB0D1906AB42D65819698D8187A15A8F1CFBABA7FE8EDA9D2D27819C3C87595EB753B69AFEFBBEE1E14C69112385E3766B1F4CC053D712393FB3FD17140012CC0BADCD3878899CC628932CD3367E7E7D1301129B897E98B7C5218B09930EA77AD22B1CB32790DB7317733FBE1A2885B365A77411B90C4FAA6F17682D175DD65832CEA4FD73785BEADB48FA8CC767DAFB870C88C7848B98E24B65476EC44CA1819BCFCE9A42902422429F2244AAF41F82F50D9DFE9D2A3915E7C6CFCC57A445204C4CE099F1382A6DD3AC18978C4E79E85AEC667BE3995BA013EA21BA933F01F3E3418900BF8B5CB868E1783556E34B6E999AEA7756931EDE350FC4FFFA3D02AD77CCCE2F49487B8DBC58851AD5CA7C3AE15B93C706913D2AF724A2DF0187876CEC951E8C425BAD39A33F2C1965670A378155E5E0EC5B5E5920183B0E4E2186B2BA89D3CBE3D414B78E84792FE7267F6C3A6E53081E1D60337134B1168514151621833857100012F10E25A80BBA615BB5F33D26B8CA82FA64330112C66421956A0D469B9E87D7D8FE9E7165DC72F41417B7A1390C3F79C9A386BD23D5B42B6F2C75520E90280372CCE1E418E8BBF676680D952D0F514BBAF210B719285D7C10D545AC6C55F4D028CE498B5B4D0CD6659AAF476078C7630BC13DE86C6EFE95435F5D6AAA57EA8AE5DBB44F7633E7EBB7AD407DB04DC925C23FAF3DF9ECB302AA61B1F0EE0E818D7305F48C8668C6595C44CB0EA330CCF2ED0B88358D9DA17CD4E79D860603241FABD002A02AEC43EB98DF9034988FCA609CA10059D15CCBFA69FB915B51BAA2C740A968EEBD804AB7602672995C73ABDFEAACA481AF35686D71A47FAEB289787ADB6F510D810E2DDF320C3C7DC82969216089DCE41C5A5F6108454B27341050A4FC858B0DC9E75A001200DB0B404C99F86C3B5D42B64735564F21820112A55DD078F82435B940E8D710CCC16207F814ADDEBADE5FCC6AA3009F551C941ACAB782676A41E4742281C80B6D2170A0422D0C6EA2F846A5CB988E90DC2E89913AF2A5709B110E2058E96BEB8A6EFB95AA5F5249DA61DE44BC5F4A5D06C5F7991816864DE791FCD2C8CD8AB8AFF3C0C3BB5A3149D73420D068D4031CA692721093D51F6E7CD274F31586E1DB7BA9B501CB8146593ED4D1784EE9E8B9944CC5BC19613B7C632480B6E8EF60356C8DD540E452EB4F9AA89B0FE801B510E643A3C1A4432BEF74E54180B45E1AB9EC9A0F54EFD8EE56D8D736520CE2F7A0DA5A2B89A715B21BCAD8020D0F7A23011341E6672F28B73E87CCC77A5FDAAF908942E6CD6803DEF98B2DFC02C9A09B33A0D3EB5BE5940012C626BE3D1658581CCA11AC2586E4A1DB3604011216600BB45808B2D128FC54F69FE07DD92CB4912051103AB1BCCCC9B266B70FD941EA65038EF3FA6AA4F7717C9732E539ABBE8504FC6089938C5B121CE689729D3B936005EE0F616051F8604F77CF7838AD36A2D50FAA1352FCB112B3A93940A6F7E41216B39AFDCCE4DEEE18D095B8CDB51F885700DEAAB2C3AA88B218F6BA4EDE0E2145F4A5C987323D343A2AFEB98478A2FC7C3CF3D1DBA09EF080A4FAB0C103A46E603F4B4E3873D2023A7CE274062D5B41AD4A13AC9C011770723B6E2375DBB76B45B38322D805D21F324C201C66CC3311057C0A91FB243B759DEB7FB4A50829142527ADE24EC0C6A06C816DD091E8BDFB8021485126533ED55EB4351D147835702322F927D1B357F83E305082EC249400121FD1D58C5E587077D430A8DE6E70802B5D8F01124C8E5C93524D2E656CC3169A7CF3D82FA5DE54386A75A272B8611E53C180A80EF7EDA38740A6BBE5748E0BF645C7E8CB1EC678131A9347B19878F60D446B2E62D9C9381B1810A7C465306CCA38EF3A785EED9DE8A28D7927E7F4313AD234B9FEBE3093D1E7D853372CF7A79A8D608645AA308F6306BF1C3AC4317F12532F6B4F300527649CDFF574B6F74D7241C7F250ED49F90CD96F5B9FD9670BC8284792341D4B1F1148C05F5CF67EAE115238A2B66E9AC2F29B69BC08825811F0511D2D4A6D432C51C73FE66179BA028137776CA8EBEBFD2B38B89FBBD97E9792C101F6FB71ED06AFC6BF3162D9BD6F73DC151C1A5DE70D6D79A945B36B09AD5FBE6DBF7EB662AA2BC97C4FDCB07456E2CA77DC174AF200129192A0E830AFC52809646396B9C36033532701127A739C8872EE67EC278A521DDC2F1B2048D0E2276EC9438300A65C5E96A7E39C75B6D377FAEB088866B0B4FE29120328E54CFF7FB0EB0033D23B7BC89EBD823C9CF154A997BA16DAC1AAD86A9F4DA5CFE013DE1484EE87D757DADC95B4EEC833CA1CF682B03B13F0E1E29E8E197B9B89F24DA16B272CA7D4378495F64E8E73E8E29BDAF2A7B07ED4B4CCD82F39D9683BCC0BF4D6452CF968915CD96CBD7CDABA995F76BCD3528863994A59B6EA756E5DB234DF6BE394C36F998A230F34DFB5BBB514B7EB13E1851D183E1D171FADEDEE38E57FA6D2592A788E053FD8E9213F1AF94988DA35E9619D666C96B27C8D0605E0A8C8D9D1ECD5807696828AEF4CDC43E025E6E4B3AF0154540CA7562E2D70BC255300125457D4E19B095DEE79FA7C09950C4C19DDE10112A9CC86C3A626E8E28DAA6024E8CD49D72E3A4FBEBD876A1FEAF7B862527C62B2579C21A0A6882A71F8F684F1517C88488B41F6D136E109172E2B8B723A3378652275528D1694B541C7A581515EEA510574CE8CB10DDE74F6620AD2E5B514967351B76C9211A8DA8F8D7BA9FE287B4C7A15AF7A1D3F175318D3309E3025028A99F1204C8852553AC4DE38F5EC654CB1A8EEE7667610FD76BA8A3F956A261372058E42AE7B9FD0E0C9439647C012D834DEAA3C57213B8223942C29AAA0871338B369A8B41D7D26D76248CEB0A3761F802443AFD002F35433FE05C518F294FC8A31FB49F6074E8DDBEE32D6EB8D39E75EE1043F84F86CA19ECAC9B6E1BF46C59A721B55FCA36FBCFEC20A125F725064C160140000123C69D217ED674E3B554797F0E0724DEBE7D701120AA018834DF5113A5AF68350C9679C0C270C8D2EFEF71D909D4EE4B990DA917EB804111B26917D35EF4199E5E27E62BD485E14F6AA2A0946B394ADC7A8571918D30214F937BF2307BFD29D823D17C30885C1DE4F9BEB421365B3FDDD72187E04887F7749958B031E1BF812FAF6C4D9726787396BFB145B3716DF6BCFB11EB3E4049CDE9190F249647DDA453EE4B2B2C859E963A0047CDB6D2AAA8F8CFF3E49C41943701FD12578FA29C42FEC0EF5F95CD6562EA1DD37DF47146153BFED0261F473AAB36FB17F54AF69D0C59986CC80501EEABDCA7C7C905F6069A4CFB51B12F240130B6214BCFCA22926FFB5BE61EB71E93C2170D856EB493CD293A792FC0A87E03D61387DBDB09B59E428E214B7D8A1767000126AA13F59B1D6ECA90005CA30A42AD66909D2011218D4958502FF0A907757D0BB00612310158BD7BB64D43C49DEA287D9DEF55BFA7E38AACB5275DFC9D8F2C73EEF0D3B678E9BAD7CF41418622CFB2C2BB6B5B564917DC8D4658ABFD786AFF655EE8B73EF2C3C49192793490ECE80A7AEC4F952484473C4AD1058C78195109F8A0F4D16376E745618401FCA058BDE5A22D33621F338E2D560571E7BC9C25DC7F1BB2E6AB83E07A6DC9F894E5D2385F3B46BE56ED76B532E28C7FCD175B06969D39BA655BB798F55F6BF6033DEA954CE31E76E38296D33E2AE33C80A3A847C6EC6BA278053748F2C38843213C9885761FB6F5643E114E7EEE00BF478B16ECB7AD7E2C7821740F1F6C84E2A73A1009F78D54A6F369C87992E1078393AC13EF55657E2BAB062C5340012F4025456633B911D3225A4FC955DFC032A0001126BD3913D18A8C726A201785C7E0CF4C6C4CFBDA4F8D4D6AFA324355BBCCC16E7F4E95CA310DC4A620743C0B8CC5EB181D86642E6B56D41DC0601DB066CE4C02BCC89D3007821E33F238013B6B65414F88ACD85BFA53889EE1DDFD6F7F3556B029699F70C7C45ABA826804C9639B20592C44D7296C7736060B7BBB437AA144CA2ECA25CD5A2EDBB5E05015377BD5E814133DD1E66D1EDE63F2CA7B4C04884FB9D13248397001A2307D2C627AD24EAB19A1D72FF869D437C142A318DD3E182E8FAC55A3DEB9C2AB8D609E5483793A09235B1A1AFB1FA04D63A425FC27EC0F3CC2A845E26D0500BCD18960F81281F1DA9B1487B467C91EC204966AC489DFAFF21D4E3A91478B8C432BA440AC6A0288107FFE5D800126011325DD5C8DDE8B7E5406CFF5D88B1B26B0112A5AFC369EE1D0F50558303781C1F6A299933899174498FBB567754BF80428B9DE5387CA5967A4816C7DB031E91349F844AE9E172C51C27F88E03C91B851250C433BD145394C2AC75543DBE043BE20D8D57FA28AB25D5B75D8F922724CAC5D986D3A94C52BF5995629857063E146C7D38FCE9579E8145AA34C706197968517B150DE9C3E300DE0FB854269D7C045BEFE0B5C91CD2EAF1DD01C12A8E2C9A73813C24615B2DF64DFEC538D82249AD167BB448C23C8964B3A7C184AFE56D311006076124B810DAF53923B6697D2FF8C698D10D4232F8A432EEDC11438E04129BA0E3E7538C857E5AFE9F5D58329E2BB6E1FF59161C4FD549BD4B8797F81B9719F21F74AEA04361B3FA573C54D61E5EF961D031BC0012A6F7DA8C7F503328742DA4624F80416EE9D1011229C6C8C530C90861E078B0C5161A95122B8F697642700BDC7334EAD15EDB445486D2BF62E6AF4A021DEA086C89E9DA4901B8065E468C4DFC95A3EBC2E212FB5C836C5F79866F3BDE97AE10F80DA69927857048748D41ED4344E0D0A2DE8592B2C0931F3658AE9404ABA0FC51A68BCF8C423A848719F690C1580340CCA3032CE3C4A2481AC85A1CF6E46CD5FBD0DD1BBAC10C7B97FF9125AD15538F9A3B1BBBFDDF1D0D5782400C620DFCF86F5DF942C528FF83322B360018B310AB2C376627EC6B22ECB004A7D0D278348181DBA19B903826356B9E51C7C731D7B16D648FC32989E8E5AE01159462BF1268F0F9CCFABDEB1A0A3C905A41CED2A42FD4D5FFA8B5ADFFF35B217AB86480A593AC8D84AA05C5020012BC67FBC84CE515AFA689C36FCEF340E5DDCB011213467762C24DAB88FAB1D74A0691F7D5BE986D9C7B1E5CE6DD369D875505429E2CE46F7944C9C55C472A9A3AB29B4835F001873B7981BDC43421F3460D6FF6015F40B738CBF9B5989052554FEC4A1553DB84B984F476918C0E22BF38A8DF14DB40F5ACEF3F12CF1EE04E383DF3CCD6B80996C9E7CA6A6895824FA390F8CB6C3DA536FE410D32FFDDC5B19B9A126DC62FCC3AB87886707F4D78710FB162A4FA6C75BFC9A20491A1305B13706E84EF1957E09F96643E20AE38C94710FD7977857C046BE27559F868342DF8431F41A2EC0FB86CC30BB6F9F965CCFCFDEE0855BE8E96E7C94CC38D9CFFD68E2F9872C083B7F46AE6FA4D7C28BE3C38AE169BC184B558D4F8C3D829E0B3E0D91F58862C672936560012FCDFA7A7F39BB8B6F1B50FDBECD9819568950112BE21AD69EB40A3A3A8D961DC75FFF06068043E3D01D014563A18F8D3C514ED65735BC917EC5A45DC77DD81E7128D590ACBA397A197E3011E4A92A17FE85423F7357AA9BEB604AEDBCBFC48A6F3C57CB62E467A51EB14E6CFCA697966F3B7DF30EA5ADCA6B48BB0E4CF85015BA861A4E50EF4BA98389BF8E904C4F057609E86930D2E60CF6DC2080BEC131AE7702851160BDB81A96D3871C9D1A62B561ACB0B186E01514555C698C85E5C846637CC61F9414386BDED14202BA707E1C2471AAAE4F762D1DABC5F2DD45BE541F1B55DBB906EABEA86083455DF53678078C186B74A72D335155D9DF97DA1A62271DFC7DA023FB664B09831E15C7E826D0C5B54F0485CC5F7D4095BB8681B6BDA4115CBFF786F70001280E6E3F2FDE93D3E0C435C1C15EA68C5E85401123D1B844C355624127C404AA7655ADB10EF17991DBBCF65252909A21528689766E8D766F2628D3D5B2713B29B7B1512119AFCE5CAFC24B3798C8ACB42180B279BC75852F06391E57750410A59B8DC360E796175B2C12C093144949867708740DE24EB57F78BC5627F880541D852E373AAE749C3C007FCAD5C3D8BDDFE556B5FDF199621702CED0EE907BCDBC69F289D091C0A9EFD3883E0D06CEA372A2122D53D946A5CDDD836BE578B0C029AA685DB8447B3B06D2104655A5BA59DEB1889622015DD9E1A94886EB2C2BA981069ADD5ABEB91B7F1407A88FFD52A6858B0667746CC4C70275586EE61AE7D759BC80134BDB6D57628F234EC5F690254821158387E4ADCABC4EEFE79463ECD71C7CD182528FB73001256DB390D980FDB2357F30DB86981DC3E6F160112B07F340FD598DB366958753202E77A9CED32E3985C0365FA03A599F7D25D0F37C75EBA0C82359BDD6F4DC311EE41B11FE58646D64676C88FD0903824F45962D7F3E6E463D5117864B62150725C40C0A077B51D15F6835124109DF00719F817B6B72200F95CF7439F3B98D2B383FB49277E63FF7D6566734CC20FFCA35A738D7628B309D487EA3E2D3DB58219BF31DF8916AD17D64F03ECEC82155B290B4EFB969196AA862B4B15230974DB5670498B6E911A567A3F89A01E600BAE202C0511B15C88528F6332773F3245032860D4806F9800DFE5694E41CA44A7B6F52CCBE158915693E576F7890EE64271BA181DF2725580DA567EBA906F6210D9A504D93B8BF03A97B93132893FA8243D637F21AF08777E0012154884878ACFF6589FE05D9DA977BF0DCC55011269DF19F221F8D8210C66CDB09EB732F4F18817B0649AE46731F874C88642F2BA25263DABD041E8B8641D18CF300D17B4EBF4A023EC21BF6A79E9DC98C16CA0E101F1A73EAE4E1EBDDAD624B4D16E61339A0EB782A8DAF16E0DAA4ABEA7786B11C8EDA05948A21ADDBA4A88B319156738EFED56FF29BF5E0537A47EF760495DF61BECA2C5CD3C71622A5DA18BA68C94DA1247A3D6EE9CB3867CFACF658C018B76EE5B6980476F2D7C6FDC0B6E1ED70A0A7E8094FB1A257C72473F6A66329293E55C1E5D4F76B60CDE6E6DC478B2A9D7979AAF3B41D2AFA405780D500221E323DB9853216C0A157FD4199C4A0B6527A80DC636135E5EE34F896E8BD0F0E7CC0987D8003C0566135CE6FFBFFA957ABB06A314AA00C28DA11B816B659FBD62E71F2AEA688022F32EDCBEF79F190FC1FF3974DA107250A0B126C6B5972622236DF9201BF10AA1A1E67E6C05BD84CC12D0B5F8088B52332DAC7D6F0B9369E50F64F0C985E6406AA0B6959EBB0BE593589E1CB358844B3A7C822ACFD074AD55C2C05E7B8043314C42EF3BDD791591DAC9337632D472E0A57A4283AEA9D6F48CC4AAABB9B62A9BC27FA5670C37CA5F932A25EC81C1D8F949510AEAF020F89CC923EA135EA08278A16F17AB6EC5612FE41303D18357CE0367C784 \ No newline at end of file diff --git a/fs/yaffs2/yaffs_guts.c b/fs/yaffs2/yaffs_guts.c index 968223eb..eec1b481 100644 --- a/fs/yaffs2/yaffs_guts.c +++ b/fs/yaffs2/yaffs_guts.c @@ -6337,6 +6337,14 @@ static int yaffs_ScanBackwards(yaffs_Device *dev) blk, c)); dev->nFreeChunks++; + } else if (tags.chunkId > YAFFS_MAX_CHUNK_ID || + (tags.chunkId > 0 && tags.byteCount > dev->nDataBytesPerChunk) || + tags.sequenceNumber != bi->sequenceNumber ) { + + printk(KERN_ERR "[MyTag]Chunk (%d:%d) with bad tags:obj = %d, chunkId = %d, byteCount = %d, ignored", + blk, c, tags.objectId, tags.chunkId, tags.byteCount); + + dev->nFreeChunks++; } else if (tags.chunkId > 0) { /* chunkId > 0 so it is a data chunk... */ @@ -7545,8 +7553,14 @@ int yaffs_GutsInitialise(yaffs_Device *dev) if (!init_failed && !yaffs_CreateInitialDirectories(dev)) init_failed = 1; - if (!init_failed && !yaffs_ScanBackwards(dev)) - init_failed = 1; + if (!init_failed && !yaffs_ScanBackwards(dev)) { + printk(KERN_ERR "[MyTag]yaffs_ScanBackwards failed, using yaffs_Scan...\n"); + + if (!yaffs_Scan(dev)) { + printk(KERN_ERR "[MyTag]yaffs_Scan failed...\n"); + init_failed = 1; + } + } } } else if (!yaffs_Scan(dev)) init_failed = 1; diff --git a/include/linux/atmel_qt602240.h b/include/linux/atmel_qt602240.h index 39f2dd35..5550e137 100644 --- a/include/linux/atmel_qt602240.h +++ b/include/linux/atmel_qt602240.h @@ -2,7 +2,10 @@ #define _LINUX_ATMEL_H #define ATMEL_QT602240_NAME "atmel_qt602240" - +#if defined(CONFIG_MACH_BLUETICK)||defined(CONFIG_MACH_BLADE2)||defined(CONFIG_MACH_SKATE)||defined(CONFIG_MACH_ROAMER)\ + ||defined(CONFIG_MACH_SAILBOAT) +#define CONFIG_TS_NOTIFIER //huangjinyu add 20110720 +#endif #define RESERVED_T0 0u #define RESERVED_T1 1u #define DEBUG_DELTAS_T2 2u @@ -36,7 +39,10 @@ #define SPT_GATE_T30 30u #define TOUCH_KEYSET_T31 31u #define TOUCH_XSLIDERSET_T32 32u +#define NEW_CAL_T35 35u #define DIAGNOSTIC_T37 37u +#define NEW_CAL_T59 59u + struct info_id_t { uint8_t family_id; uint8_t variant_id; @@ -86,8 +92,8 @@ struct atmel_i2c_platform_data { int8_t config_T6[6]; int8_t config_T38[8]; int8_t config_T7[3]; - int8_t config_T8[10];//adjust the frameware 2.0 huangjinyu changed @20110707 - int8_t config_T9[32];//adjust the frameware 2.0 huangjinyu changed @20110707 + int8_t config_T8[10];//adjust the firmware 2.0 huangjinyu changed @20110707 + int8_t config_T9[32];//adjust the firmware 2.0 huangjinyu changed @20110707 int8_t config_T15[11]; int8_t config_T18[2]; int8_t config_T19[16]; @@ -98,6 +104,13 @@ struct atmel_i2c_platform_data { int8_t config_T25[14]; int8_t config_T27[7]; int8_t config_T28[6]; + int8_t config_T35[5]; + int8_t config_T59[6]; + +#ifdef CONFIG_TS_NOTIFIER + int8_t config_T9_charge[4]; + int8_t config_T28_charge[2]; +#endif uint8_t object_crc[3]; int8_t cable_config[4]; int8_t cable_config_T7[3]; @@ -116,8 +129,17 @@ struct atmel_config_data { int8_t *config_T7; int8_t *config_T8; int8_t *config_T9; + int8_t *config_T20; int8_t *config_T22; int8_t *config_T28; + int8_t *config_T35; + int8_t *config_T59; + +#ifdef CONFIG_TS_NOTIFIER + int8_t *config_T9_charge; + int8_t *config_T28_charge; +#endif + }; #endif diff --git a/include/linux/i2c/PS_ALS_common.h b/include/linux/i2c/PS_ALS_common.h new file mode 100644 index 00000000..a2ac813b --- /dev/null +++ b/include/linux/i2c/PS_ALS_common.h @@ -0,0 +1,60 @@ +/****************************************************************************** + * PS_ALS29026.h - Linux kernel module for Intersil PS_ALS29028 ambient light sensor + * and proximity sensor + * + * Copyright 2008-2010 Intersil Inc.. + * + ********************************************************/ + +#ifndef __PS_ALS_common_H__ +#define __PS_ALS_common_H__ + +// ioctl numbers +#define PS_ALS_IOCTL_MAGIC 0XCF +#define PS_ALS_IOCTL_ALS_ON _IO(PS_ALS_IOCTL_MAGIC, 1) +#define PS_ALS_IOCTL_ALS_OFF _IO(PS_ALS_IOCTL_MAGIC, 2) +#define PS_ALS_IOCTL_ALS_DATA _IOR(PS_ALS_IOCTL_MAGIC, 3, short) +#define PS_ALS_IOCTL_ALS_CALIBRATE _IO(PS_ALS_IOCTL_MAGIC, 4) +#define PS_ALS_IOCTL_CONFIG_GET _IOR(PS_ALS_IOCTL_MAGIC, 5, struct PS_ALS_cfg) +#define PS_ALS_IOCTL_CONFIG_SET _IOW(PS_ALS_IOCTL_MAGIC, 6, struct PS_ALS_cfg) +#define PS_ALS_IOCTL_PROX_ON _IO(PS_ALS_IOCTL_MAGIC, 7) +#define PS_ALS_IOCTL_PROX_OFF _IO(PS_ALS_IOCTL_MAGIC, 8) +#define PS_ALS_IOCTL_PROX_DATA _IOR(PS_ALS_IOCTL_MAGIC, 9, struct PS_ALS_prox_info) +#define PS_ALS_IOCTL_PROX_EVENT _IO(PS_ALS_IOCTL_MAGIC, 10) +#define PS_ALS_IOCTL_PROX_CALIBRATE _IO(PS_ALS_IOCTL_MAGIC, 11) +#define PS_ALS_IOCTL_PROX_GET_ENABLED _IOR(PS_ALS_IOCTL_MAGIC, 12, int*) +#define PS_ALS_IOCTL_ALS_GET_ENABLED _IOR(PS_ALS_IOCTL_MAGIC, 13, int*) +// +//#define u32 unsigned int +//#define u16 unsigned short +//#define u8 unsigned char + +// device configuration +struct PS_ALS_cfg { + u32 calibrate_target; + u16 als_time; + u16 scale_factor; + u16 gain_trim; + u8 filter_history; + u8 filter_count; + u8 gain; + u16 prox_threshold_hi; + u16 prox_threshold_lo; + u8 prox_int_time; + u8 prox_adc_time; + u8 prox_wait_time; + u8 prox_intr_filter; + u8 prox_config; + u8 prox_pulse_cnt; + u8 prox_gain; +}; + +// proximity data +struct PS_ALS_prox_info { + u16 prox_clear; + u16 prox_data; + int prox_event; +}; + +#endif + diff --git a/include/linux/i2c/isl29026.h b/include/linux/i2c/isl29026.h new file mode 100644 index 00000000..32fc2d27 --- /dev/null +++ b/include/linux/i2c/isl29026.h @@ -0,0 +1,60 @@ +/****************************************************************************** + * isl29026.h - Linux kernel module for Intersil ISL29028 ambient light sensor + * and proximity sensor + * + * Copyright 2008-2010 Intersil Inc.. + * + ********************************************************/ + +#ifndef __ISL29026_H__ +#define __ISL29026_H__ + +// ioctl numbers +#define ISL_IOCTL_MAGIC 0XCF +#define ISL_IOCTL_ALS_ON _IO(ISL_IOCTL_MAGIC, 1) +#define ISL_IOCTL_ALS_OFF _IO(ISL_IOCTL_MAGIC, 2) +#define ISL_IOCTL_ALS_DATA _IOR(ISL_IOCTL_MAGIC, 3, short) +#define ISL_IOCTL_ALS_CALIBRATE _IO(ISL_IOCTL_MAGIC, 4) +#define ISL_IOCTL_CONFIG_GET _IOR(ISL_IOCTL_MAGIC, 5, struct ISL_cfg) +#define ISL_IOCTL_CONFIG_SET _IOW(ISL_IOCTL_MAGIC, 6, struct ISL_cfg) +#define ISL_IOCTL_PROX_ON _IO(ISL_IOCTL_MAGIC, 7) +#define ISL_IOCTL_PROX_OFF _IO(ISL_IOCTL_MAGIC, 8) +#define ISL_IOCTL_PROX_DATA _IOR(ISL_IOCTL_MAGIC, 9, struct ISL_prox_info) +#define ISL_IOCTL_PROX_EVENT _IO(ISL_IOCTL_MAGIC, 10) +#define ISL_IOCTL_PROX_CALIBRATE _IO(ISL_IOCTL_MAGIC, 11) +#define ISL_IOCTL_PROX_GET_ENABLED _IOR(ISL_IOCTL_MAGIC, 12, int*) +#define ISL_IOCTL_ALS_GET_ENABLED _IOR(ISL_IOCTL_MAGIC, 13, int*) +// +//#define u32 unsigned int +//#define u16 unsigned short +//#define u8 unsigned char + +// device configuration +struct ISL_cfg { + u32 calibrate_target; + u16 als_time; + u16 scale_factor; + u16 gain_trim; + u8 filter_history; + u8 filter_count; + u8 gain; + u16 prox_threshold_hi; + u16 prox_threshold_lo; + u8 prox_int_time; + u8 prox_adc_time; + u8 prox_wait_time; + u8 prox_intr_filter; + u8 prox_config; + u8 prox_pulse_cnt; + u8 prox_gain; +}; + +// proximity data +struct ISL_prox_info { + u16 prox_clear; + u16 prox_data; + int prox_event; +}; + +#endif + diff --git a/include/linux/input/SynaUpgrade.h b/include/linux/input/SynaUpgrade.h index 83939af3..3d7e6d74 100644 --- a/include/linux/input/SynaUpgrade.h +++ b/include/linux/input/SynaUpgrade.h @@ -3631,5 +3631,3642 @@ /*70e0:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*70f0:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd5, 0xfc, 0x1f, 0x39, /*7100:*/ 0xFF }; + +#elif defined(CONFIG_MACH_BLADE2) && defined(CONFIG_TOUCHSCREEN_VIRTUAL_KEYS) +// 736E +#define PDT_P00_F34_FLASH_QUERY_BASE_ADDR 0xE9 +#define PDT_P00_F01_FLASH_QUERY_BASE_ADDR 0xE3 + +// This is Synaptics Image File Data - Auto-Generated - DO NOT EDIT!!! + +const unsigned char SynaFirmware[] = { +/*0000:*/ 0x0e, 0x57, 0x13, 0xc4, 0x00, 0x00, 0x00, 0x03, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +/*0010:*/ 0x54, 0x4d, 0x31, 0x39, 0x38, 0x38, 0x2d, 0x30, 0x30, 0x31, 0x00, 0x00, 0x00, 0x00, 0x01, 0x65, +/*0020:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*0030:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*0040:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*0050:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*0060:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*0070:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*0080:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*0090:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*00a0:*/ 0x49, 0x32, 0x43, 0x00, 0x0e, 0x00, 0xff, 0x00, 0x0c, 0x0d, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, +/*00b0:*/ 0x49, 0x32, 0x43, 0x00, 0x0e, 0x00, 0xff, 0x00, 0x0c, 0x0d, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, +/*00c0:*/ 0x29, 0x0c, 0x09, 0xaa, 0x33, 0x44, 0x1e, 0xb4, 0xa7, 0xa0, 0x1b, 0x49, 0x98, 0xf1, 0x8d, 0x95, +/*00d0:*/ 0x68, 0xb4, 0xa4, 0x70, 0xf2, 0x56, 0xf3, 0x34, 0xda, 0x52, 0x89, 0x65, 0x50, 0xc5, 0xff, 0x8c, +/*00e0:*/ 0x96, 0x20, 0xa2, 0x9f, 0xb3, 0xc6, 0x59, 0x11, 0x83, 0x78, 0xd4, 0x4c, 0xe2, 0xb3, 0xe5, 0x0a, +/*00f0:*/ 0x81, 0x4f, 0x4d, 0x5e, 0x3a, 0xf1, 0xc7, 0x2d, 0x0e, 0xeb, 0x21, 0x02, 0xe9, 0xfc, 0xc4, 0x11, +/*0100:*/ 0x61, 0x36, 0x61, 0x5b, 0xa9, 0x01, 0xa4, 0x53, 0xdf, 0xef, 0xe3, 0xbd, 0x07, 0xf4, 0x6a, 0xff, +/*0110:*/ 0x08, 0x6a, 0xf5, 0x04, 0x2d, 0x4c, 0xe8, 0xef, 0x3a, 0x5a, 0x57, 0x02, 0x88, 0xc8, 0xb6, 0xf1, +/*0120:*/ 0x55, 0xeb, 0x47, 0xbe, 0x1b, 0xc4, 0xde, 0xd2, 0xd3, 0x4d, 0xae, 0x65, 0x9c, 0x4d, 0x55, 0x48, +/*0130:*/ 0x79, 0xfd, 0xf8, 0x59, 0x48, 0x17, 0x82, 0x2d, 0x0b, 0xb4, 0x35, 0x3a, 0x14, 0xb9, 0xfd, 0x8f, +/*0140:*/ 0x2b, 0x74, 0x69, 0x44, 0xfa, 0xb0, 0x7a, 0x00, 0x16, 0x30, 0x36, 0x0e, 0xde, 0x08, 0xd7, 0x38, +/*0150:*/ 0x41, 0xcd, 0xe7, 0x9f, 0x4f, 0xf5, 0x50, 0x14, 0xd1, 0xd5, 0xec, 0xcc, 0x43, 0x95, 0xf4, 0x57, +/*0160:*/ 0x1e, 0xf8, 0x0b, 0x8f, 0x3e, 0x50, 0x71, 0x6d, 0x9e, 0x27, 0x35, 0x51, 0xae, 0xc5, 0x1e, 0xed, +/*0170:*/ 0x87, 0x52, 0x14, 0xd6, 0x9a, 0x05, 0x58, 0x0d, 0x82, 0x9d, 0x90, 0x60, 0xcd, 0x31, 0x8e, 0x4b, +/*0180:*/ 0x0b, 0x51, 0x18, 0x85, 0xea, 0x01, 0x83, 0xbe, 0x5f, 0x95, 0xcb, 0xda, 0x12, 0x0d, 0xc7, 0x6d, +/*0190:*/ 0x89, 0xf4, 0xcc, 0x6b, 0x2c, 0x0d, 0xbf, 0xeb, 0x69, 0xd9, 0xf9, 0xc6, 0xcc, 0xd8, 0xc6, 0xc2, +/*01a0:*/ 0x5b, 0xe5, 0xe9, 0xfa, 0xdc, 0x5c, 0x7a, 0xed, 0xf0, 0x07, 0x55, 0x43, 0x10, 0x1d, 0x22, 0x12, +/*01b0:*/ 0xc1, 0xa3, 0x82, 0xc9, 0x09, 0xfa, 0x04, 0x84, 0x2b, 0x15, 0xaf, 0x13, 0x9f, 0x74, 0x57, 0x40, +/*01c0:*/ 0xa3, 0x91, 0xad, 0x30, 0xb0, 0x99, 0xff, 0x62, 0x49, 0x1d, 0xc4, 0x2d, 0x78, 0x5e, 0x17, 0xf2, +/*01d0:*/ 0x26, 0x4d, 0x7d, 0x9b, 0x39, 0x07, 0x16, 0x3d, 0x10, 0xac, 0xb0, 0x28, 0x14, 0x40, 0xf0, 0x8f, +/*01e0:*/ 0x5d, 0x3c, 0x21, 0xf9, 0x6c, 0x21, 0x8f, 0x3b, 0x3c, 0x07, 0x6d, 0x0c, 0xc5, 0x96, 0xa5, 0xe6, +/*01f0:*/ 0x84, 0x14, 0x60, 0xba, 0xfe, 0x6e, 0xff, 0xd7, 0xfc, 0xf7, 0x8d, 0x2b, 0xc8, 0x28, 0x43, 0x52, +/*0200:*/ 0xfb, 0xa6, 0x03, 0xd0, 0xde, 0xb1, 0x71, 0x1b, 0x9a, 0x93, 0x0a, 0xd6, 0xae, 0xdf, 0x85, 0xd0, +/*0210:*/ 0xbc, 0x1e, 0x53, 0x2d, 0x29, 0xb5, 0x93, 0xee, 0x2b, 0xd2, 0xd1, 0xa7, 0x5c, 0xef, 0xd6, 0xee, +/*0220:*/ 0xd0, 0xfe, 0x79, 0x42, 0xd3, 0x6d, 0x50, 0x3b, 0x16, 0x70, 0x6b, 0xa7, 0x7d, 0x09, 0x43, 0xba, +/*0230:*/ 0xf9, 0x0e, 0x24, 0xb7, 0xbb, 0x05, 0x19, 0x93, 0xfe, 0x19, 0x24, 0x32, 0x3e, 0xf0, 0x79, 0x44, +/*0240:*/ 0x6c, 0x41, 0xf2, 0xc4, 0xcf, 0xb6, 0x2a, 0x86, 0xb0, 0x4d, 0x08, 0xfd, 0xb7, 0x7e, 0x6c, 0x6c, +/*0250:*/ 0xa2, 0x35, 0x5f, 0xe7, 0x20, 0xae, 0xe9, 0x67, 0x47, 0xf2, 0xac, 0xc1, 0xc8, 0xc0, 0x4c, 0xcc, +/*0260:*/ 0xe0, 0xdc, 0x17, 0x07, 0x2f, 0xcc, 0xa0, 0x0d, 0xd0, 0x3c, 0x12, 0xe7, 0x3a, 0xd8, 0x9f, 0xaa, +/*0270:*/ 0x2d, 0x80, 0x82, 0xf6, 0x02, 0x1f, 0xad, 0xa8, 0x0f, 0x21, 0x7e, 0x35, 0x0d, 0xe9, 0x6a, 0x16, +/*0280:*/ 0xd4, 0x79, 0xb8, 0xd8, 0x85, 0xf0, 0x82, 0xa9, 0x3f, 0x36, 0xeb, 0xf5, 0xcc, 0x41, 0x19, 0x6b, +/*0290:*/ 0x39, 0x84, 0x56, 0x10, 0xb2, 0x45, 0x3d, 0xf7, 0x8d, 0x93, 0xcf, 0xd9, 0x2d, 0xe6, 0x96, 0xd7, +/*02a0:*/ 0xc0, 0x79, 0x78, 0x3c, 0x45, 0xcc, 0x77, 0x88, 0x24, 0xff, 0x8c, 0xac, 0x8c, 0x30, 0x22, 0xb0, +/*02b0:*/ 0xa0, 0x4e, 0x22, 0xb5, 0x16, 0x62, 0xb1, 0x08, 0x51, 0x55, 0xeb, 0x16, 0xcc, 0xcd, 0x94, 0xf5, +/*02c0:*/ 0x1f, 0x24, 0xdc, 0x74, 0x81, 0xbf, 0xce, 0x5e, 0xf2, 0x4a, 0x82, 0x94, 0x99, 0xa7, 0x57, 0x3c, +/*02d0:*/ 0xba, 0x27, 0xf2, 0xbb, 0x21, 0x80, 0x9f, 0x6c, 0x5a, 0x3f, 0xf7, 0x2c, 0x01, 0x00, 0x24, 0xcf, +/*02e0:*/ 0x57, 0x89, 0xdc, 0xe4, 0xe3, 0x9b, 0xe9, 0xc6, 0x2f, 0x44, 0xcc, 0x6c, 0x26, 0x12, 0x87, 0xbf, +/*02f0:*/ 0x18, 0x90, 0x13, 0xf2, 0x58, 0x55, 0x24, 0x6d, 0x65, 0x9f, 0x26, 0xaf, 0xbf, 0x49, 0x82, 0x16, +/*0300:*/ 0x14, 0x7f, 0xd4, 0x3e, 0xf4, 0x52, 0xee, 0xc1, 0x8e, 0x2b, 0x9f, 0x42, 0x8b, 0xf8, 0x82, 0x6b, +/*0310:*/ 0xa4, 0xfe, 0xf7, 0x72, 0x9e, 0xe8, 0xd5, 0x6f, 0x63, 0xa8, 0xdd, 0xcf, 0x0b, 0xaa, 0x79, 0x56, +/*0320:*/ 0xf4, 0xc0, 0x49, 0x1d, 0x6c, 0xd0, 0x71, 0xb3, 0x5c, 0x1d, 0x15, 0x51, 0x93, 0x8d, 0x79, 0x99, +/*0330:*/ 0xbb, 0x46, 0xcd, 0x4f, 0xba, 0x5b, 0x9c, 0x2f, 0x6d, 0xbb, 0x88, 0x46, 0x54, 0x44, 0xdd, 0x27, +/*0340:*/ 0x32, 0xac, 0x95, 0x1e, 0xaa, 0xdf, 0xfe, 0x80, 0xc1, 0xd9, 0xcb, 0x8c, 0x12, 0xc1, 0x5c, 0x06, +/*0350:*/ 0x26, 0x8a, 0xbb, 0x8f, 0x1b, 0xfd, 0x12, 0x26, 0xa5, 0x48, 0x4b, 0x93, 0x3c, 0xb7, 0xce, 0x80, +/*0360:*/ 0xf1, 0x89, 0xdd, 0xfb, 0x14, 0x7f, 0x61, 0xb4, 0xc4, 0x8b, 0x92, 0xb8, 0xff, 0xfa, 0x31, 0x48, +/*0370:*/ 0xe4, 0x0a, 0xd8, 0x47, 0x6a, 0xe6, 0x34, 0xa2, 0x3a, 0x3f, 0x80, 0x8a, 0x06, 0xc4, 0x41, 0x36, +/*0380:*/ 0x91, 0xf2, 0x94, 0x52, 0x54, 0x05, 0x3a, 0x74, 0xe0, 0xc7, 0x7f, 0x4d, 0x87, 0xe7, 0xe1, 0x80, +/*0390:*/ 0x8f, 0xfd, 0x8c, 0x17, 0x3d, 0xe7, 0x53, 0x1d, 0x59, 0xc6, 0x40, 0x5b, 0x61, 0x96, 0x36, 0x9b, +/*03a0:*/ 0xc0, 0x23, 0x06, 0x45, 0x0a, 0x52, 0x32, 0x53, 0x37, 0x9e, 0xe3, 0x31, 0x80, 0x20, 0xa7, 0x82, +/*03b0:*/ 0xbc, 0xb3, 0xa8, 0x8c, 0x1d, 0x10, 0x87, 0xbd, 0xab, 0x73, 0x55, 0xe1, 0x70, 0x21, 0xbf, 0xe7, +/*03c0:*/ 0xe7, 0x01, 0x70, 0x4a, 0x32, 0x88, 0x2f, 0x1b, 0xd0, 0xa4, 0x97, 0x6f, 0x78, 0x2d, 0xe2, 0x8c, +/*03d0:*/ 0xd6, 0x11, 0xff, 0x2a, 0xec, 0x2d, 0xc0, 0xe6, 0x29, 0x41, 0x3a, 0xe5, 0xca, 0xe4, 0xe4, 0x79, +/*03e0:*/ 0x6e, 0x46, 0xd7, 0xdb, 0x32, 0x94, 0x51, 0xcf, 0x98, 0xc7, 0x68, 0x15, 0xa0, 0x95, 0x7f, 0x31, +/*03f0:*/ 0x63, 0x7d, 0x6f, 0x22, 0xa9, 0xf2, 0x12, 0xee, 0x31, 0x4c, 0x07, 0xd5, 0x2d, 0x5e, 0x39, 0x3b, +/*0400:*/ 0xb9, 0xb4, 0xc8, 0x2e, 0xa8, 0x6c, 0xcc, 0x9b, 0x3a, 0x56, 0xf5, 0x5c, 0x4f, 0x2f, 0x28, 0x02, +/*0410:*/ 0x10, 0xd2, 0xd2, 0x5e, 0xe6, 0xdc, 0xe5, 0x50, 0xa9, 0xd7, 0x56, 0x88, 0xf9, 0x99, 0x09, 0xbf, +/*0420:*/ 0xb3, 0x4f, 0x36, 0xd7, 0xdc, 0x79, 0xe3, 0xbd, 0x06, 0x5e, 0x00, 0xcd, 0x90, 0xee, 0xd1, 0xdc, +/*0430:*/ 0x38, 0x07, 0x8d, 0x17, 0x42, 0xfd, 0x54, 0xa9, 0x4c, 0x3d, 0x29, 0x35, 0x5f, 0xea, 0x2d, 0x0a, +/*0440:*/ 0x58, 0xc3, 0xb7, 0xdf, 0x6f, 0x19, 0x69, 0x8d, 0x9e, 0x6a, 0x15, 0x45, 0xb7, 0x30, 0x55, 0x70, +/*0450:*/ 0x98, 0x2f, 0x85, 0x01, 0x48, 0x2d, 0x78, 0xec, 0x09, 0x15, 0x2e, 0xf0, 0x0a, 0x50, 0xb4, 0x1a, +/*0460:*/ 0x7f, 0x7a, 0xca, 0x39, 0xf4, 0xf3, 0x43, 0xe8, 0xb7, 0x6f, 0xf3, 0x64, 0x9b, 0x50, 0xc0, 0x59, +/*0470:*/ 0xb3, 0x9a, 0x59, 0x6a, 0x92, 0x3f, 0x0a, 0x74, 0x6f, 0x77, 0x79, 0x13, 0x40, 0x20, 0xdf, 0x7a, +/*0480:*/ 0x6c, 0x32, 0x79, 0x98, 0x94, 0x81, 0x3f, 0x84, 0x49, 0x8c, 0x8f, 0x9e, 0x59, 0x12, 0xc0, 0xef, +/*0490:*/ 0xff, 0x0c, 0xaa, 0x24, 0xd9, 0xc4, 0xfa, 0x9d, 0xd2, 0x91, 0xcd, 0x0d, 0x10, 0xf8, 0x69, 0x77, +/*04a0:*/ 0x8a, 0xeb, 0x99, 0x8c, 0x09, 0x6c, 0x4b, 0xad, 0xd9, 0xab, 0xaa, 0xd0, 0xd3, 0x61, 0x83, 0xab, +/*04b0:*/ 0x1c, 0xac, 0x2b, 0xfe, 0x26, 0xc7, 0xfd, 0xd5, 0xc9, 0x1d, 0x1a, 0xcb, 0x43, 0xd4, 0x0e, 0x4e, +/*04c0:*/ 0x41, 0x43, 0x2f, 0x48, 0x91, 0xf5, 0xa2, 0x9f, 0xfb, 0x65, 0x25, 0x88, 0xaa, 0x45, 0x36, 0xb4, +/*04d0:*/ 0x26, 0x64, 0xb1, 0xd2, 0x5e, 0xae, 0xb9, 0x21, 0x87, 0x72, 0x21, 0xac, 0x0c, 0xc8, 0x57, 0x3a, +/*04e0:*/ 0xd2, 0x1a, 0xf6, 0xfd, 0xc1, 0x38, 0xd1, 0x94, 0x79, 0x75, 0x1b, 0x67, 0x27, 0x28, 0x40, 0xdd, +/*04f0:*/ 0x98, 0x5d, 0x74, 0x93, 0xdf, 0x05, 0xa4, 0x11, 0x7e, 0xef, 0xc7, 0x0c, 0xe4, 0xfb, 0x66, 0x4a, +/*0500:*/ 0x77, 0xca, 0x64, 0x83, 0x6d, 0x2f, 0x84, 0xc1, 0x62, 0xff, 0xb4, 0x0a, 0xe7, 0xef, 0x6f, 0x14, +/*0510:*/ 0x3a, 0xe7, 0xd7, 0x01, 0x7a, 0xf1, 0x8d, 0xac, 0x0e, 0xe8, 0x6c, 0x79, 0x81, 0xed, 0xd9, 0x90, +/*0520:*/ 0xc1, 0xe8, 0xa7, 0xbe, 0xda, 0x61, 0xaa, 0x8c, 0x62, 0xe7, 0xdf, 0x2f, 0x80, 0x8b, 0xb5, 0x9d, +/*0530:*/ 0x5a, 0xf6, 0xce, 0x22, 0xcd, 0xb0, 0x45, 0xe7, 0x45, 0xdb, 0x81, 0xc2, 0x74, 0x00, 0x54, 0xe3, +/*0540:*/ 0xd9, 0x7a, 0x6c, 0x2e, 0xb3, 0x75, 0x55, 0x5b, 0xe6, 0xfc, 0x90, 0xf5, 0x6a, 0x46, 0x39, 0x2a, +/*0550:*/ 0xce, 0x0e, 0x2c, 0xa1, 0xa9, 0xaa, 0xb1, 0xf9, 0x3b, 0xf3, 0x09, 0xf2, 0xa0, 0x0e, 0x91, 0xa6, +/*0560:*/ 0x24, 0x4b, 0x70, 0x46, 0x2e, 0xec, 0x42, 0x39, 0x9f, 0xa0, 0x83, 0x0c, 0xfb, 0x1f, 0x61, 0x6d, +/*0570:*/ 0x19, 0x4d, 0x2e, 0xee, 0xd7, 0xfd, 0x23, 0x0a, 0xf8, 0x81, 0x2d, 0xf1, 0xf7, 0x52, 0x78, 0xaf, +/*0580:*/ 0xcc, 0xaf, 0x84, 0x65, 0x58, 0xba, 0x21, 0x7c, 0xd5, 0xc7, 0xb7, 0x0d, 0xc3, 0xe0, 0x4a, 0x7d, +/*0590:*/ 0xdb, 0x03, 0x3c, 0x2a, 0x86, 0x4b, 0xa7, 0x0a, 0x35, 0x04, 0x9b, 0x2c, 0x7e, 0xa4, 0xc8, 0xeb, +/*05a0:*/ 0x1c, 0xbe, 0x89, 0x30, 0xf9, 0x47, 0x79, 0xe0, 0x92, 0x87, 0x57, 0x39, 0x1f, 0xf7, 0x0d, 0x58, +/*05b0:*/ 0xfd, 0x51, 0x5a, 0xc0, 0xc8, 0x8a, 0x40, 0xa1, 0x7c, 0xe8, 0x48, 0xd5, 0xec, 0xb3, 0xd4, 0x4b, +/*05c0:*/ 0x4c, 0x7a, 0x1c, 0x69, 0x45, 0xb8, 0x73, 0x78, 0xb3, 0xf4, 0xb4, 0x83, 0xe4, 0x80, 0x38, 0xd3, +/*05d0:*/ 0x18, 0xcf, 0x67, 0x14, 0x58, 0x25, 0xa9, 0xd3, 0x80, 0xd7, 0xf6, 0xe4, 0xae, 0x9e, 0x8d, 0x18, +/*05e0:*/ 0x00, 0x9c, 0x56, 0xa5, 0xe3, 0x86, 0xfc, 0x13, 0xe8, 0x1f, 0x67, 0x8f, 0x53, 0x8f, 0x59, 0xa4, +/*05f0:*/ 0x5e, 0x39, 0xc5, 0x05, 0x70, 0x83, 0xc8, 0x47, 0xe3, 0x04, 0x1d, 0x28, 0x08, 0xe8, 0xc5, 0xbe, +/*0600:*/ 0x04, 0x03, 0x5c, 0x00, 0xb1, 0x5d, 0xb3, 0xcc, 0x69, 0x8c, 0x0e, 0xdc, 0x52, 0x68, 0x47, 0xf4, +/*0610:*/ 0x5c, 0x96, 0x7e, 0xa6, 0xff, 0x83, 0xcf, 0xfc, 0x7b, 0x93, 0xc0, 0x0b, 0xf8, 0x02, 0xb2, 0x7c, +/*0620:*/ 0xb4, 0x4c, 0x6c, 0x2f, 0x05, 0x02, 0x5f, 0x09, 0x2d, 0x8a, 0x6f, 0x8e, 0xf3, 0x78, 0x04, 0x6f, +/*0630:*/ 0x15, 0x3f, 0xf5, 0xd0, 0x85, 0xfa, 0x7c, 0xe0, 0x76, 0x11, 0xab, 0xbd, 0x9f, 0x1c, 0xc9, 0xcc, +/*0640:*/ 0xd3, 0x45, 0xca, 0xc7, 0xb8, 0x38, 0x91, 0x69, 0x11, 0xb9, 0x5d, 0xcd, 0xe2, 0xf6, 0xac, 0x05, +/*0650:*/ 0x05, 0x5b, 0xdf, 0xb2, 0xd7, 0x5d, 0x3b, 0x6c, 0xb7, 0x56, 0xda, 0x21, 0x55, 0xf1, 0xa3, 0xb7, +/*0660:*/ 0x9e, 0x8a, 0xe7, 0x59, 0xd5, 0xf6, 0x96, 0x69, 0xd4, 0x51, 0x3f, 0xed, 0x82, 0xc5, 0x6d, 0x81, +/*0670:*/ 0xf6, 0xa5, 0x6f, 0xc1, 0xa2, 0x29, 0x29, 0x9f, 0xe0, 0x14, 0xb5, 0xb5, 0xa3, 0x0c, 0xe3, 0xc0, +/*0680:*/ 0xab, 0xbc, 0x2c, 0x9b, 0xdd, 0x90, 0x69, 0xaa, 0xe5, 0xbf, 0x3c, 0x46, 0xa4, 0xe4, 0x0f, 0x9a, +/*0690:*/ 0x8b, 0x9f, 0x18, 0x90, 0xaf, 0x99, 0x40, 0x19, 0x25, 0xb5, 0x4b, 0xaf, 0xe2, 0x3d, 0x30, 0xc3, +/*06a0:*/ 0x5b, 0xdb, 0xf3, 0xe2, 0xdb, 0xd0, 0xb0, 0x82, 0x08, 0xfa, 0x86, 0x5e, 0x71, 0xcd, 0x55, 0x8e, +/*06b0:*/ 0xe3, 0x21, 0xc2, 0xa7, 0xe7, 0xcd, 0xa3, 0xaa, 0x5a, 0xbd, 0x2c, 0x67, 0x8e, 0xf0, 0xcb, 0xf3, +/*06c0:*/ 0x90, 0x9d, 0x35, 0x64, 0xeb, 0x14, 0x62, 0xcd, 0xdc, 0x75, 0x1b, 0x73, 0x65, 0x55, 0x31, 0x46, +/*06d0:*/ 0xb9, 0x6f, 0x1b, 0xbb, 0x81, 0xf4, 0x15, 0x51, 0x61, 0x7f, 0x05, 0x7c, 0xea, 0xdb, 0x9b, 0x9a, +/*06e0:*/ 0x56, 0x15, 0x0f, 0xe7, 0x17, 0xac, 0xf1, 0xaa, 0x9f, 0x66, 0x9e, 0xc2, 0x70, 0x1e, 0xcb, 0xbe, +/*06f0:*/ 0xa7, 0xb2, 0xdc, 0x2b, 0x55, 0xea, 0xcd, 0x29, 0x45, 0xa7, 0xac, 0x75, 0xea, 0xad, 0xc4, 0xaa, +/*0700:*/ 0xfb, 0x04, 0x55, 0x97, 0xb5, 0x0e, 0xfb, 0x37, 0x15, 0x79, 0xd6, 0x0e, 0x20, 0x76, 0x9a, 0xaf, +/*0710:*/ 0xf5, 0xf6, 0x08, 0xa0, 0xe9, 0xd6, 0x99, 0xfb, 0x22, 0x13, 0x79, 0x40, 0xd1, 0x6a, 0xe8, 0x05, +/*0720:*/ 0xe3, 0xd8, 0x35, 0x02, 0xe7, 0x6c, 0x88, 0x15, 0xf8, 0x0e, 0xf5, 0xa5, 0x18, 0xe3, 0xc8, 0xd9, +/*0730:*/ 0x05, 0x7d, 0x9d, 0x5d, 0x2f, 0xfe, 0xfd, 0xcd, 0x8c, 0xed, 0x82, 0xc3, 0xde, 0x4a, 0x31, 0x9c, +/*0740:*/ 0x6f, 0xca, 0xb4, 0xc3, 0xc7, 0xf4, 0x5a, 0x80, 0x37, 0x3b, 0x29, 0xd8, 0x1d, 0x72, 0xad, 0xc3, +/*0750:*/ 0x61, 0xc5, 0xb3, 0xc9, 0xa5, 0xab, 0xa4, 0x85, 0x9c, 0x44, 0xe3, 0x2d, 0xc5, 0x4b, 0xa8, 0x69, +/*0760:*/ 0x9d, 0x16, 0xb6, 0xbb, 0x7f, 0x12, 0xdd, 0x22, 0xf8, 0x8c, 0x63, 0xa2, 0x28, 0xaa, 0xb1, 0x6c, +/*0770:*/ 0xe5, 0x7b, 0xa6, 0x6a, 0x41, 0x14, 0x09, 0x8a, 0x4e, 0x1b, 0xbe, 0x86, 0x76, 0xb3, 0x14, 0xd1, +/*0780:*/ 0xf0, 0x48, 0x98, 0x18, 0x16, 0xcd, 0x20, 0x96, 0x6c, 0x65, 0xfa, 0xed, 0xb4, 0x5a, 0xf5, 0x49, +/*0790:*/ 0x7f, 0x4c, 0xc9, 0x61, 0xdd, 0x4d, 0x56, 0x98, 0xf6, 0x23, 0xd3, 0x8d, 0xea, 0x5f, 0xb6, 0x7d, +/*07a0:*/ 0xa9, 0xa2, 0xad, 0x7b, 0x0b, 0x88, 0x50, 0xad, 0xa4, 0x76, 0x6f, 0x83, 0x5f, 0x0c, 0xbe, 0x9d, +/*07b0:*/ 0xfb, 0xb1, 0x00, 0x24, 0x11, 0xf4, 0xaf, 0x9d, 0xfe, 0x67, 0x55, 0x4b, 0x44, 0xe5, 0xe4, 0x0c, +/*07c0:*/ 0x26, 0x9f, 0xf3, 0x30, 0xad, 0xd4, 0xd5, 0x53, 0x83, 0x05, 0x55, 0x45, 0xae, 0x4b, 0x30, 0xdd, +/*07d0:*/ 0xce, 0x90, 0x22, 0x87, 0x0b, 0xf4, 0x75, 0x1d, 0x69, 0x29, 0xfa, 0x0f, 0x1f, 0x74, 0x65, 0xbe, +/*07e0:*/ 0x05, 0x88, 0x7b, 0x32, 0xd5, 0x37, 0xba, 0x64, 0xc0, 0xb7, 0x51, 0x1d, 0x87, 0xce, 0x26, 0x48, +/*07f0:*/ 0x1f, 0xd9, 0x8d, 0xfc, 0x9d, 0x98, 0xed, 0xf7, 0xa5, 0x66, 0x5c, 0x2a, 0x56, 0xc0, 0xe3, 0x38, +/*0800:*/ 0xb4, 0x78, 0x49, 0x80, 0x0b, 0x01, 0xf6, 0x1e, 0xba, 0xfd, 0xb0, 0x7d, 0x34, 0x0a, 0x8c, 0x7a, +/*0810:*/ 0x44, 0xf8, 0x77, 0x9a, 0xca, 0x1c, 0x38, 0x58, 0xc2, 0x4b, 0xcb, 0x80, 0x41, 0xce, 0xb7, 0x2b, +/*0820:*/ 0x6a, 0x13, 0x59, 0xf8, 0x3c, 0x87, 0xc7, 0x93, 0x71, 0x23, 0xe2, 0x4f, 0x44, 0x14, 0xda, 0xee, +/*0830:*/ 0xc6, 0xd7, 0x75, 0x45, 0xa7, 0xa5, 0x9e, 0x78, 0xc1, 0x8b, 0x9b, 0x9d, 0x31, 0x08, 0x0e, 0x3b, +/*0840:*/ 0x0d, 0xed, 0x07, 0xc6, 0x5e, 0xc5, 0x5a, 0xea, 0xe2, 0xe0, 0x58, 0x67, 0xcf, 0x12, 0x15, 0xe5, +/*0850:*/ 0xa9, 0x09, 0x81, 0xed, 0xc4, 0x39, 0xce, 0x86, 0xc4, 0xbb, 0xf5, 0x9c, 0x9f, 0xd6, 0x81, 0x44, +/*0860:*/ 0x54, 0xd2, 0x36, 0xc4, 0x3a, 0x5a, 0xd3, 0x26, 0x2e, 0x7d, 0x57, 0x33, 0x91, 0x3e, 0x61, 0x21, +/*0870:*/ 0x7b, 0xc9, 0x9d, 0x27, 0x4b, 0xd9, 0x53, 0x15, 0x4c, 0x4f, 0x65, 0xc6, 0x86, 0x68, 0x82, 0x40, +/*0880:*/ 0x1e, 0xeb, 0xb9, 0xa4, 0x60, 0x82, 0x55, 0xc4, 0xda, 0x89, 0xba, 0xb3, 0x9c, 0xba, 0xcc, 0xdc, +/*0890:*/ 0xce, 0xd7, 0xfa, 0x4b, 0xfd, 0x56, 0x18, 0x77, 0xed, 0xe2, 0x37, 0xa8, 0x1e, 0x47, 0xd9, 0x81, +/*08a0:*/ 0xf0, 0xc7, 0xa3, 0x9b, 0xc5, 0x94, 0x9c, 0xd3, 0xa7, 0x96, 0xb3, 0x2a, 0xb3, 0x8d, 0x6c, 0x6f, +/*08b0:*/ 0x9e, 0x5e, 0x7b, 0x4f, 0xff, 0x93, 0x29, 0x0c, 0x24, 0x4b, 0xb4, 0x90, 0xc1, 0xcd, 0xc4, 0xae, +/*08c0:*/ 0x57, 0x8e, 0xc6, 0xe9, 0x43, 0x19, 0x71, 0xde, 0x06, 0xee, 0x52, 0x09, 0x31, 0x52, 0x07, 0x36, +/*08d0:*/ 0xd1, 0x92, 0xb6, 0xe8, 0xfc, 0x92, 0x6f, 0xdf, 0xa4, 0xae, 0x20, 0x74, 0x28, 0x63, 0x3f, 0x06, +/*08e0:*/ 0xc9, 0x24, 0xd6, 0xbb, 0xfa, 0x62, 0xab, 0x5d, 0x48, 0x70, 0x86, 0xa8, 0x5e, 0xa8, 0x44, 0xfc, +/*08f0:*/ 0x49, 0x62, 0x87, 0x1f, 0x43, 0xd3, 0x85, 0xe0, 0xa1, 0x85, 0xc6, 0xfa, 0x3e, 0xa9, 0x7f, 0x18, +/*0900:*/ 0x4a, 0xe8, 0x27, 0x59, 0xb7, 0x48, 0xfd, 0xbd, 0xf1, 0x61, 0x90, 0x24, 0x67, 0x5e, 0xc8, 0x3d, +/*0910:*/ 0x76, 0xee, 0x7a, 0x95, 0xa3, 0x28, 0x89, 0x9b, 0x57, 0x20, 0x62, 0xd6, 0xdd, 0x56, 0xd7, 0x83, +/*0920:*/ 0x12, 0x00, 0x62, 0xde, 0xe8, 0x27, 0xdf, 0x56, 0x13, 0x56, 0xd0, 0xfa, 0xae, 0xf4, 0x05, 0x5f, +/*0930:*/ 0x5e, 0x9c, 0x4c, 0x13, 0xa6, 0xf9, 0xf3, 0x32, 0xd2, 0xd2, 0x96, 0x8f, 0x5c, 0x0c, 0x9f, 0x89, +/*0940:*/ 0x5d, 0x85, 0xcd, 0xec, 0x84, 0x8c, 0x91, 0x6d, 0x99, 0xe2, 0x44, 0x37, 0x72, 0x01, 0x83, 0x4c, +/*0950:*/ 0x01, 0xa8, 0xde, 0xc9, 0xdd, 0x68, 0x83, 0x3a, 0x9c, 0x3c, 0xc7, 0xf1, 0x33, 0xd8, 0x89, 0x62, +/*0960:*/ 0x5c, 0x61, 0x4d, 0xb7, 0x3f, 0x09, 0xd2, 0xd3, 0xa9, 0x39, 0x34, 0x6a, 0x0c, 0xde, 0xec, 0xe4, +/*0970:*/ 0x92, 0x6c, 0x43, 0x41, 0x71, 0x9e, 0x64, 0x90, 0x58, 0x9c, 0xa5, 0x7e, 0x98, 0x59, 0xa8, 0x1b, +/*0980:*/ 0x03, 0xac, 0xa9, 0x40, 0xc2, 0x55, 0xce, 0x50, 0x0b, 0x6c, 0x90, 0x26, 0x13, 0x3a, 0x8b, 0x42, +/*0990:*/ 0xd1, 0xcb, 0xf7, 0xae, 0xd1, 0x0d, 0x39, 0xfd, 0x97, 0x25, 0x95, 0x78, 0x6c, 0x0f, 0x71, 0x3b, +/*09a0:*/ 0x87, 0xca, 0x59, 0x20, 0x0f, 0x36, 0x57, 0x08, 0x78, 0x4f, 0x31, 0x7d, 0x28, 0x7c, 0xc8, 0x6f, +/*09b0:*/ 0x5d, 0x64, 0xfb, 0xea, 0xab, 0xf0, 0x81, 0x3a, 0x5f, 0x38, 0xbc, 0x07, 0xce, 0xf8, 0xae, 0x19, +/*09c0:*/ 0x38, 0x33, 0x87, 0x38, 0xcc, 0x2d, 0x0e, 0x97, 0xdd, 0x9a, 0x49, 0xe7, 0x57, 0xb2, 0x65, 0x17, +/*09d0:*/ 0x6c, 0x54, 0x1b, 0xf9, 0x55, 0xdf, 0x55, 0x29, 0xcc, 0xe6, 0xac, 0xb8, 0x21, 0x18, 0x97, 0x9d, +/*09e0:*/ 0x19, 0x54, 0xf1, 0xd0, 0xf1, 0x4c, 0x17, 0x79, 0x53, 0xdd, 0x68, 0xd2, 0x9c, 0xd9, 0x03, 0x1d, +/*09f0:*/ 0x35, 0x62, 0xf4, 0xd2, 0x1f, 0xe7, 0xb8, 0xd0, 0xce, 0xdb, 0x80, 0x7b, 0xcf, 0xe5, 0x56, 0xba, +/*0a00:*/ 0x55, 0x2d, 0x5c, 0x57, 0xa5, 0x98, 0x48, 0xfe, 0xa8, 0xff, 0xa6, 0xb0, 0x0e, 0x2e, 0x3c, 0xb9, +/*0a10:*/ 0x22, 0x64, 0xe3, 0xd0, 0x87, 0x6f, 0x03, 0x11, 0x88, 0xe5, 0x27, 0xea, 0x36, 0xa3, 0x57, 0xe3, +/*0a20:*/ 0x69, 0xf5, 0x07, 0x10, 0xb9, 0xe6, 0x6a, 0xf2, 0x91, 0x0c, 0x52, 0xc0, 0x70, 0x4b, 0x92, 0x16, +/*0a30:*/ 0xf2, 0x57, 0xce, 0xb0, 0x1f, 0x87, 0xb2, 0x6d, 0x06, 0xff, 0xcf, 0x53, 0x2b, 0x35, 0x66, 0x00, +/*0a40:*/ 0x51, 0x51, 0x8b, 0x5c, 0x51, 0x5f, 0xf8, 0x5b, 0x4f, 0x63, 0x24, 0xb2, 0x68, 0x34, 0xf4, 0x9d, +/*0a50:*/ 0x97, 0x82, 0xab, 0xa8, 0x84, 0xc2, 0x8a, 0xf9, 0x91, 0x08, 0x9d, 0xb0, 0x02, 0x66, 0x11, 0x48, +/*0a60:*/ 0x33, 0x87, 0x1b, 0xec, 0xa9, 0x6d, 0x23, 0x08, 0xfc, 0x4e, 0xde, 0xa4, 0x51, 0x9d, 0xd8, 0xd0, +/*0a70:*/ 0x6d, 0x29, 0x43, 0x03, 0xf8, 0xe6, 0x13, 0x37, 0xd6, 0x85, 0x48, 0xa2, 0x87, 0xf3, 0xbb, 0xb8, +/*0a80:*/ 0xb0, 0x48, 0x05, 0xc7, 0x90, 0xd9, 0x91, 0x48, 0x3d, 0x1f, 0x94, 0xfc, 0x4e, 0x68, 0x99, 0x4b, +/*0a90:*/ 0x3d, 0x1f, 0x44, 0x7b, 0x4f, 0x83, 0x5d, 0xd3, 0xfc, 0x1c, 0x25, 0x88, 0xf8, 0xd8, 0xa8, 0x08, +/*0aa0:*/ 0x6f, 0x93, 0x9b, 0xb4, 0x45, 0xda, 0x0b, 0x77, 0x12, 0x38, 0x5e, 0x03, 0xeb, 0xbc, 0x9c, 0xcb, +/*0ab0:*/ 0x62, 0x20, 0x3c, 0xa9, 0xc1, 0xc9, 0xab, 0x10, 0x40, 0xec, 0x05, 0xf3, 0x19, 0x78, 0xd3, 0x87, +/*0ac0:*/ 0x0f, 0x87, 0xdb, 0x6c, 0xbf, 0x82, 0x0a, 0x8a, 0x99, 0x91, 0x53, 0x31, 0x93, 0xcc, 0x6e, 0xf1, +/*0ad0:*/ 0x0c, 0xdb, 0xd5, 0x00, 0xa5, 0x81, 0x56, 0x34, 0xcc, 0xe0, 0x11, 0x4c, 0x10, 0x62, 0xd3, 0x32, +/*0ae0:*/ 0x99, 0x7a, 0x79, 0x00, 0x3d, 0x86, 0x17, 0x4a, 0x07, 0x6d, 0x4e, 0xec, 0x74, 0x4b, 0xac, 0xfe, +/*0af0:*/ 0xde, 0x39, 0xab, 0xbe, 0x68, 0x46, 0x91, 0x1c, 0x57, 0x9f, 0x86, 0xc7, 0xfb, 0xf2, 0x04, 0xfb, +/*0b00:*/ 0xdc, 0x97, 0x56, 0x8d, 0x07, 0x0d, 0xfd, 0xb4, 0xae, 0x8f, 0x84, 0xc6, 0x67, 0xea, 0x7c, 0xd9, +/*0b10:*/ 0x8d, 0xbd, 0x75, 0x6a, 0x87, 0xb3, 0x0a, 0x95, 0x94, 0xf5, 0x7a, 0x7c, 0xbc, 0x88, 0xbc, 0xc7, +/*0b20:*/ 0x8e, 0xaf, 0x6b, 0x05, 0x66, 0xd9, 0xe5, 0x79, 0x35, 0x4c, 0x40, 0x95, 0x5c, 0x18, 0x77, 0x06, +/*0b30:*/ 0xdb, 0xe9, 0xaf, 0xe6, 0x2a, 0xb8, 0xf7, 0x26, 0x41, 0xf7, 0x6d, 0xb8, 0xd9, 0x85, 0x49, 0xc1, +/*0b40:*/ 0xcb, 0xb8, 0x7a, 0x81, 0xab, 0xcd, 0x85, 0x65, 0xb9, 0xd8, 0xd4, 0xc0, 0x91, 0x1a, 0x05, 0xcc, +/*0b50:*/ 0xeb, 0xb2, 0xec, 0x3c, 0xc3, 0x3c, 0x65, 0x81, 0x09, 0x8f, 0x3f, 0xb5, 0xb4, 0x63, 0xa6, 0x2e, +/*0b60:*/ 0x16, 0xd3, 0xd2, 0xd4, 0xb0, 0xac, 0xff, 0x7a, 0x67, 0xe2, 0x97, 0xbf, 0x9a, 0x71, 0x94, 0xec, +/*0b70:*/ 0xa6, 0xb2, 0x47, 0x85, 0x3d, 0x1f, 0x4d, 0x31, 0x53, 0x24, 0xb2, 0x26, 0x71, 0x71, 0xc9, 0x1c, +/*0b80:*/ 0x10, 0xc3, 0xe4, 0xcc, 0x82, 0xb7, 0xbd, 0x79, 0xe9, 0xd7, 0xd6, 0x8f, 0x84, 0x49, 0x00, 0x8c, +/*0b90:*/ 0xf8, 0xc8, 0x65, 0x27, 0x7b, 0x9b, 0x56, 0x0f, 0x28, 0x68, 0x68, 0x90, 0x81, 0x3a, 0x3d, 0x81, +/*0ba0:*/ 0x64, 0x32, 0x6a, 0x65, 0x5b, 0x5e, 0xed, 0x7d, 0xc7, 0x37, 0xea, 0x7f, 0x50, 0x87, 0x2d, 0x01, +/*0bb0:*/ 0x4b, 0xf6, 0x71, 0x19, 0xd9, 0x7c, 0x1d, 0xe3, 0x75, 0x13, 0x57, 0x70, 0x65, 0x88, 0xfd, 0x1b, +/*0bc0:*/ 0xd7, 0x13, 0xd8, 0x0c, 0x40, 0xe8, 0x8e, 0xaf, 0x02, 0xf3, 0x89, 0x3b, 0xee, 0x80, 0xb4, 0xcc, +/*0bd0:*/ 0x03, 0x3e, 0xce, 0x68, 0x95, 0xd8, 0xeb, 0xb0, 0xb6, 0x19, 0xeb, 0x80, 0x1c, 0x82, 0xf0, 0x7c, +/*0be0:*/ 0x53, 0x29, 0x79, 0x3b, 0xc7, 0x63, 0xee, 0xa3, 0x8b, 0x12, 0xa9, 0x06, 0xcb, 0xce, 0xfa, 0x4e, +/*0bf0:*/ 0x55, 0x63, 0x8a, 0x37, 0xd5, 0x42, 0xae, 0xcb, 0xfc, 0x16, 0x91, 0x72, 0x70, 0x46, 0x08, 0x3e, +/*0c00:*/ 0x5a, 0xea, 0x9d, 0x1c, 0xa5, 0x65, 0x4c, 0xc3, 0xfa, 0xd5, 0x53, 0x74, 0x41, 0x94, 0x57, 0x59, +/*0c10:*/ 0x59, 0x07, 0x50, 0x9e, 0xcb, 0xd8, 0xed, 0x92, 0x2b, 0x95, 0x77, 0x9b, 0xb2, 0x7a, 0xe1, 0x25, +/*0c20:*/ 0x6d, 0xcf, 0x09, 0xf1, 0xff, 0x40, 0x7e, 0xda, 0xf4, 0x33, 0xd4, 0xf2, 0x51, 0xd3, 0x89, 0xe3, +/*0c30:*/ 0x32, 0xff, 0x18, 0x7e, 0x0a, 0x61, 0xac, 0xb8, 0x6c, 0x03, 0x0a, 0x84, 0x4a, 0x99, 0x25, 0x15, +/*0c40:*/ 0xda, 0x54, 0x44, 0x86, 0xb1, 0xf5, 0xf3, 0x90, 0x7c, 0x67, 0x73, 0xae, 0x28, 0xbf, 0x7b, 0xaf, +/*0c50:*/ 0x04, 0xd0, 0xb9, 0xa8, 0x17, 0xe2, 0xfb, 0xa3, 0xd2, 0x19, 0x82, 0xb9, 0x73, 0xdd, 0xc5, 0x13, +/*0c60:*/ 0x91, 0x44, 0xf2, 0x9b, 0xa5, 0x00, 0xa5, 0x8b, 0x9b, 0x16, 0xd2, 0x36, 0x36, 0x39, 0x0c, 0xb7, +/*0c70:*/ 0xe7, 0xe8, 0x98, 0xe8, 0x08, 0xa0, 0x1d, 0x73, 0xc0, 0x3b, 0x83, 0xe9, 0xea, 0x3f, 0xdb, 0x46, +/*0c80:*/ 0x73, 0xcd, 0x17, 0xc3, 0x1b, 0x45, 0xd4, 0xfb, 0x99, 0x71, 0x47, 0x35, 0x56, 0xf8, 0xb3, 0x21, +/*0c90:*/ 0xef, 0xe4, 0x71, 0xbd, 0xbd, 0xee, 0x52, 0xa9, 0x20, 0xa9, 0xc8, 0x9c, 0x9f, 0x94, 0x13, 0xe4, +/*0ca0:*/ 0xe0, 0xc5, 0x7f, 0x74, 0x73, 0x89, 0x0e, 0xb6, 0x30, 0x40, 0xa0, 0x20, 0xcd, 0x73, 0x41, 0x6d, +/*0cb0:*/ 0xce, 0x45, 0x85, 0xa3, 0x24, 0x47, 0x3e, 0x63, 0x04, 0xea, 0xf8, 0x97, 0x70, 0xa7, 0x12, 0x45, +/*0cc0:*/ 0x64, 0x35, 0x99, 0xaa, 0x7d, 0x0e, 0xb8, 0xfd, 0x89, 0x9e, 0x5e, 0xb4, 0x74, 0x2a, 0x18, 0x5a, +/*0cd0:*/ 0xa7, 0x8e, 0x23, 0xa2, 0x38, 0xa3, 0x84, 0xfa, 0x55, 0xce, 0x13, 0xb1, 0x24, 0xba, 0xa5, 0xb0, +/*0ce0:*/ 0x8c, 0x81, 0x8f, 0xd7, 0xe9, 0x68, 0x4f, 0xf6, 0xdc, 0x7b, 0x89, 0xbe, 0x73, 0x54, 0x38, 0x9f, +/*0cf0:*/ 0x11, 0xf3, 0x10, 0xbc, 0x1e, 0xdc, 0x01, 0x06, 0xeb, 0xd0, 0x0b, 0x34, 0x8f, 0x03, 0xa5, 0xbb, +/*0d00:*/ 0xbf, 0x20, 0xfa, 0x7e, 0x2a, 0xc7, 0xfe, 0xa3, 0x36, 0xbf, 0xb3, 0x84, 0x0c, 0x76, 0xd8, 0x9b, +/*0d10:*/ 0x32, 0xaa, 0x06, 0xb1, 0x59, 0x75, 0x45, 0x01, 0x84, 0x60, 0x95, 0x19, 0x88, 0x61, 0xa9, 0x0a, +/*0d20:*/ 0x44, 0x27, 0x23, 0xea, 0x70, 0xa0, 0xd7, 0x05, 0xce, 0x86, 0x66, 0x7a, 0x98, 0x04, 0x84, 0x9a, +/*0d30:*/ 0x6f, 0xdf, 0x4c, 0x75, 0xe4, 0xed, 0x7d, 0x7a, 0x35, 0x66, 0xa7, 0x8c, 0x0a, 0xfa, 0x8d, 0xbe, +/*0d40:*/ 0x0b, 0x2b, 0x87, 0xf9, 0x75, 0xb8, 0xe8, 0xc8, 0xe7, 0x67, 0x1f, 0x4a, 0x6d, 0xfa, 0xf6, 0x2c, +/*0d50:*/ 0xea, 0x3d, 0xbe, 0xbf, 0xba, 0x01, 0x1e, 0x40, 0xc2, 0xda, 0xf9, 0xb4, 0xe3, 0xdc, 0x00, 0x3d, +/*0d60:*/ 0x84, 0xf9, 0x14, 0x49, 0x20, 0x1c, 0x42, 0x77, 0x8d, 0xb5, 0x49, 0x21, 0x69, 0x12, 0x82, 0x01, +/*0d70:*/ 0xec, 0x57, 0x46, 0xe9, 0x69, 0x63, 0x90, 0xc2, 0xc1, 0x78, 0x10, 0xd7, 0x9b, 0x64, 0x8e, 0x96, +/*0d80:*/ 0x8c, 0x82, 0xe6, 0x0e, 0xaf, 0xb2, 0x41, 0xae, 0x84, 0x5f, 0x3b, 0xf9, 0x5b, 0x1d, 0xa7, 0x0f, +/*0d90:*/ 0xdf, 0xac, 0x31, 0x81, 0x44, 0xe5, 0x45, 0x37, 0x9f, 0x96, 0xfc, 0x5f, 0xb2, 0x09, 0x4e, 0x6e, +/*0da0:*/ 0xd2, 0x37, 0x8b, 0x30, 0x17, 0x82, 0xb4, 0xbc, 0x13, 0xbe, 0xba, 0xc4, 0xd2, 0x30, 0x0d, 0xe9, +/*0db0:*/ 0xc3, 0x87, 0xed, 0x9a, 0x49, 0x2f, 0xbe, 0x27, 0x6f, 0xf7, 0xe0, 0xd4, 0xe3, 0xc7, 0x1e, 0x3c, +/*0dc0:*/ 0xbe, 0x6c, 0x47, 0xc7, 0xb0, 0x72, 0xdd, 0xc5, 0x0d, 0x26, 0xfc, 0x8b, 0x86, 0xc7, 0x8e, 0x85, +/*0dd0:*/ 0x1b, 0x6a, 0xc4, 0x6d, 0x09, 0xec, 0xe2, 0x82, 0x4e, 0xb2, 0xf0, 0xe6, 0xb4, 0x6e, 0x5a, 0xa3, +/*0de0:*/ 0x3e, 0xc4, 0x05, 0x96, 0x36, 0x82, 0xbf, 0x8a, 0x7a, 0xdd, 0x98, 0xf2, 0x40, 0xf5, 0x13, 0xa2, +/*0df0:*/ 0xbe, 0xbc, 0x6a, 0x5d, 0x45, 0x5e, 0xb5, 0x33, 0x85, 0x96, 0x25, 0x54, 0xa5, 0xdf, 0xd8, 0xf8, +/*0e00:*/ 0x49, 0x57, 0x11, 0x76, 0x55, 0xe7, 0x5a, 0xe3, 0x14, 0xd2, 0xc7, 0x94, 0xfe, 0xdf, 0xab, 0xb9, +/*0e10:*/ 0xc4, 0x59, 0xaa, 0x7a, 0x91, 0x2c, 0xfd, 0xaf, 0x6a, 0x5b, 0x49, 0x15, 0xbb, 0x4b, 0x53, 0x95, +/*0e20:*/ 0xa2, 0xf7, 0xec, 0xd4, 0xb3, 0xb7, 0x8d, 0x83, 0xa9, 0xc3, 0x74, 0xe5, 0xb9, 0x0d, 0x7b, 0x83, +/*0e30:*/ 0x44, 0xbb, 0x3b, 0x85, 0x70, 0x11, 0xb0, 0x6c, 0x90, 0x62, 0xa3, 0x59, 0xad, 0xba, 0xf0, 0xd8, +/*0e40:*/ 0x97, 0x02, 0x28, 0x91, 0x73, 0x71, 0x16, 0x00, 0x5e, 0x87, 0x09, 0x4e, 0x51, 0x30, 0x77, 0x9b, +/*0e50:*/ 0xe5, 0x09, 0xe5, 0x6e, 0x66, 0xef, 0xd1, 0xf0, 0x63, 0x3e, 0x2a, 0x51, 0x42, 0x1d, 0x40, 0xfe, +/*0e60:*/ 0x7b, 0x9d, 0x1c, 0x18, 0xd5, 0x12, 0x7e, 0xf2, 0x26, 0x2f, 0xab, 0xf7, 0x26, 0xe4, 0x68, 0x8b, +/*0e70:*/ 0x42, 0x16, 0x82, 0xc0, 0x11, 0xc5, 0x94, 0x6c, 0x1c, 0x46, 0xc9, 0x1e, 0xa5, 0xc0, 0x4d, 0x8e, +/*0e80:*/ 0x5b, 0x21, 0xd9, 0x24, 0x2b, 0x6b, 0x03, 0x54, 0x3f, 0xf0, 0x95, 0x71, 0xc0, 0x9a, 0x7f, 0x96, +/*0e90:*/ 0x8c, 0xd6, 0x61, 0x03, 0x8d, 0x0c, 0x97, 0x9b, 0x5f, 0xaa, 0x7d, 0xae, 0x8b, 0x63, 0x3f, 0x9d, +/*0ea0:*/ 0x06, 0x43, 0x81, 0xcd, 0x29, 0xe6, 0x06, 0x17, 0xaa, 0x7d, 0x48, 0xbf, 0x58, 0x10, 0x19, 0x74, +/*0eb0:*/ 0x55, 0xb5, 0x44, 0x9d, 0x64, 0x32, 0xff, 0xf7, 0x9f, 0xcb, 0xf2, 0x43, 0x5b, 0xf7, 0x77, 0xbe, +/*0ec0:*/ 0x50, 0x53, 0xda, 0xf0, 0x55, 0xa3, 0xd9, 0x88, 0xa5, 0xdc, 0x93, 0x5d, 0xa3, 0x5b, 0x8b, 0x4c, +/*0ed0:*/ 0xcc, 0x38, 0xd0, 0x59, 0x7f, 0x25, 0x71, 0x49, 0xe2, 0xc6, 0x58, 0xdb, 0xc6, 0x7f, 0xe5, 0x66, +/*0ee0:*/ 0xa2, 0x7f, 0x14, 0x48, 0xc7, 0x85, 0x90, 0x45, 0x4a, 0x50, 0xec, 0xc3, 0x4a, 0x9f, 0x63, 0xff, +/*0ef0:*/ 0x2b, 0x25, 0xd9, 0x2f, 0xd4, 0xec, 0xb0, 0x31, 0xd6, 0x64, 0xdb, 0x02, 0x10, 0xdf, 0x79, 0x9e, +/*0f00:*/ 0xbe, 0x6d, 0xd8, 0x81, 0x91, 0x2d, 0x04, 0x9b, 0xfb, 0x3c, 0x8d, 0x42, 0x55, 0xd6, 0x32, 0x1c, +/*0f10:*/ 0xfe, 0x57, 0x6d, 0x70, 0x23, 0x1f, 0x96, 0x2a, 0x45, 0x2c, 0x2d, 0x2d, 0xeb, 0x6a, 0xd1, 0x45, +/*0f20:*/ 0x69, 0xe4, 0xf9, 0x68, 0xee, 0x7c, 0xb6, 0x18, 0x08, 0x6c, 0x0a, 0xeb, 0xb7, 0x81, 0x7c, 0x6e, +/*0f30:*/ 0x8e, 0x38, 0x37, 0x0e, 0x35, 0x15, 0xc7, 0xcd, 0x2b, 0x7a, 0x90, 0x88, 0x7b, 0xcd, 0x22, 0x3b, +/*0f40:*/ 0x61, 0x9f, 0x99, 0xa6, 0x92, 0x12, 0x87, 0x13, 0xf3, 0x9e, 0x60, 0xe8, 0xeb, 0x37, 0x94, 0x23, +/*0f50:*/ 0xf3, 0x3b, 0xe0, 0x5c, 0xc9, 0x12, 0x98, 0x40, 0xaa, 0x9f, 0x42, 0xb5, 0xa9, 0x30, 0x17, 0x1f, +/*0f60:*/ 0xcc, 0x28, 0x2d, 0xc4, 0xca, 0xc7, 0x08, 0x0e, 0xaa, 0x9a, 0xd6, 0x0c, 0xa5, 0xf7, 0x9a, 0x40, +/*0f70:*/ 0x34, 0xc0, 0xd0, 0xe0, 0xa4, 0xc3, 0x09, 0x34, 0x84, 0x01, 0x1d, 0x99, 0x5f, 0xe5, 0x24, 0x27, +/*0f80:*/ 0x7b, 0xda, 0x98, 0x9e, 0x5a, 0x9e, 0x9b, 0xaf, 0x48, 0x36, 0x7c, 0x8d, 0x93, 0x21, 0x0b, 0xdc, +/*0f90:*/ 0x64, 0xb5, 0x58, 0x03, 0xc6, 0x1a, 0x13, 0xdc, 0x3f, 0x43, 0x23, 0xdb, 0x06, 0xd1, 0x6b, 0x6a, +/*0fa0:*/ 0xbd, 0xeb, 0xe1, 0x55, 0x0a, 0xf0, 0x74, 0x9f, 0x01, 0xf0, 0x7b, 0x61, 0xc7, 0x91, 0x5b, 0x46, +/*0fb0:*/ 0x49, 0xfe, 0x92, 0xce, 0x36, 0xb5, 0xa3, 0xcc, 0xae, 0x7f, 0x49, 0x6a, 0x9b, 0x21, 0x9c, 0x07, +/*0fc0:*/ 0x00, 0xa8, 0x73, 0x34, 0xc7, 0x43, 0x5f, 0x5e, 0x9f, 0x63, 0x2b, 0xc4, 0xad, 0x5a, 0x20, 0x85, +/*0fd0:*/ 0xeb, 0xd9, 0xc2, 0x3d, 0x35, 0x21, 0xb5, 0x52, 0x49, 0x35, 0x29, 0x5b, 0x88, 0x12, 0xf6, 0x63, +/*0fe0:*/ 0x81, 0xb5, 0x06, 0xf7, 0x09, 0x8c, 0xaa, 0x71, 0x89, 0x86, 0x48, 0xb0, 0x9f, 0xe9, 0xf2, 0x2b, +/*0ff0:*/ 0x02, 0x50, 0xec, 0xd5, 0x8b, 0x27, 0x19, 0x5a, 0x63, 0xdf, 0x14, 0x60, 0xa8, 0x16, 0xed, 0x92, +/*1000:*/ 0xf2, 0x2a, 0x61, 0x6d, 0x38, 0xfe, 0x21, 0x0d, 0x48, 0x60, 0xd0, 0x7f, 0x18, 0xbe, 0xe7, 0x01, +/*1010:*/ 0xee, 0x4c, 0xca, 0x88, 0x78, 0x6f, 0x9b, 0x8c, 0xe4, 0xbc, 0x26, 0xad, 0xad, 0x90, 0xbc, 0xbb, +/*1020:*/ 0xa7, 0x45, 0xdc, 0x68, 0x84, 0xd7, 0x4e, 0x4b, 0x32, 0x3e, 0xbd, 0xa6, 0xd6, 0x1f, 0x92, 0xdd, +/*1030:*/ 0x83, 0x3c, 0x06, 0x2b, 0x21, 0xea, 0x5d, 0xba, 0xc3, 0xa9, 0x1b, 0x10, 0x0c, 0xd0, 0xef, 0xa8, +/*1040:*/ 0x99, 0x84, 0x7e, 0x33, 0x9f, 0x37, 0x3e, 0x61, 0x90, 0x53, 0x64, 0xd7, 0x12, 0x39, 0xf7, 0x03, +/*1050:*/ 0x34, 0xc5, 0x70, 0x61, 0x56, 0x87, 0xe7, 0xde, 0x2f, 0x2f, 0xc7, 0xf6, 0x96, 0x90, 0x8a, 0x7f, +/*1060:*/ 0x91, 0x5e, 0x63, 0xa3, 0x73, 0x90, 0x0d, 0x13, 0x4c, 0x2c, 0xb0, 0x78, 0x28, 0xd5, 0xe1, 0xaa, +/*1070:*/ 0x1c, 0x6e, 0x76, 0x7b, 0x81, 0x99, 0x1e, 0x52, 0x4f, 0x39, 0x2e, 0xcb, 0x2d, 0xb9, 0xb2, 0xa5, +/*1080:*/ 0x36, 0xc1, 0x1d, 0xe2, 0x27, 0xec, 0x6e, 0xfd, 0x8a, 0x89, 0x8f, 0xb5, 0x8d, 0x2e, 0xc8, 0xf5, +/*1090:*/ 0x0c, 0x8d, 0x22, 0xcb, 0x16, 0xab, 0x03, 0x05, 0xc1, 0x19, 0x09, 0x02, 0xc6, 0xd5, 0xae, 0x07, +/*10a0:*/ 0x4e, 0x1b, 0x3c, 0xa7, 0x3d, 0xfa, 0x34, 0x27, 0xe2, 0x11, 0xdf, 0xd4, 0x69, 0xac, 0x21, 0x32, +/*10b0:*/ 0xe9, 0x65, 0xb7, 0xd5, 0x45, 0x77, 0xa8, 0x16, 0x35, 0xec, 0x42, 0xea, 0xcb, 0x6e, 0xc6, 0x28, +/*10c0:*/ 0x99, 0xb0, 0x3f, 0x78, 0xac, 0xc2, 0xbb, 0xb2, 0x4e, 0xe0, 0x8f, 0xda, 0x23, 0xbf, 0xb9, 0xc1, +/*10d0:*/ 0x23, 0xfb, 0xe7, 0x75, 0x2b, 0xa9, 0xe5, 0x58, 0x9d, 0x8c, 0x44, 0xc8, 0xcc, 0x6a, 0xbd, 0x30, +/*10e0:*/ 0xc6, 0xa3, 0xfb, 0x80, 0xf4, 0x6a, 0x59, 0x0a, 0x3b, 0x14, 0xd9, 0xf4, 0xb3, 0x11, 0x69, 0xba, +/*10f0:*/ 0x85, 0x15, 0x1a, 0xdf, 0xdb, 0x97, 0x8e, 0x5c, 0xaa, 0xd3, 0xc6, 0xc6, 0x17, 0x80, 0xb2, 0x41, +/*1100:*/ 0x17, 0x1b, 0x8d, 0x85, 0x89, 0xd1, 0x0a, 0xd3, 0x29, 0xc3, 0x1b, 0x99, 0x67, 0xf8, 0xf1, 0x30, +/*1110:*/ 0xdb, 0x0b, 0xe8, 0xf6, 0x1f, 0xda, 0x32, 0xad, 0x0a, 0xa3, 0xf1, 0x2a, 0xc2, 0xae, 0xa2, 0xeb, +/*1120:*/ 0x2d, 0x43, 0xf1, 0xea, 0x5f, 0xdd, 0xaf, 0x90, 0x63, 0x92, 0xce, 0xda, 0xc0, 0x13, 0xc1, 0x4f, +/*1130:*/ 0x1e, 0xaf, 0x29, 0x88, 0x2f, 0x3c, 0x31, 0x9e, 0xa3, 0x69, 0xb8, 0x99, 0x22, 0xb2, 0xf4, 0xbd, +/*1140:*/ 0xf3, 0x04, 0x3f, 0x71, 0xf4, 0x2c, 0xb7, 0x2b, 0x91, 0x72, 0xe4, 0x86, 0x79, 0xb2, 0x6c, 0x0e, +/*1150:*/ 0x61, 0xd2, 0xf6, 0x66, 0xfc, 0x62, 0x14, 0xbc, 0x2c, 0x64, 0xe7, 0x83, 0xf9, 0x25, 0x26, 0xfa, +/*1160:*/ 0x6d, 0xf5, 0xc5, 0x49, 0xaf, 0x07, 0xa3, 0xdb, 0xc0, 0x5e, 0xef, 0x42, 0xca, 0x7d, 0xdc, 0x67, +/*1170:*/ 0xaf, 0x76, 0xd6, 0x96, 0x26, 0xb8, 0xaa, 0x99, 0x40, 0x50, 0xe2, 0xfe, 0xf3, 0xa3, 0x5a, 0xcf, +/*1180:*/ 0x44, 0x0c, 0x66, 0x37, 0x61, 0x3f, 0x7f, 0x6c, 0x7d, 0xdb, 0xc9, 0xd6, 0xdc, 0x6f, 0x82, 0x6e, +/*1190:*/ 0xbc, 0x5e, 0xbc, 0x1d, 0x96, 0xa2, 0x88, 0x99, 0x35, 0x68, 0xf3, 0xd9, 0xaf, 0x5e, 0x0d, 0x60, +/*11a0:*/ 0x6a, 0x0f, 0x58, 0x60, 0x4b, 0xdc, 0x43, 0xe4, 0x56, 0x9d, 0xd5, 0x8b, 0x47, 0xe2, 0xc5, 0x7b, +/*11b0:*/ 0xf7, 0x94, 0x37, 0x4f, 0x1f, 0x84, 0x5e, 0x2b, 0x4a, 0xb1, 0x65, 0x7b, 0x22, 0xd4, 0xee, 0x70, +/*11c0:*/ 0xcb, 0x9f, 0xe7, 0x0b, 0x80, 0x3e, 0xa9, 0xe0, 0xd8, 0x09, 0x13, 0x7d, 0x7d, 0x03, 0x79, 0x9f, +/*11d0:*/ 0xf7, 0xcc, 0xe4, 0xcd, 0x5d, 0xb2, 0x0f, 0xcd, 0xd9, 0xae, 0x69, 0xbd, 0xed, 0xdf, 0x0c, 0x46, +/*11e0:*/ 0xe6, 0xd2, 0x02, 0xb7, 0x09, 0x59, 0xe1, 0x38, 0xbd, 0x21, 0x9f, 0xd6, 0x1f, 0xb4, 0x6a, 0x67, +/*11f0:*/ 0xed, 0x61, 0xb3, 0x94, 0x69, 0x73, 0xdb, 0x61, 0x27, 0x99, 0x40, 0x11, 0x23, 0xb7, 0x66, 0x0e, +/*1200:*/ 0xf7, 0x23, 0xba, 0x61, 0x72, 0x03, 0x9e, 0x3c, 0x2e, 0xf0, 0x43, 0xcd, 0x68, 0xe6, 0xc1, 0xcb, +/*1210:*/ 0x7b, 0xcd, 0xdc, 0x57, 0xe7, 0xe2, 0xb3, 0x62, 0xdb, 0xc5, 0xa5, 0x2e, 0x1f, 0xfd, 0x8d, 0x67, +/*1220:*/ 0xf6, 0xaa, 0x14, 0xcc, 0x7b, 0xdf, 0x6c, 0x34, 0xb4, 0xd9, 0x50, 0x9c, 0x78, 0x71, 0xc0, 0x9f, +/*1230:*/ 0x44, 0x04, 0xd5, 0xa7, 0x47, 0x02, 0xec, 0xa7, 0x90, 0x1e, 0x7d, 0xcc, 0x1b, 0x4b, 0x6a, 0xb4, +/*1240:*/ 0xce, 0xda, 0x2e, 0x81, 0xf0, 0xd8, 0xdd, 0x29, 0x09, 0xf3, 0x10, 0x37, 0x9c, 0xe0, 0x19, 0xbc, +/*1250:*/ 0xb1, 0xc5, 0xf3, 0x05, 0x5c, 0x48, 0x1a, 0x01, 0x4f, 0x4a, 0xd6, 0xc3, 0x83, 0xde, 0x49, 0xa7, +/*1260:*/ 0xee, 0xd3, 0x9f, 0x1a, 0x02, 0x16, 0x01, 0xc0, 0xae, 0x00, 0xe4, 0xb3, 0x43, 0xcb, 0x2b, 0x4a, +/*1270:*/ 0x14, 0x47, 0x45, 0x79, 0xfb, 0x95, 0x5e, 0x06, 0x7a, 0x1a, 0x01, 0x63, 0x40, 0x1a, 0x54, 0x53, +/*1280:*/ 0xfd, 0x72, 0x38, 0x33, 0x8c, 0x73, 0x2c, 0xd5, 0x47, 0xa7, 0x78, 0x2a, 0x17, 0x1f, 0xef, 0x0c, +/*1290:*/ 0x8d, 0x7a, 0xc6, 0xe9, 0x1b, 0xfc, 0xd2, 0x50, 0xe9, 0x43, 0x21, 0x5a, 0xdf, 0x38, 0xfb, 0x31, +/*12a0:*/ 0xa0, 0x85, 0x99, 0xc6, 0x03, 0x1d, 0xd1, 0x3c, 0xda, 0x4f, 0xc3, 0xb4, 0x0c, 0x4a, 0x3d, 0x64, +/*12b0:*/ 0x49, 0x4f, 0x11, 0x75, 0x3c, 0xed, 0xde, 0xa3, 0x5d, 0xa4, 0x0e, 0x64, 0xca, 0x62, 0xac, 0xff, +/*12c0:*/ 0x1e, 0xc3, 0x92, 0x28, 0x74, 0xe7, 0x14, 0xda, 0x1b, 0xa5, 0xfc, 0xb6, 0x58, 0xe3, 0x43, 0x2e, +/*12d0:*/ 0x82, 0xe0, 0x6d, 0x04, 0x2a, 0xca, 0x30, 0x5b, 0xd0, 0xb3, 0x94, 0x2b, 0x02, 0xd5, 0xfe, 0x7d, +/*12e0:*/ 0x19, 0xe7, 0x34, 0x7b, 0x85, 0x36, 0x68, 0xf3, 0x03, 0xe2, 0x4f, 0xd8, 0x9a, 0x2f, 0x39, 0xae, +/*12f0:*/ 0x95, 0x02, 0x54, 0x37, 0x01, 0xc4, 0xa4, 0xdc, 0x73, 0x85, 0x6b, 0x53, 0x03, 0xfc, 0x82, 0x4d, +/*1300:*/ 0xef, 0x3a, 0xb9, 0x92, 0x5d, 0xfa, 0xfc, 0x96, 0x5e, 0x77, 0x00, 0x1a, 0x42, 0xfa, 0x72, 0xad, +/*1310:*/ 0xb1, 0xdb, 0x5f, 0xbd, 0x57, 0x9c, 0x00, 0x27, 0xba, 0xf0, 0x44, 0x95, 0x21, 0x65, 0xba, 0xc6, +/*1320:*/ 0x88, 0x94, 0x48, 0xae, 0x01, 0xb1, 0x91, 0x9b, 0xcd, 0xac, 0xe7, 0x59, 0x8d, 0xcd, 0x9c, 0x55, +/*1330:*/ 0x83, 0x5a, 0x48, 0xe3, 0xd7, 0xb4, 0xb1, 0x8b, 0x73, 0x69, 0xba, 0x04, 0x00, 0x8a, 0x73, 0xeb, +/*1340:*/ 0x36, 0x6a, 0x10, 0x6d, 0xa2, 0xa6, 0x2a, 0x7b, 0xcc, 0xa7, 0x89, 0x2b, 0xf9, 0x03, 0xe6, 0x62, +/*1350:*/ 0x11, 0x9b, 0x1b, 0x0d, 0xfe, 0x70, 0x0e, 0xde, 0x24, 0xd4, 0xd1, 0x00, 0x14, 0xd7, 0xdf, 0x74, +/*1360:*/ 0x77, 0x44, 0xe2, 0x76, 0xc7, 0xfe, 0x04, 0x47, 0xc1, 0x19, 0xa6, 0x3f, 0x36, 0x64, 0x83, 0x95, +/*1370:*/ 0xaf, 0x0f, 0x60, 0xbb, 0x79, 0xc8, 0x79, 0xea, 0x9d, 0x79, 0xfd, 0x3d, 0xf3, 0x01, 0x18, 0x9a, +/*1380:*/ 0xfa, 0xda, 0x60, 0x13, 0x6f, 0x92, 0x66, 0x69, 0x5e, 0xde, 0xd1, 0xe9, 0x53, 0x0f, 0xeb, 0xe0, +/*1390:*/ 0x30, 0xec, 0x45, 0x20, 0x3b, 0x0c, 0xdc, 0x91, 0xd7, 0x88, 0x15, 0xa8, 0x0b, 0x44, 0xe5, 0x0a, +/*13a0:*/ 0x82, 0x54, 0x8f, 0x03, 0x5f, 0xaa, 0x84, 0xf5, 0xc5, 0xdb, 0x7d, 0x2a, 0x9c, 0x1f, 0x50, 0xb2, +/*13b0:*/ 0x0e, 0x97, 0xfe, 0x84, 0x63, 0x2b, 0xc8, 0x67, 0x2a, 0x21, 0xe1, 0xa1, 0xfb, 0xaf, 0x58, 0x70, +/*13c0:*/ 0x29, 0xfe, 0xb5, 0x20, 0x84, 0xab, 0xf9, 0xc1, 0x62, 0x7c, 0x9b, 0x8b, 0x94, 0x0e, 0xa6, 0x66, +/*13d0:*/ 0x5e, 0xdf, 0x07, 0x0e, 0x0b, 0x14, 0x44, 0x99, 0x90, 0xbd, 0x0a, 0x67, 0xa1, 0x26, 0x95, 0xde, +/*13e0:*/ 0xf1, 0x5a, 0x69, 0x28, 0xd6, 0x91, 0x07, 0x78, 0x9e, 0x83, 0xb6, 0x25, 0x04, 0x68, 0x20, 0x2d, +/*13f0:*/ 0x9f, 0x04, 0xd5, 0x90, 0x40, 0x3d, 0x1f, 0xb2, 0x11, 0x4f, 0x15, 0x5e, 0x70, 0x5a, 0x32, 0x74, +/*1400:*/ 0x87, 0xe2, 0x54, 0x62, 0x64, 0x46, 0x63, 0xfa, 0xe7, 0x4d, 0x20, 0x40, 0x82, 0xf3, 0xe5, 0xa4, +/*1410:*/ 0x75, 0x33, 0xdb, 0xf8, 0xc3, 0x38, 0xdb, 0xb0, 0x3f, 0xcb, 0xa2, 0x7f, 0xb6, 0xcd, 0x8f, 0x9d, +/*1420:*/ 0xaa, 0xfb, 0x00, 0x7d, 0xf4, 0x8e, 0x32, 0x7c, 0xc5, 0x6b, 0xc7, 0x42, 0x6a, 0x8a, 0xaf, 0x1e, +/*1430:*/ 0x2d, 0x8b, 0xdc, 0xb8, 0x35, 0xb5, 0xba, 0xc7, 0x16, 0xbe, 0xb5, 0x9c, 0x2a, 0x07, 0x2b, 0x83, +/*1440:*/ 0xba, 0x5b, 0xa9, 0x2e, 0x37, 0xbc, 0x68, 0xfe, 0x69, 0xae, 0x68, 0xe6, 0x9e, 0x35, 0x3e, 0xfd, +/*1450:*/ 0x97, 0xbb, 0x61, 0x56, 0x4c, 0xda, 0x54, 0x23, 0x7c, 0x63, 0xd1, 0x5c, 0xd5, 0x42, 0xd5, 0xbb, +/*1460:*/ 0x6b, 0x0b, 0x4a, 0x89, 0x56, 0x1a, 0xec, 0x19, 0xba, 0x0f, 0xea, 0x5b, 0xe0, 0x03, 0x57, 0xd7, +/*1470:*/ 0xf1, 0x06, 0xb4, 0xc3, 0x60, 0x55, 0xe7, 0x9b, 0xf4, 0xa8, 0xa1, 0x1c, 0xd7, 0x8e, 0x00, 0xcd, +/*1480:*/ 0x1e, 0xd8, 0xb9, 0x54, 0x5d, 0x02, 0x2e, 0x3b, 0x09, 0x38, 0xe6, 0x00, 0x6a, 0xb6, 0x16, 0xeb, +/*1490:*/ 0x78, 0xde, 0x78, 0x0e, 0x7e, 0xc8, 0x76, 0x48, 0xb3, 0x2c, 0x9d, 0x29, 0x45, 0xca, 0xea, 0x8b, +/*14a0:*/ 0xf9, 0x2a, 0x7a, 0x9b, 0x98, 0xd5, 0xa7, 0x6d, 0xe0, 0x94, 0x33, 0x90, 0xd9, 0x6a, 0x04, 0xbe, +/*14b0:*/ 0x22, 0x71, 0x46, 0x56, 0xeb, 0x4c, 0x90, 0x37, 0xe6, 0x75, 0x6e, 0x77, 0x17, 0x70, 0x55, 0xf2, +/*14c0:*/ 0xbe, 0x3d, 0x50, 0x31, 0x6d, 0x28, 0x8b, 0x95, 0xb0, 0xcc, 0xfb, 0x51, 0x07, 0xd9, 0x6c, 0x5f, +/*14d0:*/ 0x90, 0x1c, 0x32, 0xa5, 0xbb, 0x4b, 0x14, 0xaa, 0x07, 0x58, 0x82, 0xc2, 0x7e, 0x1f, 0xa2, 0x00, +/*14e0:*/ 0x8b, 0xb6, 0x8a, 0x68, 0xa1, 0xec, 0xe6, 0x89, 0xd0, 0x4b, 0x80, 0xfe, 0x66, 0x4b, 0x22, 0xa0, +/*14f0:*/ 0x47, 0xfe, 0xc5, 0xbc, 0x35, 0x4e, 0xf7, 0xca, 0x03, 0x23, 0x20, 0x42, 0x1e, 0xa0, 0x43, 0x67, +/*1500:*/ 0xf5, 0x54, 0xe8, 0x93, 0x5a, 0x54, 0xc3, 0xb9, 0xd8, 0x54, 0x25, 0x8f, 0x8d, 0xae, 0x41, 0x42, +/*1510:*/ 0x37, 0x84, 0x22, 0xd6, 0x83, 0x0e, 0x75, 0xb1, 0xc1, 0x2d, 0xa9, 0xdf, 0x20, 0x8c, 0xe5, 0x5a, +/*1520:*/ 0x34, 0x86, 0xe5, 0x42, 0xe7, 0xb6, 0xfb, 0x46, 0x4b, 0x49, 0x36, 0xe8, 0xc8, 0x51, 0xcc, 0x5e, +/*1530:*/ 0xb8, 0x32, 0xe9, 0xb4, 0x5e, 0xe4, 0x0a, 0x04, 0xc3, 0x28, 0x22, 0xe8, 0x1f, 0xe8, 0xab, 0x1a, +/*1540:*/ 0x93, 0x6e, 0xff, 0xd9, 0x9c, 0x7e, 0x3f, 0xa5, 0x16, 0xc8, 0xf3, 0x67, 0xe4, 0x74, 0x97, 0xd5, +/*1550:*/ 0xda, 0xaf, 0xfa, 0xc6, 0x0b, 0xaf, 0x25, 0x6b, 0xec, 0x63, 0xff, 0xf5, 0xf8, 0x3c, 0x53, 0xfc, +/*1560:*/ 0x9f, 0x7a, 0x3a, 0x95, 0x4b, 0xef, 0x7a, 0x91, 0x29, 0xeb, 0x23, 0xce, 0x7e, 0x6b, 0xdd, 0x03, +/*1570:*/ 0x8b, 0x8c, 0xba, 0xba, 0x21, 0x27, 0xf8, 0x06, 0xf5, 0xc9, 0xed, 0xad, 0x15, 0xc4, 0xec, 0x5b, +/*1580:*/ 0xf5, 0x2e, 0xc4, 0xda, 0xd8, 0xc7, 0x1e, 0xe4, 0x4c, 0x32, 0x54, 0x5b, 0xe8, 0x96, 0xb0, 0xaf, +/*1590:*/ 0x0a, 0xa1, 0x86, 0x4d, 0xaf, 0xb6, 0x18, 0x4d, 0xed, 0x2c, 0xe4, 0x60, 0x14, 0x35, 0x19, 0xcb, +/*15a0:*/ 0x9a, 0xae, 0xd1, 0x96, 0x10, 0x14, 0x11, 0x15, 0xa8, 0xb6, 0xd8, 0xc1, 0xf4, 0x3f, 0x82, 0x3d, +/*15b0:*/ 0xb1, 0xae, 0x5f, 0xd5, 0xb5, 0x5b, 0xcb, 0x5f, 0x00, 0x93, 0x44, 0xe8, 0xda, 0xd6, 0xf3, 0x7f, +/*15c0:*/ 0x4d, 0xed, 0xe7, 0xa3, 0xe1, 0xfe, 0x69, 0xe2, 0x68, 0x68, 0x57, 0xc3, 0x2d, 0x7d, 0x1d, 0x07, +/*15d0:*/ 0x31, 0x4f, 0x15, 0x24, 0xc4, 0x9a, 0x24, 0xca, 0x21, 0x25, 0x15, 0xb2, 0x58, 0xad, 0xd5, 0xd7, +/*15e0:*/ 0x60, 0x84, 0x45, 0x60, 0x12, 0x8a, 0x60, 0x9d, 0x69, 0xdd, 0xaa, 0x99, 0x53, 0xa9, 0x1c, 0x8f, +/*15f0:*/ 0xa1, 0xdc, 0xfc, 0xea, 0x91, 0xba, 0x8b, 0x70, 0x98, 0x02, 0x94, 0xdf, 0x17, 0x58, 0x3c, 0xa4, +/*1600:*/ 0xc7, 0x59, 0xdc, 0xc9, 0xa4, 0xb4, 0x88, 0xdc, 0x1f, 0xc8, 0xec, 0x84, 0xcf, 0x12, 0x61, 0x05, +/*1610:*/ 0xd3, 0xa0, 0x9d, 0x62, 0x43, 0xfc, 0x88, 0xb8, 0x76, 0xe0, 0x25, 0x3f, 0x03, 0xd4, 0xf1, 0x4b, +/*1620:*/ 0xce, 0xf8, 0xec, 0x21, 0x00, 0xff, 0x7f, 0xf9, 0x9b, 0x33, 0x7d, 0xe3, 0x2f, 0x2b, 0xbc, 0x5b, +/*1630:*/ 0xcb, 0x89, 0xb9, 0x94, 0xc3, 0xf0, 0xd0, 0x2f, 0x2b, 0xd2, 0x10, 0x35, 0xcf, 0xe6, 0xf3, 0x5c, +/*1640:*/ 0x33, 0x37, 0xb3, 0x61, 0x8c, 0x36, 0x44, 0x05, 0xdf, 0xd3, 0x49, 0x3d, 0x81, 0xfe, 0xec, 0x7a, +/*1650:*/ 0x74, 0x5c, 0x82, 0xbd, 0x68, 0x07, 0xcf, 0x25, 0xe9, 0x18, 0x1c, 0xed, 0x51, 0xcd, 0x10, 0xf3, +/*1660:*/ 0xc2, 0x52, 0x5f, 0xce, 0x11, 0x99, 0x92, 0x05, 0x6b, 0xdf, 0x70, 0xdd, 0x95, 0x86, 0x86, 0xc1, +/*1670:*/ 0x8a, 0xcd, 0x61, 0x45, 0x1d, 0x13, 0x8e, 0x56, 0x67, 0x66, 0x51, 0xcd, 0x85, 0x6f, 0xe1, 0xc4, +/*1680:*/ 0xf2, 0x5a, 0xc8, 0x1f, 0xc0, 0x1c, 0x6d, 0xc7, 0x76, 0x55, 0x8a, 0xdb, 0x3d, 0xcc, 0x5f, 0xf1, +/*1690:*/ 0xe5, 0x59, 0xb3, 0x45, 0x2d, 0x14, 0x6a, 0xd9, 0x66, 0xbc, 0x71, 0x41, 0xe3, 0x9d, 0x1b, 0xb6, +/*16a0:*/ 0x70, 0x39, 0x03, 0x6f, 0x53, 0xdd, 0x84, 0xd1, 0x8f, 0x93, 0xf5, 0xc4, 0x38, 0x04, 0x35, 0x1d, +/*16b0:*/ 0x41, 0xc2, 0xd3, 0x2c, 0x11, 0xb3, 0xbe, 0x3a, 0x30, 0x30, 0x69, 0x21, 0x16, 0xeb, 0xb3, 0xde, +/*16c0:*/ 0x95, 0x21, 0xb3, 0x37, 0xfe, 0xc0, 0x27, 0x56, 0x39, 0x4b, 0xcb, 0xf9, 0x27, 0x9e, 0x70, 0xc2, +/*16d0:*/ 0xca, 0xb8, 0x95, 0xb3, 0xa4, 0x57, 0xa8, 0x8a, 0xb7, 0xf4, 0x32, 0x2b, 0x18, 0x0b, 0xd6, 0x4e, +/*16e0:*/ 0x08, 0xe9, 0xa6, 0x11, 0x36, 0x48, 0x04, 0xb4, 0x13, 0xdd, 0x2c, 0x0d, 0x00, 0xdd, 0xe9, 0x9f, +/*16f0:*/ 0x76, 0x66, 0x41, 0xdc, 0x57, 0xf5, 0x47, 0xfd, 0x11, 0xa9, 0xb8, 0xe7, 0xeb, 0x88, 0xd2, 0x89, +/*1700:*/ 0x08, 0xd5, 0x86, 0x32, 0xd5, 0x6f, 0x79, 0x44, 0xd2, 0x61, 0x6a, 0xed, 0xb0, 0xce, 0x17, 0xc2, +/*1710:*/ 0x68, 0x25, 0x18, 0x5c, 0xaa, 0xa4, 0xa1, 0x23, 0x5e, 0x05, 0xe7, 0x70, 0x56, 0x1c, 0x84, 0x29, +/*1720:*/ 0xa7, 0xef, 0xf7, 0x2f, 0x20, 0x43, 0xf3, 0xc7, 0xcb, 0x4a, 0x46, 0xfd, 0x06, 0xe5, 0x78, 0x52, +/*1730:*/ 0x2f, 0x2b, 0x58, 0xae, 0x41, 0xb1, 0x86, 0xff, 0x9c, 0x0d, 0x08, 0x9a, 0x39, 0xbd, 0x5d, 0xd0, +/*1740:*/ 0xec, 0x40, 0x58, 0x50, 0xf8, 0xe8, 0xb5, 0xec, 0x88, 0xdc, 0x36, 0xdd, 0x79, 0xd0, 0xe2, 0xbe, +/*1750:*/ 0xae, 0xe9, 0x0b, 0xab, 0xfe, 0xa0, 0x27, 0xa0, 0xac, 0xcc, 0x1a, 0x3c, 0x24, 0x39, 0x0e, 0x2d, +/*1760:*/ 0x9a, 0x17, 0x02, 0x71, 0x97, 0x82, 0xb4, 0xde, 0x72, 0x6e, 0xf8, 0xcb, 0xec, 0x63, 0x10, 0xa4, +/*1770:*/ 0x04, 0xb8, 0xfc, 0xc8, 0xcd, 0xa7, 0x47, 0xa4, 0xcd, 0xf2, 0x42, 0x58, 0xae, 0x9a, 0x60, 0x00, +/*1780:*/ 0x3d, 0x88, 0x8c, 0x0b, 0xab, 0xfd, 0x28, 0x32, 0xcb, 0xe2, 0xa6, 0x55, 0xac, 0x3e, 0x5c, 0x00, +/*1790:*/ 0x28, 0xbb, 0xcd, 0xf6, 0x4a, 0xf8, 0xbe, 0xe2, 0x64, 0x18, 0x02, 0x39, 0xaf, 0x59, 0x07, 0x56, +/*17a0:*/ 0x02, 0x4b, 0xb0, 0x5b, 0x72, 0xd6, 0x3e, 0x00, 0xad, 0x7a, 0xba, 0xa2, 0xe8, 0xb3, 0x98, 0x2a, +/*17b0:*/ 0xc6, 0xeb, 0xaf, 0x03, 0xbf, 0x86, 0x53, 0xde, 0x83, 0x71, 0xe5, 0x73, 0x12, 0xd8, 0x48, 0xf5, +/*17c0:*/ 0x6e, 0x0b, 0x0a, 0x68, 0xe3, 0x1b, 0xd2, 0x08, 0xec, 0x41, 0x05, 0xa8, 0xc9, 0xda, 0xdb, 0x0e, +/*17d0:*/ 0xc2, 0x40, 0x5f, 0x7c, 0xde, 0x15, 0x70, 0xfe, 0xb9, 0x30, 0x94, 0xd2, 0x33, 0xbd, 0x0e, 0x6d, +/*17e0:*/ 0x0d, 0x13, 0xb5, 0xd4, 0xc9, 0x05, 0x62, 0xd3, 0x9d, 0xb3, 0xef, 0x91, 0xc2, 0xd8, 0xdb, 0xef, +/*17f0:*/ 0x4b, 0xa4, 0xc5, 0x0d, 0xd3, 0x0f, 0x85, 0x4c, 0x48, 0xcc, 0xb2, 0x2a, 0x1a, 0xa1, 0xa2, 0x9b, +/*1800:*/ 0x79, 0x62, 0x38, 0x8b, 0x2c, 0x24, 0x00, 0x7c, 0xbf, 0xc4, 0xe7, 0xf5, 0x35, 0x5a, 0xe3, 0x8b, +/*1810:*/ 0x8a, 0xfc, 0x93, 0x7f, 0x31, 0xf9, 0x2a, 0x9c, 0xc4, 0x0d, 0xeb, 0xe2, 0x8b, 0x25, 0x55, 0xa3, +/*1820:*/ 0xd6, 0xbd, 0x96, 0x65, 0x0d, 0xcd, 0x10, 0xcc, 0x77, 0x11, 0xd2, 0x6e, 0x8b, 0x05, 0x70, 0x9e, +/*1830:*/ 0x1f, 0x9f, 0xc3, 0x74, 0x18, 0xcd, 0x5d, 0x3d, 0xde, 0x8c, 0xd3, 0xce, 0x1c, 0x4b, 0xc0, 0xaf, +/*1840:*/ 0xe2, 0x9a, 0x8e, 0x4f, 0x1f, 0x3e, 0x07, 0xb1, 0xfc, 0x49, 0x9d, 0x6d, 0x83, 0xe1, 0xb3, 0x69, +/*1850:*/ 0x77, 0x12, 0x41, 0xc2, 0x90, 0x63, 0xbf, 0x83, 0x78, 0x13, 0x93, 0x3c, 0x01, 0xba, 0xda, 0x65, +/*1860:*/ 0x9c, 0x3e, 0x3e, 0xdf, 0x88, 0xf1, 0x43, 0x16, 0x4e, 0x2c, 0x6e, 0x2e, 0xfe, 0x69, 0x5d, 0xcd, +/*1870:*/ 0xeb, 0x4b, 0xb6, 0xc6, 0x7f, 0xf9, 0xc3, 0x01, 0x54, 0xf9, 0xd6, 0x4f, 0x90, 0xf7, 0x42, 0xf9, +/*1880:*/ 0x0f, 0x60, 0xcc, 0x21, 0xbd, 0x5c, 0xf8, 0x31, 0xe6, 0x02, 0xce, 0x17, 0x41, 0x4b, 0x73, 0x76, +/*1890:*/ 0x9a, 0xb4, 0x88, 0xcb, 0xac, 0xe3, 0xd9, 0xe0, 0x6a, 0x8a, 0x18, 0x4b, 0x14, 0x90, 0x6d, 0x26, +/*18a0:*/ 0x39, 0xf8, 0x6a, 0x8a, 0x91, 0x8a, 0x82, 0xd5, 0xb4, 0x23, 0xd0, 0x90, 0x7b, 0x97, 0x59, 0xba, +/*18b0:*/ 0xb0, 0xa8, 0x6c, 0x66, 0x4e, 0xae, 0x17, 0x07, 0xff, 0x89, 0x0b, 0x1f, 0x7e, 0x2f, 0x51, 0x7f, +/*18c0:*/ 0x6c, 0x49, 0x9b, 0x15, 0xc4, 0x73, 0xe7, 0x06, 0x2e, 0x2b, 0x45, 0xc1, 0x35, 0x5f, 0x2c, 0x75, +/*18d0:*/ 0xb3, 0xc4, 0x34, 0xcb, 0x04, 0x98, 0x71, 0xdf, 0xc3, 0x69, 0x85, 0x86, 0x61, 0x40, 0x94, 0x2d, +/*18e0:*/ 0x16, 0x55, 0x64, 0x7f, 0xa4, 0x30, 0xcb, 0x3e, 0x6e, 0xc8, 0x4e, 0x47, 0x20, 0x5d, 0x6e, 0x06, +/*18f0:*/ 0xe7, 0x1c, 0xa9, 0x18, 0xbe, 0x13, 0x2f, 0xd3, 0x32, 0xc8, 0x47, 0x03, 0xdf, 0xce, 0xde, 0xc8, +/*1900:*/ 0x62, 0xbd, 0x5b, 0x3b, 0x26, 0x3a, 0x23, 0xce, 0xff, 0x15, 0xfa, 0x94, 0x81, 0x94, 0x30, 0xe2, +/*1910:*/ 0x76, 0xd2, 0x4c, 0xa6, 0x2c, 0xc3, 0x52, 0x18, 0x10, 0x85, 0x69, 0x83, 0x11, 0x04, 0x6c, 0xed, +/*1920:*/ 0x8d, 0xb2, 0xdf, 0x89, 0x96, 0x26, 0xb5, 0x1e, 0xc2, 0x5e, 0x9b, 0xb1, 0x6b, 0xb2, 0xb9, 0x96, +/*1930:*/ 0x84, 0xfc, 0x5a, 0x24, 0x86, 0x31, 0x63, 0xd8, 0xaa, 0x38, 0x31, 0x75, 0x49, 0x8e, 0x71, 0x15, +/*1940:*/ 0x2e, 0x34, 0xff, 0x7b, 0x02, 0x71, 0xf1, 0x09, 0x25, 0xd5, 0xe9, 0x40, 0xc0, 0x3a, 0x2b, 0xe3, +/*1950:*/ 0xb4, 0x5f, 0xc8, 0x29, 0x12, 0x85, 0xb0, 0xfd, 0x0d, 0xc1, 0xa5, 0xb7, 0x44, 0x57, 0x64, 0x40, +/*1960:*/ 0xc0, 0x45, 0xef, 0x1c, 0xde, 0x41, 0xe8, 0xa9, 0xf5, 0xde, 0x58, 0x53, 0x39, 0xe3, 0x4b, 0x4a, +/*1970:*/ 0xb7, 0x96, 0xd8, 0x88, 0x44, 0x92, 0x81, 0xdd, 0x3a, 0x7a, 0xff, 0x3c, 0x48, 0x9b, 0xe9, 0xa1, +/*1980:*/ 0xc8, 0x71, 0x88, 0xf8, 0x4e, 0x71, 0xc9, 0x86, 0xfb, 0xba, 0x3c, 0xf5, 0x24, 0x28, 0x6b, 0x89, +/*1990:*/ 0xfb, 0xfd, 0xf0, 0xd7, 0x70, 0xc3, 0x34, 0xc7, 0x5d, 0xfb, 0x33, 0x43, 0x3e, 0x56, 0xe1, 0xa7, +/*19a0:*/ 0xbd, 0xe3, 0x70, 0xff, 0x41, 0xd7, 0xdb, 0x1c, 0x68, 0xa6, 0x97, 0xcc, 0x1a, 0xb1, 0xfc, 0xe0, +/*19b0:*/ 0x72, 0xd7, 0x13, 0x62, 0xa6, 0x36, 0x4d, 0xdd, 0x5c, 0x07, 0xbe, 0x37, 0x7d, 0x9d, 0x7b, 0xdd, +/*19c0:*/ 0xc2, 0x30, 0xcd, 0x6a, 0x56, 0x34, 0xd0, 0xd8, 0x30, 0x64, 0x95, 0xb4, 0x43, 0x36, 0xec, 0x7c, +/*19d0:*/ 0xeb, 0x6a, 0x60, 0xca, 0xf9, 0xfe, 0xd3, 0xff, 0x91, 0xa3, 0xb9, 0xd9, 0xa5, 0xbf, 0x33, 0xe1, +/*19e0:*/ 0x29, 0x4c, 0xaf, 0x27, 0x33, 0x95, 0xc1, 0x33, 0x1a, 0xbb, 0xe0, 0xaf, 0x84, 0xe6, 0xfa, 0x88, +/*19f0:*/ 0xd8, 0x7c, 0xc6, 0x39, 0xc6, 0x07, 0x69, 0x70, 0x58, 0xfb, 0xf6, 0xd0, 0x01, 0x8a, 0xba, 0x07, +/*1a00:*/ 0x0a, 0xa4, 0xb9, 0x92, 0x47, 0x32, 0xda, 0x10, 0xa6, 0xfc, 0xaf, 0xbf, 0xd6, 0x12, 0x35, 0x7d, +/*1a10:*/ 0x1d, 0x8b, 0xff, 0x09, 0x53, 0xa4, 0x7a, 0x6e, 0x21, 0x8a, 0x16, 0xc7, 0x2d, 0x65, 0x44, 0xcd, +/*1a20:*/ 0x56, 0xb4, 0x48, 0xd5, 0x72, 0x11, 0x96, 0xcc, 0x01, 0x20, 0x43, 0xb5, 0x2a, 0xa0, 0x4b, 0x0e, +/*1a30:*/ 0xd0, 0xe5, 0x50, 0xb5, 0x9c, 0xdc, 0x52, 0xe9, 0x5b, 0x91, 0xa4, 0xda, 0xdd, 0x0d, 0x3f, 0x78, +/*1a40:*/ 0xa5, 0xd5, 0xfa, 0xd9, 0x18, 0xc9, 0x97, 0x11, 0x43, 0xa6, 0x04, 0x30, 0xb3, 0x60, 0x8b, 0xac, +/*1a50:*/ 0xf4, 0xd7, 0x3a, 0xb2, 0x72, 0xf4, 0x2f, 0x5c, 0x02, 0x6e, 0xac, 0x84, 0xa3, 0x17, 0x5a, 0x90, +/*1a60:*/ 0xc5, 0x36, 0x5f, 0xcd, 0xe7, 0xc7, 0x96, 0xf2, 0x22, 0x3a, 0x4e, 0x80, 0xe1, 0x6a, 0x81, 0x97, +/*1a70:*/ 0x68, 0x9f, 0x9d, 0x5c, 0x24, 0x76, 0x4e, 0x50, 0x05, 0x34, 0x1c, 0x6e, 0x69, 0x25, 0x01, 0x2b, +/*1a80:*/ 0x87, 0x9f, 0xf1, 0xd4, 0x30, 0x3e, 0xca, 0xb8, 0x52, 0x3e, 0xf5, 0xac, 0x45, 0x89, 0x04, 0x4c, +/*1a90:*/ 0x2f, 0xf6, 0xfe, 0x36, 0x24, 0x9a, 0xe1, 0x9b, 0x36, 0xcf, 0x23, 0x91, 0xa3, 0xf3, 0x60, 0xb3, +/*1aa0:*/ 0x32, 0xa4, 0xef, 0x24, 0x15, 0x90, 0xe5, 0x43, 0x30, 0xf4, 0x6b, 0xa4, 0x51, 0xd3, 0xc3, 0x28, +/*1ab0:*/ 0xaf, 0xab, 0x68, 0xc5, 0x06, 0x90, 0xc4, 0x58, 0x9c, 0x48, 0x46, 0xd9, 0x73, 0x4f, 0x78, 0x0a, +/*1ac0:*/ 0x0e, 0xdf, 0xc2, 0x91, 0x81, 0xa3, 0xb9, 0xd3, 0xa0, 0x34, 0x7a, 0x97, 0x1e, 0x86, 0xdf, 0x9c, +/*1ad0:*/ 0xc9, 0x54, 0x7f, 0x97, 0xd2, 0xa1, 0x29, 0xfb, 0xec, 0xde, 0x86, 0x3b, 0xc8, 0xd2, 0x7c, 0xde, +/*1ae0:*/ 0x08, 0xb6, 0x19, 0xab, 0xaa, 0x0b, 0x2f, 0x7e, 0x03, 0xf0, 0x85, 0x93, 0xa7, 0x02, 0x5c, 0xff, +/*1af0:*/ 0x87, 0xaf, 0xab, 0x23, 0xbb, 0x39, 0x73, 0x53, 0x4b, 0x88, 0x9b, 0xf4, 0xae, 0x5f, 0xbc, 0x5d, +/*1b00:*/ 0x78, 0xcb, 0x25, 0x1d, 0x7f, 0x03, 0x05, 0x84, 0x3b, 0xda, 0x97, 0x96, 0x4c, 0xf9, 0x84, 0x12, +/*1b10:*/ 0x23, 0xdb, 0xc2, 0x13, 0xcd, 0x1f, 0xc1, 0x36, 0xbe, 0xaa, 0xa2, 0xa7, 0xb9, 0xd1, 0x8e, 0xd7, +/*1b20:*/ 0x2f, 0x71, 0x9e, 0xc2, 0x09, 0xd1, 0x91, 0xc8, 0x2f, 0xd2, 0x8f, 0xab, 0x0e, 0xfa, 0x57, 0x49, +/*1b30:*/ 0xce, 0x20, 0xad, 0x70, 0xb9, 0x7d, 0x7c, 0x87, 0xc5, 0xbc, 0x14, 0x26, 0xf7, 0x41, 0x08, 0x7b, +/*1b40:*/ 0xe0, 0xf5, 0xf3, 0x58, 0xbe, 0x2e, 0x5d, 0x3d, 0x46, 0xce, 0xc3, 0x7c, 0xbf, 0x08, 0x59, 0x3c, +/*1b50:*/ 0x53, 0x4f, 0x62, 0x7e, 0xd2, 0x65, 0x95, 0xa3, 0x7f, 0xdd, 0x91, 0x54, 0xb7, 0x9e, 0x39, 0x6a, +/*1b60:*/ 0xdb, 0xaf, 0xbe, 0x47, 0x8f, 0xf7, 0xf5, 0xb3, 0xa4, 0x1b, 0xc7, 0xd9, 0xab, 0x04, 0xad, 0x16, +/*1b70:*/ 0x6d, 0x71, 0x34, 0x80, 0xe4, 0x17, 0xe4, 0x22, 0xcd, 0x2c, 0x5f, 0xd9, 0x77, 0x35, 0x4e, 0x9a, +/*1b80:*/ 0x36, 0x1c, 0x89, 0x5a, 0xe8, 0x6a, 0xed, 0x80, 0x41, 0x48, 0x27, 0x73, 0x27, 0xcd, 0x7b, 0xcf, +/*1b90:*/ 0x1c, 0xe2, 0x88, 0x5e, 0x58, 0x3b, 0xa8, 0x27, 0xaa, 0x4d, 0x5c, 0x06, 0xf3, 0xb2, 0xab, 0xff, +/*1ba0:*/ 0x76, 0x0b, 0x99, 0x48, 0xb6, 0x14, 0xa8, 0x67, 0x68, 0x7f, 0xdb, 0xfb, 0xcc, 0x1a, 0x16, 0xdb, +/*1bb0:*/ 0xd2, 0x8e, 0x0e, 0xf8, 0x7b, 0x5c, 0x45, 0x54, 0x26, 0x6d, 0x68, 0xb2, 0xb5, 0x9b, 0x52, 0xbb, +/*1bc0:*/ 0x1b, 0xe2, 0x47, 0x13, 0xed, 0xd8, 0x73, 0xd5, 0x55, 0xc6, 0x28, 0x83, 0xe0, 0x2c, 0x95, 0x47, +/*1bd0:*/ 0xd5, 0x90, 0xf2, 0xcc, 0xc0, 0x1e, 0x4d, 0x34, 0xa7, 0x6d, 0x55, 0xaf, 0xf8, 0x70, 0x10, 0x4f, +/*1be0:*/ 0xcc, 0x1e, 0xa0, 0x34, 0x26, 0x37, 0x12, 0x5b, 0x69, 0xea, 0xf4, 0x83, 0x3a, 0xcc, 0x0f, 0x4a, +/*1bf0:*/ 0x45, 0x8d, 0x17, 0x6a, 0x11, 0x11, 0x96, 0x88, 0x93, 0xc6, 0xac, 0x4b, 0x83, 0x25, 0x96, 0x42, +/*1c00:*/ 0x83, 0x5b, 0xe7, 0xd6, 0x7a, 0xc7, 0x9f, 0x72, 0x04, 0xfd, 0x24, 0x6c, 0x72, 0x47, 0x38, 0x7b, +/*1c10:*/ 0x12, 0xa2, 0xc1, 0x7a, 0xb9, 0x82, 0xed, 0x1f, 0xd8, 0x24, 0xe4, 0xbf, 0x77, 0xb6, 0x65, 0xdb, +/*1c20:*/ 0xf6, 0x09, 0x23, 0x80, 0x95, 0xda, 0xd6, 0xf2, 0x22, 0x0a, 0x6b, 0xec, 0x43, 0x77, 0x90, 0x80, +/*1c30:*/ 0x04, 0xc9, 0xf7, 0x21, 0x95, 0x51, 0x66, 0x10, 0xba, 0x07, 0xe0, 0x63, 0x6c, 0x4d, 0x95, 0x13, +/*1c40:*/ 0x6b, 0xe9, 0x41, 0xb8, 0x75, 0x33, 0x20, 0x99, 0x1b, 0x0d, 0x35, 0x50, 0xdd, 0x3b, 0x8c, 0xbb, +/*1c50:*/ 0x5a, 0xde, 0xb7, 0xc6, 0xda, 0xad, 0xca, 0xaf, 0xcd, 0x7d, 0xc6, 0x36, 0x56, 0x68, 0x12, 0x0b, +/*1c60:*/ 0xf1, 0xfe, 0x88, 0x43, 0x45, 0xa9, 0x0a, 0xf5, 0xa2, 0xdd, 0xf4, 0xc4, 0xea, 0x1f, 0xb3, 0x14, +/*1c70:*/ 0x9d, 0x1c, 0x93, 0x02, 0x2d, 0xb0, 0xa5, 0x62, 0xee, 0x5b, 0xfa, 0x14, 0xc6, 0xe4, 0x16, 0xac, +/*1c80:*/ 0xab, 0x9b, 0xc3, 0x16, 0x48, 0x44, 0x8e, 0x49, 0xd0, 0x2d, 0x3e, 0x2c, 0x4f, 0x20, 0x19, 0x14, +/*1c90:*/ 0x39, 0x88, 0x5a, 0x3f, 0xa3, 0x8c, 0x24, 0x08, 0xd3, 0x79, 0x6b, 0x6f, 0xcd, 0x0f, 0xde, 0x70, +/*1ca0:*/ 0x7e, 0x75, 0x8e, 0x8f, 0xcf, 0x0c, 0x38, 0x7c, 0x50, 0x53, 0x35, 0xd0, 0xa5, 0xad, 0xfe, 0x13, +/*1cb0:*/ 0x5f, 0xe8, 0xae, 0xac, 0x99, 0x80, 0xb0, 0x5c, 0x95, 0x2c, 0xf4, 0x3c, 0x23, 0x25, 0x77, 0x17, +/*1cc0:*/ 0xef, 0x0d, 0x19, 0x5a, 0x7e, 0x99, 0x47, 0x00, 0x09, 0x6a, 0xf7, 0xf9, 0x86, 0xbf, 0x97, 0x0c, +/*1cd0:*/ 0x43, 0x05, 0x44, 0x91, 0x27, 0x44, 0xf9, 0x0c, 0x4b, 0xdc, 0x89, 0xe7, 0xb3, 0x8a, 0x2b, 0xb3, +/*1ce0:*/ 0x28, 0x31, 0xf6, 0xf5, 0x10, 0x56, 0x91, 0x9f, 0xe4, 0x88, 0xa7, 0xc9, 0xea, 0x65, 0xf3, 0x77, +/*1cf0:*/ 0x49, 0x5d, 0x5e, 0xff, 0x91, 0x9b, 0x47, 0xc5, 0xbc, 0x1f, 0xca, 0x87, 0xd1, 0x88, 0x3d, 0xf8, +/*1d00:*/ 0x3c, 0x9b, 0x47, 0x60, 0x85, 0x92, 0xac, 0xe1, 0x64, 0x56, 0x7e, 0xda, 0x0d, 0x62, 0x8e, 0x29, +/*1d10:*/ 0x08, 0xa4, 0xc4, 0x5c, 0xc8, 0xd4, 0x4e, 0xe9, 0x2e, 0xfb, 0x0a, 0x62, 0x37, 0x7d, 0xd0, 0xb2, +/*1d20:*/ 0x25, 0xc8, 0x08, 0x49, 0xfe, 0x10, 0xb3, 0x9c, 0x01, 0x17, 0x29, 0x6a, 0x1d, 0x14, 0x8f, 0x1c, +/*1d30:*/ 0xa5, 0x53, 0xea, 0xd5, 0x38, 0xe8, 0x3f, 0x64, 0x04, 0x12, 0xbf, 0x79, 0x82, 0xc2, 0x17, 0xb2, +/*1d40:*/ 0xdf, 0xf4, 0x93, 0xf6, 0xdf, 0x55, 0xaa, 0x6e, 0x2e, 0x48, 0x1e, 0xcd, 0x29, 0x58, 0x31, 0x3c, +/*1d50:*/ 0x4c, 0x18, 0xb4, 0x63, 0x88, 0x73, 0xde, 0xb2, 0x33, 0xeb, 0x17, 0x0e, 0xba, 0xc9, 0xda, 0xbe, +/*1d60:*/ 0xa8, 0x76, 0xe3, 0xf6, 0xe9, 0xd1, 0xe2, 0x63, 0xd0, 0x6b, 0x06, 0x03, 0x89, 0xcf, 0x06, 0x1e, +/*1d70:*/ 0x55, 0xf4, 0x48, 0xd7, 0x99, 0x3d, 0x21, 0xe4, 0x1e, 0x06, 0x69, 0xd4, 0x97, 0xdb, 0x21, 0x8c, +/*1d80:*/ 0x8a, 0xb8, 0x31, 0xaa, 0xc4, 0x4a, 0xab, 0xbe, 0xd9, 0xc3, 0x29, 0x43, 0x7a, 0xa3, 0xdd, 0x57, +/*1d90:*/ 0x28, 0xf3, 0x71, 0x4a, 0xc6, 0xe0, 0x8a, 0x1a, 0x78, 0x22, 0xf2, 0x37, 0xb0, 0x2e, 0x4c, 0x87, +/*1da0:*/ 0x22, 0x05, 0x54, 0xa0, 0x0d, 0x8a, 0xee, 0xda, 0xb4, 0xc2, 0x17, 0x40, 0x52, 0x53, 0x94, 0x4b, +/*1db0:*/ 0x4b, 0xb1, 0xfb, 0x8c, 0x1b, 0xed, 0x41, 0x25, 0x05, 0x40, 0xcb, 0x20, 0xb8, 0x00, 0x86, 0x05, +/*1dc0:*/ 0x2a, 0xcf, 0xf2, 0xc3, 0x64, 0xbb, 0xf5, 0x0f, 0xae, 0x2e, 0xb8, 0x58, 0xbb, 0x8f, 0xed, 0x64, +/*1dd0:*/ 0x56, 0x62, 0x29, 0xa0, 0x50, 0x23, 0x89, 0xf3, 0x29, 0x03, 0xbe, 0x72, 0x7b, 0xed, 0x91, 0x85, +/*1de0:*/ 0x88, 0x15, 0x2a, 0x34, 0x56, 0xfd, 0x57, 0x5c, 0x08, 0x65, 0x6b, 0xe3, 0x39, 0x40, 0x68, 0x31, +/*1df0:*/ 0xa3, 0xb1, 0x9c, 0x71, 0x24, 0x3f, 0x64, 0xb4, 0x48, 0xc0, 0x2f, 0xc6, 0x53, 0xab, 0x9a, 0xd2, +/*1e00:*/ 0x27, 0x34, 0xbf, 0xc6, 0xcc, 0x1e, 0xd3, 0xb8, 0x8e, 0xc7, 0x2a, 0x1d, 0xd2, 0x73, 0x77, 0xd5, +/*1e10:*/ 0x50, 0xe1, 0x5b, 0x40, 0x0b, 0x04, 0xc5, 0x34, 0xd7, 0x1f, 0x65, 0x98, 0x81, 0x33, 0x62, 0x3c, +/*1e20:*/ 0xeb, 0x0b, 0x70, 0x6a, 0x93, 0x39, 0x00, 0x24, 0x34, 0xb1, 0x9a, 0x5e, 0x9e, 0xa3, 0x97, 0xc6, +/*1e30:*/ 0x15, 0x72, 0xba, 0xdf, 0x8b, 0x71, 0x20, 0xec, 0x68, 0x81, 0x80, 0x96, 0xd0, 0xe6, 0x0c, 0xc4, +/*1e40:*/ 0xc6, 0xe4, 0xdd, 0xe2, 0xf4, 0x4b, 0x0f, 0x40, 0x8a, 0x05, 0x69, 0xa1, 0x6e, 0x9e, 0xf3, 0xcf, +/*1e50:*/ 0x7c, 0x9c, 0x8f, 0x32, 0xd4, 0xba, 0x84, 0x65, 0x2c, 0x5f, 0x0f, 0x76, 0x3a, 0x74, 0xb4, 0x0d, +/*1e60:*/ 0x67, 0x59, 0xa7, 0xdc, 0xc6, 0x1b, 0xd1, 0x68, 0x62, 0xd8, 0xe2, 0x47, 0xd3, 0x39, 0xa3, 0xdc, +/*1e70:*/ 0x15, 0x6f, 0x76, 0x16, 0x12, 0xe0, 0x62, 0xff, 0x4c, 0xe4, 0x98, 0x23, 0x1e, 0xf7, 0xfd, 0x6f, +/*1e80:*/ 0x2e, 0x5a, 0x72, 0x6e, 0x69, 0x95, 0x43, 0x58, 0xa6, 0xba, 0xfd, 0xe8, 0x0c, 0x3c, 0x1d, 0xf2, +/*1e90:*/ 0x22, 0x6b, 0x31, 0x2b, 0x75, 0xfa, 0x35, 0x16, 0xfd, 0x73, 0xa7, 0xa5, 0xdc, 0xb3, 0x5c, 0x60, +/*1ea0:*/ 0x52, 0x95, 0x05, 0xe6, 0xcc, 0x69, 0x76, 0x49, 0xd8, 0x54, 0x3b, 0xf7, 0xc8, 0x39, 0x2d, 0x35, +/*1eb0:*/ 0x08, 0x04, 0xe5, 0x49, 0x58, 0xee, 0x2b, 0x7b, 0x1f, 0xca, 0x32, 0xcc, 0x0a, 0x85, 0x9c, 0xc1, +/*1ec0:*/ 0x9f, 0x6d, 0x05, 0x85, 0x1e, 0x4a, 0x9d, 0x57, 0xb2, 0xcd, 0x66, 0x06, 0x9c, 0x52, 0xba, 0x59, +/*1ed0:*/ 0x31, 0x06, 0x3e, 0x01, 0x1c, 0xad, 0x9e, 0x32, 0x86, 0xcf, 0xe3, 0xff, 0xfc, 0xa0, 0xcf, 0x39, +/*1ee0:*/ 0x7b, 0xb3, 0x56, 0xd0, 0x11, 0xec, 0x53, 0xe1, 0xab, 0xaf, 0x15, 0xee, 0x78, 0xb5, 0x94, 0xb3, +/*1ef0:*/ 0x0d, 0x16, 0xc3, 0x8d, 0x1e, 0x04, 0x3c, 0x42, 0x98, 0x18, 0xf0, 0xe9, 0x0e, 0xe3, 0x56, 0x97, +/*1f00:*/ 0xe9, 0x0f, 0x90, 0xbe, 0x00, 0x12, 0x94, 0x88, 0xc3, 0xd9, 0x9e, 0xd8, 0x50, 0x76, 0x08, 0xb1, +/*1f10:*/ 0xfe, 0x16, 0xf7, 0x29, 0xfb, 0xb7, 0x64, 0x46, 0x37, 0x8b, 0xeb, 0x01, 0x2b, 0x8a, 0x7e, 0x7e, +/*1f20:*/ 0x4c, 0x96, 0x9a, 0x3b, 0x29, 0xd6, 0xfa, 0x1f, 0x4a, 0xea, 0xfe, 0xa0, 0xd7, 0x71, 0xc5, 0x6b, +/*1f30:*/ 0x61, 0x7c, 0xa6, 0xc3, 0xc2, 0xe9, 0xdd, 0x86, 0x69, 0x89, 0x87, 0x3d, 0x49, 0xc0, 0x5e, 0x16, +/*1f40:*/ 0xc4, 0x47, 0x6c, 0x6c, 0x34, 0xd4, 0x78, 0xd0, 0x45, 0x50, 0xc1, 0xe0, 0xce, 0xd2, 0x62, 0x76, +/*1f50:*/ 0xfb, 0x78, 0xf2, 0x9f, 0xf8, 0xda, 0xe7, 0x45, 0x14, 0x79, 0xf8, 0xdb, 0xde, 0x4b, 0x86, 0x4e, +/*1f60:*/ 0x00, 0xf7, 0x20, 0xf8, 0x7d, 0xa4, 0xf6, 0x7b, 0x3e, 0xa5, 0xf0, 0x09, 0x3b, 0x2b, 0xb9, 0x49, +/*1f70:*/ 0x6a, 0x6e, 0xfb, 0x43, 0x01, 0x63, 0x5d, 0x0d, 0x8b, 0x9e, 0x74, 0xde, 0x5c, 0xc9, 0x85, 0xc2, +/*1f80:*/ 0x35, 0xc1, 0x81, 0x74, 0x35, 0xe6, 0xc9, 0x57, 0xd7, 0x54, 0x3c, 0x89, 0x7b, 0x29, 0xd0, 0x9f, +/*1f90:*/ 0x05, 0x2c, 0xdd, 0xe6, 0xe7, 0x73, 0x1b, 0x99, 0x4e, 0x7f, 0x8e, 0x32, 0x9d, 0x17, 0xad, 0x41, +/*1fa0:*/ 0xfd, 0xb3, 0xa0, 0xbe, 0xb0, 0x93, 0x79, 0x03, 0x37, 0x6e, 0x53, 0xb1, 0x9b, 0xba, 0xa0, 0xd9, +/*1fb0:*/ 0x33, 0xec, 0x85, 0xa0, 0xf0, 0x0d, 0xcb, 0x8c, 0xb3, 0xf5, 0x59, 0x25, 0x79, 0x35, 0x35, 0x62, +/*1fc0:*/ 0xbc, 0x9d, 0x0b, 0xcc, 0x80, 0xd9, 0x5d, 0xe8, 0x85, 0xf7, 0xda, 0x1e, 0x4c, 0x89, 0x6d, 0x4d, +/*1fd0:*/ 0x99, 0xbc, 0xbb, 0x30, 0xab, 0x63, 0xae, 0xfb, 0x9c, 0x91, 0x7a, 0xfd, 0x7a, 0xdf, 0x62, 0x13, +/*1fe0:*/ 0x10, 0x6b, 0xcc, 0x56, 0x9c, 0xa7, 0x41, 0x5c, 0x2e, 0x5a, 0x29, 0x0b, 0xcb, 0xd2, 0xd0, 0x29, +/*1ff0:*/ 0x2a, 0xbb, 0x4a, 0x3c, 0xc5, 0xb5, 0xcf, 0xf2, 0x55, 0x9c, 0x21, 0x0b, 0x99, 0x46, 0xe5, 0x98, +/*2000:*/ 0xcc, 0x98, 0x9a, 0xd2, 0xf7, 0x15, 0xd3, 0x1b, 0x67, 0x73, 0xa6, 0x19, 0xa2, 0x6e, 0xa2, 0xeb, +/*2010:*/ 0xb0, 0xe3, 0x06, 0xe1, 0xa2, 0x07, 0x3c, 0xfa, 0x42, 0x29, 0x04, 0x55, 0x70, 0x2c, 0x18, 0x39, +/*2020:*/ 0xd2, 0x87, 0xb9, 0x81, 0xbc, 0x29, 0x95, 0xf9, 0xac, 0x42, 0xab, 0x3f, 0x27, 0x58, 0xb0, 0x22, +/*2030:*/ 0x9f, 0x07, 0xd6, 0x3c, 0x79, 0xb8, 0x48, 0xd1, 0x38, 0xc3, 0xe9, 0xb0, 0xf5, 0x80, 0x71, 0x5b, +/*2040:*/ 0xff, 0xad, 0xfb, 0x35, 0x3e, 0x4a, 0x58, 0x50, 0x58, 0x7d, 0xf7, 0x01, 0xd6, 0xb4, 0xe8, 0x26, +/*2050:*/ 0x38, 0x2a, 0x26, 0x88, 0xb8, 0x83, 0x6f, 0xdb, 0xef, 0x4b, 0x67, 0xca, 0x7e, 0x76, 0x07, 0x78, +/*2060:*/ 0x35, 0xc4, 0x37, 0xc2, 0xa1, 0x8a, 0x2b, 0x0f, 0xbf, 0x14, 0xb1, 0x54, 0x85, 0xe1, 0xec, 0x02, +/*2070:*/ 0x40, 0x6e, 0xc6, 0x76, 0x1b, 0x84, 0x93, 0x5c, 0x5e, 0x05, 0xaf, 0xa1, 0x8f, 0xd3, 0xd8, 0x01, +/*2080:*/ 0x53, 0x01, 0x54, 0x63, 0x89, 0x4c, 0xe0, 0x8b, 0xef, 0x98, 0x69, 0xde, 0x97, 0x2c, 0x7f, 0x6c, +/*2090:*/ 0xd2, 0xc2, 0x0a, 0x11, 0xf9, 0x5e, 0x10, 0x38, 0x6f, 0xfd, 0x19, 0x24, 0x2a, 0x56, 0x6a, 0xc2, +/*20a0:*/ 0x10, 0x9f, 0x10, 0xe0, 0x8c, 0x1e, 0x93, 0x44, 0x9f, 0xd5, 0x50, 0xb4, 0xe7, 0x22, 0xde, 0xf1, +/*20b0:*/ 0xd4, 0x06, 0xeb, 0x12, 0x27, 0x69, 0x9a, 0xd7, 0x0b, 0x0b, 0x57, 0xab, 0xa7, 0x5a, 0xcd, 0xeb, +/*20c0:*/ 0xee, 0xae, 0x45, 0x90, 0xb0, 0x91, 0x1e, 0x75, 0xe1, 0x41, 0x89, 0xf6, 0x0c, 0x63, 0x06, 0xc6, +/*20d0:*/ 0xc8, 0xab, 0xc5, 0xba, 0xa9, 0xbf, 0xf1, 0xa8, 0x7e, 0x50, 0x2b, 0x9d, 0x51, 0x36, 0xce, 0xe7, +/*20e0:*/ 0x64, 0x3c, 0x6f, 0xdf, 0x4b, 0xf0, 0xeb, 0x06, 0xf4, 0xe7, 0x00, 0x9b, 0x09, 0x1f, 0x31, 0x48, +/*20f0:*/ 0x80, 0x11, 0x9e, 0xc1, 0xa5, 0x85, 0x04, 0x00, 0x66, 0x06, 0x5c, 0x9c, 0x2b, 0xa4, 0xaa, 0x0a, +/*2100:*/ 0xe6, 0x8a, 0x27, 0x46, 0x2f, 0x98, 0xdd, 0x49, 0x85, 0xc5, 0xcc, 0x3f, 0xd1, 0x22, 0x00, 0x89, +/*2110:*/ 0x6a, 0x67, 0x09, 0xba, 0x64, 0x54, 0x20, 0x97, 0xaf, 0x7f, 0x28, 0xf5, 0xea, 0xf3, 0x02, 0xcc, +/*2120:*/ 0x90, 0xf0, 0x46, 0x01, 0x28, 0xca, 0x99, 0x46, 0xa1, 0x68, 0xc4, 0x9d, 0xb8, 0x63, 0x5a, 0x48, +/*2130:*/ 0x8b, 0xb8, 0x2c, 0x11, 0x53, 0xe1, 0x92, 0xbd, 0x5c, 0xaf, 0x62, 0x1c, 0x42, 0x2f, 0x92, 0xcc, +/*2140:*/ 0x1b, 0xe7, 0xc5, 0xb4, 0xfb, 0x08, 0x16, 0xd2, 0x08, 0xb1, 0xa0, 0xad, 0x0a, 0xbd, 0x5b, 0xd6, +/*2150:*/ 0x3a, 0xaf, 0x4d, 0xed, 0x3c, 0x88, 0x57, 0x74, 0xd2, 0x78, 0x04, 0x44, 0x39, 0xff, 0x6c, 0x9e, +/*2160:*/ 0x88, 0xd6, 0x82, 0xe1, 0x6c, 0xdd, 0x04, 0x28, 0xa6, 0xcc, 0xd7, 0xf7, 0xa3, 0x93, 0x96, 0x4c, +/*2170:*/ 0xfa, 0x40, 0x22, 0x40, 0x53, 0x5c, 0x08, 0x10, 0x29, 0x37, 0x3e, 0x33, 0x89, 0x00, 0x85, 0x46, +/*2180:*/ 0x51, 0xdf, 0xc9, 0xbe, 0x7d, 0x49, 0xaf, 0x07, 0xcd, 0xc5, 0x26, 0xd8, 0x56, 0xf0, 0xf6, 0x8a, +/*2190:*/ 0x7d, 0x24, 0xc5, 0x4a, 0xb5, 0xb4, 0xa9, 0x2a, 0x21, 0xf1, 0x07, 0x25, 0x61, 0x05, 0x4c, 0x91, +/*21a0:*/ 0xa5, 0x8c, 0x86, 0xf5, 0x89, 0x2b, 0x63, 0x9a, 0x7a, 0x5a, 0x6f, 0x4c, 0xe3, 0x96, 0xf6, 0x27, +/*21b0:*/ 0x85, 0x90, 0x14, 0x64, 0x3c, 0x31, 0x51, 0x56, 0x9c, 0xc1, 0x4d, 0xc5, 0xf2, 0xc9, 0x5d, 0x1b, +/*21c0:*/ 0x15, 0x9d, 0x6e, 0x92, 0x95, 0x20, 0x2c, 0xf8, 0x99, 0x33, 0xee, 0xad, 0x83, 0x80, 0xaa, 0x90, +/*21d0:*/ 0xcb, 0xf3, 0x51, 0x85, 0x65, 0xc6, 0x0d, 0x6f, 0x70, 0x73, 0xa8, 0x85, 0x9e, 0xe9, 0xcd, 0x9f, +/*21e0:*/ 0x03, 0x56, 0xab, 0xed, 0x79, 0xd7, 0x8d, 0x23, 0xd9, 0x35, 0x6e, 0x5d, 0xf4, 0x98, 0xc0, 0xda, +/*21f0:*/ 0x3c, 0xef, 0x5f, 0x5c, 0x5e, 0x76, 0x2a, 0xa6, 0x07, 0x81, 0x7f, 0xf0, 0xc4, 0xcc, 0x2d, 0x89, +/*2200:*/ 0x6c, 0x88, 0xfd, 0x44, 0x57, 0xc9, 0xad, 0x6d, 0x8b, 0x4c, 0x68, 0x44, 0x1a, 0x06, 0x97, 0x53, +/*2210:*/ 0x84, 0x3e, 0x72, 0xce, 0xeb, 0xaf, 0x3c, 0xc6, 0x29, 0xb2, 0x85, 0x20, 0x5f, 0x1f, 0x72, 0x81, +/*2220:*/ 0xab, 0x12, 0x09, 0x83, 0x07, 0xd3, 0x02, 0x9c, 0xef, 0x96, 0x0b, 0xad, 0xf2, 0x81, 0x3c, 0xb7, +/*2230:*/ 0x3c, 0x61, 0xd3, 0x93, 0x69, 0x53, 0x75, 0xb6, 0xd2, 0xf2, 0xb1, 0xcd, 0xb7, 0xa2, 0xe7, 0x14, +/*2240:*/ 0x29, 0xf4, 0x5c, 0xfb, 0x8f, 0x89, 0xfe, 0x10, 0x77, 0xe4, 0x70, 0xb4, 0x5f, 0xe7, 0xd1, 0xd7, +/*2250:*/ 0x46, 0x4c, 0xfc, 0xda, 0x41, 0x00, 0x91, 0x41, 0xed, 0xc7, 0xab, 0x03, 0x1d, 0x79, 0x1a, 0xe7, +/*2260:*/ 0x28, 0xd1, 0x36, 0x52, 0x0e, 0x31, 0x3d, 0xb2, 0xe9, 0x89, 0xbd, 0xd9, 0x1a, 0xda, 0xa8, 0xee, +/*2270:*/ 0x81, 0xea, 0x96, 0x9b, 0x32, 0xc2, 0x59, 0xe2, 0x20, 0xec, 0x11, 0xef, 0xf1, 0x11, 0x21, 0x6c, +/*2280:*/ 0x32, 0xd4, 0x89, 0xc6, 0xb0, 0xbe, 0xd2, 0x17, 0xa4, 0x92, 0x25, 0x05, 0x0c, 0xc4, 0xbe, 0xab, +/*2290:*/ 0xb7, 0xe2, 0x6a, 0x67, 0x42, 0xd2, 0xbc, 0x77, 0xcc, 0xc3, 0x81, 0x8c, 0x16, 0x1a, 0xbb, 0x0e, +/*22a0:*/ 0x8d, 0x2d, 0x43, 0x22, 0xe2, 0x3d, 0x48, 0x7a, 0x37, 0xde, 0xa3, 0x05, 0x33, 0xe7, 0x4b, 0x0d, +/*22b0:*/ 0xa8, 0x72, 0xc1, 0x31, 0xd5, 0x6a, 0xaa, 0x48, 0xe6, 0x8e, 0x1b, 0x36, 0x6f, 0xe2, 0xc8, 0x07, +/*22c0:*/ 0x47, 0x0b, 0x7a, 0x38, 0x37, 0x66, 0x0a, 0x54, 0x3b, 0x9f, 0xba, 0x84, 0xd8, 0x64, 0x7d, 0x59, +/*22d0:*/ 0x85, 0x75, 0x30, 0x15, 0x27, 0x0c, 0x22, 0xfd, 0xc6, 0xa1, 0x40, 0xe2, 0x05, 0x94, 0xab, 0x6e, +/*22e0:*/ 0x1e, 0x03, 0x03, 0x3a, 0x79, 0x38, 0x10, 0x34, 0x92, 0x86, 0xe9, 0xdf, 0xf9, 0xf4, 0xea, 0xce, +/*22f0:*/ 0x00, 0x7b, 0xb9, 0x36, 0x14, 0xd0, 0x07, 0xda, 0xa3, 0x18, 0x55, 0xd1, 0x63, 0xd1, 0xe0, 0x9f, +/*2300:*/ 0x80, 0xe5, 0x0b, 0x2d, 0xa4, 0xe1, 0x5b, 0xce, 0x8f, 0x92, 0xc3, 0xd2, 0x6c, 0xd5, 0x14, 0x52, +/*2310:*/ 0x26, 0xab, 0x8b, 0x59, 0x88, 0x7e, 0xd0, 0xc0, 0x02, 0xcd, 0x6c, 0xec, 0xdc, 0x31, 0x59, 0x4b, +/*2320:*/ 0x64, 0xe5, 0xca, 0x77, 0x41, 0x66, 0x5e, 0x7b, 0xbc, 0x24, 0x70, 0xb0, 0x63, 0x7a, 0x46, 0x2e, +/*2330:*/ 0xd0, 0xbe, 0x12, 0x9f, 0x3a, 0x2c, 0xa0, 0xdf, 0x43, 0x16, 0x3c, 0x78, 0x0c, 0x86, 0x00, 0xd6, +/*2340:*/ 0x68, 0x3f, 0xbb, 0x9d, 0x13, 0xa2, 0x15, 0xf1, 0x8f, 0x22, 0x7c, 0x74, 0x31, 0x51, 0x54, 0xc3, +/*2350:*/ 0xc9, 0xcd, 0x40, 0x57, 0x59, 0xd5, 0x9c, 0xd8, 0x22, 0xec, 0x13, 0xc1, 0x6e, 0xec, 0xd7, 0xa3, +/*2360:*/ 0xfa, 0xad, 0xfb, 0xcd, 0xf8, 0xfa, 0x7b, 0xbb, 0xe1, 0xf5, 0xd8, 0x60, 0x7e, 0x44, 0xb3, 0x3a, +/*2370:*/ 0x57, 0xe3, 0x7b, 0x97, 0x65, 0x29, 0xbf, 0xd5, 0x9e, 0x86, 0x5c, 0x82, 0xf1, 0xa0, 0x59, 0xf6, +/*2380:*/ 0x9d, 0x91, 0xf0, 0xfc, 0x70, 0x32, 0x0b, 0x4d, 0x45, 0xad, 0xd6, 0x48, 0x96, 0x2a, 0x30, 0xb8, +/*2390:*/ 0x2b, 0x77, 0xe8, 0x89, 0xfa, 0xfc, 0xc2, 0x77, 0x4c, 0x74, 0xbb, 0x54, 0xc2, 0x93, 0xf2, 0x51, +/*23a0:*/ 0x11, 0x80, 0xa0, 0x38, 0x47, 0xd1, 0xdc, 0x5e, 0xd2, 0xfc, 0x2a, 0x6c, 0x06, 0x98, 0x79, 0x19, +/*23b0:*/ 0x12, 0x22, 0xc0, 0xf0, 0xff, 0x49, 0xb8, 0x41, 0x1a, 0x04, 0x28, 0xbb, 0x2f, 0x90, 0x15, 0x48, +/*23c0:*/ 0x83, 0x69, 0x23, 0x1e, 0xce, 0x26, 0x24, 0x1d, 0x1b, 0x6b, 0x70, 0x41, 0xe1, 0xdb, 0xea, 0x63, +/*23d0:*/ 0x8e, 0xce, 0x9a, 0x0d, 0xb5, 0x26, 0xa1, 0xb8, 0xd1, 0x94, 0xc4, 0x75, 0xbc, 0xbf, 0xe2, 0x27, +/*23e0:*/ 0xed, 0xc7, 0xb7, 0x75, 0x55, 0x25, 0xc2, 0xa3, 0xb1, 0xf3, 0xde, 0x2c, 0x18, 0x99, 0x6a, 0x54, +/*23f0:*/ 0x14, 0x3d, 0x7a, 0x80, 0xa0, 0xd3, 0x43, 0x27, 0x63, 0x37, 0x87, 0x40, 0xd7, 0x8c, 0xd3, 0xf2, +/*2400:*/ 0x32, 0x34, 0x32, 0x9c, 0xa9, 0xf4, 0x98, 0x65, 0x5f, 0x6c, 0xcf, 0xb5, 0xf5, 0x34, 0x6f, 0x29, +/*2410:*/ 0x2a, 0xcf, 0x84, 0x6c, 0x39, 0xe3, 0x72, 0xdf, 0xb6, 0x50, 0xe0, 0x27, 0xdc, 0xb1, 0x55, 0x45, +/*2420:*/ 0xed, 0x9a, 0xe9, 0x5d, 0x8d, 0x7d, 0x04, 0x9b, 0x52, 0x8a, 0xe7, 0x15, 0x94, 0xef, 0x48, 0x06, +/*2430:*/ 0xa1, 0x35, 0x7c, 0x4a, 0x45, 0x05, 0xaa, 0xdb, 0x21, 0x74, 0x6e, 0xb7, 0x11, 0x3f, 0xaf, 0xde, +/*2440:*/ 0xed, 0x58, 0xaa, 0x80, 0x97, 0x4d, 0x77, 0xc5, 0x9d, 0x00, 0x1d, 0xda, 0x95, 0x34, 0x6b, 0xda, +/*2450:*/ 0xe1, 0x68, 0x5f, 0x08, 0x71, 0x18, 0x22, 0xc8, 0x0c, 0x83, 0x74, 0x80, 0x1d, 0x5a, 0x70, 0x69, +/*2460:*/ 0x71, 0x18, 0xb5, 0x0a, 0x6a, 0xc1, 0xe5, 0xeb, 0xa6, 0x16, 0x99, 0xdf, 0xf6, 0xf0, 0xb4, 0x11, +/*2470:*/ 0xf5, 0x8e, 0x1c, 0xa2, 0x60, 0xbe, 0xa6, 0xc7, 0x11, 0x41, 0xa3, 0xf6, 0x96, 0x5e, 0x5f, 0x7d, +/*2480:*/ 0x97, 0x46, 0x0f, 0xf5, 0x15, 0x48, 0xbc, 0x6e, 0xe6, 0xc9, 0x51, 0x3f, 0x38, 0x78, 0xc5, 0x32, +/*2490:*/ 0xc3, 0x45, 0x0f, 0x62, 0x98, 0x64, 0x7d, 0x05, 0x93, 0x55, 0x4f, 0x99, 0xe7, 0x49, 0x49, 0x5e, +/*24a0:*/ 0xc4, 0x4f, 0x2b, 0x43, 0xa3, 0x3b, 0x6a, 0x6f, 0xed, 0xc9, 0xca, 0x74, 0x20, 0xcb, 0x2a, 0x46, +/*24b0:*/ 0xce, 0xdd, 0xb3, 0xe0, 0xf6, 0xf9, 0xa0, 0x66, 0x77, 0x55, 0x91, 0x1d, 0xa5, 0xae, 0x39, 0xf1, +/*24c0:*/ 0xd5, 0x49, 0x0f, 0xcf, 0x25, 0xe9, 0x83, 0xf2, 0x4b, 0xf7, 0x48, 0x79, 0x0b, 0x8d, 0xe1, 0xd3, +/*24d0:*/ 0x85, 0x9f, 0x0b, 0x3c, 0x03, 0x71, 0x43, 0xe8, 0x73, 0xb1, 0x30, 0xdb, 0xe4, 0xd8, 0xe8, 0x62, +/*24e0:*/ 0x8e, 0x0f, 0x99, 0x5b, 0x54, 0xc2, 0xae, 0x1d, 0x32, 0xa7, 0x1e, 0xa6, 0x75, 0x03, 0x03, 0x47, +/*24f0:*/ 0x62, 0xc0, 0x51, 0x74, 0x61, 0xe7, 0xaa, 0xd1, 0xdb, 0x50, 0xd5, 0x87, 0xd4, 0xf6, 0x6f, 0x1b, +/*2500:*/ 0xfe, 0x9c, 0x4a, 0x30, 0x84, 0x44, 0x70, 0x08, 0xf6, 0xe1, 0x8c, 0x18, 0x85, 0x18, 0x65, 0x7d, +/*2510:*/ 0x1f, 0x2f, 0xfb, 0x52, 0x91, 0x7a, 0x0d, 0xbd, 0xd6, 0x67, 0x64, 0x2b, 0xab, 0x86, 0x79, 0x88, +/*2520:*/ 0x32, 0xaf, 0xc3, 0xbd, 0xf5, 0x7e, 0x7f, 0x3d, 0x18, 0x4f, 0x95, 0x2f, 0x7a, 0x01, 0xa1, 0x80, +/*2530:*/ 0x12, 0x45, 0xf1, 0xd8, 0x68, 0x80, 0x4d, 0xdb, 0x3b, 0x6a, 0x6a, 0x6c, 0x05, 0x55, 0xc8, 0xce, +/*2540:*/ 0x8c, 0xa3, 0xc6, 0x94, 0xa9, 0x42, 0xaa, 0x55, 0xd2, 0x60, 0x90, 0x9d, 0x87, 0x23, 0xbc, 0x75, +/*2550:*/ 0x98, 0x25, 0x23, 0x04, 0xbd, 0xfe, 0x2f, 0x9f, 0x31, 0xaf, 0x68, 0x2e, 0xfd, 0x21, 0x96, 0x8c, +/*2560:*/ 0x16, 0xaf, 0x69, 0xc3, 0xb3, 0x54, 0xf6, 0x89, 0xf1, 0x81, 0x41, 0x56, 0xa4, 0x82, 0x03, 0xf3, +/*2570:*/ 0xf6, 0x89, 0x74, 0x28, 0x20, 0x5b, 0x34, 0xae, 0x61, 0x41, 0x93, 0xe9, 0xfd, 0x3b, 0x23, 0xe3, +/*2580:*/ 0x60, 0xc7, 0xf5, 0xf5, 0x84, 0x58, 0x1f, 0x65, 0xbd, 0x28, 0x50, 0xc2, 0xb7, 0x19, 0xc6, 0x44, +/*2590:*/ 0x6c, 0x46, 0x55, 0x16, 0xa9, 0xef, 0xb3, 0xfc, 0x8d, 0x4b, 0x76, 0x3a, 0x74, 0xac, 0xf5, 0x49, +/*25a0:*/ 0x81, 0x56, 0x97, 0xf9, 0x21, 0x28, 0xed, 0x0c, 0x42, 0xe9, 0x5a, 0x97, 0x50, 0xc4, 0x2f, 0xb2, +/*25b0:*/ 0x30, 0xb8, 0x76, 0x73, 0x36, 0x1d, 0xa2, 0xcc, 0x8c, 0x76, 0x69, 0x1e, 0x46, 0x04, 0x94, 0xbd, +/*25c0:*/ 0x6f, 0x3a, 0x35, 0xe5, 0x0a, 0x59, 0xea, 0x29, 0x64, 0x18, 0x89, 0x74, 0xc9, 0x79, 0xc3, 0x0b, +/*25d0:*/ 0xe9, 0x35, 0xce, 0xd0, 0xc3, 0x74, 0x55, 0xbb, 0x45, 0x17, 0x60, 0x7e, 0x70, 0xc8, 0xc2, 0x88, +/*25e0:*/ 0xd6, 0xb4, 0x76, 0x3b, 0x1e, 0x2e, 0x14, 0xcf, 0x3c, 0xdd, 0x89, 0x68, 0xab, 0x41, 0x01, 0xb2, +/*25f0:*/ 0x20, 0x9f, 0x1d, 0xbf, 0x9e, 0xaa, 0xb1, 0x59, 0x7b, 0xd6, 0x59, 0xdc, 0xea, 0x50, 0xe9, 0x80, +/*2600:*/ 0x54, 0x2c, 0xba, 0x91, 0xef, 0x25, 0x1e, 0x98, 0x85, 0x82, 0x16, 0xc6, 0x4a, 0x6b, 0x74, 0xb4, +/*2610:*/ 0x8c, 0xe9, 0xba, 0xc5, 0x66, 0x18, 0x2f, 0xd1, 0xca, 0xa7, 0x32, 0x69, 0x86, 0x13, 0xfb, 0x22, +/*2620:*/ 0xeb, 0xf9, 0x27, 0x94, 0xde, 0xf0, 0x50, 0x2d, 0x68, 0x83, 0x9b, 0xe1, 0x2c, 0x01, 0xa9, 0x47, +/*2630:*/ 0x99, 0xc5, 0x80, 0xc2, 0x8a, 0x6e, 0x29, 0x47, 0x2f, 0xf1, 0x06, 0x15, 0x2a, 0x59, 0xb5, 0xc9, +/*2640:*/ 0xb7, 0x33, 0x98, 0x54, 0xa8, 0x06, 0xc6, 0x46, 0xf2, 0x3d, 0x98, 0x72, 0x73, 0x4e, 0xe8, 0x54, +/*2650:*/ 0x8e, 0x5b, 0x7d, 0x2c, 0x93, 0xe1, 0xa0, 0x41, 0x3a, 0x29, 0x3a, 0x25, 0x69, 0x88, 0x4d, 0x10, +/*2660:*/ 0x8a, 0xd3, 0x2c, 0xad, 0x9f, 0x9f, 0xaa, 0xfe, 0x69, 0x33, 0x9d, 0x3a, 0x37, 0xbb, 0xdc, 0xfb, +/*2670:*/ 0x83, 0xf6, 0x54, 0x9a, 0xcc, 0x72, 0x0f, 0xbb, 0xea, 0x48, 0xd2, 0xba, 0xe3, 0xc8, 0x9c, 0xfc, +/*2680:*/ 0x35, 0x9a, 0x07, 0x20, 0xb8, 0x6f, 0x58, 0x43, 0xfd, 0x10, 0xa6, 0xb7, 0x9d, 0x5f, 0xda, 0x20, +/*2690:*/ 0x25, 0xc8, 0x0b, 0xaa, 0xec, 0x09, 0xff, 0x91, 0x14, 0x44, 0x02, 0x44, 0x8c, 0x86, 0xb2, 0x1f, +/*26a0:*/ 0xf7, 0x52, 0x84, 0xcc, 0xcb, 0x3b, 0xa9, 0x2e, 0xb6, 0xfe, 0x7e, 0xfd, 0xa8, 0x65, 0xe4, 0xfc, +/*26b0:*/ 0x31, 0xdb, 0xf3, 0x4e, 0x36, 0x2d, 0x35, 0x34, 0xad, 0x76, 0x01, 0xe7, 0x4d, 0xe1, 0x25, 0x2d, +/*26c0:*/ 0xac, 0x6e, 0x50, 0x7c, 0xb8, 0xb2, 0x15, 0xc4, 0x7b, 0x91, 0x0a, 0x89, 0xb8, 0x7e, 0x77, 0x32, +/*26d0:*/ 0xc6, 0x25, 0xd2, 0xb5, 0x1d, 0xa3, 0x4e, 0x4e, 0x91, 0xa1, 0xd3, 0x0d, 0xec, 0xb4, 0x27, 0xa9, +/*26e0:*/ 0x3e, 0xf5, 0xe5, 0x69, 0x6f, 0x2b, 0x75, 0xb0, 0xe9, 0x9b, 0x9d, 0xa7, 0xf2, 0x9e, 0xbc, 0x35, +/*26f0:*/ 0xc0, 0xfa, 0xa6, 0xc1, 0xbd, 0xfc, 0x16, 0x95, 0x48, 0x6a, 0xbc, 0x6f, 0xbf, 0x7b, 0x66, 0x6b, +/*2700:*/ 0x8c, 0x76, 0x2e, 0x07, 0xd2, 0x6a, 0xeb, 0xf6, 0xce, 0x52, 0x14, 0x84, 0x9f, 0x3f, 0x74, 0xc1, +/*2710:*/ 0x89, 0x18, 0x58, 0x5d, 0x51, 0xd2, 0x66, 0x74, 0x94, 0x50, 0x64, 0xa8, 0x3f, 0xb3, 0xd7, 0x30, +/*2720:*/ 0xd2, 0x6b, 0x37, 0xa1, 0x5d, 0x55, 0xb4, 0x91, 0xcd, 0x27, 0x56, 0x2c, 0x43, 0x67, 0x48, 0xe9, +/*2730:*/ 0xf2, 0x2d, 0x0a, 0x7c, 0xe4, 0x14, 0x11, 0x03, 0x33, 0x3c, 0x9d, 0x26, 0x41, 0xc9, 0x72, 0x24, +/*2740:*/ 0xca, 0x3e, 0x08, 0x66, 0x7a, 0x4b, 0x97, 0x72, 0xb1, 0x5b, 0x95, 0x2b, 0xe2, 0xc2, 0xee, 0x32, +/*2750:*/ 0x99, 0x61, 0x21, 0xc7, 0xca, 0x1a, 0xd8, 0x00, 0xc2, 0x38, 0x3c, 0xb0, 0x91, 0x0c, 0xdb, 0x7c, +/*2760:*/ 0x39, 0x7c, 0xa7, 0x4b, 0xa3, 0x5a, 0xa4, 0xc5, 0x06, 0xe3, 0xa8, 0x68, 0x24, 0xcd, 0xa7, 0x70, +/*2770:*/ 0x78, 0xe9, 0x9c, 0xdb, 0xba, 0x92, 0x22, 0xed, 0x12, 0x96, 0x85, 0x27, 0x6c, 0xe7, 0xd8, 0xca, +/*2780:*/ 0x40, 0x17, 0x0e, 0x23, 0xea, 0xb0, 0x96, 0x63, 0x7b, 0x5e, 0xb3, 0x36, 0x14, 0x3a, 0x06, 0x50, +/*2790:*/ 0x86, 0x95, 0x1c, 0xba, 0x5b, 0xf0, 0x06, 0x26, 0x21, 0x9b, 0x8d, 0x26, 0x80, 0x64, 0x0b, 0x2e, +/*27a0:*/ 0x96, 0x28, 0x80, 0x8b, 0x2f, 0x74, 0x18, 0x70, 0x35, 0x53, 0x1b, 0x84, 0x7e, 0x99, 0xb3, 0xc2, +/*27b0:*/ 0x47, 0x57, 0xd1, 0xa4, 0xb7, 0x01, 0xfe, 0x41, 0x50, 0x0c, 0x05, 0x17, 0xee, 0x0c, 0x23, 0xb2, +/*27c0:*/ 0x82, 0xe4, 0x00, 0x1b, 0xf0, 0x94, 0xcf, 0x52, 0x84, 0x1f, 0x28, 0xd3, 0x5c, 0x27, 0x82, 0x4c, +/*27d0:*/ 0xec, 0xd7, 0x15, 0x97, 0x72, 0xc3, 0x4b, 0x06, 0xdc, 0x44, 0xac, 0x3c, 0x7c, 0xd9, 0xe4, 0x0e, +/*27e0:*/ 0x46, 0xad, 0x48, 0xf4, 0x90, 0xf1, 0x0c, 0x52, 0x0c, 0xa1, 0x16, 0xea, 0x2f, 0x3b, 0xe8, 0x43, +/*27f0:*/ 0x4c, 0xcc, 0x51, 0x8d, 0xd9, 0xa4, 0x7f, 0xce, 0xf8, 0x38, 0x8c, 0x0f, 0x0c, 0x4f, 0xa1, 0x88, +/*2800:*/ 0x95, 0xb9, 0x0c, 0x55, 0x40, 0xd2, 0x22, 0xd6, 0xe5, 0x68, 0x83, 0x85, 0xbb, 0x00, 0xdf, 0xdd, +/*2810:*/ 0xc7, 0x69, 0x56, 0xfb, 0xa4, 0xa2, 0x1a, 0xed, 0x68, 0x61, 0xd1, 0x6c, 0xbf, 0x4b, 0x7a, 0xea, +/*2820:*/ 0x96, 0x3d, 0x63, 0xb5, 0xc8, 0xe7, 0x0d, 0xaf, 0xc5, 0xe2, 0x63, 0x35, 0x8c, 0xe2, 0xb5, 0x44, +/*2830:*/ 0x71, 0xb7, 0xd6, 0x4b, 0xe4, 0x6d, 0x5a, 0x50, 0x2e, 0x48, 0xca, 0xd6, 0x9d, 0x1b, 0xc6, 0x47, +/*2840:*/ 0x5c, 0x3f, 0x96, 0xdd, 0xd4, 0xa6, 0xb6, 0xe4, 0xb6, 0x59, 0x88, 0x40, 0x2f, 0x95, 0xde, 0xbf, +/*2850:*/ 0x56, 0x92, 0x3c, 0xde, 0xa6, 0xba, 0xa7, 0x6a, 0x03, 0xe2, 0x3b, 0x05, 0x82, 0xb2, 0x6a, 0x55, +/*2860:*/ 0xdf, 0xdc, 0x4f, 0xb4, 0x93, 0x46, 0x36, 0x8d, 0x9c, 0x17, 0x44, 0xa7, 0x54, 0x37, 0xbe, 0x16, +/*2870:*/ 0x6b, 0x3d, 0xde, 0x91, 0xe2, 0x41, 0xda, 0x34, 0x36, 0xd3, 0xd8, 0x4b, 0x44, 0x46, 0x04, 0x67, +/*2880:*/ 0xa5, 0x60, 0x5d, 0x5c, 0x45, 0x61, 0x77, 0x3a, 0x75, 0x2e, 0x6d, 0xf7, 0x41, 0x24, 0x61, 0x32, +/*2890:*/ 0x66, 0x6f, 0x4a, 0x6e, 0x30, 0x2a, 0xf9, 0xb9, 0xa7, 0xac, 0x80, 0x0c, 0x12, 0xb8, 0xdb, 0x18, +/*28a0:*/ 0x44, 0xd4, 0x58, 0x2e, 0x26, 0xf2, 0x9c, 0xce, 0xe9, 0xca, 0x63, 0x96, 0x53, 0x6a, 0xa6, 0x84, +/*28b0:*/ 0x2c, 0x1d, 0xa2, 0xe2, 0x24, 0x37, 0x95, 0xc7, 0x57, 0x59, 0x61, 0x05, 0x9a, 0x68, 0x08, 0xa3, +/*28c0:*/ 0x0b, 0x30, 0x16, 0xac, 0x45, 0x18, 0xb6, 0xd2, 0x36, 0x09, 0x26, 0x83, 0x4f, 0x7f, 0xcf, 0xf8, +/*28d0:*/ 0x4b, 0xc2, 0x5f, 0xb1, 0x99, 0xf7, 0x97, 0xdb, 0xd3, 0xcf, 0xb2, 0x23, 0x4a, 0x63, 0xa9, 0xab, +/*28e0:*/ 0x7d, 0x33, 0x04, 0x15, 0xcc, 0x77, 0x0d, 0xf3, 0xbe, 0xb2, 0x8b, 0x85, 0xc0, 0xf2, 0x7f, 0xd4, +/*28f0:*/ 0x46, 0xc6, 0xbb, 0xab, 0xa6, 0xd6, 0x7a, 0x9e, 0xbd, 0xa8, 0x1a, 0x50, 0x07, 0x3e, 0xc4, 0xd2, +/*2900:*/ 0x49, 0x84, 0xc3, 0xb4, 0x62, 0x6d, 0xa2, 0x22, 0xb3, 0x5c, 0x37, 0xad, 0x6d, 0x11, 0x8d, 0xce, +/*2910:*/ 0x54, 0x11, 0xd8, 0xa8, 0x92, 0x86, 0x87, 0xe2, 0x03, 0xdc, 0x7b, 0x14, 0x7c, 0x50, 0x0a, 0xe4, +/*2920:*/ 0x1c, 0x9c, 0x79, 0xd0, 0x9c, 0x90, 0x5d, 0x34, 0xce, 0x47, 0x83, 0x16, 0x4d, 0xa4, 0xde, 0x8e, +/*2930:*/ 0xb4, 0xa4, 0x42, 0x54, 0x78, 0x32, 0xf3, 0xb8, 0x91, 0x0f, 0xb1, 0x93, 0xaf, 0x2d, 0xaa, 0x76, +/*2940:*/ 0xdd, 0x82, 0xa5, 0x3f, 0xe3, 0xcd, 0xf7, 0xa8, 0x33, 0x7a, 0xe6, 0x82, 0xcc, 0xc0, 0x3a, 0xf7, +/*2950:*/ 0xce, 0x61, 0x8d, 0xbc, 0x01, 0x1f, 0x33, 0x1e, 0xdd, 0xb7, 0xe7, 0x64, 0x8c, 0xa8, 0xd4, 0xca, +/*2960:*/ 0xcc, 0xf2, 0x2f, 0x22, 0x3c, 0xf3, 0x2a, 0xd6, 0x43, 0xb7, 0x4b, 0x92, 0xc3, 0xf1, 0x22, 0x2a, +/*2970:*/ 0x31, 0x67, 0x2d, 0x22, 0x3c, 0xbb, 0xd8, 0xb6, 0x14, 0xfd, 0x80, 0x74, 0xe4, 0x2d, 0x86, 0x0e, +/*2980:*/ 0x86, 0x7f, 0x69, 0xeb, 0xd8, 0xa4, 0x97, 0x6b, 0xa3, 0xf6, 0xd1, 0x53, 0xe6, 0xc1, 0x4f, 0x48, +/*2990:*/ 0xc3, 0x7d, 0x6d, 0x5b, 0xd1, 0x7e, 0xc9, 0xd6, 0xef, 0x89, 0x68, 0x00, 0x8a, 0xd2, 0xe7, 0xf9, +/*29a0:*/ 0x04, 0x67, 0x07, 0xfe, 0xff, 0x36, 0x78, 0x3a, 0xfc, 0x14, 0x5d, 0xee, 0xc8, 0xd8, 0x84, 0xbe, +/*29b0:*/ 0x6a, 0x40, 0x38, 0x30, 0xa5, 0x74, 0x46, 0x1c, 0x0d, 0xbd, 0xe6, 0x76, 0xd0, 0xd4, 0x51, 0x70, +/*29c0:*/ 0x33, 0xcd, 0x22, 0xb6, 0xd1, 0xe0, 0xfa, 0x33, 0xcf, 0xba, 0x57, 0xb1, 0x98, 0xc1, 0x12, 0xbc, +/*29d0:*/ 0x78, 0x66, 0xdb, 0x6a, 0xc7, 0xee, 0xf2, 0xcb, 0x7e, 0xd5, 0xc2, 0x74, 0x37, 0x65, 0x48, 0x55, +/*29e0:*/ 0xbc, 0x29, 0x7d, 0xe7, 0xe7, 0x9f, 0x19, 0xd1, 0xa5, 0x86, 0x05, 0x37, 0xc1, 0x43, 0x16, 0x37, +/*29f0:*/ 0x92, 0xb2, 0xbc, 0x34, 0x9b, 0x29, 0xc5, 0xdd, 0x1a, 0xa1, 0xab, 0xe0, 0xda, 0x04, 0x7c, 0x15, +/*2a00:*/ 0xbc, 0xd7, 0x26, 0x37, 0xe0, 0x39, 0x92, 0xa3, 0x02, 0x9f, 0xcf, 0x20, 0xc4, 0x16, 0x00, 0xaf, +/*2a10:*/ 0xcd, 0xfc, 0x8f, 0xcf, 0xc0, 0xfc, 0xe6, 0xa2, 0x05, 0xd6, 0xfc, 0xd2, 0xc8, 0x04, 0x9c, 0xca, +/*2a20:*/ 0xbd, 0xa0, 0x8e, 0x44, 0xa3, 0x2b, 0x9e, 0xec, 0xde, 0x91, 0x53, 0x28, 0x37, 0xdc, 0x1e, 0x73, +/*2a30:*/ 0x99, 0xa8, 0xe8, 0x0e, 0x62, 0x10, 0xf2, 0xb9, 0xd0, 0x7a, 0xb4, 0xee, 0x63, 0xca, 0x1e, 0x0c, +/*2a40:*/ 0x46, 0x1d, 0x35, 0x70, 0x37, 0xb5, 0x8a, 0x3d, 0xe9, 0xfa, 0xfd, 0x21, 0xee, 0x48, 0x3d, 0x82, +/*2a50:*/ 0xe3, 0xaf, 0xe4, 0x9a, 0xb8, 0x87, 0x21, 0x77, 0x24, 0xee, 0xb0, 0x6b, 0x64, 0x39, 0x3c, 0x2a, +/*2a60:*/ 0xc5, 0x22, 0x70, 0x61, 0xe5, 0x78, 0x4f, 0x79, 0x3b, 0x20, 0x87, 0x96, 0x88, 0xb8, 0xad, 0xfc, +/*2a70:*/ 0x71, 0x3c, 0x79, 0x3a, 0x34, 0x6b, 0x8d, 0x86, 0xfd, 0xd6, 0xe7, 0xfc, 0x1f, 0x48, 0xb3, 0x8d, +/*2a80:*/ 0xea, 0xd0, 0x1f, 0x62, 0xa1, 0x4c, 0x87, 0xdb, 0x71, 0x5a, 0xc1, 0xf6, 0x20, 0x89, 0x9a, 0xf9, +/*2a90:*/ 0x46, 0x76, 0xad, 0x2e, 0xe9, 0x2b, 0xb7, 0x70, 0x8d, 0xc3, 0x5f, 0x31, 0xa9, 0x66, 0x4b, 0xb5, +/*2aa0:*/ 0x91, 0x2e, 0x5e, 0xd0, 0xec, 0x02, 0xf8, 0x11, 0x28, 0x2e, 0xe4, 0xa8, 0x09, 0x80, 0x9c, 0x17, +/*2ab0:*/ 0xaa, 0x81, 0x24, 0xad, 0x56, 0xc5, 0x8a, 0xa2, 0x9f, 0xf6, 0x11, 0x63, 0x62, 0xe4, 0x69, 0xf7, +/*2ac0:*/ 0x71, 0x6b, 0x7d, 0xb3, 0xff, 0x59, 0xce, 0x66, 0x82, 0x10, 0x20, 0x71, 0x19, 0xbb, 0x21, 0x44, +/*2ad0:*/ 0x87, 0x61, 0x1a, 0x1a, 0x26, 0xb0, 0xd7, 0x4b, 0x09, 0x46, 0xa9, 0xa3, 0x80, 0x5b, 0xc1, 0x0b, +/*2ae0:*/ 0x17, 0x92, 0xbc, 0x90, 0xde, 0x40, 0xf3, 0x46, 0x00, 0xbd, 0x05, 0x96, 0xd7, 0x1f, 0x4a, 0x57, +/*2af0:*/ 0xa7, 0xd6, 0x85, 0xdc, 0x3f, 0x3a, 0x14, 0x1c, 0xfe, 0x3d, 0x22, 0xb0, 0xb3, 0xd6, 0x2f, 0xcd, +/*2b00:*/ 0x6f, 0x59, 0xae, 0x34, 0x90, 0xaa, 0x7f, 0x3a, 0x6c, 0xea, 0x92, 0x1f, 0xf9, 0xc0, 0xf2, 0x7e, +/*2b10:*/ 0x18, 0xfd, 0x9d, 0x4e, 0xd5, 0x78, 0x29, 0x34, 0x6d, 0x74, 0x0d, 0x35, 0x66, 0x5c, 0x6f, 0xd0, +/*2b20:*/ 0xc8, 0x9b, 0x32, 0x56, 0x25, 0x39, 0xfa, 0xfd, 0x44, 0x90, 0x74, 0xa0, 0x56, 0x3c, 0x4c, 0x70, +/*2b30:*/ 0xa8, 0x32, 0xa1, 0x18, 0xdf, 0x43, 0x88, 0x06, 0x0c, 0x66, 0x1d, 0x05, 0x5b, 0x60, 0xa1, 0x82, +/*2b40:*/ 0x3a, 0xb9, 0xde, 0x78, 0x79, 0xac, 0xb5, 0x47, 0x9d, 0x6c, 0xe6, 0xc3, 0x4c, 0x39, 0x6c, 0x92, +/*2b50:*/ 0xb7, 0x34, 0xb3, 0x1a, 0xad, 0x9a, 0x45, 0xf6, 0x5b, 0xb8, 0x84, 0x35, 0x4a, 0x98, 0x77, 0xdb, +/*2b60:*/ 0x85, 0x5d, 0xdb, 0xec, 0x28, 0xd4, 0xce, 0x4c, 0x09, 0x3b, 0x02, 0xc2, 0xda, 0x2b, 0xab, 0x69, +/*2b70:*/ 0xa7, 0x5c, 0xf5, 0xfe, 0xe7, 0x88, 0x21, 0xfa, 0x75, 0x48, 0x76, 0xa4, 0x91, 0x13, 0x1c, 0xe7, +/*2b80:*/ 0x92, 0x8f, 0x5d, 0xb7, 0xac, 0x0b, 0x4a, 0x7c, 0xec, 0xd9, 0x88, 0xf6, 0xa6, 0xea, 0xf1, 0x4f, +/*2b90:*/ 0x66, 0x85, 0x0e, 0xf0, 0xe8, 0xb2, 0x44, 0x00, 0x30, 0xa5, 0x29, 0x40, 0xe7, 0x09, 0xd9, 0xae, +/*2ba0:*/ 0x0e, 0x00, 0x30, 0x59, 0x83, 0x79, 0xcf, 0x48, 0xb1, 0xd9, 0xdc, 0x72, 0x9a, 0x61, 0x34, 0xaa, +/*2bb0:*/ 0x34, 0x25, 0x8b, 0xf3, 0xb6, 0x68, 0x98, 0x2e, 0x3e, 0xb6, 0x82, 0x8b, 0x84, 0xc1, 0xf5, 0x6d, +/*2bc0:*/ 0x5f, 0xec, 0x1f, 0x9c, 0xe0, 0x37, 0x47, 0xa2, 0x36, 0x2a, 0x21, 0xd8, 0x19, 0xba, 0x05, 0xae, +/*2bd0:*/ 0x48, 0xe4, 0x15, 0xf4, 0x20, 0x24, 0x76, 0x98, 0x33, 0xaf, 0xe5, 0x9c, 0x03, 0x78, 0x5a, 0x9d, +/*2be0:*/ 0x15, 0xeb, 0xc6, 0x52, 0x75, 0x0b, 0xed, 0x8c, 0x8d, 0x01, 0x89, 0xe6, 0x9f, 0xac, 0x9a, 0xa1, +/*2bf0:*/ 0xc9, 0x7a, 0x7b, 0xec, 0x81, 0xb4, 0xcd, 0xe9, 0x0d, 0xa7, 0xda, 0x77, 0xa1, 0x24, 0x30, 0x02, +/*2c00:*/ 0x87, 0x35, 0x9b, 0xa8, 0xe2, 0xb9, 0x3e, 0x77, 0xb5, 0xcf, 0x7d, 0x22, 0xaf, 0x51, 0x3f, 0x6e, +/*2c10:*/ 0xa4, 0x38, 0xb9, 0x0e, 0x29, 0x91, 0x09, 0x3d, 0xae, 0xbb, 0x88, 0xd6, 0x39, 0x87, 0xe9, 0xa3, +/*2c20:*/ 0xab, 0xfc, 0xdf, 0x3a, 0x7d, 0xdd, 0x8d, 0x6a, 0x74, 0xdb, 0xb7, 0xe7, 0x17, 0xff, 0xdd, 0x5d, +/*2c30:*/ 0x5a, 0xc8, 0xe0, 0xb9, 0x96, 0xf8, 0xdf, 0x91, 0x89, 0x90, 0x3e, 0x1a, 0xa1, 0xae, 0xf0, 0x78, +/*2c40:*/ 0xa0, 0x6b, 0xfe, 0x41, 0x21, 0xda, 0x62, 0x3d, 0x51, 0xf4, 0xf8, 0x70, 0xba, 0x1f, 0x32, 0xa3, +/*2c50:*/ 0xaa, 0x8d, 0x07, 0x48, 0xc8, 0x3f, 0x77, 0xbd, 0x42, 0xe8, 0x79, 0x80, 0xeb, 0x06, 0x53, 0xe7, +/*2c60:*/ 0x6f, 0x62, 0xee, 0xb5, 0xcd, 0x6e, 0x3a, 0xf3, 0x73, 0xb2, 0xe7, 0xa9, 0xa4, 0xb1, 0x26, 0xa4, +/*2c70:*/ 0x7b, 0x28, 0x61, 0x12, 0x89, 0x62, 0xf7, 0xc5, 0x50, 0xc5, 0xe9, 0xc5, 0x05, 0x41, 0x98, 0x3e, +/*2c80:*/ 0x16, 0x33, 0x23, 0x23, 0x76, 0xbf, 0x0a, 0x08, 0x0a, 0x3b, 0x21, 0xa1, 0x55, 0x18, 0xe1, 0x58, +/*2c90:*/ 0x18, 0x3a, 0x42, 0x2a, 0x04, 0x05, 0xc0, 0x65, 0x82, 0x5f, 0x55, 0x49, 0xba, 0x5b, 0x52, 0xfa, +/*2ca0:*/ 0xdf, 0x29, 0x22, 0xac, 0x8a, 0xc8, 0x21, 0x06, 0xd6, 0x03, 0x4e, 0x82, 0xc6, 0x45, 0xa7, 0x2e, +/*2cb0:*/ 0xc3, 0x65, 0x56, 0x89, 0xe1, 0xe0, 0x1e, 0x59, 0x03, 0x56, 0xa0, 0xb5, 0xd3, 0xd8, 0x5c, 0x1e, +/*2cc0:*/ 0x30, 0x6f, 0x78, 0xfb, 0xa3, 0x1e, 0xe4, 0x1d, 0x59, 0x6c, 0x90, 0x39, 0x8b, 0xbd, 0x42, 0xd8, +/*2cd0:*/ 0x0c, 0xd9, 0xe6, 0xce, 0x8c, 0x3e, 0x5c, 0x0d, 0x8a, 0x80, 0x14, 0xd9, 0x20, 0x4e, 0x84, 0x03, +/*2ce0:*/ 0xe9, 0x4a, 0xa1, 0xc2, 0x84, 0xc7, 0x0d, 0xb8, 0xc9, 0x6e, 0xd1, 0x00, 0x09, 0xc0, 0xc0, 0xf2, +/*2cf0:*/ 0x14, 0x77, 0x5b, 0xd6, 0x38, 0xc9, 0x24, 0x01, 0x5a, 0x66, 0xe4, 0xc0, 0xe6, 0x8b, 0x9f, 0xd7, +/*2d00:*/ 0x6b, 0x3d, 0xbc, 0x65, 0x3d, 0xf3, 0xd4, 0xeb, 0x98, 0xee, 0x06, 0x3d, 0x53, 0x3d, 0xa3, 0x8c, +/*2d10:*/ 0x97, 0x51, 0x1d, 0x6a, 0x0d, 0x72, 0x71, 0xfd, 0x79, 0xb7, 0xed, 0xab, 0xec, 0xbe, 0xc3, 0xa7, +/*2d20:*/ 0x0a, 0x2e, 0x61, 0x79, 0x2e, 0x68, 0x42, 0x00, 0x10, 0xaf, 0x28, 0x8d, 0x7f, 0x1c, 0xdb, 0xd5, +/*2d30:*/ 0xfd, 0x2e, 0x12, 0x62, 0xeb, 0x12, 0xe1, 0x3c, 0xa2, 0x00, 0x8f, 0x07, 0x2b, 0x26, 0x2b, 0x8c, +/*2d40:*/ 0x85, 0x6f, 0x3f, 0x11, 0xfc, 0xcc, 0xd8, 0x29, 0xf3, 0x97, 0x3b, 0x05, 0xf6, 0x51, 0x05, 0x91, +/*2d50:*/ 0x1b, 0xa2, 0xb7, 0x32, 0xd0, 0x7d, 0xe0, 0xf0, 0xdc, 0x91, 0xc4, 0xbf, 0x5d, 0xc3, 0xcb, 0x9a, +/*2d60:*/ 0xdb, 0xf4, 0xa8, 0x41, 0x12, 0x3f, 0x79, 0x3e, 0x8f, 0xd5, 0x67, 0xa3, 0x4d, 0xe7, 0x62, 0xd3, +/*2d70:*/ 0x4c, 0xd8, 0x6d, 0x02, 0xb8, 0x52, 0xb8, 0x15, 0x02, 0x7c, 0xf2, 0xe2, 0x9f, 0x87, 0x41, 0xdd, +/*2d80:*/ 0x34, 0xc9, 0xbf, 0x39, 0x99, 0xf4, 0x2f, 0x69, 0x17, 0xee, 0xbc, 0xd6, 0x2b, 0xd7, 0xa4, 0x02, +/*2d90:*/ 0xea, 0xb1, 0x06, 0xd2, 0xaa, 0x22, 0xe1, 0x16, 0xdc, 0xa4, 0x87, 0xf8, 0xcd, 0xcb, 0x5c, 0x2b, +/*2da0:*/ 0xfe, 0xf9, 0xa5, 0x7e, 0xbb, 0xcd, 0x37, 0x63, 0xf2, 0x4d, 0xa0, 0x0c, 0xa0, 0x7e, 0x91, 0x0f, +/*2db0:*/ 0x09, 0x87, 0x24, 0x72, 0x7a, 0xf6, 0xe1, 0x6d, 0x44, 0x8e, 0x3d, 0xd7, 0xc2, 0x9c, 0x70, 0x29, +/*2dc0:*/ 0xf3, 0xa5, 0x1c, 0xf5, 0x8e, 0x88, 0x3a, 0x8b, 0x14, 0xd7, 0x6c, 0x8a, 0xea, 0x35, 0xdb, 0x97, +/*2dd0:*/ 0x09, 0xc0, 0x78, 0x6c, 0x64, 0xab, 0x81, 0x2e, 0x0d, 0x70, 0x05, 0xd2, 0x72, 0xf3, 0x35, 0xa6, +/*2de0:*/ 0x4f, 0xcf, 0x03, 0x96, 0xdc, 0x20, 0x2d, 0x1c, 0xdf, 0xc6, 0x78, 0x62, 0x18, 0x2e, 0x94, 0xdb, +/*2df0:*/ 0x84, 0x4d, 0xe0, 0xb3, 0x96, 0x17, 0xeb, 0x25, 0x20, 0x53, 0x50, 0xfe, 0x2c, 0x7f, 0x77, 0xef, +/*2e00:*/ 0x30, 0xdb, 0xc2, 0x30, 0x94, 0x28, 0x76, 0xc4, 0x39, 0x18, 0x9c, 0xcb, 0x94, 0xb9, 0x9c, 0x00, +/*2e10:*/ 0x66, 0xef, 0xb1, 0xd2, 0x05, 0x56, 0xd3, 0x03, 0xfd, 0x86, 0x7a, 0xb5, 0x38, 0x0e, 0x45, 0x95, +/*2e20:*/ 0xe8, 0xad, 0xb5, 0x9e, 0xd8, 0xb3, 0x31, 0x9a, 0x84, 0x61, 0x29, 0xea, 0x52, 0x42, 0x0f, 0x0b, +/*2e30:*/ 0xf6, 0xc0, 0xab, 0x0d, 0xaf, 0x0b, 0xc5, 0x44, 0x5d, 0x60, 0xe2, 0xa9, 0x91, 0x3c, 0xbc, 0x86, +/*2e40:*/ 0x64, 0xfa, 0x6d, 0x12, 0x3a, 0x90, 0x07, 0x1b, 0xc4, 0x67, 0x20, 0x49, 0x02, 0x8a, 0xd6, 0xc0, +/*2e50:*/ 0xba, 0xd4, 0xa0, 0x6a, 0x1a, 0xa4, 0xc3, 0x7c, 0x07, 0xe6, 0x16, 0xbf, 0x8d, 0x5f, 0xb6, 0xdc, +/*2e60:*/ 0x20, 0xb3, 0x40, 0x03, 0x64, 0x4f, 0x8f, 0x55, 0xfd, 0xde, 0xf7, 0xb2, 0xf8, 0xd6, 0x5c, 0x53, +/*2e70:*/ 0xdb, 0x85, 0xce, 0x1d, 0xf9, 0xe2, 0xf1, 0xc3, 0x33, 0xbd, 0x4c, 0x60, 0x81, 0xdc, 0xac, 0x2a, +/*2e80:*/ 0xcc, 0x1e, 0x6b, 0xc7, 0xe1, 0x9a, 0x74, 0x75, 0xd1, 0x0a, 0xa3, 0x0b, 0xba, 0xe0, 0xb7, 0x3c, +/*2e90:*/ 0x87, 0x68, 0x7c, 0x41, 0x2e, 0x65, 0x89, 0x22, 0xf6, 0x34, 0x5f, 0x64, 0x3d, 0x49, 0x6c, 0x35, +/*2ea0:*/ 0xf7, 0x69, 0xb4, 0x8a, 0xbd, 0x36, 0x27, 0xbb, 0xc4, 0x44, 0x4e, 0x78, 0x46, 0x68, 0xe0, 0x41, +/*2eb0:*/ 0x2f, 0x81, 0xc3, 0xfa, 0x30, 0x7d, 0x96, 0x2f, 0x92, 0xc2, 0xf8, 0x9a, 0x3c, 0xff, 0x5e, 0xe9, +/*2ec0:*/ 0xec, 0xfc, 0x77, 0xda, 0x33, 0x15, 0x4d, 0x86, 0x9d, 0xbb, 0xa3, 0xa4, 0x1a, 0x1b, 0xa7, 0x5d, +/*2ed0:*/ 0x11, 0x64, 0xc1, 0x7d, 0xc1, 0x75, 0x98, 0x69, 0x7f, 0xba, 0xa9, 0x99, 0x45, 0xb4, 0x92, 0x86, +/*2ee0:*/ 0x2b, 0xfa, 0x8e, 0x29, 0xfb, 0x0a, 0x53, 0x54, 0xe1, 0xdd, 0x12, 0xe5, 0x60, 0x35, 0x29, 0xfe, +/*2ef0:*/ 0x81, 0x83, 0xdc, 0x48, 0xe9, 0xfe, 0x98, 0x47, 0x14, 0xe1, 0xac, 0x20, 0xc3, 0x3a, 0x45, 0xd0, +/*2f00:*/ 0x45, 0x40, 0x6c, 0x23, 0xdc, 0x16, 0x77, 0xcc, 0xb0, 0x63, 0x55, 0xb7, 0xd5, 0xdd, 0xf7, 0x0c, +/*2f10:*/ 0x8d, 0xc5, 0xe4, 0x1a, 0x94, 0x5b, 0xce, 0x28, 0x07, 0xad, 0x6f, 0x7d, 0xaa, 0x05, 0xed, 0x14, +/*2f20:*/ 0x22, 0x86, 0xc5, 0xbe, 0x5d, 0x89, 0x31, 0x3f, 0x8b, 0xc3, 0x0b, 0x96, 0xa1, 0x77, 0x7f, 0xd9, +/*2f30:*/ 0x79, 0x83, 0x48, 0xbe, 0xc7, 0xdf, 0x6d, 0x40, 0xef, 0x00, 0x92, 0xc6, 0xc7, 0x0e, 0x7c, 0x7f, +/*2f40:*/ 0xc9, 0xa0, 0xc8, 0xb0, 0x33, 0x7a, 0x29, 0xcf, 0x6c, 0x45, 0x72, 0xe9, 0xb7, 0x65, 0xfc, 0x4b, +/*2f50:*/ 0x48, 0xcc, 0xdb, 0x73, 0xcf, 0x73, 0x1b, 0x30, 0x38, 0x00, 0xab, 0xf8, 0xae, 0x0a, 0x9c, 0xa7, +/*2f60:*/ 0x46, 0x53, 0x1f, 0xc1, 0x71, 0xbb, 0x99, 0x35, 0xd0, 0x2a, 0xd3, 0x1b, 0x3a, 0x44, 0x2e, 0x72, +/*2f70:*/ 0x75, 0xb4, 0xf0, 0x8a, 0x2c, 0xae, 0xc0, 0x8a, 0xbd, 0x3e, 0x58, 0x21, 0x20, 0x1a, 0x8c, 0x51, +/*2f80:*/ 0xf6, 0xe5, 0x62, 0x61, 0xf7, 0x06, 0x73, 0xd3, 0x85, 0xec, 0xb7, 0xe8, 0x6b, 0xc7, 0xe2, 0xda, +/*2f90:*/ 0x9f, 0x12, 0xe0, 0x0c, 0xa7, 0x69, 0xed, 0xe3, 0x38, 0xfd, 0xe2, 0x37, 0x0c, 0x43, 0xb1, 0xe5, +/*2fa0:*/ 0x38, 0x0b, 0x1b, 0xa5, 0x8f, 0xeb, 0x97, 0xc8, 0x73, 0x2c, 0xdd, 0x5c, 0x07, 0x78, 0x6d, 0x5f, +/*2fb0:*/ 0xe5, 0x9d, 0x86, 0x21, 0x8d, 0x95, 0xcf, 0x6a, 0x89, 0xc4, 0x9e, 0x70, 0xed, 0xd8, 0x4c, 0x3f, +/*2fc0:*/ 0x00, 0x77, 0xd7, 0xf9, 0x8b, 0xd6, 0x4c, 0x36, 0xe6, 0x3c, 0xab, 0x9e, 0xd4, 0x40, 0x86, 0xcd, +/*2fd0:*/ 0xe1, 0x14, 0x40, 0x1c, 0x88, 0x7a, 0x74, 0xdc, 0xaf, 0x00, 0x9f, 0x73, 0x28, 0xa3, 0x78, 0x83, +/*2fe0:*/ 0x59, 0xdf, 0xf0, 0x2e, 0x6b, 0x61, 0xfc, 0xe9, 0x54, 0xd6, 0x0e, 0x35, 0xd0, 0x7a, 0x0e, 0xdd, +/*2ff0:*/ 0x2f, 0x9c, 0xe1, 0x6b, 0xcf, 0xf5, 0x6e, 0x95, 0x0f, 0x4a, 0x90, 0xfd, 0xe7, 0x48, 0xd8, 0xf9, +/*3000:*/ 0x72, 0x24, 0xac, 0xbe, 0xb9, 0xc7, 0x69, 0x43, 0x5a, 0xf7, 0x34, 0x47, 0xe6, 0x55, 0x6e, 0x36, +/*3010:*/ 0x93, 0x0e, 0x66, 0x73, 0xd2, 0x44, 0xb5, 0x09, 0xbc, 0x03, 0xa3, 0x97, 0x65, 0x17, 0x40, 0xf6, +/*3020:*/ 0x85, 0xf9, 0x10, 0xd7, 0x2e, 0x8d, 0x71, 0xe2, 0x35, 0x6c, 0xc4, 0xe3, 0xcd, 0x06, 0x66, 0x9e, +/*3030:*/ 0xa6, 0x72, 0xc4, 0x2a, 0xd1, 0x38, 0x10, 0x98, 0xbc, 0xc9, 0x7f, 0x81, 0x39, 0x04, 0x8c, 0x42, +/*3040:*/ 0x16, 0x15, 0x31, 0x31, 0x23, 0x87, 0x65, 0x76, 0x05, 0x3f, 0xb0, 0x4d, 0xb5, 0x44, 0x24, 0x5a, +/*3050:*/ 0xbe, 0x6e, 0xa2, 0x27, 0x53, 0x18, 0x9f, 0x21, 0x7e, 0x43, 0x42, 0x30, 0xcc, 0xba, 0xaf, 0x25, +/*3060:*/ 0x52, 0x7c, 0x92, 0xd6, 0xa9, 0x33, 0xa4, 0xbb, 0x16, 0xc8, 0xa1, 0xa5, 0x9f, 0x72, 0x8c, 0x9c, +/*3070:*/ 0xd8, 0x1f, 0xd3, 0xad, 0x6e, 0x06, 0x06, 0xe2, 0x12, 0x52, 0x6b, 0x50, 0x2d, 0xee, 0xb5, 0x7e, +/*3080:*/ 0x22, 0x50, 0x39, 0x7f, 0xc4, 0x1f, 0x35, 0xc0, 0x7d, 0x72, 0x58, 0x29, 0xdd, 0x6b, 0x30, 0x2a, +/*3090:*/ 0xd0, 0x8a, 0xcf, 0x2f, 0x06, 0xc7, 0x8d, 0x7f, 0x59, 0x14, 0x21, 0x44, 0x9c, 0x93, 0xc7, 0xff, +/*30a0:*/ 0x0d, 0xaf, 0xbb, 0x40, 0xac, 0xfe, 0x41, 0x09, 0x14, 0x1e, 0x6c, 0x61, 0xf0, 0xe7, 0x10, 0x9e, +/*30b0:*/ 0x9a, 0x07, 0x94, 0x1d, 0x27, 0x74, 0x28, 0x2c, 0x77, 0x32, 0xcf, 0x0f, 0xe5, 0xa3, 0x74, 0x54, +/*30c0:*/ 0x06, 0x5f, 0x40, 0x80, 0xef, 0x6c, 0x39, 0x13, 0xd0, 0xa3, 0x04, 0xd7, 0xac, 0x79, 0x84, 0x5d, +/*30d0:*/ 0x40, 0xd7, 0x91, 0xc1, 0x8f, 0x42, 0xad, 0x71, 0x8e, 0x9e, 0x90, 0x2d, 0xfc, 0xdc, 0x78, 0x7c, +/*30e0:*/ 0x72, 0x0b, 0x17, 0x17, 0x3f, 0xd0, 0x8d, 0x49, 0xbc, 0x94, 0x9e, 0xcb, 0x32, 0xe7, 0xea, 0x4b, +/*30f0:*/ 0x48, 0x05, 0xd3, 0x32, 0x09, 0x38, 0x0f, 0x43, 0xc3, 0xcc, 0xd1, 0x6f, 0xfa, 0xc3, 0x3d, 0x57, +/*3100:*/ 0x58, 0xc7, 0x18, 0x0f, 0x12, 0xd4, 0x1e, 0x6c, 0xd8, 0xe9, 0xf7, 0x8f, 0x69, 0xd7, 0xcb, 0xce, +/*3110:*/ 0xcf, 0x6f, 0xa8, 0x1e, 0x64, 0x59, 0x78, 0x3d, 0xe1, 0x23, 0x40, 0xdd, 0xd6, 0x0b, 0xc0, 0x3b, +/*3120:*/ 0x9c, 0xc9, 0xc5, 0x27, 0x27, 0xb8, 0xf1, 0x36, 0xa1, 0x37, 0x1f, 0x46, 0xf5, 0x71, 0x80, 0x68, +/*3130:*/ 0x41, 0xfe, 0x4c, 0x0d, 0x10, 0x4d, 0x1b, 0x21, 0x3d, 0x6d, 0x94, 0xae, 0x89, 0x9d, 0x3f, 0xbb, +/*3140:*/ 0xda, 0xd5, 0x57, 0x92, 0x94, 0x59, 0x83, 0x1c, 0x83, 0x1a, 0xb1, 0xcc, 0xb7, 0x77, 0xb2, 0x0f, +/*3150:*/ 0x1b, 0x8f, 0x8f, 0x31, 0x7a, 0x32, 0x75, 0x0f, 0xdc, 0x76, 0xd0, 0xa3, 0x3e, 0x28, 0xfb, 0x70, +/*3160:*/ 0x78, 0xd6, 0xa7, 0xa4, 0x04, 0xdf, 0x48, 0x42, 0xa8, 0x14, 0x79, 0xbc, 0xd0, 0xf0, 0x4d, 0x28, +/*3170:*/ 0x7b, 0x65, 0xba, 0xf0, 0xe2, 0xb5, 0x6c, 0x01, 0x93, 0x2c, 0xb4, 0x02, 0x5a, 0x2b, 0xa8, 0x57, +/*3180:*/ 0xea, 0xac, 0x4b, 0xb4, 0x74, 0xde, 0xad, 0x50, 0x74, 0x31, 0x4c, 0xd5, 0x6f, 0xa9, 0xc9, 0x62, +/*3190:*/ 0xcf, 0xfd, 0xab, 0x10, 0x4a, 0x2d, 0x44, 0xe5, 0xa6, 0x68, 0xb9, 0x20, 0xda, 0xb0, 0x8a, 0x64, +/*31a0:*/ 0x65, 0xec, 0x2d, 0x58, 0xf4, 0xb2, 0xac, 0x7b, 0xe6, 0x95, 0x72, 0xbd, 0xeb, 0x91, 0x6c, 0x6c, +/*31b0:*/ 0xd8, 0xb4, 0xb8, 0xd8, 0x0a, 0x03, 0x74, 0xf9, 0x8d, 0xf0, 0x9d, 0xb8, 0x89, 0x0d, 0x8b, 0xd4, +/*31c0:*/ 0x8c, 0xa9, 0xd4, 0x58, 0x7d, 0x5e, 0x4a, 0x49, 0x79, 0x2f, 0x08, 0x10, 0x6f, 0x79, 0x3d, 0x3d, +/*31d0:*/ 0x21, 0xdd, 0x47, 0x01, 0xff, 0xf0, 0xb3, 0x70, 0x3d, 0x7d, 0x7a, 0x72, 0x76, 0x50, 0xec, 0x6b, +/*31e0:*/ 0x62, 0x29, 0xb9, 0x1b, 0xd7, 0x7c, 0x8f, 0x30, 0xa8, 0xf0, 0x6b, 0x08, 0x77, 0x23, 0x91, 0x34, +/*31f0:*/ 0xca, 0x97, 0x19, 0x57, 0x79, 0x15, 0x9b, 0xcd, 0xe9, 0xe5, 0xd7, 0x33, 0x87, 0x59, 0xd5, 0x87, +/*3200:*/ 0x7d, 0xa9, 0xc5, 0x9e, 0x05, 0xb9, 0x75, 0x07, 0x70, 0x99, 0x78, 0x40, 0x22, 0x8b, 0x55, 0x7f, +/*3210:*/ 0x24, 0x19, 0xcd, 0x9e, 0xfe, 0xbf, 0x8e, 0xa9, 0x08, 0xde, 0xa7, 0x4d, 0xc1, 0xf3, 0x9e, 0xbe, +/*3220:*/ 0x4a, 0xf8, 0x91, 0xd4, 0x56, 0xf6, 0xd0, 0xb0, 0x48, 0x3c, 0x29, 0x21, 0x8d, 0x1a, 0x27, 0x0d, +/*3230:*/ 0x76, 0xb7, 0x1b, 0xac, 0x7b, 0xfa, 0x4b, 0x46, 0x8e, 0xdb, 0xc6, 0xd6, 0x7b, 0x70, 0xac, 0x2b, +/*3240:*/ 0x09, 0xe7, 0xda, 0x97, 0xcc, 0x34, 0x1e, 0x32, 0x2f, 0x33, 0x51, 0x1e, 0xa2, 0xa5, 0x31, 0x0a, +/*3250:*/ 0x46, 0xd1, 0xc3, 0xab, 0xfa, 0x34, 0xa4, 0x1e, 0x49, 0x73, 0xf1, 0xee, 0x29, 0xcb, 0x93, 0x66, +/*3260:*/ 0xc1, 0xbe, 0x45, 0xfd, 0x06, 0x54, 0xf1, 0xe8, 0x97, 0xc5, 0xa7, 0xff, 0x2c, 0x44, 0x22, 0xa7, +/*3270:*/ 0x55, 0x66, 0x86, 0xe9, 0x17, 0xfc, 0x1c, 0xac, 0xd0, 0xd6, 0x79, 0x46, 0xae, 0xb1, 0xe0, 0xb8, +/*3280:*/ 0x0d, 0xeb, 0xb2, 0xe4, 0xb3, 0xca, 0xf4, 0x56, 0x0a, 0xe8, 0xf1, 0xfa, 0xdd, 0x3c, 0x40, 0xd2, +/*3290:*/ 0xee, 0x78, 0x33, 0xb5, 0xf3, 0xd9, 0x74, 0xf5, 0xf4, 0x6c, 0x92, 0xe9, 0xeb, 0x18, 0x74, 0x14, +/*32a0:*/ 0xc2, 0xee, 0x4c, 0x91, 0xa8, 0xf0, 0xd9, 0xc8, 0x81, 0x3e, 0x02, 0x67, 0x2d, 0x4f, 0xba, 0xf2, +/*32b0:*/ 0x2c, 0x1b, 0xca, 0x0a, 0x9b, 0x7d, 0xe3, 0x69, 0x9f, 0xd0, 0xf3, 0xa7, 0x5a, 0xb6, 0x02, 0x38, +/*32c0:*/ 0xf7, 0xc5, 0x1a, 0x0d, 0x5c, 0x60, 0xbe, 0x15, 0x17, 0xc3, 0xb9, 0xd5, 0xa3, 0x5e, 0x38, 0x0b, +/*32d0:*/ 0xa4, 0x57, 0x0d, 0x72, 0xfe, 0x4d, 0xd1, 0x30, 0xd7, 0xf7, 0x7a, 0x8b, 0x24, 0xbc, 0x8d, 0xb8, +/*32e0:*/ 0x68, 0xd0, 0x52, 0xa1, 0xfa, 0x49, 0x2e, 0x84, 0x7c, 0xf3, 0x87, 0x71, 0xf7, 0xcb, 0xbf, 0x6e, +/*32f0:*/ 0xc1, 0xd6, 0x56, 0x03, 0xbb, 0xda, 0x48, 0x21, 0x8d, 0x5b, 0xfe, 0xac, 0x0f, 0x3e, 0x39, 0x3b, +/*3300:*/ 0x24, 0xfb, 0xa9, 0x20, 0xd9, 0xe5, 0x3a, 0xa1, 0x6e, 0x5e, 0x73, 0x5d, 0xc9, 0x47, 0xe1, 0xaf, +/*3310:*/ 0x3c, 0xb6, 0xf3, 0xb3, 0xaa, 0xb3, 0xcd, 0x05, 0x37, 0x5b, 0xb7, 0x2b, 0xac, 0x91, 0x3b, 0xc2, +/*3320:*/ 0x88, 0x5b, 0xdb, 0x1a, 0xe3, 0x6d, 0x77, 0xe4, 0xd8, 0xe1, 0x3f, 0x20, 0x15, 0x99, 0x26, 0xfd, +/*3330:*/ 0x02, 0x7e, 0x58, 0x88, 0x2a, 0x90, 0x93, 0x1e, 0xa9, 0xe7, 0x4f, 0x8a, 0xc4, 0xb0, 0xb6, 0x38, +/*3340:*/ 0x6f, 0xc4, 0x14, 0xdf, 0x76, 0x51, 0x19, 0x2e, 0x33, 0xaa, 0x97, 0x02, 0xd2, 0xee, 0xff, 0xa9, +/*3350:*/ 0x35, 0xad, 0x2b, 0xa5, 0xad, 0x4d, 0x81, 0x59, 0x64, 0x4b, 0xc8, 0xac, 0xfb, 0xb0, 0xf6, 0x15, +/*3360:*/ 0x72, 0x73, 0xc5, 0x39, 0xfc, 0xc1, 0xde, 0xbf, 0xa6, 0x2b, 0x67, 0x87, 0x34, 0xb1, 0x92, 0x0b, +/*3370:*/ 0x02, 0x84, 0x42, 0x69, 0xa7, 0x6f, 0xd5, 0x0f, 0x01, 0x4c, 0x0d, 0x51, 0x15, 0x64, 0xc2, 0x99, +/*3380:*/ 0xcc, 0x9c, 0xfe, 0x0d, 0x8e, 0x0f, 0xcf, 0x98, 0xa9, 0x6d, 0x47, 0xc6, 0xf1, 0x89, 0x32, 0x2a, +/*3390:*/ 0x00, 0x04, 0x3a, 0x28, 0xea, 0xc0, 0x6b, 0x30, 0x00, 0x8a, 0x77, 0xa9, 0x46, 0x7d, 0x32, 0xb3, +/*33a0:*/ 0x1a, 0x24, 0x26, 0x6c, 0x4b, 0xd8, 0x91, 0xc2, 0x9e, 0x98, 0xcb, 0x8a, 0x2f, 0x1a, 0xd5, 0x82, +/*33b0:*/ 0x8f, 0xc7, 0x34, 0x07, 0x95, 0x10, 0x78, 0x97, 0xea, 0xa2, 0x28, 0x83, 0x57, 0xf5, 0x94, 0xb5, +/*33c0:*/ 0xdd, 0x38, 0xa1, 0x31, 0x60, 0xc8, 0xdf, 0x3b, 0xb2, 0x00, 0x50, 0x2a, 0xac, 0x19, 0xc0, 0xbb, +/*33d0:*/ 0x0a, 0xaf, 0x53, 0x08, 0x3a, 0x9d, 0x83, 0x2a, 0x1f, 0xb5, 0xdb, 0xc9, 0x0b, 0xbd, 0x37, 0x24, +/*33e0:*/ 0x83, 0xf0, 0xb9, 0x4d, 0x18, 0xbc, 0xc7, 0x53, 0xf0, 0x27, 0xd9, 0x36, 0xb0, 0x37, 0x45, 0xbd, +/*33f0:*/ 0x36, 0x80, 0x30, 0x08, 0x20, 0xcf, 0xde, 0x8e, 0x57, 0xee, 0xe7, 0x94, 0xb4, 0x92, 0x63, 0x99, +/*3400:*/ 0x4c, 0x85, 0x40, 0x4c, 0x9d, 0xd1, 0x8d, 0xf7, 0x7e, 0x24, 0xe0, 0xe9, 0xf1, 0x1e, 0x1f, 0x3f, +/*3410:*/ 0x19, 0x11, 0x96, 0x95, 0x76, 0x49, 0xbd, 0x3c, 0xd5, 0x7f, 0x8a, 0xfb, 0x9f, 0x50, 0xc0, 0x57, +/*3420:*/ 0x24, 0x19, 0x0e, 0x09, 0xef, 0x09, 0xc1, 0xb7, 0xc0, 0xb4, 0x46, 0xc6, 0x77, 0x2a, 0x06, 0x64, +/*3430:*/ 0x8c, 0x4e, 0x9a, 0xa2, 0x8f, 0x61, 0x3a, 0x57, 0x44, 0x5f, 0x0b, 0x6a, 0x71, 0xe8, 0x1b, 0x5f, +/*3440:*/ 0x6e, 0x89, 0x39, 0x3b, 0xe4, 0x30, 0x97, 0x95, 0x5d, 0xc8, 0xcb, 0xa4, 0x64, 0x2a, 0xf5, 0x7f, +/*3450:*/ 0x7a, 0x1c, 0x58, 0x26, 0x74, 0xc8, 0xe8, 0x0a, 0x82, 0x14, 0x23, 0x25, 0x7c, 0x5d, 0xb8, 0x5f, +/*3460:*/ 0x6c, 0xb1, 0x1d, 0x08, 0x37, 0xd8, 0x5d, 0x7a, 0xd3, 0xe0, 0x97, 0x2a, 0xec, 0xe4, 0x6c, 0x00, +/*3470:*/ 0x32, 0x20, 0x94, 0xc2, 0xa4, 0x66, 0xfa, 0xbb, 0x29, 0x00, 0x92, 0xed, 0xd2, 0x68, 0xb7, 0xc3, +/*3480:*/ 0x1d, 0xa4, 0x50, 0xed, 0xb9, 0xc2, 0xd6, 0x34, 0xe4, 0xc6, 0x78, 0x4d, 0xcc, 0x2f, 0xe0, 0x1e, +/*3490:*/ 0x3a, 0xdd, 0xd5, 0x64, 0xa7, 0x83, 0x0c, 0x99, 0x96, 0x0e, 0x95, 0x5b, 0x51, 0x38, 0x0b, 0x2b, +/*34a0:*/ 0xcd, 0x49, 0x66, 0x57, 0xbd, 0x72, 0xc7, 0x69, 0x6c, 0xe3, 0x91, 0xb1, 0x81, 0x85, 0x4c, 0x95, +/*34b0:*/ 0x3f, 0x8d, 0x63, 0xcb, 0x4a, 0x93, 0x7f, 0x4b, 0x48, 0xac, 0x8d, 0x6c, 0x45, 0x4f, 0xa7, 0xc8, +/*34c0:*/ 0xb5, 0x53, 0x99, 0xd6, 0x12, 0x5b, 0xf5, 0x21, 0x4a, 0x4d, 0x87, 0x5b, 0xfc, 0xf3, 0xa7, 0xf7, +/*34d0:*/ 0x99, 0xff, 0xe1, 0x77, 0x0f, 0x78, 0x7e, 0x31, 0x91, 0x09, 0xe4, 0x6a, 0xa8, 0xbc, 0xf6, 0x67, +/*34e0:*/ 0x9a, 0x70, 0x75, 0x0a, 0x55, 0xb1, 0xc3, 0xbb, 0x40, 0x18, 0x76, 0xc4, 0x95, 0xe9, 0x2a, 0xbc, +/*34f0:*/ 0x1d, 0x8e, 0x98, 0x33, 0x20, 0x67, 0x0a, 0x7d, 0xf1, 0xb6, 0x9e, 0x88, 0xcc, 0x1a, 0x85, 0xc1, +/*3500:*/ 0x08, 0x18, 0x63, 0x25, 0x66, 0x1b, 0x9f, 0x14, 0xee, 0x2b, 0xfb, 0x7b, 0x3c, 0x4e, 0xe7, 0x89, +/*3510:*/ 0x3b, 0x02, 0xc0, 0x72, 0x66, 0x86, 0xd2, 0x69, 0xab, 0x48, 0x9b, 0xcd, 0x1b, 0x7b, 0x8b, 0x51, +/*3520:*/ 0x71, 0xa3, 0x23, 0xf2, 0xe5, 0x66, 0xdc, 0xb0, 0xa0, 0xf8, 0xcc, 0x98, 0xb3, 0xe7, 0x54, 0xfc, +/*3530:*/ 0x6c, 0x97, 0x4f, 0x72, 0x3a, 0x5c, 0x38, 0x64, 0x9c, 0x85, 0x89, 0x4d, 0x62, 0x00, 0xb0, 0x52, +/*3540:*/ 0xd8, 0xa4, 0x7a, 0x86, 0x31, 0x96, 0xf2, 0xc2, 0xdf, 0x3a, 0x18, 0x5e, 0x09, 0x49, 0xfe, 0x08, +/*3550:*/ 0xee, 0x80, 0xe3, 0x71, 0x11, 0x88, 0x92, 0xc8, 0x82, 0xbc, 0x9b, 0x58, 0xc0, 0x30, 0xe5, 0xb1, +/*3560:*/ 0xe6, 0x86, 0xa1, 0x8a, 0x1f, 0x22, 0x6b, 0x5b, 0x28, 0x21, 0x37, 0x56, 0xb4, 0x2a, 0x6a, 0x64, +/*3570:*/ 0x94, 0x50, 0x39, 0xf3, 0x06, 0xad, 0x4e, 0xdf, 0x85, 0xcf, 0x7f, 0xd4, 0xff, 0x12, 0x4c, 0xc7, +/*3580:*/ 0x06, 0x5c, 0xa9, 0xf8, 0x09, 0xbb, 0xb9, 0x45, 0xf7, 0xb1, 0xb4, 0x7c, 0x25, 0x48, 0x54, 0xa7, +/*3590:*/ 0x41, 0x0f, 0x09, 0xbc, 0xc8, 0x23, 0x27, 0x36, 0xeb, 0xa9, 0xb5, 0xaf, 0x15, 0xee, 0x99, 0xf3, +/*35a0:*/ 0x50, 0xf7, 0x02, 0x4a, 0x44, 0x1c, 0x6f, 0xb3, 0xb1, 0xa5, 0xc0, 0x94, 0x3a, 0xe6, 0xc6, 0xa9, +/*35b0:*/ 0x0d, 0x9a, 0x47, 0x26, 0xfd, 0x03, 0xf7, 0xd5, 0xc6, 0x16, 0x8c, 0x6f, 0x95, 0x58, 0xa2, 0x3a, +/*35c0:*/ 0x81, 0x23, 0xc3, 0xe3, 0x2c, 0xd7, 0x13, 0x1e, 0xd9, 0xb3, 0x62, 0x11, 0x34, 0xac, 0x37, 0x9e, +/*35d0:*/ 0x03, 0x9a, 0x30, 0x3a, 0xba, 0xec, 0xf6, 0x9f, 0xf5, 0x73, 0xa8, 0x09, 0x7f, 0x13, 0xbf, 0xee, +/*35e0:*/ 0xc1, 0x5b, 0xf0, 0x99, 0xb7, 0x5d, 0x10, 0xaf, 0xb9, 0xd2, 0xbe, 0x50, 0x71, 0x45, 0xed, 0x7d, +/*35f0:*/ 0x1f, 0xb6, 0x52, 0x53, 0x01, 0x02, 0x74, 0xf0, 0x3d, 0xd4, 0xaf, 0xa2, 0x27, 0x89, 0x76, 0x4c, +/*3600:*/ 0x1a, 0x39, 0x51, 0xcf, 0x4f, 0x15, 0x13, 0x5d, 0x69, 0xb6, 0xc3, 0x04, 0x29, 0x45, 0x70, 0x37, +/*3610:*/ 0x9b, 0xac, 0x7e, 0xef, 0xe1, 0x8c, 0x99, 0x40, 0x02, 0xc2, 0xa5, 0xb9, 0xbe, 0xf8, 0xdf, 0x14, +/*3620:*/ 0x06, 0xe7, 0xa2, 0xf2, 0x63, 0x82, 0x57, 0x02, 0xf7, 0x87, 0x73, 0x76, 0x53, 0x4f, 0xc7, 0xbd, +/*3630:*/ 0x9c, 0x62, 0x48, 0x1f, 0x9d, 0x12, 0x69, 0xef, 0xa5, 0xe2, 0x3b, 0x0e, 0x0a, 0x58, 0xba, 0x7c, +/*3640:*/ 0xb1, 0xf9, 0x28, 0x15, 0x66, 0x95, 0xe8, 0xb4, 0x88, 0x7c, 0xd3, 0xe2, 0xdf, 0xf3, 0xc7, 0x0a, +/*3650:*/ 0x6a, 0xdf, 0x13, 0x85, 0x77, 0x84, 0x73, 0x64, 0xa0, 0xa3, 0xae, 0x40, 0x08, 0xaf, 0x50, 0x29, +/*3660:*/ 0x79, 0x22, 0x64, 0x6b, 0x38, 0x53, 0x04, 0x6b, 0x87, 0xf8, 0x78, 0x28, 0x61, 0x8e, 0x75, 0xdc, +/*3670:*/ 0x29, 0xd5, 0x34, 0x5c, 0x84, 0xb8, 0x89, 0xf5, 0x1d, 0xc5, 0x17, 0xfc, 0xdd, 0xe0, 0x6f, 0xf5, +/*3680:*/ 0xba, 0x65, 0x27, 0x70, 0x9b, 0x8e, 0xb3, 0x54, 0x29, 0x48, 0x83, 0x93, 0x13, 0x14, 0xe7, 0x73, +/*3690:*/ 0xfe, 0xe4, 0x25, 0x19, 0xb3, 0xc0, 0x82, 0x0e, 0x3b, 0xa0, 0x31, 0x60, 0x60, 0x42, 0x77, 0xc2, +/*36a0:*/ 0x11, 0x92, 0x86, 0xd5, 0x2b, 0x30, 0x11, 0x4a, 0x0d, 0x1d, 0x0c, 0xf1, 0xe4, 0xab, 0x9d, 0x70, +/*36b0:*/ 0x8c, 0x57, 0x55, 0x31, 0x5c, 0x57, 0x3e, 0xc4, 0xba, 0xb7, 0x16, 0x4d, 0xef, 0x57, 0x81, 0x25, +/*36c0:*/ 0xd4, 0xbf, 0xd4, 0x09, 0xd1, 0x61, 0x34, 0x8d, 0x7a, 0x55, 0xd6, 0xac, 0x57, 0xd6, 0x8b, 0x00, +/*36d0:*/ 0xb1, 0x98, 0xa1, 0x63, 0xf5, 0xce, 0x79, 0x49, 0x5e, 0x04, 0x81, 0x96, 0x21, 0x41, 0x23, 0x60, +/*36e0:*/ 0x65, 0x22, 0x32, 0x28, 0xdb, 0x77, 0x21, 0x22, 0x0d, 0x38, 0x86, 0xd2, 0xea, 0x3a, 0xad, 0x19, +/*36f0:*/ 0xac, 0x94, 0xdf, 0x62, 0x17, 0xc4, 0xc3, 0x84, 0xc5, 0x40, 0xba, 0xe2, 0x2e, 0xda, 0xd6, 0x2d, +/*3700:*/ 0x18, 0x54, 0xbb, 0xf9, 0xa0, 0xa6, 0x83, 0x08, 0x94, 0x71, 0xf3, 0x91, 0xf1, 0x08, 0x8b, 0xbb, +/*3710:*/ 0x21, 0x2c, 0xa4, 0x18, 0xf3, 0x94, 0x53, 0x2c, 0x3f, 0x04, 0x5a, 0xef, 0xc9, 0xcb, 0x57, 0x85, +/*3720:*/ 0x1b, 0xea, 0xc7, 0xd6, 0x07, 0x61, 0x58, 0xfe, 0x66, 0xc3, 0x9d, 0xef, 0xab, 0xf7, 0xac, 0xfb, +/*3730:*/ 0xc1, 0x5c, 0x0e, 0xb5, 0xdd, 0x0c, 0x1d, 0xde, 0xab, 0x09, 0xd1, 0xb3, 0xe1, 0x31, 0x4d, 0x72, +/*3740:*/ 0x2c, 0x58, 0xe0, 0x5d, 0x3b, 0x79, 0x2c, 0xa4, 0x9e, 0xaa, 0x69, 0xf4, 0xf1, 0xb2, 0x62, 0x34, +/*3750:*/ 0x3c, 0x8d, 0xa5, 0xcf, 0xe5, 0x38, 0xda, 0x78, 0x67, 0xd4, 0xc8, 0xbf, 0xc8, 0x35, 0x92, 0xd0, +/*3760:*/ 0x87, 0x7a, 0x34, 0x04, 0xfa, 0x93, 0x3b, 0x8d, 0xd3, 0x5e, 0xab, 0xf0, 0x89, 0x07, 0x7d, 0x26, +/*3770:*/ 0x48, 0xb7, 0x2b, 0xa7, 0x24, 0x40, 0xf7, 0x64, 0x3f, 0x6e, 0x92, 0x24, 0xf2, 0x6e, 0xd9, 0x46, +/*3780:*/ 0xb9, 0x07, 0x35, 0x63, 0x08, 0x2c, 0xdf, 0x6c, 0x57, 0x1e, 0x13, 0xa1, 0x5c, 0x4a, 0x2e, 0x5a, +/*3790:*/ 0x2d, 0x15, 0xe4, 0x9b, 0x95, 0x9f, 0xb3, 0x8e, 0x47, 0x10, 0xba, 0xfc, 0x8e, 0x5b, 0xaa, 0xff, +/*37a0:*/ 0xd2, 0x48, 0xb8, 0x6e, 0x13, 0x40, 0x28, 0x9b, 0x34, 0x5d, 0xab, 0xe1, 0x5a, 0x62, 0x5b, 0x28, +/*37b0:*/ 0x1a, 0xbb, 0x73, 0x22, 0xd0, 0x8d, 0x3f, 0x8d, 0xe3, 0x94, 0xd3, 0xcb, 0x0b, 0x7d, 0x05, 0x98, +/*37c0:*/ 0x62, 0x01, 0x77, 0x78, 0x17, 0xfa, 0x5e, 0x6b, 0x0e, 0xcd, 0x4e, 0x0f, 0xe9, 0x82, 0x22, 0xea, +/*37d0:*/ 0xfb, 0xa2, 0x2a, 0x4a, 0xe3, 0x95, 0xfa, 0x6a, 0xbc, 0x27, 0x61, 0xd5, 0x87, 0x47, 0x8c, 0x30, +/*37e0:*/ 0x59, 0xed, 0x12, 0x4c, 0x3f, 0x02, 0xfe, 0x11, 0x03, 0xe2, 0x81, 0x35, 0x25, 0x3b, 0xd7, 0xe7, +/*37f0:*/ 0x5e, 0x08, 0x77, 0xf7, 0x08, 0x30, 0x11, 0xeb, 0x3e, 0xd6, 0x88, 0x8d, 0xa2, 0xf2, 0xc6, 0x8e, +/*3800:*/ 0x3e, 0xf4, 0x7f, 0x53, 0xf3, 0xea, 0xf4, 0xb3, 0x92, 0x75, 0x59, 0x99, 0xa3, 0xc1, 0xd4, 0xbb, +/*3810:*/ 0x18, 0x40, 0x25, 0x4e, 0xf0, 0xa6, 0xcd, 0xf0, 0x37, 0x87, 0x9b, 0x08, 0x1b, 0x85, 0xa8, 0xe6, +/*3820:*/ 0xd5, 0x75, 0x6a, 0x4f, 0xf5, 0xac, 0x7a, 0xd6, 0x39, 0x0d, 0xf6, 0x89, 0xe8, 0xf2, 0x6a, 0xee, +/*3830:*/ 0xb4, 0x36, 0xbc, 0x2e, 0xfd, 0x23, 0xf1, 0xa6, 0x08, 0x87, 0x01, 0xcc, 0xea, 0x2b, 0x4f, 0x95, +/*3840:*/ 0x2c, 0x07, 0x22, 0xce, 0x4f, 0x8a, 0xd6, 0xe3, 0x26, 0xe9, 0x16, 0xb9, 0x07, 0xb2, 0x39, 0x84, +/*3850:*/ 0xf2, 0xad, 0x3d, 0x2e, 0x50, 0x8a, 0xa3, 0x37, 0x2c, 0xb9, 0xfe, 0x37, 0xc0, 0x5c, 0xe5, 0xe9, +/*3860:*/ 0xf0, 0x2b, 0x74, 0x28, 0xf2, 0x5f, 0xec, 0x2f, 0xf4, 0x87, 0xe3, 0x59, 0x28, 0x61, 0x0a, 0x2b, +/*3870:*/ 0xe1, 0x6c, 0x3b, 0x1d, 0x2a, 0x4c, 0x9c, 0xc7, 0xe6, 0x03, 0xf7, 0xdc, 0x50, 0x27, 0xde, 0x17, +/*3880:*/ 0x7e, 0x6c, 0x2d, 0xc5, 0xb7, 0xe3, 0x2b, 0x69, 0x68, 0x71, 0xb9, 0x86, 0x90, 0x00, 0x6a, 0x8d, +/*3890:*/ 0x76, 0x16, 0xa8, 0x5d, 0x04, 0x40, 0xc6, 0x2e, 0xf5, 0xf4, 0xdf, 0xa4, 0x4f, 0x1c, 0x8e, 0xb9, +/*38a0:*/ 0xe5, 0x4e, 0x75, 0x4f, 0xcd, 0x10, 0xbb, 0x61, 0x6b, 0xac, 0xc8, 0x61, 0xb1, 0xb3, 0x55, 0xcc, +/*38b0:*/ 0x1d, 0x27, 0xbc, 0x23, 0xe0, 0x94, 0x7c, 0x6f, 0xa0, 0xce, 0x49, 0x22, 0xa3, 0xc4, 0x71, 0xed, +/*38c0:*/ 0x96, 0x4a, 0xf3, 0x69, 0x16, 0x5c, 0x42, 0x57, 0x63, 0x1d, 0x25, 0xae, 0xfe, 0xb4, 0xb8, 0x07, +/*38d0:*/ 0x73, 0x68, 0x5d, 0x21, 0x55, 0x70, 0xce, 0x54, 0xf5, 0x20, 0xa1, 0x42, 0x45, 0x79, 0xe1, 0x94, +/*38e0:*/ 0xe6, 0xf3, 0x74, 0xcb, 0xbd, 0x61, 0xc0, 0x87, 0x3f, 0xf5, 0x0b, 0xe5, 0xb3, 0xf0, 0x74, 0x9d, +/*38f0:*/ 0xd4, 0x5f, 0x82, 0xf6, 0x94, 0xfd, 0x55, 0x39, 0x0f, 0x1d, 0x5e, 0x90, 0x50, 0x47, 0x70, 0xac, +/*3900:*/ 0xd6, 0x12, 0x7f, 0xe3, 0xcd, 0xde, 0x46, 0xd0, 0x7c, 0x6d, 0xe7, 0x9f, 0xea, 0x16, 0x13, 0x7f, +/*3910:*/ 0xb4, 0x01, 0xfc, 0xa2, 0x71, 0x00, 0xd1, 0x57, 0x79, 0xef, 0xf1, 0xcb, 0x31, 0xba, 0x83, 0x49, +/*3920:*/ 0x32, 0x66, 0xfe, 0xb4, 0x8e, 0x0b, 0xdb, 0xfc, 0x0f, 0xd4, 0xc1, 0x83, 0x61, 0x02, 0x57, 0x93, +/*3930:*/ 0xcb, 0x6a, 0xb5, 0xc8, 0xb7, 0xbe, 0x6b, 0xd0, 0x1c, 0x57, 0xb1, 0x00, 0x65, 0x90, 0xfd, 0xa8, +/*3940:*/ 0xeb, 0x5a, 0x8c, 0x2c, 0x97, 0xd6, 0x16, 0xbc, 0x44, 0x07, 0x56, 0xe3, 0xcb, 0xb1, 0xa2, 0xd0, +/*3950:*/ 0x2c, 0x6e, 0xe6, 0xc8, 0x5a, 0x98, 0x13, 0x95, 0xf3, 0xf5, 0x47, 0xbb, 0x19, 0x68, 0xc4, 0x65, +/*3960:*/ 0x75, 0xaa, 0x83, 0x33, 0x44, 0xb0, 0xfc, 0xf2, 0xaf, 0x0d, 0x70, 0x2f, 0x13, 0x70, 0x4a, 0x2c, +/*3970:*/ 0xda, 0x1d, 0x87, 0xff, 0x84, 0x44, 0x9d, 0x5a, 0x37, 0xce, 0x31, 0xb5, 0x9f, 0x44, 0x9b, 0x5e, +/*3980:*/ 0x53, 0x3a, 0x68, 0x96, 0x21, 0x8c, 0xc8, 0x41, 0xc8, 0xcf, 0xe6, 0x61, 0xd2, 0xe8, 0x91, 0x68, +/*3990:*/ 0x8d, 0x21, 0xb9, 0xda, 0x33, 0xf2, 0x98, 0x9f, 0xd5, 0x7d, 0xdf, 0x45, 0x38, 0x3d, 0x18, 0x8c, +/*39a0:*/ 0xb9, 0x2d, 0x11, 0x67, 0x8f, 0xc0, 0x24, 0xc9, 0x70, 0x18, 0x10, 0xb9, 0xfc, 0x21, 0x14, 0xd3, +/*39b0:*/ 0xd3, 0xe2, 0x47, 0xce, 0x8f, 0xde, 0xba, 0x52, 0x42, 0x3b, 0xfd, 0x5a, 0xe8, 0x9d, 0x51, 0xc7, +/*39c0:*/ 0x4c, 0x3f, 0x57, 0xfd, 0x84, 0xd1, 0x27, 0xe9, 0x67, 0x0b, 0x9a, 0xc7, 0x78, 0x7c, 0x00, 0x94, +/*39d0:*/ 0xbe, 0x15, 0x3c, 0x69, 0xdf, 0x02, 0x02, 0x9d, 0xb3, 0x57, 0xc5, 0xe3, 0x15, 0x27, 0x8e, 0x04, +/*39e0:*/ 0x03, 0x55, 0xcd, 0x10, 0x8e, 0x3f, 0x8b, 0xe0, 0xf5, 0x69, 0xc0, 0xa4, 0x8a, 0x18, 0x38, 0x9c, +/*39f0:*/ 0x0e, 0xae, 0xe1, 0x6b, 0xa7, 0xbb, 0x37, 0xe6, 0x4b, 0x37, 0x22, 0x05, 0xa7, 0x7f, 0xfe, 0x75, +/*3a00:*/ 0x11, 0x43, 0xc3, 0xa1, 0x75, 0xf7, 0x8f, 0x36, 0xc3, 0xc6, 0xe7, 0x45, 0x49, 0x44, 0x80, 0x99, +/*3a10:*/ 0xbd, 0x57, 0x36, 0x04, 0x7d, 0xec, 0xcc, 0x45, 0x09, 0xde, 0x75, 0x3b, 0x44, 0x2a, 0x12, 0x78, +/*3a20:*/ 0x75, 0x8e, 0x21, 0xeb, 0x07, 0xe5, 0x7f, 0x18, 0x23, 0x78, 0xbb, 0x31, 0x94, 0xf6, 0x29, 0x61, +/*3a30:*/ 0xab, 0x5a, 0xec, 0x22, 0x21, 0xa2, 0x26, 0x39, 0xbf, 0x5a, 0xd8, 0xb3, 0x12, 0x8a, 0xe0, 0x24, +/*3a40:*/ 0x5a, 0x6f, 0x03, 0xc0, 0x0a, 0x17, 0x42, 0x65, 0xed, 0x32, 0xa7, 0x18, 0x15, 0x67, 0x47, 0x4e, +/*3a50:*/ 0xe4, 0x5e, 0x14, 0x77, 0x77, 0xef, 0xff, 0x0c, 0xca, 0xc3, 0x93, 0xf5, 0xab, 0x44, 0x37, 0xc3, +/*3a60:*/ 0x54, 0x33, 0x6d, 0x19, 0x04, 0x36, 0xbe, 0x96, 0xc1, 0x47, 0xb2, 0x8b, 0xf2, 0xd6, 0x73, 0x43, +/*3a70:*/ 0xa1, 0x1a, 0xdb, 0x73, 0xaf, 0x05, 0xe6, 0x6d, 0x8d, 0x3f, 0xe9, 0x49, 0xf8, 0xde, 0xb4, 0x4c, +/*3a80:*/ 0xfb, 0xb4, 0xcd, 0xd9, 0x1f, 0x86, 0x60, 0xee, 0xd9, 0xf7, 0xce, 0xb2, 0xab, 0xb6, 0x68, 0xc5, +/*3a90:*/ 0x65, 0x8a, 0xc1, 0xf8, 0xfd, 0xdc, 0x33, 0x9f, 0x01, 0x22, 0x93, 0x20, 0xdf, 0x86, 0x11, 0x14, +/*3aa0:*/ 0x57, 0x92, 0x0b, 0xf3, 0x74, 0x6f, 0x6e, 0x39, 0xc3, 0x3a, 0x29, 0x60, 0x67, 0xeb, 0x13, 0xfc, +/*3ab0:*/ 0x80, 0xc7, 0xff, 0xba, 0xb4, 0xe2, 0x2b, 0x3d, 0x0b, 0x22, 0x3c, 0xcd, 0x79, 0xeb, 0xc2, 0xba, +/*3ac0:*/ 0x0e, 0x28, 0x9b, 0xbf, 0xd8, 0xbe, 0xe1, 0x7c, 0x83, 0xe3, 0x68, 0x53, 0x5d, 0x6f, 0x81, 0x35, +/*3ad0:*/ 0x22, 0xa8, 0x64, 0x56, 0xa2, 0x21, 0x46, 0x78, 0x71, 0xa7, 0xc7, 0x2f, 0xfd, 0x1a, 0x2a, 0x07, +/*3ae0:*/ 0x8d, 0xd6, 0x5c, 0x0a, 0x3d, 0x39, 0x14, 0x80, 0xe1, 0x9b, 0x5a, 0x8b, 0x37, 0x19, 0x47, 0x5c, +/*3af0:*/ 0xde, 0x5c, 0xa9, 0x78, 0x6c, 0x38, 0x3d, 0xc6, 0x25, 0xe6, 0x57, 0x47, 0xf1, 0x19, 0x33, 0xf7, +/*3b00:*/ 0xd6, 0xd2, 0xbe, 0x61, 0x2a, 0x83, 0xd9, 0xf3, 0x52, 0x0d, 0xa3, 0xc2, 0x14, 0x1d, 0xa6, 0x23, +/*3b10:*/ 0x9d, 0xcf, 0x1f, 0x23, 0x99, 0x6f, 0x28, 0xe6, 0xe5, 0x71, 0x4a, 0xd2, 0x4c, 0xde, 0x38, 0x77, +/*3b20:*/ 0x4d, 0x26, 0xad, 0xf2, 0x37, 0x15, 0x70, 0xe0, 0xb3, 0x17, 0xcf, 0xdf, 0x17, 0xbf, 0xa7, 0x5f, +/*3b30:*/ 0x23, 0x9f, 0xea, 0x6a, 0xc1, 0xfb, 0xfe, 0x25, 0xb0, 0x64, 0xc6, 0x0e, 0x91, 0x63, 0xd2, 0x72, +/*3b40:*/ 0x3d, 0xd3, 0x22, 0x9e, 0xd1, 0x02, 0x1e, 0x62, 0xbd, 0xfd, 0xbf, 0x83, 0x96, 0xd2, 0x37, 0x2a, +/*3b50:*/ 0x14, 0x83, 0x30, 0xb4, 0xb3, 0x37, 0xda, 0x15, 0x70, 0xe7, 0x9c, 0x69, 0x88, 0x84, 0x9b, 0xaf, +/*3b60:*/ 0xad, 0x00, 0xd4, 0xee, 0xf2, 0x59, 0x2f, 0x1d, 0xf3, 0xac, 0x1f, 0xf3, 0xd5, 0xbe, 0x1d, 0x76, +/*3b70:*/ 0xfd, 0xcd, 0x57, 0xd2, 0xd9, 0x2d, 0x5a, 0x8a, 0x78, 0xd2, 0x11, 0xb9, 0x57, 0x6c, 0x58, 0xc9, +/*3b80:*/ 0xb4, 0x65, 0x30, 0x3c, 0x02, 0x15, 0x02, 0x15, 0x3c, 0x77, 0xf8, 0xa8, 0xf8, 0xdc, 0x01, 0xe3, +/*3b90:*/ 0xe0, 0xd4, 0x3d, 0x11, 0x45, 0x90, 0x7f, 0x6d, 0x12, 0xca, 0x62, 0x13, 0x5b, 0xd5, 0xdd, 0xc8, +/*3ba0:*/ 0x1a, 0x74, 0xaa, 0x78, 0xa6, 0x3f, 0x78, 0xcf, 0x02, 0x68, 0xfe, 0xba, 0xe8, 0xbf, 0xa1, 0x08, +/*3bb0:*/ 0xc7, 0xb6, 0x18, 0x54, 0x28, 0xdd, 0x5b, 0x7d, 0x0c, 0x80, 0x5a, 0x35, 0xf1, 0xea, 0xb3, 0xe2, +/*3bc0:*/ 0x11, 0xba, 0x50, 0x35, 0xe2, 0x2e, 0x91, 0xf0, 0x03, 0x0c, 0x48, 0x9f, 0xf7, 0x8d, 0x44, 0x4e, +/*3bd0:*/ 0x19, 0xc1, 0x01, 0x3f, 0xc9, 0x89, 0x05, 0x38, 0x90, 0x56, 0x2c, 0x80, 0x94, 0xc3, 0xdf, 0xc2, +/*3be0:*/ 0x8d, 0xbd, 0x40, 0x81, 0xb4, 0x16, 0xba, 0x18, 0x58, 0x8c, 0x62, 0xa5, 0xb8, 0x91, 0x41, 0x51, +/*3bf0:*/ 0xbf, 0xc8, 0xef, 0x09, 0xff, 0x18, 0x87, 0xc7, 0xd0, 0xbe, 0xd9, 0xa2, 0xc4, 0x9f, 0x4e, 0xad, +/*3c00:*/ 0xc7, 0x1a, 0x1f, 0xb0, 0x07, 0x81, 0x93, 0x3d, 0xf0, 0xe8, 0x96, 0xe9, 0xe5, 0x4a, 0x48, 0x12, +/*3c10:*/ 0x1a, 0x24, 0x7d, 0xb6, 0x55, 0xfe, 0x8b, 0x08, 0x40, 0x0e, 0x08, 0xac, 0x98, 0x82, 0x7d, 0xcf, +/*3c20:*/ 0x14, 0x69, 0x47, 0xda, 0xc7, 0x37, 0xce, 0x72, 0xc7, 0xd7, 0xd4, 0xbc, 0x08, 0x8e, 0x68, 0xe3, +/*3c30:*/ 0xcd, 0x80, 0xe5, 0x8c, 0xe4, 0xda, 0xd6, 0x28, 0x0d, 0x70, 0xab, 0x3b, 0x83, 0x65, 0xe1, 0xfa, +/*3c40:*/ 0xa5, 0xd4, 0x98, 0xf6, 0xdc, 0x62, 0xda, 0xea, 0xe2, 0x54, 0x7d, 0x0c, 0x0e, 0xb2, 0x0b, 0xbb, +/*3c50:*/ 0x8a, 0x25, 0x06, 0x4b, 0x35, 0x0d, 0x93, 0x36, 0x45, 0xaf, 0xdf, 0x6d, 0x60, 0x9d, 0x0c, 0xb4, +/*3c60:*/ 0x2e, 0x89, 0x7e, 0x3d, 0x86, 0x7c, 0xaa, 0x11, 0x70, 0xcf, 0xea, 0x66, 0x68, 0x74, 0x29, 0x72, +/*3c70:*/ 0xe2, 0x82, 0x9d, 0x50, 0xc1, 0x32, 0x53, 0x7a, 0x8a, 0x0a, 0x6c, 0xb4, 0xbe, 0xdc, 0x03, 0xe8, +/*3c80:*/ 0x28, 0xe7, 0x1e, 0x0b, 0x3a, 0xcb, 0x55, 0x04, 0x0a, 0x6b, 0x45, 0x0b, 0x0e, 0xa2, 0xf1, 0xd4, +/*3c90:*/ 0x75, 0xc2, 0xc6, 0xd2, 0x63, 0xbd, 0xe0, 0x53, 0xbe, 0x5d, 0x94, 0xed, 0x01, 0x63, 0x5f, 0x10, +/*3ca0:*/ 0x90, 0xe7, 0xf5, 0x89, 0x39, 0xcb, 0x09, 0x3e, 0x75, 0xbd, 0x4c, 0xbb, 0xa8, 0xd1, 0x05, 0x2a, +/*3cb0:*/ 0x88, 0xae, 0xac, 0xd3, 0x5a, 0xdd, 0x6f, 0x4a, 0x50, 0xeb, 0x34, 0x46, 0x18, 0xe0, 0x43, 0x17, +/*3cc0:*/ 0xc4, 0x3c, 0x77, 0xbf, 0x9c, 0x43, 0x45, 0xa0, 0xd2, 0xcb, 0xa8, 0x45, 0x7b, 0xd0, 0xbc, 0x3c, +/*3cd0:*/ 0x04, 0xf9, 0x2c, 0xd3, 0x09, 0x15, 0x71, 0x0b, 0x07, 0xa7, 0xe4, 0xa9, 0x2b, 0x07, 0x85, 0x0d, +/*3ce0:*/ 0x42, 0x34, 0xe1, 0x8b, 0x0f, 0x34, 0xee, 0x73, 0x0d, 0x6a, 0x2d, 0x35, 0xc4, 0x2e, 0x46, 0x9e, +/*3cf0:*/ 0x0a, 0xde, 0x27, 0xb1, 0xfe, 0x5e, 0xdd, 0x98, 0x80, 0x64, 0xb3, 0x8b, 0xcb, 0x6e, 0x17, 0x57, +/*3d00:*/ 0x11, 0xec, 0x33, 0x10, 0x68, 0xf8, 0xd1, 0xdf, 0x6e, 0x1e, 0xbd, 0x75, 0xac, 0x70, 0x54, 0x68, +/*3d10:*/ 0xab, 0x6b, 0x80, 0x79, 0x4d, 0xe4, 0x95, 0x43, 0x11, 0x98, 0x36, 0xa5, 0x79, 0xf0, 0x46, 0x8d, +/*3d20:*/ 0xfb, 0x4f, 0x36, 0xfd, 0x50, 0x09, 0x34, 0x8b, 0x21, 0xe6, 0x1d, 0x97, 0xae, 0x4d, 0x07, 0x28, +/*3d30:*/ 0x1e, 0xa9, 0x3b, 0x9a, 0xbc, 0xa3, 0x2c, 0xcc, 0x30, 0x97, 0xf9, 0x09, 0x37, 0xe8, 0x79, 0xdc, +/*3d40:*/ 0x6b, 0xb9, 0x8c, 0x28, 0x89, 0x6e, 0x3f, 0x7d, 0x2e, 0xb3, 0x25, 0x39, 0xc9, 0xeb, 0x01, 0x7d, +/*3d50:*/ 0x17, 0xec, 0x53, 0xcf, 0x65, 0x95, 0xc6, 0x53, 0xba, 0xf7, 0x14, 0x7f, 0x11, 0xa8, 0xe3, 0x57, +/*3d60:*/ 0x1c, 0x98, 0xa8, 0xf9, 0x26, 0x17, 0x6d, 0xa6, 0x93, 0x60, 0xd5, 0x04, 0xd4, 0xec, 0xe6, 0xd5, +/*3d70:*/ 0x8b, 0x32, 0x1b, 0x99, 0xbe, 0x08, 0x9e, 0x43, 0xa7, 0xe1, 0xd0, 0x70, 0x85, 0xc1, 0x5b, 0x48, +/*3d80:*/ 0xc7, 0x06, 0x15, 0x29, 0x5c, 0x08, 0xb9, 0x81, 0x78, 0x26, 0xb6, 0xfe, 0x94, 0x52, 0x4d, 0x71, +/*3d90:*/ 0xe4, 0x6e, 0xda, 0xec, 0xbe, 0x39, 0x5f, 0x65, 0xfc, 0x97, 0x53, 0x38, 0x13, 0x37, 0x74, 0xb1, +/*3da0:*/ 0x93, 0xa9, 0x0a, 0x92, 0xe0, 0x1c, 0x97, 0xbb, 0x3e, 0x2d, 0x67, 0x48, 0x77, 0x6a, 0x00, 0xd6, +/*3db0:*/ 0x89, 0x02, 0xd3, 0x56, 0xa3, 0xd1, 0x99, 0xd5, 0xdb, 0x07, 0x64, 0xe4, 0x17, 0x11, 0xcc, 0x9b, +/*3dc0:*/ 0x6d, 0x03, 0x33, 0xc8, 0xc3, 0xa6, 0x7a, 0xe6, 0xe4, 0x55, 0x77, 0xf5, 0x94, 0x78, 0xc7, 0x01, +/*3dd0:*/ 0x08, 0xd8, 0x39, 0x0a, 0xc3, 0x5a, 0x81, 0x5c, 0xf2, 0xfe, 0xf7, 0x01, 0x9e, 0x1d, 0x08, 0x06, +/*3de0:*/ 0x27, 0xea, 0x92, 0x02, 0x6c, 0x4a, 0xf4, 0xeb, 0x66, 0xe4, 0xf7, 0xce, 0x07, 0x0d, 0xfd, 0xd6, +/*3df0:*/ 0x3d, 0x0a, 0x22, 0xa6, 0x38, 0xe7, 0x84, 0x43, 0x25, 0x5b, 0x94, 0xd6, 0x39, 0xec, 0xb6, 0x05, +/*3e00:*/ 0x67, 0xf0, 0x2a, 0xee, 0xbf, 0x64, 0x68, 0x47, 0x68, 0x90, 0x55, 0x3b, 0x24, 0x63, 0x35, 0x7a, +/*3e10:*/ 0x21, 0xdc, 0x74, 0x7d, 0xec, 0x01, 0xec, 0xe7, 0x18, 0x51, 0xe3, 0xcf, 0x5c, 0x59, 0x5e, 0x65, +/*3e20:*/ 0x2a, 0xd6, 0x9c, 0xec, 0x6b, 0x90, 0x4e, 0xda, 0x10, 0xd8, 0x83, 0x30, 0x95, 0x88, 0x5c, 0x45, +/*3e30:*/ 0x62, 0xb6, 0x87, 0xd3, 0x37, 0xa6, 0x70, 0xec, 0x4e, 0x4a, 0xf9, 0x6b, 0x03, 0xcb, 0x6b, 0xfe, +/*3e40:*/ 0x7d, 0x28, 0x63, 0x5e, 0xe5, 0x89, 0x0c, 0xa9, 0x82, 0xac, 0xcf, 0xb3, 0x6c, 0xa2, 0x6d, 0x4f, +/*3e50:*/ 0x19, 0xba, 0x5d, 0xc4, 0x85, 0x43, 0x81, 0x8d, 0xc6, 0x87, 0x1f, 0xff, 0x48, 0x33, 0xc1, 0xe6, +/*3e60:*/ 0xc3, 0xb5, 0x20, 0xbe, 0x74, 0x6c, 0x6f, 0xaa, 0xe8, 0x22, 0xa7, 0x8d, 0x37, 0xed, 0x1e, 0x90, +/*3e70:*/ 0x1f, 0xe0, 0xca, 0x85, 0x8b, 0x85, 0xf3, 0xb4, 0xaf, 0x08, 0x49, 0x24, 0x51, 0x33, 0x60, 0x7a, +/*3e80:*/ 0x78, 0x21, 0xc6, 0xe1, 0xb1, 0x89, 0xa3, 0x08, 0x11, 0x22, 0x72, 0x7d, 0xc9, 0x6d, 0x45, 0x40, +/*3e90:*/ 0xc0, 0x75, 0x22, 0x4b, 0xc6, 0x95, 0xd5, 0x89, 0x48, 0x4a, 0x21, 0x1e, 0x29, 0x8c, 0xe8, 0xae, +/*3ea0:*/ 0x06, 0x85, 0x7f, 0x81, 0x5a, 0xea, 0xc7, 0xc2, 0x66, 0xa5, 0x41, 0x98, 0x3b, 0xd5, 0x68, 0x33, +/*3eb0:*/ 0x9f, 0x87, 0x86, 0x7a, 0xba, 0x07, 0xce, 0xd1, 0xd9, 0x54, 0xd8, 0xd2, 0xb6, 0xa6, 0xe6, 0x4b, +/*3ec0:*/ 0x9c, 0x87, 0x9a, 0xbf, 0x68, 0x56, 0x3d, 0xb0, 0x84, 0xef, 0x8b, 0x83, 0xce, 0xa7, 0xb6, 0xb8, +/*3ed0:*/ 0x58, 0x0f, 0x3a, 0xac, 0xea, 0xca, 0x93, 0x1e, 0x59, 0x34, 0xb1, 0xbc, 0x2e, 0x9c, 0x1c, 0xfc, +/*3ee0:*/ 0xcc, 0xbc, 0x7e, 0x9e, 0x8b, 0x49, 0xef, 0x56, 0x5f, 0x3e, 0x30, 0x62, 0xa8, 0x1d, 0x7e, 0xfa, +/*3ef0:*/ 0x41, 0x6f, 0x73, 0xd1, 0x43, 0xe8, 0xda, 0xcd, 0x3a, 0xec, 0xc9, 0x62, 0x55, 0xf6, 0xe3, 0xef, +/*3f00:*/ 0x6d, 0x91, 0x18, 0x0e, 0x9a, 0x1d, 0x0e, 0x85, 0xb5, 0x89, 0xc6, 0x24, 0x7f, 0xfb, 0x23, 0xd2, +/*3f10:*/ 0x75, 0xc4, 0xd3, 0x85, 0xac, 0x06, 0xcf, 0x62, 0xac, 0xd9, 0x39, 0xaa, 0x18, 0xcf, 0x6f, 0xd8, +/*3f20:*/ 0x76, 0x98, 0x6b, 0xc6, 0xc2, 0x1f, 0x49, 0xcf, 0xe3, 0x23, 0xbd, 0xb7, 0x04, 0x6e, 0x0d, 0xd3, +/*3f30:*/ 0x1f, 0x2d, 0x5d, 0xfb, 0x18, 0xef, 0x71, 0x11, 0x80, 0xb3, 0xd0, 0x1c, 0xed, 0x98, 0x52, 0xf6, +/*3f40:*/ 0x3a, 0x9b, 0xec, 0x29, 0x69, 0x19, 0x97, 0x84, 0xda, 0xb1, 0x20, 0x76, 0xda, 0xea, 0x5e, 0xf5, +/*3f50:*/ 0x86, 0x97, 0xe2, 0x77, 0x1d, 0x3c, 0xeb, 0xea, 0x43, 0x69, 0x4e, 0x10, 0x50, 0xf8, 0x24, 0x0d, +/*3f60:*/ 0x69, 0x9e, 0x17, 0x3f, 0xba, 0x03, 0x9e, 0xdb, 0xbb, 0x93, 0x9f, 0x29, 0x6c, 0xca, 0x30, 0xdf, +/*3f70:*/ 0xe8, 0x91, 0xd9, 0xa2, 0x8d, 0xf2, 0x83, 0xcc, 0x87, 0x1c, 0x8e, 0x8b, 0x9b, 0x04, 0x9e, 0x58, +/*3f80:*/ 0x29, 0x05, 0x9c, 0xe6, 0x6d, 0x26, 0xef, 0x72, 0xc8, 0x47, 0xa4, 0x37, 0xa1, 0x14, 0x4b, 0x25, +/*3f90:*/ 0x5c, 0xf3, 0xc0, 0xad, 0x73, 0x21, 0xcf, 0x58, 0x9a, 0x32, 0xb1, 0xc0, 0x20, 0xc1, 0x1d, 0xc4, +/*3fa0:*/ 0x16, 0x9b, 0xd1, 0xbf, 0x54, 0xdf, 0xf9, 0x4c, 0x0f, 0xe1, 0xff, 0x84, 0x12, 0x7b, 0xde, 0x40, +/*3fb0:*/ 0x08, 0xc3, 0x49, 0xcf, 0x23, 0x3b, 0x23, 0xa8, 0xf9, 0x65, 0x1d, 0xf2, 0xff, 0xed, 0xfa, 0xe6, +/*3fc0:*/ 0xe5, 0xc6, 0x78, 0x86, 0x2e, 0x97, 0x56, 0xcd, 0x62, 0xd6, 0xd7, 0x6d, 0x17, 0x5c, 0x7a, 0x24, +/*3fd0:*/ 0x96, 0x4c, 0xbe, 0xb1, 0xfe, 0xa6, 0x22, 0x46, 0xf1, 0xd1, 0xb7, 0x64, 0x51, 0x5b, 0x7b, 0x35, +/*3fe0:*/ 0x8e, 0xb5, 0xed, 0xf7, 0x76, 0x79, 0x9d, 0x72, 0xf4, 0xe6, 0x25, 0x8f, 0xb0, 0x87, 0x3f, 0x30, +/*3ff0:*/ 0x7e, 0xb4, 0x3e, 0xba, 0xe2, 0xc2, 0xe2, 0x89, 0x9f, 0xe5, 0x20, 0x0f, 0x00, 0x43, 0x21, 0x03, +/*4000:*/ 0x3f, 0x4b, 0xb3, 0xbd, 0xa5, 0xa5, 0xec, 0x8b, 0x07, 0x27, 0xe7, 0x21, 0x17, 0x00, 0x5d, 0xb6, +/*4010:*/ 0x13, 0x98, 0xcb, 0x9e, 0x17, 0xba, 0x36, 0xe0, 0xba, 0xb2, 0xf5, 0xf3, 0x06, 0xc1, 0x5c, 0xea, +/*4020:*/ 0xc6, 0x21, 0x40, 0xf7, 0x34, 0xb9, 0xc1, 0x80, 0x84, 0xa8, 0x3e, 0x6a, 0xd8, 0x52, 0xed, 0x49, +/*4030:*/ 0xcb, 0x90, 0xbe, 0x29, 0xf3, 0xb0, 0x9a, 0x61, 0x33, 0x18, 0xf9, 0xed, 0xb8, 0xf4, 0xd1, 0xfb, +/*4040:*/ 0x32, 0xd3, 0x7d, 0x5c, 0xa8, 0xa0, 0x33, 0xab, 0xe2, 0x31, 0xdc, 0x19, 0xe2, 0xdb, 0xd5, 0xcf, +/*4050:*/ 0xb5, 0xf3, 0xd0, 0x99, 0xde, 0xfe, 0x92, 0xff, 0xb9, 0x26, 0x48, 0x06, 0x27, 0xd8, 0xc1, 0xca, +/*4060:*/ 0x89, 0x16, 0x15, 0xe3, 0xf3, 0x60, 0x7b, 0xd5, 0xf1, 0x7a, 0xe9, 0x6c, 0x41, 0x34, 0xef, 0xc0, +/*4070:*/ 0x08, 0xb5, 0x35, 0x24, 0x3b, 0xf9, 0x52, 0x30, 0xfd, 0x5c, 0x7c, 0x6f, 0xb2, 0x42, 0xe3, 0x6c, +/*4080:*/ 0x60, 0xa0, 0xe2, 0xe7, 0xc5, 0x43, 0x32, 0x14, 0xe5, 0x97, 0x61, 0x99, 0x9b, 0x6f, 0xa1, 0xcc, +/*4090:*/ 0x29, 0x5c, 0x9d, 0xbc, 0x84, 0x24, 0x56, 0xa6, 0x8b, 0x92, 0xca, 0x15, 0xc2, 0x21, 0x87, 0xa5, +/*40a0:*/ 0x13, 0x38, 0x3f, 0x46, 0xc7, 0xcc, 0x43, 0xa9, 0x09, 0x0f, 0x0e, 0x94, 0xf3, 0x70, 0xd8, 0xc4, +/*40b0:*/ 0xb6, 0x4c, 0x9d, 0xfe, 0x15, 0xed, 0xc9, 0x35, 0x39, 0xd6, 0x20, 0x10, 0x5c, 0xde, 0x73, 0xbd, +/*40c0:*/ 0xd6, 0xa5, 0x66, 0x51, 0xbf, 0xa7, 0xd6, 0x1a, 0x58, 0x51, 0xe0, 0x67, 0x5e, 0x01, 0x42, 0x16, +/*40d0:*/ 0x6b, 0x66, 0x72, 0x3b, 0xf2, 0xdf, 0xfb, 0x53, 0xc6, 0x3f, 0x58, 0x39, 0x19, 0xe8, 0x33, 0x1b, +/*40e0:*/ 0xe3, 0x53, 0x0d, 0xd2, 0x61, 0xe8, 0x1c, 0x41, 0xfa, 0xb7, 0xc9, 0x1c, 0xef, 0x63, 0x93, 0xe0, +/*40f0:*/ 0xd8, 0x6d, 0x3f, 0x8e, 0xb0, 0xed, 0xea, 0xdb, 0x26, 0xe1, 0xee, 0x11, 0xc6, 0x85, 0xb1, 0xf6, +/*4100:*/ 0xf4, 0xed, 0xff, 0xee, 0x41, 0x20, 0xf7, 0x85, 0x99, 0x79, 0xdd, 0x3d, 0x01, 0xa3, 0xc1, 0xd5, +/*4110:*/ 0x67, 0x89, 0x77, 0x4c, 0x50, 0x22, 0x10, 0xed, 0x81, 0x1d, 0x0b, 0x06, 0x92, 0x3f, 0x91, 0xd0, +/*4120:*/ 0x17, 0x6e, 0x0c, 0x96, 0xf1, 0x82, 0x77, 0x49, 0x60, 0x3d, 0xad, 0xeb, 0x66, 0x2f, 0xdc, 0x12, +/*4130:*/ 0xfe, 0x13, 0xe1, 0x40, 0xe1, 0x99, 0xa3, 0xe7, 0xc7, 0x55, 0x00, 0x60, 0x84, 0x25, 0x35, 0x83, +/*4140:*/ 0x3e, 0x6a, 0x81, 0x31, 0x78, 0x69, 0xf0, 0x20, 0x41, 0x88, 0xdd, 0x4b, 0xcc, 0x1c, 0x81, 0x95, +/*4150:*/ 0xfe, 0xe9, 0x31, 0xa2, 0x88, 0xb2, 0x73, 0x8b, 0x7e, 0x93, 0x09, 0xd1, 0xd1, 0x55, 0xef, 0x6c, +/*4160:*/ 0x3f, 0x78, 0x69, 0x1f, 0x56, 0x16, 0x96, 0x18, 0x38, 0x2e, 0x30, 0x86, 0x7c, 0x48, 0x63, 0xfe, +/*4170:*/ 0xc0, 0x75, 0xe2, 0x06, 0x20, 0xed, 0x9a, 0x47, 0x6a, 0x8b, 0x95, 0x7c, 0x8e, 0xf0, 0xf6, 0x09, +/*4180:*/ 0x0c, 0x70, 0xf9, 0x1b, 0x20, 0x56, 0x58, 0x54, 0xa0, 0x6d, 0x93, 0x96, 0xc9, 0xc3, 0x47, 0xb7, +/*4190:*/ 0x10, 0x1d, 0x69, 0x48, 0x7d, 0x3c, 0xfd, 0x2a, 0x4d, 0xc9, 0x93, 0x10, 0x38, 0x7a, 0xda, 0x31, +/*41a0:*/ 0xa2, 0x4e, 0x2d, 0xe2, 0x4e, 0xcf, 0x45, 0x34, 0xe9, 0x08, 0x90, 0x57, 0xac, 0xe9, 0x1f, 0x18, +/*41b0:*/ 0x67, 0x25, 0xdf, 0xf9, 0xc0, 0xb0, 0x3a, 0x17, 0x01, 0x80, 0xd5, 0xc2, 0xf3, 0x8d, 0xab, 0x84, +/*41c0:*/ 0x7e, 0x49, 0xcf, 0xb0, 0xed, 0xe3, 0xe1, 0x54, 0x38, 0x2a, 0xf6, 0xd8, 0xd7, 0xc4, 0x33, 0x0f, +/*41d0:*/ 0xb3, 0x82, 0xad, 0x22, 0x56, 0x1d, 0x3e, 0x1b, 0x07, 0xce, 0xe1, 0x1d, 0xfe, 0xdc, 0x6e, 0xc0, +/*41e0:*/ 0x66, 0xf0, 0xe6, 0x10, 0xbf, 0x0d, 0x09, 0x08, 0xde, 0x87, 0x7e, 0xbf, 0xc5, 0xd1, 0x81, 0xfd, +/*41f0:*/ 0x36, 0x30, 0x23, 0xb7, 0xc0, 0xb1, 0x35, 0x97, 0x57, 0x7c, 0xaa, 0x6c, 0x99, 0x70, 0x20, 0xc6, +/*4200:*/ 0xa1, 0x76, 0xed, 0x47, 0xef, 0x53, 0xb0, 0xde, 0x4c, 0x52, 0x5c, 0xb8, 0xf3, 0xf1, 0x20, 0x0b, +/*4210:*/ 0xdd, 0x8f, 0x8b, 0xd6, 0x14, 0x10, 0x94, 0x19, 0xa8, 0xf1, 0xf4, 0x3f, 0x1b, 0xcc, 0x87, 0xf6, +/*4220:*/ 0xe9, 0x65, 0xf8, 0x24, 0x4d, 0xf0, 0xd1, 0xf0, 0xaf, 0xaa, 0x86, 0x3c, 0x36, 0x5d, 0xc5, 0xff, +/*4230:*/ 0xf2, 0x6a, 0xe3, 0xd5, 0xaf, 0x09, 0x9d, 0x15, 0x8b, 0xf0, 0x2b, 0xad, 0x5c, 0x32, 0x51, 0x35, +/*4240:*/ 0x58, 0x52, 0x00, 0xcc, 0x81, 0x02, 0xe1, 0xbf, 0x96, 0xc2, 0x65, 0x10, 0x6b, 0x18, 0x6c, 0x80, +/*4250:*/ 0x26, 0xca, 0x54, 0xd6, 0xfe, 0xd8, 0x71, 0x18, 0x37, 0x8c, 0xdd, 0x49, 0x81, 0x3a, 0x01, 0x35, +/*4260:*/ 0x02, 0x41, 0xbb, 0x9f, 0x5a, 0xec, 0x9c, 0x4c, 0x42, 0x40, 0x2f, 0x8e, 0x25, 0x09, 0xb2, 0xd6, +/*4270:*/ 0x73, 0x04, 0x59, 0x74, 0xdc, 0xf1, 0xd9, 0x6b, 0x55, 0xff, 0x03, 0x2f, 0xd3, 0x97, 0x18, 0x5d, +/*4280:*/ 0x1a, 0x86, 0x68, 0x7d, 0x73, 0x54, 0x53, 0x68, 0x0f, 0xdf, 0xea, 0x3a, 0x11, 0x2e, 0x03, 0x2b, +/*4290:*/ 0xcb, 0x93, 0x98, 0xb0, 0xe3, 0xf0, 0xeb, 0x78, 0xf6, 0x88, 0xd0, 0xcb, 0x5c, 0x77, 0x17, 0xd0, +/*42a0:*/ 0xeb, 0xc3, 0x91, 0x9b, 0xd9, 0xfc, 0x07, 0xf6, 0xc5, 0x66, 0x95, 0xd9, 0x23, 0x98, 0x3d, 0x4a, +/*42b0:*/ 0x16, 0x4c, 0xbe, 0xba, 0xf4, 0x82, 0x5c, 0x34, 0xfd, 0xe3, 0x9c, 0x62, 0xeb, 0x72, 0xc8, 0x39, +/*42c0:*/ 0x89, 0x0a, 0xdc, 0x8b, 0xc7, 0x0f, 0xe6, 0xc3, 0x2f, 0x82, 0xe4, 0x72, 0x7a, 0x93, 0x56, 0x88, +/*42d0:*/ 0x08, 0x6e, 0x42, 0x16, 0xdd, 0xc5, 0xc6, 0x7f, 0xcf, 0x9d, 0x35, 0xd5, 0xb0, 0x77, 0xc9, 0x59, +/*42e0:*/ 0x0f, 0xf8, 0x88, 0xd9, 0xcd, 0x26, 0xd5, 0x24, 0x97, 0x89, 0xd2, 0xe6, 0x87, 0xb8, 0x7b, 0x67, +/*42f0:*/ 0x43, 0x3e, 0x1f, 0xe6, 0x8e, 0x5b, 0xe5, 0xc6, 0x94, 0x9e, 0x18, 0x59, 0x63, 0xab, 0x4b, 0x5b, +/*4300:*/ 0x58, 0x64, 0x21, 0xaa, 0x09, 0xf0, 0x3e, 0x79, 0x6b, 0x9b, 0xd6, 0xb5, 0x9f, 0x45, 0xcd, 0xe9, +/*4310:*/ 0x5d, 0x45, 0x70, 0x2c, 0x5d, 0xcd, 0x10, 0x89, 0x51, 0x9a, 0x7d, 0xe9, 0xe3, 0x9d, 0x43, 0x73, +/*4320:*/ 0x26, 0x11, 0x0c, 0xce, 0xdf, 0x6c, 0x8d, 0x41, 0xcb, 0x42, 0x03, 0x26, 0x33, 0xba, 0x4d, 0x82, +/*4330:*/ 0x42, 0x9a, 0x05, 0xde, 0xe5, 0x21, 0x3b, 0xe5, 0x53, 0xc3, 0x92, 0x85, 0x97, 0x62, 0x46, 0x81, +/*4340:*/ 0xca, 0x2f, 0x8b, 0x15, 0x63, 0x8e, 0x9c, 0x80, 0xf2, 0x80, 0x5e, 0x07, 0xd9, 0xaf, 0x2b, 0x3d, +/*4350:*/ 0x02, 0x0b, 0xc3, 0xe9, 0x2e, 0x2d, 0xb5, 0xf2, 0x84, 0x3b, 0x68, 0xbb, 0x05, 0x97, 0x24, 0x9a, +/*4360:*/ 0xac, 0x83, 0xd1, 0xc0, 0xc0, 0x6c, 0x74, 0x87, 0x39, 0xcd, 0x16, 0xc0, 0xbc, 0x29, 0x64, 0xc8, +/*4370:*/ 0x0a, 0x2f, 0xe1, 0x6f, 0x00, 0x64, 0x36, 0x47, 0x5e, 0xa7, 0xc9, 0xe4, 0xa0, 0x94, 0xab, 0xfc, +/*4380:*/ 0x4e, 0x4d, 0x13, 0xd1, 0x81, 0xb3, 0x9a, 0x87, 0x6b, 0xba, 0x11, 0x2e, 0x13, 0xe5, 0x64, 0x1e, +/*4390:*/ 0xc2, 0x5a, 0x7c, 0x4b, 0x80, 0x28, 0xe8, 0xf1, 0xfc, 0xf6, 0xc3, 0x91, 0xb9, 0x7d, 0xb4, 0x65, +/*43a0:*/ 0xda, 0xb1, 0x71, 0x5d, 0x13, 0x1a, 0x84, 0x09, 0xd3, 0xb9, 0xcb, 0x51, 0x04, 0x66, 0x14, 0x4d, +/*43b0:*/ 0x6d, 0x70, 0xe3, 0x36, 0x98, 0x44, 0x96, 0xa9, 0xac, 0x39, 0xa9, 0x36, 0x05, 0x2c, 0x11, 0x2a, +/*43c0:*/ 0x69, 0xc4, 0xed, 0x1e, 0xf7, 0x9c, 0xb8, 0xe2, 0x30, 0x6f, 0x66, 0xc4, 0xd5, 0x95, 0x86, 0x20, +/*43d0:*/ 0x40, 0x50, 0x42, 0x1b, 0xfa, 0xf1, 0x0a, 0xd2, 0xea, 0xfa, 0x06, 0xb8, 0x77, 0x99, 0xc2, 0x58, +/*43e0:*/ 0x77, 0x7b, 0x1b, 0x81, 0x3e, 0x49, 0x64, 0xbb, 0x53, 0x8a, 0xb6, 0xfc, 0x25, 0x66, 0x10, 0x60, +/*43f0:*/ 0x14, 0xfb, 0x06, 0x95, 0xdd, 0x3b, 0x54, 0xc1, 0x19, 0x4f, 0xd1, 0x73, 0x2f, 0x28, 0x82, 0xf8, +/*4400:*/ 0x63, 0xa9, 0xaf, 0x26, 0xa5, 0x30, 0x66, 0x3c, 0x2c, 0x54, 0xd1, 0x61, 0x4d, 0xb9, 0x75, 0xcd, +/*4410:*/ 0x63, 0xe1, 0x6b, 0xea, 0x7e, 0x7d, 0x97, 0xf7, 0xf2, 0x5b, 0xd9, 0x9f, 0x4f, 0x0d, 0x21, 0x42, +/*4420:*/ 0x47, 0x46, 0x58, 0xbb, 0xf1, 0xab, 0x3d, 0xab, 0x03, 0xcf, 0x84, 0x6e, 0xf7, 0xa8, 0xd8, 0xb3, +/*4430:*/ 0xd9, 0x53, 0xd2, 0x3a, 0x93, 0x0b, 0xd4, 0x6f, 0xd6, 0xdd, 0x40, 0xe3, 0xff, 0x5a, 0x2c, 0x3e, +/*4440:*/ 0x61, 0x22, 0x3a, 0x12, 0x56, 0x54, 0xe0, 0x7a, 0x8b, 0x0e, 0xd7, 0xb3, 0x75, 0xb0, 0x2e, 0x45, +/*4450:*/ 0xc3, 0xec, 0x2b, 0x6a, 0xc6, 0x85, 0x26, 0xcf, 0x5c, 0xbf, 0xe8, 0x3e, 0x5d, 0x1f, 0x14, 0x6b, +/*4460:*/ 0x28, 0xe1, 0xd5, 0xbd, 0x1b, 0xd5, 0xd4, 0xcc, 0x14, 0x15, 0xf7, 0x19, 0xa0, 0x64, 0x32, 0xe6, +/*4470:*/ 0xd2, 0xe8, 0x89, 0xf2, 0xa4, 0x32, 0xe6, 0x7c, 0xb3, 0xfa, 0xd7, 0x75, 0x0f, 0xa1, 0x90, 0xf8, +/*4480:*/ 0x7e, 0x23, 0xa1, 0x86, 0x4a, 0x08, 0xae, 0x85, 0x20, 0x21, 0x3b, 0xcd, 0x06, 0x57, 0xe9, 0x2e, +/*4490:*/ 0x05, 0x11, 0x85, 0x61, 0x1c, 0xb2, 0xd1, 0x59, 0xc4, 0x1a, 0x41, 0x66, 0xd9, 0x2f, 0xfb, 0x13, +/*44a0:*/ 0x7f, 0xfa, 0xe6, 0x40, 0x70, 0xb8, 0x02, 0x49, 0xce, 0x9b, 0xea, 0x8c, 0x34, 0x40, 0x42, 0x42, +/*44b0:*/ 0xc7, 0xae, 0xfd, 0x27, 0xd9, 0xce, 0x3f, 0xb1, 0x0f, 0x61, 0x43, 0xe2, 0xc1, 0x80, 0x0c, 0x8f, +/*44c0:*/ 0x19, 0x79, 0xee, 0x37, 0x67, 0xaa, 0xf1, 0xa1, 0x70, 0xfa, 0x52, 0xd8, 0x6b, 0x9a, 0x85, 0xbc, +/*44d0:*/ 0x77, 0xde, 0x3b, 0x03, 0xbf, 0x6d, 0xb9, 0x88, 0x71, 0x03, 0xfb, 0x5a, 0xf3, 0x7f, 0xd4, 0x4e, +/*44e0:*/ 0xb4, 0x22, 0xdc, 0xf1, 0x5a, 0xdd, 0xaf, 0x6c, 0x7a, 0x68, 0xd8, 0xfe, 0xf2, 0x6b, 0x46, 0xe4, +/*44f0:*/ 0xa6, 0xc8, 0x3d, 0xd0, 0x25, 0x54, 0xa3, 0x7c, 0xe4, 0xdc, 0x05, 0x71, 0x08, 0xe2, 0x3b, 0xdc, +/*4500:*/ 0xeb, 0x41, 0xca, 0x83, 0xe4, 0x36, 0x6a, 0xc2, 0x63, 0x58, 0x12, 0xac, 0xd0, 0x9e, 0x4c, 0x60, +/*4510:*/ 0x8b, 0x24, 0x8c, 0xb6, 0xf3, 0x19, 0x6a, 0xa5, 0x4f, 0x87, 0x0f, 0x24, 0x2d, 0xd3, 0x1d, 0xeb, +/*4520:*/ 0x58, 0xa3, 0x79, 0xbb, 0x72, 0x24, 0x12, 0x63, 0x47, 0x14, 0x0d, 0xa0, 0x3c, 0x58, 0xde, 0x63, +/*4530:*/ 0xd2, 0xab, 0x74, 0xec, 0xc3, 0x5e, 0xc7, 0xcb, 0x95, 0xba, 0xb0, 0xec, 0x61, 0x52, 0x63, 0xdb, +/*4540:*/ 0x38, 0x6d, 0x8c, 0xa1, 0x03, 0x89, 0x80, 0x87, 0xe8, 0xaf, 0x87, 0xbc, 0xb4, 0x14, 0xc3, 0x25, +/*4550:*/ 0xa9, 0x59, 0x8e, 0xcd, 0x6d, 0x06, 0xa1, 0x3b, 0x26, 0x5d, 0xba, 0x2a, 0xff, 0xe8, 0x2b, 0xf2, +/*4560:*/ 0xac, 0x95, 0x0c, 0x89, 0x8d, 0xf0, 0xd3, 0x54, 0xa4, 0xd4, 0xcc, 0x60, 0xab, 0xbe, 0x66, 0x05, +/*4570:*/ 0x31, 0x40, 0x42, 0x67, 0x7b, 0x43, 0x88, 0xc2, 0x0b, 0xa6, 0xfc, 0xdb, 0x70, 0xa8, 0x59, 0x75, +/*4580:*/ 0xb4, 0x97, 0xee, 0x24, 0xd7, 0x7f, 0x95, 0x1f, 0xe1, 0xfa, 0x10, 0x32, 0xc9, 0x71, 0x08, 0x34, +/*4590:*/ 0x99, 0x1a, 0xed, 0xe5, 0x8d, 0x5d, 0xf1, 0x0d, 0x34, 0x97, 0xe5, 0xf8, 0xf2, 0xf2, 0xe1, 0x70, +/*45a0:*/ 0xec, 0x00, 0x9f, 0x06, 0xda, 0xc1, 0x91, 0x6e, 0x34, 0x2a, 0x04, 0x4a, 0xb3, 0x61, 0xb1, 0x79, +/*45b0:*/ 0x53, 0x99, 0x48, 0x22, 0x8e, 0x16, 0xa4, 0x14, 0x21, 0x08, 0x53, 0xad, 0x13, 0x43, 0x4a, 0x3c, +/*45c0:*/ 0x6a, 0xdb, 0xe2, 0x7e, 0x08, 0x86, 0x95, 0x78, 0xc5, 0x4f, 0x70, 0x27, 0xbf, 0xec, 0x26, 0x6f, +/*45d0:*/ 0x81, 0xed, 0x48, 0x16, 0x33, 0xb2, 0x14, 0xee, 0x72, 0x00, 0xd3, 0x5b, 0x36, 0xd2, 0x9c, 0xf7, +/*45e0:*/ 0xd5, 0x9c, 0x06, 0x3c, 0xeb, 0x70, 0x98, 0x0e, 0xe3, 0x6a, 0x32, 0x56, 0x2e, 0xed, 0x1a, 0x30, +/*45f0:*/ 0x2d, 0x89, 0x9d, 0x27, 0x3d, 0xc8, 0x85, 0x01, 0xd4, 0x90, 0x71, 0xef, 0x8d, 0x57, 0xe9, 0xfc, +/*4600:*/ 0xf1, 0x88, 0xad, 0xcd, 0x06, 0x84, 0x2b, 0x66, 0xf1, 0x45, 0x44, 0x43, 0x53, 0x3c, 0x52, 0x8c, +/*4610:*/ 0x3b, 0x42, 0x4e, 0x59, 0x38, 0xf3, 0x67, 0x0e, 0x29, 0x6b, 0x51, 0x4a, 0xa3, 0xd5, 0x92, 0x03, +/*4620:*/ 0x1b, 0x10, 0x1e, 0xd2, 0xef, 0x31, 0xf7, 0x03, 0x64, 0x0a, 0x43, 0x11, 0x3d, 0x15, 0xde, 0x02, +/*4630:*/ 0xcb, 0xdf, 0x73, 0x21, 0x82, 0xbf, 0xed, 0xbf, 0x75, 0x26, 0xdf, 0x10, 0x86, 0x5a, 0x9f, 0xdd, +/*4640:*/ 0x3e, 0x55, 0xe4, 0xc0, 0xf2, 0xbd, 0x0b, 0xbf, 0x2f, 0x85, 0xd3, 0x64, 0x69, 0xc7, 0x27, 0x54, +/*4650:*/ 0x2e, 0xf3, 0xea, 0x24, 0xc6, 0x77, 0x45, 0xbe, 0x13, 0x37, 0x87, 0xe1, 0xf8, 0xcd, 0xa3, 0xfc, +/*4660:*/ 0x0e, 0x0a, 0x98, 0x5a, 0x4f, 0x31, 0x22, 0x06, 0xe0, 0x6c, 0x9e, 0x62, 0x4e, 0xc7, 0xaf, 0x5a, +/*4670:*/ 0xe1, 0xa3, 0x56, 0x0d, 0xcd, 0x7f, 0x04, 0xda, 0xaf, 0xe2, 0xce, 0x80, 0x74, 0x3e, 0x16, 0x44, +/*4680:*/ 0x23, 0x48, 0x74, 0xd4, 0xa1, 0xb1, 0xd2, 0x1c, 0x52, 0x29, 0x9f, 0x11, 0x76, 0x61, 0x96, 0x8e, +/*4690:*/ 0x2d, 0x2f, 0x93, 0x15, 0x0a, 0x8b, 0x8e, 0x62, 0xe6, 0x5b, 0x39, 0x59, 0x23, 0x12, 0x6a, 0xb1, +/*46a0:*/ 0x30, 0x85, 0xa6, 0x99, 0x02, 0x81, 0x9f, 0x7e, 0xa3, 0xd3, 0x9d, 0x58, 0x96, 0x1d, 0x0a, 0x7b, +/*46b0:*/ 0x2f, 0x7c, 0xef, 0x25, 0xe0, 0x15, 0xaf, 0x5e, 0x5d, 0x9e, 0x4f, 0xdc, 0x01, 0x99, 0xb0, 0x45, +/*46c0:*/ 0xfa, 0x44, 0xcc, 0x4f, 0x6b, 0xce, 0x11, 0xb7, 0x84, 0x42, 0x2a, 0x56, 0xe6, 0xb7, 0x81, 0x11, +/*46d0:*/ 0x59, 0x73, 0x0b, 0x9e, 0x59, 0x66, 0xef, 0x2e, 0x22, 0xc0, 0xf2, 0x14, 0xc2, 0x85, 0x08, 0x74, +/*46e0:*/ 0x19, 0x7f, 0xf1, 0xd6, 0xbd, 0xf4, 0x66, 0x5a, 0x73, 0x21, 0xe2, 0x23, 0x67, 0xb2, 0x86, 0xee, +/*46f0:*/ 0xc6, 0x01, 0xdb, 0x61, 0x53, 0x18, 0x30, 0xa8, 0x01, 0x19, 0x50, 0xa8, 0xed, 0xb2, 0x2c, 0x0c, +/*4700:*/ 0xae, 0x95, 0xe6, 0x8b, 0x9e, 0x01, 0xf2, 0xae, 0x86, 0x65, 0xf8, 0x95, 0x6c, 0xc0, 0xd5, 0x45, +/*4710:*/ 0x78, 0x2b, 0x4c, 0xd3, 0xb5, 0x39, 0xa6, 0x3c, 0x3f, 0x40, 0xf2, 0x00, 0xd9, 0x1b, 0x3b, 0x97, +/*4720:*/ 0x02, 0x21, 0xe7, 0xdd, 0xc0, 0x7f, 0x74, 0x87, 0x72, 0x90, 0x6b, 0x8f, 0xb0, 0x6f, 0x2d, 0x08, +/*4730:*/ 0x55, 0x28, 0xd4, 0xd1, 0x41, 0xae, 0x79, 0x6c, 0xa8, 0x29, 0x92, 0xef, 0xbb, 0x1f, 0xd0, 0x77, +/*4740:*/ 0x7c, 0x1b, 0xac, 0xd0, 0xee, 0x43, 0x26, 0x3b, 0x62, 0xa7, 0xfd, 0x0c, 0x5d, 0x6e, 0x26, 0xe7, +/*4750:*/ 0x5b, 0x94, 0x01, 0x3b, 0x57, 0xab, 0x54, 0xe0, 0x7f, 0xea, 0x7d, 0x07, 0x20, 0x71, 0xae, 0xaf, +/*4760:*/ 0x2c, 0xc1, 0x60, 0x3a, 0xf8, 0xd5, 0x51, 0xf0, 0x45, 0x76, 0x2a, 0x02, 0x55, 0xc5, 0x58, 0xa4, +/*4770:*/ 0x4d, 0xb7, 0x2e, 0x6a, 0xec, 0x53, 0xf0, 0x3f, 0x78, 0x73, 0x16, 0xca, 0x4d, 0xd6, 0x82, 0x4c, +/*4780:*/ 0x7c, 0xa2, 0x4f, 0x25, 0x3f, 0xfd, 0x94, 0xf7, 0x57, 0xb3, 0x40, 0x06, 0x8e, 0xba, 0x90, 0x03, +/*4790:*/ 0x12, 0x14, 0x62, 0x13, 0x15, 0xf4, 0x51, 0x66, 0x63, 0x82, 0x40, 0x42, 0x48, 0x4c, 0x5c, 0x83, +/*47a0:*/ 0xea, 0x42, 0xb3, 0xc1, 0xe0, 0x75, 0xe4, 0xce, 0xd9, 0x19, 0x48, 0x7c, 0x5d, 0xba, 0x18, 0x6b, +/*47b0:*/ 0xf8, 0x06, 0x5e, 0x52, 0x55, 0x6f, 0xa9, 0x48, 0x25, 0xbf, 0x20, 0x31, 0x9c, 0xed, 0x6c, 0x54, +/*47c0:*/ 0x39, 0x96, 0x8a, 0x82, 0x92, 0x9a, 0x4f, 0x5c, 0x21, 0x09, 0x04, 0xf5, 0x51, 0x15, 0x13, 0x0e, +/*47d0:*/ 0x30, 0x91, 0x75, 0x4d, 0xe8, 0xb2, 0xa0, 0xce, 0xc9, 0xdb, 0x76, 0xd5, 0xfc, 0x96, 0x72, 0x7d, +/*47e0:*/ 0x29, 0x8f, 0xa4, 0x7c, 0xbe, 0x83, 0xda, 0x6e, 0x1a, 0x6d, 0x25, 0x80, 0x6e, 0x6b, 0x7e, 0xe2, +/*47f0:*/ 0xbc, 0x56, 0xc1, 0x15, 0xf6, 0x7b, 0x57, 0x41, 0x1d, 0x18, 0xcf, 0x2b, 0x9e, 0x41, 0x13, 0x4f, +/*4800:*/ 0x1e, 0x25, 0x48, 0x6f, 0x1d, 0x4e, 0x9a, 0xf9, 0xc2, 0xe9, 0x54, 0xdd, 0xf1, 0x7b, 0x53, 0x70, +/*4810:*/ 0x06, 0x08, 0xbb, 0x94, 0xc1, 0xb0, 0x7b, 0x75, 0x7d, 0x48, 0x10, 0xf3, 0xa0, 0x7c, 0xf1, 0x35, +/*4820:*/ 0x27, 0x5e, 0x40, 0x4e, 0x6f, 0xbf, 0x35, 0x4c, 0xb3, 0x8d, 0x5d, 0x43, 0x84, 0xc2, 0x44, 0x51, +/*4830:*/ 0x5c, 0x7b, 0xa8, 0xa8, 0xa1, 0xdf, 0xf8, 0x40, 0xe5, 0xd5, 0xef, 0x28, 0x7e, 0x96, 0x5d, 0xc0, +/*4840:*/ 0x3f, 0xf7, 0xc1, 0x1d, 0x94, 0x46, 0xe3, 0x3a, 0x51, 0xa4, 0x5d, 0x74, 0x6d, 0xa9, 0x3f, 0xe6, +/*4850:*/ 0xaf, 0xf1, 0xc4, 0x9c, 0xf7, 0x8d, 0x52, 0xb2, 0x99, 0xe8, 0xef, 0xa4, 0xbd, 0xda, 0xe1, 0xfd, +/*4860:*/ 0xa0, 0xbf, 0x59, 0xa5, 0x62, 0x0a, 0x6f, 0xb6, 0x6f, 0xdd, 0x5b, 0x0a, 0xf2, 0xfa, 0xf7, 0xf9, +/*4870:*/ 0xac, 0x1b, 0x4e, 0x5f, 0xc8, 0x5a, 0x00, 0x0d, 0x45, 0x07, 0x1f, 0xc4, 0xc8, 0x24, 0x11, 0xc0, +/*4880:*/ 0x88, 0x09, 0x21, 0xc7, 0x9d, 0xb2, 0x7e, 0x9f, 0xf1, 0x2a, 0xd0, 0x7c, 0xc7, 0xa5, 0xee, 0xa9, +/*4890:*/ 0x9d, 0x93, 0x3b, 0x74, 0x24, 0xb5, 0xa6, 0x9e, 0xe9, 0x0a, 0x6b, 0xf9, 0xe0, 0x39, 0xfe, 0x71, +/*48a0:*/ 0xa2, 0xc5, 0x30, 0xe7, 0x04, 0x43, 0x9a, 0x08, 0xf8, 0xe0, 0xe1, 0xe6, 0xb7, 0x02, 0x03, 0x98, +/*48b0:*/ 0xef, 0xf5, 0xea, 0x2f, 0x30, 0x04, 0xd8, 0xbc, 0xd8, 0xac, 0x90, 0xe9, 0x3e, 0xa7, 0x84, 0x35, +/*48c0:*/ 0x8e, 0xef, 0x4f, 0x16, 0x69, 0x35, 0xa5, 0x42, 0xfb, 0x7d, 0x0e, 0x90, 0xd3, 0x5a, 0x13, 0x7e, +/*48d0:*/ 0x7d, 0xd5, 0xe8, 0x53, 0x6e, 0x85, 0x86, 0x48, 0xd7, 0xcc, 0x8c, 0x7d, 0x71, 0x40, 0xec, 0x8c, +/*48e0:*/ 0x70, 0x66, 0x01, 0xce, 0xfb, 0xb3, 0x7e, 0xd0, 0xd3, 0xda, 0x77, 0x97, 0xd4, 0x48, 0x69, 0x59, +/*48f0:*/ 0x77, 0x10, 0xce, 0xf8, 0x07, 0x1f, 0x26, 0x14, 0x55, 0xf0, 0xee, 0x7b, 0x8e, 0x15, 0xdf, 0x5c, +/*4900:*/ 0x42, 0x0f, 0xf7, 0x20, 0x6a, 0x1d, 0x6f, 0x01, 0x95, 0x9a, 0x0e, 0xaf, 0xf1, 0x4e, 0x59, 0x56, +/*4910:*/ 0x18, 0xf1, 0x60, 0x3c, 0x17, 0xc5, 0xaf, 0x5f, 0x47, 0x27, 0x72, 0x5f, 0x4c, 0xf1, 0x2c, 0x81, +/*4920:*/ 0xe3, 0x2d, 0x63, 0xcf, 0x30, 0xc2, 0xa5, 0xcd, 0xa1, 0xcb, 0x2a, 0x6e, 0xc0, 0x4c, 0x65, 0xc2, +/*4930:*/ 0x5c, 0x36, 0x33, 0xbe, 0x41, 0x1e, 0xec, 0xf3, 0x19, 0x89, 0x22, 0x51, 0xe0, 0x65, 0x5b, 0x4f, +/*4940:*/ 0x2d, 0xac, 0x5b, 0x12, 0x11, 0x9c, 0x9c, 0x59, 0x51, 0x5d, 0x85, 0x21, 0x7d, 0xd7, 0x0d, 0xe2, +/*4950:*/ 0x2b, 0x01, 0x73, 0x5d, 0xf3, 0xed, 0x12, 0x62, 0xca, 0xe4, 0xe6, 0xe4, 0x73, 0xb5, 0x33, 0x2f, +/*4960:*/ 0x1f, 0xa4, 0x8a, 0x19, 0xea, 0x9b, 0x56, 0x08, 0x51, 0x29, 0x15, 0x8f, 0x4a, 0xe6, 0xdd, 0xc7, +/*4970:*/ 0xc3, 0x9f, 0x03, 0x1f, 0xbb, 0xef, 0x6a, 0x5e, 0xe0, 0x16, 0x62, 0xa7, 0xc7, 0x1a, 0xc8, 0xf0, +/*4980:*/ 0xe8, 0xb6, 0xc4, 0x76, 0xfc, 0xe1, 0x93, 0x67, 0x83, 0x15, 0xbd, 0x67, 0x29, 0x8d, 0x5b, 0x80, +/*4990:*/ 0xd8, 0x07, 0x42, 0x83, 0x4a, 0xe6, 0x5f, 0xf5, 0xb8, 0x8c, 0x2b, 0xd7, 0x80, 0xe0, 0x34, 0xd6, +/*49a0:*/ 0xe6, 0x4e, 0x31, 0xfa, 0x96, 0x87, 0xb5, 0xd7, 0x44, 0x08, 0xea, 0xf2, 0xd1, 0xc8, 0xd6, 0x83, +/*49b0:*/ 0xab, 0x4a, 0x7a, 0x6e, 0x7c, 0x27, 0x04, 0x85, 0x9f, 0x24, 0x8f, 0x93, 0xf8, 0x96, 0x74, 0x79, +/*49c0:*/ 0x5c, 0xc8, 0xf8, 0xd2, 0x96, 0x7e, 0x84, 0x73, 0x18, 0x62, 0x00, 0x00, 0x9e, 0x27, 0x3d, 0x64, +/*49d0:*/ 0x12, 0x38, 0x5f, 0x09, 0x7c, 0xf5, 0xfd, 0x2a, 0x5c, 0xc3, 0x69, 0xb9, 0x6f, 0x87, 0x07, 0xc9, +/*49e0:*/ 0xe1, 0x0b, 0x2d, 0x91, 0x7e, 0xe5, 0x2e, 0xbf, 0xe1, 0xc6, 0x35, 0x57, 0xe1, 0x5a, 0x5a, 0xe0, +/*49f0:*/ 0x1c, 0xc9, 0xb5, 0x82, 0xe2, 0xa1, 0x6b, 0x53, 0x34, 0xd0, 0x3a, 0xd8, 0xde, 0x95, 0x0a, 0x27, +/*4a00:*/ 0x0e, 0x2b, 0x8e, 0x06, 0x56, 0xe1, 0x67, 0x21, 0xbf, 0xe5, 0x09, 0xf0, 0xc3, 0xd9, 0x8d, 0x1e, +/*4a10:*/ 0x35, 0x2a, 0x09, 0xe9, 0xce, 0x1d, 0x0b, 0xde, 0x3b, 0xf1, 0xab, 0xbf, 0xf2, 0x5f, 0xc6, 0x63, +/*4a20:*/ 0xa0, 0x3e, 0x87, 0x05, 0x79, 0x0d, 0x53, 0xd4, 0x96, 0xa0, 0xc4, 0x24, 0x83, 0xaa, 0xdb, 0x0a, +/*4a30:*/ 0x17, 0x77, 0x51, 0xf1, 0xbb, 0xa8, 0x9a, 0xc0, 0x4c, 0xb5, 0x3b, 0x30, 0xea, 0x39, 0x1b, 0xbc, +/*4a40:*/ 0x07, 0x73, 0x8d, 0x9c, 0x2c, 0xdf, 0x55, 0x21, 0xbc, 0xb3, 0x7b, 0x1e, 0x52, 0x97, 0xb3, 0xae, +/*4a50:*/ 0x0d, 0x18, 0x9e, 0xb2, 0x42, 0x06, 0x6e, 0x88, 0xff, 0xb2, 0x01, 0xe0, 0x89, 0x79, 0x96, 0xec, +/*4a60:*/ 0x1e, 0x57, 0xeb, 0x75, 0xc0, 0xbe, 0xac, 0x72, 0xf1, 0x62, 0xe5, 0xcb, 0x4e, 0xd9, 0x7a, 0xfb, +/*4a70:*/ 0xa1, 0x8d, 0x1d, 0x1d, 0x98, 0x75, 0xb6, 0xe2, 0x19, 0x01, 0x2d, 0xbb, 0x82, 0xb2, 0x6a, 0x4e, +/*4a80:*/ 0x83, 0x40, 0xff, 0x37, 0xc1, 0x73, 0x7f, 0x57, 0xc4, 0xe2, 0xca, 0xc0, 0x46, 0xd5, 0x31, 0xf6, +/*4a90:*/ 0x60, 0x52, 0x18, 0xbb, 0x42, 0x0c, 0xb4, 0x01, 0x50, 0xa3, 0xd5, 0x3a, 0x64, 0xac, 0x96, 0xdf, +/*4aa0:*/ 0xce, 0x3e, 0xa8, 0xa5, 0xaf, 0xae, 0x73, 0x76, 0x10, 0x16, 0x9f, 0xdb, 0xf2, 0xf5, 0x07, 0xdc, +/*4ab0:*/ 0xc2, 0x93, 0x80, 0x84, 0xcd, 0xfc, 0xb5, 0xab, 0x69, 0x98, 0x50, 0x0f, 0x4d, 0x94, 0x1c, 0x95, +/*4ac0:*/ 0x29, 0xa5, 0x51, 0xba, 0x25, 0x27, 0x4f, 0x3a, 0xc0, 0xa2, 0x0c, 0xd6, 0x01, 0x73, 0x4f, 0xf8, +/*4ad0:*/ 0x2f, 0x0c, 0x01, 0x68, 0x9a, 0x25, 0x8f, 0xf4, 0x43, 0x60, 0xbf, 0x30, 0x60, 0x06, 0xbb, 0x4c, +/*4ae0:*/ 0x7a, 0x8a, 0x8d, 0x82, 0x8a, 0x47, 0xe4, 0xf6, 0x31, 0xa1, 0x9e, 0x41, 0x26, 0xcf, 0x3c, 0x78, +/*4af0:*/ 0xa5, 0x24, 0xe4, 0xfd, 0xb0, 0xda, 0x33, 0xcb, 0x05, 0x3e, 0x4e, 0x3a, 0xe8, 0xeb, 0x49, 0x37, +/*4b00:*/ 0xca, 0x6e, 0xab, 0x9b, 0x44, 0x3f, 0x74, 0xfb, 0x75, 0xf8, 0x40, 0xac, 0x11, 0x44, 0xad, 0x27, +/*4b10:*/ 0x4e, 0xb0, 0x37, 0x92, 0xcb, 0xd5, 0x29, 0x5a, 0x9a, 0xe1, 0x73, 0x83, 0xdc, 0xaa, 0xad, 0x6f, +/*4b20:*/ 0xd9, 0xbc, 0x43, 0xe0, 0x91, 0xdd, 0x98, 0x14, 0x9c, 0x19, 0x03, 0x55, 0xc5, 0xa2, 0x08, 0xd6, +/*4b30:*/ 0x1e, 0x05, 0x97, 0xc6, 0x63, 0xca, 0x47, 0x01, 0xd3, 0x99, 0x12, 0xb7, 0xbc, 0x6a, 0x27, 0x51, +/*4b40:*/ 0xe0, 0x34, 0x66, 0x4e, 0x73, 0xed, 0xd6, 0x2a, 0xe3, 0xc2, 0xe9, 0x26, 0x04, 0xc3, 0x3c, 0xae, +/*4b50:*/ 0xde, 0x56, 0xc1, 0x80, 0xd1, 0x19, 0xce, 0x2d, 0x8d, 0xcf, 0x82, 0xea, 0x0d, 0x18, 0xa3, 0x13, +/*4b60:*/ 0x92, 0x35, 0x4d, 0xa5, 0x3a, 0x2e, 0x49, 0xc1, 0xda, 0x8e, 0x04, 0x39, 0x50, 0x6b, 0xe9, 0xc9, +/*4b70:*/ 0x65, 0x87, 0x25, 0x3f, 0xc7, 0x6c, 0xb2, 0xf6, 0x34, 0x90, 0x34, 0x69, 0x17, 0xd1, 0xcf, 0x4e, +/*4b80:*/ 0x3c, 0x6f, 0x82, 0x30, 0x0a, 0x6e, 0x41, 0x30, 0xfd, 0x9f, 0x6f, 0x40, 0x72, 0xf5, 0xba, 0xe5, +/*4b90:*/ 0x12, 0x4a, 0x7a, 0xbf, 0xf2, 0x8d, 0xd8, 0x46, 0xd1, 0xd4, 0x60, 0x32, 0x80, 0x90, 0x5a, 0x1a, +/*4ba0:*/ 0x34, 0x28, 0xda, 0x84, 0x6b, 0x77, 0x32, 0x5b, 0x25, 0xff, 0xbc, 0x74, 0x91, 0x66, 0x53, 0xd5, +/*4bb0:*/ 0x41, 0x10, 0x34, 0x71, 0x21, 0x7f, 0x66, 0x0c, 0x91, 0x8d, 0x27, 0xc6, 0x10, 0x8b, 0x9d, 0x85, +/*4bc0:*/ 0x38, 0xfe, 0xb2, 0x74, 0x04, 0x6d, 0x2c, 0x58, 0xee, 0xc1, 0x97, 0xc7, 0xca, 0xb5, 0x39, 0x6f, +/*4bd0:*/ 0x76, 0x91, 0x59, 0x45, 0x31, 0x61, 0x5b, 0x7f, 0x44, 0xf3, 0x7d, 0x2a, 0x4d, 0x5c, 0x1d, 0x9d, +/*4be0:*/ 0xc8, 0x9e, 0xb5, 0x8d, 0x13, 0xc5, 0xdf, 0x0c, 0x7d, 0xb6, 0xea, 0x18, 0xf7, 0x5d, 0xf8, 0xca, +/*4bf0:*/ 0x7b, 0x0d, 0xdd, 0x31, 0xbd, 0xc3, 0x9d, 0x35, 0x41, 0xee, 0x97, 0x4e, 0x4c, 0xf5, 0xb3, 0x4e, +/*4c00:*/ 0xfa, 0x16, 0xe3, 0x8b, 0x5c, 0x90, 0x28, 0xff, 0x9e, 0x36, 0x20, 0xa5, 0xf7, 0x62, 0x33, 0x1a, +/*4c10:*/ 0xb0, 0x6b, 0x37, 0x33, 0xe2, 0x6d, 0x90, 0x86, 0x84, 0x85, 0x81, 0x00, 0x02, 0xab, 0xa4, 0x3b, +/*4c20:*/ 0x85, 0x8d, 0x0e, 0x13, 0x6d, 0xdb, 0xa1, 0xb0, 0xaf, 0x0f, 0x31, 0xcb, 0x6d, 0x01, 0x69, 0xbe, +/*4c30:*/ 0x95, 0xce, 0x47, 0x53, 0x51, 0x5f, 0x79, 0x70, 0x59, 0xf7, 0x3d, 0x9e, 0x05, 0x82, 0xdd, 0xec, +/*4c40:*/ 0x6a, 0x54, 0x58, 0x85, 0xce, 0x49, 0xe4, 0xaa, 0x68, 0x61, 0xe4, 0x4d, 0x24, 0xea, 0xc5, 0xa4, +/*4c50:*/ 0x45, 0x83, 0xbf, 0x63, 0x03, 0x56, 0x6e, 0xfb, 0x8a, 0x26, 0x23, 0xea, 0x88, 0x71, 0x32, 0x10, +/*4c60:*/ 0x1e, 0x2a, 0x9f, 0xa4, 0x41, 0x01, 0x3c, 0xeb, 0x9e, 0x1d, 0xe6, 0xba, 0xed, 0xa7, 0xfe, 0xc2, +/*4c70:*/ 0xaf, 0x67, 0x41, 0x1d, 0xff, 0x91, 0x0d, 0x41, 0x8b, 0xe1, 0x0e, 0x1e, 0xb2, 0xae, 0x14, 0x66, +/*4c80:*/ 0xb4, 0xa2, 0x4d, 0x2c, 0x6c, 0xaf, 0xde, 0x06, 0xa4, 0x1c, 0xb8, 0x84, 0xee, 0xeb, 0x7b, 0x95, +/*4c90:*/ 0x12, 0xf7, 0x07, 0xb4, 0x00, 0x1e, 0x1f, 0x57, 0xa6, 0x28, 0x5b, 0xd9, 0xa8, 0x4a, 0xb8, 0x15, +/*4ca0:*/ 0x6d, 0x99, 0x4c, 0x25, 0x4c, 0x9d, 0xa6, 0x07, 0x00, 0x85, 0xf1, 0x42, 0x0b, 0x05, 0xb8, 0xa5, +/*4cb0:*/ 0xd4, 0x08, 0xde, 0xec, 0xd5, 0x78, 0xef, 0x56, 0xb8, 0x13, 0xa9, 0x0f, 0x8d, 0x0b, 0x7e, 0x40, +/*4cc0:*/ 0xb0, 0x2a, 0x3f, 0x19, 0xaf, 0xa9, 0x51, 0x43, 0x3c, 0x5a, 0xb7, 0xbc, 0xff, 0xee, 0xeb, 0xe6, +/*4cd0:*/ 0x11, 0x7c, 0x4b, 0x36, 0x76, 0x74, 0xdb, 0x63, 0xd7, 0xc7, 0x2b, 0xbe, 0xc9, 0xcc, 0xc7, 0x94, +/*4ce0:*/ 0x06, 0x6f, 0xc6, 0xd4, 0x49, 0xdb, 0x14, 0x85, 0xf8, 0x79, 0xfa, 0x7a, 0x73, 0x25, 0x59, 0xea, +/*4cf0:*/ 0x89, 0x68, 0xfc, 0x4c, 0xac, 0xa6, 0xe9, 0x70, 0x9d, 0x8b, 0xf2, 0x05, 0x51, 0x1a, 0xf6, 0xce, +/*4d00:*/ 0xc4, 0xf6, 0x33, 0x57, 0x2e, 0xe5, 0x8c, 0xff, 0x1e, 0x4f, 0xd2, 0x2b, 0x33, 0x5a, 0x74, 0xc4, +/*4d10:*/ 0x06, 0xe9, 0x27, 0x9e, 0x28, 0x7e, 0x58, 0x4a, 0x55, 0x39, 0x2b, 0x9f, 0x4f, 0x68, 0x34, 0x5c, +/*4d20:*/ 0x44, 0xa2, 0x25, 0x47, 0x7a, 0x54, 0x29, 0x82, 0x2a, 0xb1, 0xa6, 0x02, 0xd8, 0x49, 0xfc, 0x0c, +/*4d30:*/ 0xf8, 0x0b, 0xba, 0xc6, 0x83, 0x9b, 0x9b, 0xc3, 0xe3, 0x99, 0x3e, 0x87, 0x96, 0x4f, 0x22, 0x2c, +/*4d40:*/ 0x82, 0x95, 0xce, 0x03, 0xa7, 0xf0, 0x27, 0x43, 0x42, 0x38, 0x4d, 0xe3, 0x14, 0x70, 0x2b, 0x4f, +/*4d50:*/ 0x18, 0x2d, 0x8c, 0x63, 0x9e, 0x32, 0x05, 0x57, 0xcd, 0x32, 0x5e, 0x5c, 0x09, 0x6d, 0x81, 0x6b, +/*4d60:*/ 0xab, 0x58, 0xda, 0x16, 0x03, 0x2a, 0xa8, 0x54, 0xe8, 0x4d, 0x45, 0xf3, 0x10, 0x55, 0x88, 0x6e, +/*4d70:*/ 0x0b, 0xf3, 0x99, 0x73, 0x0d, 0x60, 0x1a, 0xed, 0xfc, 0xbf, 0xa8, 0x5c, 0x53, 0x5c, 0xd8, 0x44, +/*4d80:*/ 0x9a, 0xc5, 0x4f, 0xcb, 0x44, 0xaf, 0xdc, 0x80, 0x78, 0x2a, 0x28, 0x64, 0x13, 0xa2, 0xcf, 0x77, +/*4d90:*/ 0x30, 0x1e, 0x42, 0x3f, 0xad, 0x9b, 0xe2, 0x56, 0xb9, 0xa9, 0xbb, 0x47, 0xde, 0xbb, 0xe3, 0x5b, +/*4da0:*/ 0xe4, 0xfc, 0xd4, 0xe7, 0x9f, 0x29, 0x5d, 0x8a, 0x5d, 0x9d, 0x81, 0x2b, 0x0f, 0x7c, 0x73, 0x1c, +/*4db0:*/ 0x25, 0x10, 0x27, 0xd6, 0x6d, 0x32, 0x18, 0xf2, 0xfa, 0xca, 0x09, 0x04, 0xb6, 0x34, 0x37, 0x27, +/*4dc0:*/ 0x42, 0x51, 0xca, 0x5e, 0xb1, 0xb6, 0x26, 0x98, 0xa4, 0x74, 0xa8, 0xb5, 0x7f, 0xf6, 0xec, 0xb1, +/*4dd0:*/ 0x05, 0x15, 0x68, 0x27, 0xf0, 0xf8, 0x4b, 0xfc, 0x45, 0xaa, 0xca, 0x2c, 0xd0, 0x47, 0x96, 0x58, +/*4de0:*/ 0x22, 0xd5, 0x06, 0x98, 0xde, 0x7d, 0x2d, 0x71, 0xf9, 0x0f, 0x04, 0x50, 0x16, 0x81, 0x1d, 0x83, +/*4df0:*/ 0xd6, 0x6b, 0x75, 0xa7, 0x72, 0x6a, 0xf3, 0xc3, 0x0f, 0x01, 0xf0, 0xa6, 0x0e, 0x6a, 0xba, 0x3d, +/*4e00:*/ 0x59, 0x5f, 0x9e, 0xd8, 0xf4, 0x9f, 0x97, 0x15, 0xa3, 0xee, 0x3a, 0xda, 0xac, 0x9e, 0x56, 0x94, +/*4e10:*/ 0x13, 0x4d, 0x82, 0xdb, 0x70, 0x6f, 0xac, 0x8a, 0x81, 0x18, 0x1b, 0xb5, 0x78, 0xd9, 0xce, 0x7f, +/*4e20:*/ 0xb0, 0xd8, 0xfe, 0x78, 0x66, 0x84, 0x68, 0x90, 0xe8, 0x6e, 0xaa, 0xe4, 0xd8, 0xd4, 0x10, 0x09, +/*4e30:*/ 0x20, 0xeb, 0xaf, 0xe1, 0x1a, 0x10, 0xcd, 0xc6, 0x50, 0xe0, 0x78, 0x38, 0x98, 0x87, 0x37, 0xf3, +/*4e40:*/ 0x7e, 0x66, 0x65, 0x0b, 0xa6, 0xc0, 0xb1, 0x9c, 0x74, 0xad, 0x12, 0x8f, 0x9c, 0x02, 0xbf, 0xbf, +/*4e50:*/ 0xf4, 0xb9, 0xb8, 0xb8, 0x64, 0x4e, 0x64, 0xe0, 0x36, 0x64, 0xac, 0xa9, 0x9f, 0xa0, 0xe4, 0xe7, +/*4e60:*/ 0x44, 0x35, 0xce, 0x91, 0x32, 0xfd, 0x16, 0x20, 0x44, 0x55, 0xb4, 0xb8, 0x0d, 0x25, 0xc2, 0xc5, +/*4e70:*/ 0x89, 0x3d, 0x58, 0xe5, 0x51, 0x8d, 0x50, 0x33, 0x56, 0xc4, 0xc8, 0xea, 0x72, 0x37, 0x1e, 0x15, +/*4e80:*/ 0x32, 0x9d, 0x26, 0x8a, 0x86, 0x8d, 0x6b, 0x64, 0x2d, 0x7a, 0x5c, 0xa3, 0x51, 0x4c, 0xbb, 0x3a, +/*4e90:*/ 0x03, 0x42, 0x5d, 0x50, 0x35, 0x5e, 0x31, 0x5d, 0xed, 0xbe, 0xb8, 0xd5, 0x26, 0xc1, 0x9e, 0x29, +/*4ea0:*/ 0xd2, 0x3d, 0x9a, 0x3a, 0x79, 0x58, 0x15, 0xde, 0x82, 0xdf, 0x79, 0xe6, 0xd9, 0x91, 0xa9, 0x63, +/*4eb0:*/ 0x81, 0xb5, 0xee, 0x01, 0xe6, 0xcd, 0x6c, 0xbc, 0x4c, 0xc6, 0x68, 0xff, 0xe8, 0x96, 0xbc, 0xc4, +/*4ec0:*/ 0x60, 0x0d, 0x71, 0x98, 0xa7, 0x5f, 0x96, 0x5e, 0xac, 0x27, 0x0b, 0x99, 0x9d, 0x07, 0x41, 0x31, +/*4ed0:*/ 0x99, 0xae, 0x9e, 0xeb, 0x59, 0xf6, 0xb3, 0x82, 0x58, 0x80, 0x10, 0xd0, 0xd2, 0xb6, 0x55, 0x79, +/*4ee0:*/ 0x09, 0xe0, 0x04, 0x34, 0x1e, 0x97, 0x0f, 0x47, 0x74, 0x99, 0xde, 0xac, 0xc2, 0x08, 0xb1, 0x5b, +/*4ef0:*/ 0xcb, 0xd4, 0x85, 0x3f, 0x32, 0x3a, 0x52, 0x8e, 0xae, 0x45, 0x21, 0x12, 0xf0, 0x45, 0x49, 0x7a, +/*4f00:*/ 0x05, 0x44, 0xe8, 0xc2, 0xc4, 0x7f, 0x28, 0xc9, 0x1d, 0x83, 0x8c, 0x89, 0x84, 0x47, 0x9c, 0x0d, +/*4f10:*/ 0x8c, 0xd4, 0x16, 0xad, 0xfd, 0x1e, 0x3b, 0xa8, 0xb3, 0xa4, 0x25, 0xfe, 0xa8, 0xe7, 0x93, 0x7e, +/*4f20:*/ 0x7d, 0x1c, 0x2b, 0xd0, 0xd4, 0x34, 0xd6, 0xcd, 0x6a, 0x2b, 0xff, 0xe4, 0x23, 0x8b, 0x29, 0xd4, +/*4f30:*/ 0xda, 0xed, 0xa2, 0xb4, 0x68, 0xe8, 0x55, 0xa5, 0xbd, 0xc1, 0x5c, 0xaa, 0x26, 0xa9, 0x6b, 0x61, +/*4f40:*/ 0x9f, 0x6b, 0x16, 0x95, 0xe2, 0x69, 0x5a, 0x11, 0x53, 0x41, 0x94, 0x56, 0xfc, 0x07, 0x67, 0x64, +/*4f50:*/ 0x54, 0x37, 0x16, 0x67, 0xac, 0x81, 0x2d, 0x47, 0x3d, 0x12, 0x87, 0x31, 0x16, 0xe9, 0x4b, 0x80, +/*4f60:*/ 0x81, 0x08, 0x49, 0xde, 0xbd, 0x89, 0x82, 0xe7, 0x6a, 0x40, 0x4e, 0x25, 0x5f, 0x1a, 0xe0, 0x0d, +/*4f70:*/ 0x76, 0xc1, 0xdc, 0x33, 0x46, 0xef, 0x2d, 0xe9, 0x9a, 0x71, 0x65, 0xa0, 0x40, 0x9a, 0x4d, 0xb1, +/*4f80:*/ 0x75, 0x8d, 0x70, 0xe2, 0x06, 0xc6, 0xa8, 0x35, 0x22, 0x3c, 0x05, 0xcd, 0x08, 0x60, 0xf2, 0x06, +/*4f90:*/ 0xaf, 0xc9, 0xa6, 0x3d, 0x0b, 0xa1, 0x33, 0x07, 0x41, 0x35, 0x11, 0xf7, 0x0c, 0x49, 0x62, 0x96, +/*4fa0:*/ 0xa5, 0x98, 0x0d, 0x00, 0x87, 0xb9, 0xdc, 0xb2, 0x19, 0x08, 0xf4, 0xce, 0x2c, 0x71, 0x77, 0x1a, +/*4fb0:*/ 0x88, 0x82, 0xde, 0xe7, 0x66, 0x0e, 0x41, 0xb6, 0xfa, 0x1e, 0xa1, 0xda, 0x0f, 0x53, 0x3d, 0x99, +/*4fc0:*/ 0x5c, 0x67, 0x0d, 0x22, 0x21, 0xbe, 0x80, 0x9b, 0xfe, 0xfa, 0x49, 0x13, 0x24, 0x7e, 0x32, 0x3e, +/*4fd0:*/ 0x69, 0xfa, 0xee, 0x55, 0x7c, 0xc1, 0x35, 0x83, 0x46, 0x38, 0xe8, 0x27, 0xb3, 0x30, 0xbc, 0x07, +/*4fe0:*/ 0x5c, 0x6d, 0xd2, 0x19, 0x83, 0xff, 0xe0, 0xf2, 0x67, 0xbf, 0x64, 0xad, 0xe9, 0x99, 0x60, 0xbb, +/*4ff0:*/ 0x52, 0xdf, 0x0b, 0x94, 0x74, 0x53, 0x6d, 0x6b, 0x35, 0xad, 0xdd, 0xbd, 0xe7, 0x3f, 0x89, 0x4b, +/*5000:*/ 0x6c, 0x89, 0xa2, 0x5f, 0x01, 0x5f, 0x40, 0x57, 0x78, 0xeb, 0x5e, 0x34, 0x18, 0xf8, 0xc4, 0x1f, +/*5010:*/ 0x35, 0x80, 0xa3, 0xf0, 0x05, 0x93, 0x17, 0xc6, 0x16, 0x3f, 0x10, 0x14, 0x2f, 0x2c, 0x05, 0xb8, +/*5020:*/ 0xe4, 0x7a, 0xc5, 0xb7, 0x1d, 0x09, 0x67, 0x99, 0xa6, 0x5c, 0xe5, 0xc1, 0xb0, 0x9d, 0xa2, 0x4f, +/*5030:*/ 0x07, 0x4f, 0x01, 0xd9, 0x7e, 0xa2, 0x69, 0x52, 0xb5, 0xe1, 0x20, 0xf5, 0x0b, 0xad, 0xef, 0x50, +/*5040:*/ 0x5e, 0x0b, 0xc7, 0x7d, 0x4e, 0x75, 0x5e, 0x06, 0x2b, 0x6c, 0x7c, 0x32, 0x26, 0xa2, 0x12, 0xa8, +/*5050:*/ 0x91, 0xda, 0x43, 0x23, 0x35, 0x86, 0xc9, 0x1c, 0xc8, 0xab, 0x64, 0x95, 0xaf, 0x0e, 0xda, 0x7a, +/*5060:*/ 0xd2, 0x5d, 0x14, 0xe3, 0x9e, 0xdf, 0x64, 0xa4, 0x3c, 0x1c, 0x51, 0x09, 0x76, 0x35, 0xe9, 0xf0, +/*5070:*/ 0xf2, 0xf6, 0xc0, 0x35, 0xe5, 0xff, 0xf3, 0x31, 0x3d, 0x0a, 0x15, 0x62, 0x51, 0x0b, 0xc6, 0xad, +/*5080:*/ 0xf6, 0x2a, 0x10, 0xf2, 0x0a, 0x9f, 0x86, 0xef, 0x0d, 0x3b, 0x97, 0xb2, 0x10, 0x5a, 0xb6, 0xc7, +/*5090:*/ 0x90, 0xaa, 0x1c, 0xde, 0xcf, 0x45, 0xb6, 0x76, 0x1f, 0xe1, 0x1a, 0x23, 0x3f, 0x9d, 0x2d, 0x5f, +/*50a0:*/ 0xa4, 0x32, 0x88, 0xb3, 0x4f, 0x90, 0x60, 0x1e, 0xdf, 0x3c, 0xe5, 0xb7, 0x7a, 0xc3, 0x85, 0x4f, +/*50b0:*/ 0x5c, 0x48, 0x48, 0x3d, 0x1d, 0xc2, 0x39, 0xe6, 0xfd, 0xbf, 0x65, 0x07, 0xc1, 0x7a, 0xb3, 0x14, +/*50c0:*/ 0x40, 0xdb, 0x42, 0xc8, 0x86, 0xcc, 0x0b, 0xd3, 0xdd, 0xc9, 0x63, 0xc2, 0x1a, 0xfa, 0xd6, 0x03, +/*50d0:*/ 0x37, 0xaf, 0xa6, 0x52, 0xc8, 0x7b, 0x40, 0x87, 0xf8, 0x6d, 0xa1, 0x5e, 0x0d, 0x1a, 0x2a, 0x4d, +/*50e0:*/ 0xb7, 0x63, 0xed, 0x2e, 0xaf, 0xe6, 0x0c, 0xd5, 0xbf, 0x78, 0xf6, 0x25, 0xc0, 0xf6, 0x08, 0x27, +/*50f0:*/ 0x98, 0x58, 0x91, 0x67, 0x8d, 0x8d, 0x0b, 0x1c, 0x45, 0xbb, 0xb3, 0x6e, 0xc7, 0xad, 0xb3, 0xd8, +/*5100:*/ 0x1a, 0x8f, 0x15, 0xf2, 0xcd, 0xd0, 0x6d, 0xb7, 0x95, 0x13, 0xc5, 0xf9, 0x9f, 0x2b, 0x01, 0xbd, +/*5110:*/ 0x28, 0x97, 0xf6, 0x7b, 0x37, 0xca, 0xcf, 0x0e, 0xc5, 0x48, 0x4d, 0x47, 0x04, 0x04, 0x72, 0x8d, +/*5120:*/ 0xa0, 0xd1, 0x33, 0x37, 0x14, 0x0e, 0x83, 0x0c, 0xa4, 0xda, 0xe4, 0xd0, 0x3b, 0x4b, 0xa1, 0x14, +/*5130:*/ 0x24, 0xfe, 0xf1, 0x81, 0xb9, 0x61, 0x2f, 0xd2, 0x6c, 0x5f, 0x7c, 0xc1, 0x8e, 0x6d, 0xa5, 0xf1, +/*5140:*/ 0x3b, 0x9d, 0xf0, 0x7d, 0xd1, 0xe9, 0x75, 0xd3, 0xbc, 0x87, 0x89, 0x11, 0x49, 0x15, 0xb2, 0xf9, +/*5150:*/ 0x65, 0xb1, 0x67, 0x15, 0xe1, 0x14, 0xc0, 0x67, 0xfd, 0x39, 0xe5, 0x49, 0xdf, 0x8b, 0x52, 0x07, +/*5160:*/ 0x23, 0xcf, 0x89, 0xf6, 0x71, 0x18, 0x28, 0x46, 0x92, 0x96, 0x00, 0xc0, 0x60, 0x0c, 0xdd, 0xf5, +/*5170:*/ 0x66, 0x7d, 0x1b, 0xc4, 0xd8, 0x98, 0xf4, 0x58, 0xa9, 0x3b, 0xdf, 0x4a, 0xe3, 0xe2, 0xe4, 0x01, +/*5180:*/ 0xb9, 0xa7, 0xde, 0xb5, 0x68, 0x1e, 0xe6, 0x1d, 0xc7, 0x63, 0xd5, 0x75, 0x6c, 0xfa, 0xcf, 0x41, +/*5190:*/ 0xd5, 0x5b, 0x72, 0x22, 0x8f, 0x87, 0x9e, 0x96, 0x00, 0x79, 0xbd, 0xb4, 0x14, 0xed, 0x60, 0x7e, +/*51a0:*/ 0xc1, 0xc8, 0xbe, 0xd6, 0xbf, 0x52, 0x38, 0x20, 0xcc, 0xa9, 0x08, 0xcc, 0x3c, 0x7a, 0xb0, 0xff, +/*51b0:*/ 0x89, 0xd7, 0x88, 0x20, 0x83, 0x68, 0x6a, 0xbf, 0x84, 0xa9, 0xe9, 0xd3, 0x2a, 0x92, 0xbc, 0x49, +/*51c0:*/ 0x50, 0xa5, 0x19, 0x3c, 0x8a, 0xf0, 0x87, 0xbf, 0x57, 0xff, 0x77, 0xe9, 0x53, 0x55, 0x0e, 0xcd, +/*51d0:*/ 0xe8, 0x00, 0xc5, 0xda, 0x4b, 0x96, 0x33, 0x9c, 0xbb, 0x3c, 0x1f, 0x40, 0x4f, 0xee, 0x1f, 0x16, +/*51e0:*/ 0xd3, 0x41, 0xc9, 0x8d, 0xf3, 0xb2, 0x66, 0x72, 0x58, 0xa9, 0x51, 0xb0, 0x9f, 0x49, 0x5c, 0xbe, +/*51f0:*/ 0x14, 0x7e, 0x58, 0x8a, 0xbb, 0x0d, 0x4a, 0x18, 0x2c, 0x87, 0x9b, 0x81, 0x3a, 0x11, 0x37, 0x71, +/*5200:*/ 0xdd, 0x93, 0xf5, 0xe1, 0xe9, 0x1b, 0x29, 0x72, 0x82, 0x96, 0x10, 0xb8, 0x2c, 0xd7, 0x82, 0x4b, +/*5210:*/ 0xee, 0x84, 0xdb, 0xfd, 0xea, 0x54, 0x29, 0x34, 0xdd, 0xb5, 0xb0, 0x53, 0xab, 0x0e, 0xb0, 0x2c, +/*5220:*/ 0xde, 0xea, 0x6f, 0x42, 0xdc, 0x6f, 0x3a, 0x35, 0x55, 0xda, 0xa1, 0xe1, 0xad, 0xca, 0xf7, 0xb6, +/*5230:*/ 0xfa, 0x2c, 0xdf, 0x51, 0x93, 0x81, 0xeb, 0x8e, 0x03, 0x50, 0x6b, 0x65, 0xb6, 0x97, 0x30, 0xe6, +/*5240:*/ 0x45, 0x0f, 0x7a, 0x16, 0xa1, 0x3e, 0x21, 0xd2, 0x3f, 0xe3, 0x72, 0x32, 0x02, 0xe3, 0x06, 0x8e, +/*5250:*/ 0x65, 0x30, 0xc2, 0xe5, 0x21, 0x4f, 0xbe, 0x6b, 0x66, 0xd4, 0xc4, 0xbe, 0x24, 0x86, 0x58, 0x49, +/*5260:*/ 0x1a, 0x47, 0x22, 0x0d, 0xbd, 0x0d, 0xd1, 0x8b, 0x52, 0x84, 0x9b, 0xa1, 0xd0, 0xca, 0x05, 0x95, +/*5270:*/ 0xa4, 0x6e, 0xe8, 0x77, 0x95, 0x1b, 0xe8, 0x65, 0x55, 0x6d, 0x9d, 0x7e, 0x0c, 0xac, 0x88, 0x41, +/*5280:*/ 0x87, 0x91, 0xf9, 0x7f, 0xc7, 0x30, 0x04, 0x23, 0x36, 0xeb, 0xfa, 0x21, 0xb5, 0xc9, 0xfb, 0x11, +/*5290:*/ 0x0a, 0x9a, 0xcc, 0x59, 0x73, 0xe5, 0x7e, 0xf6, 0x1f, 0x6e, 0x8e, 0xed, 0x2f, 0xae, 0x94, 0xcd, +/*52a0:*/ 0x47, 0x27, 0x65, 0x29, 0x47, 0x31, 0x64, 0x19, 0x4f, 0x8c, 0xe1, 0x7f, 0xd3, 0xef, 0x47, 0xa4, +/*52b0:*/ 0xe7, 0xa6, 0x94, 0x84, 0x61, 0xba, 0xb5, 0xeb, 0xa2, 0xb8, 0x7e, 0xfe, 0xa0, 0x1e, 0xf3, 0x04, +/*52c0:*/ 0xa8, 0xc1, 0x31, 0xab, 0xf9, 0x4e, 0x5d, 0xf3, 0x32, 0x17, 0x1e, 0x79, 0x6b, 0xe3, 0xc2, 0x26, +/*52d0:*/ 0xe5, 0x95, 0xc1, 0x31, 0x0a, 0x00, 0x5a, 0xa6, 0xf1, 0x0e, 0x4b, 0xd8, 0x46, 0x5a, 0x8f, 0xd7, +/*52e0:*/ 0xa3, 0xfb, 0x86, 0xdc, 0x30, 0x60, 0xae, 0x79, 0x32, 0xdc, 0xb0, 0xdd, 0xa9, 0x47, 0x50, 0x68, +/*52f0:*/ 0x2f, 0x38, 0x2f, 0x1c, 0x35, 0x4c, 0x11, 0x4b, 0xef, 0xe4, 0x82, 0xe8, 0xfb, 0x48, 0x11, 0xb5, +/*5300:*/ 0xf7, 0x74, 0xa5, 0x27, 0x23, 0x97, 0x75, 0xe1, 0x6d, 0x01, 0x1d, 0x13, 0x59, 0xd3, 0x1b, 0xaf, +/*5310:*/ 0x76, 0x87, 0x96, 0x8c, 0xb6, 0x7a, 0xa8, 0xdb, 0x33, 0x2f, 0xb4, 0xb6, 0xc0, 0x13, 0x22, 0x2b, +/*5320:*/ 0x07, 0x5f, 0x51, 0x79, 0xfd, 0x9b, 0xe7, 0xe2, 0x61, 0xa0, 0x07, 0xbb, 0x33, 0xba, 0x9a, 0xc1, +/*5330:*/ 0x4c, 0x42, 0xb5, 0xdf, 0x4a, 0xf7, 0xdc, 0x1d, 0x06, 0x31, 0x5c, 0x51, 0xca, 0x4d, 0xa9, 0xb7, +/*5340:*/ 0x8a, 0xa1, 0x64, 0xeb, 0x14, 0x48, 0x2f, 0x6b, 0xd4, 0x38, 0xde, 0x15, 0x54, 0x7d, 0xf7, 0x39, +/*5350:*/ 0x85, 0x96, 0x14, 0x75, 0xbb, 0x93, 0x0a, 0xb1, 0xf7, 0x89, 0xfc, 0x38, 0x2f, 0xf6, 0x99, 0x3c, +/*5360:*/ 0x2d, 0x19, 0xd8, 0x80, 0xb1, 0x9d, 0x0f, 0xdc, 0xce, 0x1d, 0x31, 0xde, 0x08, 0x7b, 0x85, 0xbe, +/*5370:*/ 0xa4, 0xa2, 0x23, 0x56, 0x09, 0xa5, 0xc3, 0x6e, 0x8b, 0x84, 0xc3, 0xe2, 0x81, 0xa9, 0x60, 0x17, +/*5380:*/ 0xf4, 0x91, 0x0d, 0x43, 0xcb, 0x99, 0x56, 0xf8, 0x3b, 0x76, 0x08, 0x77, 0x1d, 0x32, 0xa9, 0x8a, +/*5390:*/ 0x1f, 0x66, 0x3d, 0xbd, 0xeb, 0x2a, 0xdb, 0x30, 0xe7, 0xd2, 0x0f, 0x70, 0x63, 0xa3, 0x66, 0x89, +/*53a0:*/ 0x84, 0x1e, 0xf9, 0xa7, 0x4a, 0xcb, 0x34, 0xff, 0xf1, 0x13, 0x31, 0xd4, 0xb5, 0x86, 0xc9, 0x2f, +/*53b0:*/ 0xda, 0x2e, 0x6d, 0x0f, 0x0a, 0x3b, 0xe5, 0xe3, 0x16, 0x50, 0x41, 0x83, 0x05, 0xad, 0xec, 0x0c, +/*53c0:*/ 0x0f, 0x68, 0x57, 0x36, 0x9d, 0xde, 0x34, 0x6a, 0x4d, 0xb3, 0x6a, 0x35, 0x42, 0x9a, 0x8d, 0xa5, +/*53d0:*/ 0xa8, 0x8d, 0xf9, 0x1f, 0x2a, 0x20, 0x1b, 0xd1, 0xe0, 0xc2, 0xb7, 0x2e, 0xe0, 0x48, 0x90, 0x9c, +/*53e0:*/ 0x0e, 0x29, 0xe5, 0x21, 0x21, 0x3e, 0xd7, 0xa2, 0x9a, 0x5a, 0xa3, 0xdb, 0x5c, 0x78, 0xea, 0x1a, +/*53f0:*/ 0x09, 0xd5, 0x57, 0xa6, 0x55, 0xcd, 0x32, 0xc3, 0x02, 0x7e, 0xa4, 0x40, 0x6f, 0xb0, 0x71, 0xe0, +/*5400:*/ 0x0c, 0xd9, 0x3f, 0x2c, 0xed, 0xf8, 0xc4, 0x9c, 0x87, 0xf7, 0xd6, 0x45, 0xf1, 0x0a, 0xb6, 0xe2, +/*5410:*/ 0xea, 0x8f, 0x92, 0x1a, 0xb4, 0x01, 0x85, 0x49, 0x7c, 0xcb, 0xff, 0x06, 0xe1, 0x11, 0x40, 0x2a, +/*5420:*/ 0x7a, 0x94, 0x3b, 0x9c, 0x1b, 0x25, 0x86, 0x4b, 0x2d, 0x1f, 0xaf, 0x49, 0x29, 0xac, 0x3a, 0xbe, +/*5430:*/ 0x50, 0x89, 0x29, 0x78, 0x55, 0x68, 0x7b, 0x20, 0x2d, 0x68, 0x3c, 0x72, 0xfb, 0x2f, 0x0c, 0x2a, +/*5440:*/ 0x1f, 0x27, 0x8e, 0x68, 0xd9, 0xe6, 0xdf, 0xce, 0x87, 0xeb, 0x50, 0xda, 0xd0, 0x71, 0xbe, 0x42, +/*5450:*/ 0x2c, 0x71, 0x7d, 0x50, 0x5e, 0x93, 0x90, 0x81, 0xed, 0xdd, 0x55, 0x4c, 0x84, 0x93, 0x44, 0x11, +/*5460:*/ 0x72, 0x48, 0x53, 0xd1, 0x9f, 0x32, 0xb9, 0xce, 0xbc, 0x88, 0x3f, 0x2a, 0xce, 0xd9, 0xb6, 0xb6, +/*5470:*/ 0x94, 0xdb, 0x98, 0x13, 0xa5, 0xc9, 0xa7, 0x7e, 0x25, 0x26, 0x81, 0xfe, 0x4e, 0xd2, 0xb2, 0x81, +/*5480:*/ 0x88, 0xdf, 0xbd, 0x5a, 0xcb, 0xb5, 0x3b, 0x3b, 0x1b, 0xdd, 0x2e, 0xe4, 0x94, 0xe5, 0x40, 0xbc, +/*5490:*/ 0x23, 0x25, 0x38, 0x6d, 0x6d, 0xaf, 0x0f, 0xb2, 0x31, 0x6a, 0x74, 0x7d, 0x1a, 0x3c, 0x88, 0xf4, +/*54a0:*/ 0x43, 0xe6, 0xcd, 0x02, 0x89, 0x1f, 0x08, 0x83, 0x4f, 0x3b, 0xf7, 0x8c, 0x70, 0x21, 0x33, 0x9b, +/*54b0:*/ 0x8a, 0x76, 0x29, 0x14, 0x3f, 0x9e, 0xc2, 0x15, 0xa1, 0xcb, 0x69, 0xf1, 0x1a, 0x6e, 0xbf, 0xb7, +/*54c0:*/ 0xd6, 0xa3, 0x4f, 0xa5, 0x35, 0x8c, 0x22, 0xf6, 0x5d, 0xda, 0xfd, 0x95, 0x6f, 0xd2, 0x27, 0xbd, +/*54d0:*/ 0x64, 0x76, 0x3e, 0xe4, 0xed, 0x40, 0x95, 0xb6, 0x8a, 0xcf, 0xcd, 0xde, 0x8d, 0x36, 0x9d, 0x55, +/*54e0:*/ 0x58, 0x1a, 0x73, 0x94, 0xd3, 0x9f, 0x55, 0x70, 0xe7, 0x67, 0xc3, 0xaf, 0x07, 0xd9, 0x28, 0x2f, +/*54f0:*/ 0xd9, 0x24, 0x1e, 0x07, 0x72, 0xef, 0x25, 0xe9, 0xa4, 0x39, 0x3a, 0x66, 0xca, 0x86, 0xde, 0x6c, +/*5500:*/ 0xfd, 0x34, 0xc3, 0xdc, 0x31, 0x60, 0x78, 0x11, 0x44, 0x68, 0xef, 0x5f, 0x38, 0x32, 0x8c, 0x2e, +/*5510:*/ 0xa6, 0xa1, 0xf7, 0x04, 0x63, 0xa7, 0x51, 0xcb, 0xfe, 0xd5, 0xee, 0xb4, 0xda, 0xa5, 0xe8, 0xff, +/*5520:*/ 0xba, 0x82, 0x48, 0x17, 0xb5, 0xc8, 0x6d, 0x6d, 0x45, 0xf1, 0xb1, 0xba, 0xfb, 0xd0, 0x03, 0xff, +/*5530:*/ 0xd7, 0x2c, 0xe3, 0x1c, 0x68, 0x2f, 0x06, 0xaf, 0x01, 0x09, 0xc5, 0x99, 0xdb, 0x8f, 0x92, 0x55, +/*5540:*/ 0xc9, 0xd4, 0x16, 0xac, 0x8b, 0x3a, 0xa5, 0x0c, 0xe6, 0xc2, 0x81, 0x92, 0x4a, 0xd2, 0xc7, 0xa8, +/*5550:*/ 0x21, 0xb9, 0xca, 0x59, 0xb5, 0xa6, 0x47, 0x91, 0x35, 0x01, 0xda, 0x9a, 0x1c, 0x01, 0x6c, 0xc4, +/*5560:*/ 0x4c, 0xf0, 0x2d, 0xdc, 0x1f, 0xa1, 0x9a, 0x96, 0xe5, 0xd6, 0xe6, 0xeb, 0x4d, 0xe2, 0x41, 0x4e, +/*5570:*/ 0xf7, 0xd7, 0xb7, 0xb1, 0xe5, 0x07, 0xfb, 0x66, 0x02, 0x6a, 0xf6, 0x52, 0x2b, 0x8a, 0x8b, 0xda, +/*5580:*/ 0xc2, 0xf0, 0x5e, 0xdd, 0x25, 0x87, 0x46, 0xac, 0x14, 0x58, 0x75, 0x5e, 0xae, 0x7b, 0xac, 0x17, +/*5590:*/ 0x19, 0xc2, 0xa0, 0xba, 0xac, 0x2f, 0x52, 0xaa, 0xae, 0xbe, 0x54, 0x53, 0xe3, 0xca, 0x0e, 0x71, +/*55a0:*/ 0x49, 0x51, 0xb8, 0x97, 0x6e, 0x4b, 0xad, 0x8b, 0xae, 0xa9, 0x4c, 0x1b, 0x8a, 0x0c, 0x35, 0x68, +/*55b0:*/ 0x30, 0xdc, 0x02, 0xeb, 0xec, 0x40, 0x31, 0xf3, 0x68, 0x9e, 0xdc, 0x69, 0x2e, 0xd4, 0xf9, 0x18, +/*55c0:*/ 0xe0, 0xc4, 0xa9, 0x80, 0xd1, 0x0a, 0x1a, 0xcb, 0x01, 0x05, 0x3d, 0x95, 0xc5, 0x3d, 0x80, 0x90, +/*55d0:*/ 0x63, 0x12, 0x7d, 0xc4, 0xb1, 0x75, 0x90, 0xb5, 0xee, 0x5b, 0xa5, 0x06, 0xc4, 0xc0, 0x52, 0x53, +/*55e0:*/ 0x22, 0x49, 0xde, 0x02, 0xe2, 0x82, 0xeb, 0x66, 0x1f, 0xb7, 0x91, 0x43, 0xc4, 0x34, 0x4f, 0xb5, +/*55f0:*/ 0x82, 0xf9, 0x8e, 0xd1, 0x64, 0x76, 0xda, 0x83, 0x91, 0xfb, 0x9d, 0x12, 0xa7, 0x52, 0x1b, 0x36, +/*5600:*/ 0xe2, 0x86, 0x00, 0xd0, 0x55, 0xde, 0xe3, 0x99, 0xe6, 0x31, 0x27, 0xea, 0xd7, 0xaf, 0xc0, 0xe4, +/*5610:*/ 0x73, 0xcb, 0xa3, 0xcb, 0x4e, 0x8c, 0x19, 0xc9, 0xed, 0x79, 0x06, 0x29, 0xe8, 0x6d, 0x48, 0x21, +/*5620:*/ 0x29, 0xb7, 0x07, 0x21, 0x33, 0xe7, 0x42, 0xe9, 0xcf, 0x2b, 0x36, 0x05, 0x48, 0xba, 0x9d, 0xb7, +/*5630:*/ 0xa4, 0x5f, 0x2c, 0x43, 0x28, 0x23, 0x44, 0xef, 0x5b, 0x00, 0x60, 0x0c, 0xa0, 0xa6, 0x4f, 0x01, +/*5640:*/ 0xc9, 0x03, 0x36, 0x8f, 0x96, 0x99, 0xfb, 0x13, 0x91, 0x08, 0x8f, 0x00, 0x55, 0x69, 0x5c, 0xeb, +/*5650:*/ 0x19, 0x4b, 0x79, 0xb8, 0xf0, 0x51, 0x34, 0xe8, 0xdd, 0x91, 0x56, 0x0f, 0x71, 0x07, 0x4b, 0x29, +/*5660:*/ 0xcf, 0xfe, 0xe8, 0xec, 0x93, 0x4a, 0xff, 0xaa, 0xad, 0xca, 0xec, 0x8c, 0xaf, 0xe5, 0x3e, 0x44, +/*5670:*/ 0x5e, 0xb7, 0xc6, 0x3f, 0xd5, 0x39, 0xf1, 0x24, 0xeb, 0x93, 0xcc, 0xf7, 0x7a, 0x61, 0x17, 0x93, +/*5680:*/ 0x98, 0xa4, 0x83, 0xd5, 0x87, 0x3c, 0xb6, 0x64, 0xd2, 0x97, 0x6d, 0x5f, 0x17, 0xf9, 0xdd, 0x56, +/*5690:*/ 0x36, 0x7a, 0x41, 0x9e, 0xf7, 0x37, 0xcc, 0x54, 0xbf, 0x29, 0x11, 0xac, 0x1a, 0x79, 0xc1, 0xa7, +/*56a0:*/ 0xe0, 0x48, 0x39, 0x31, 0x21, 0x44, 0x4e, 0x13, 0xdf, 0xda, 0xdc, 0x37, 0x9b, 0xe1, 0x82, 0x06, +/*56b0:*/ 0xcd, 0xbe, 0xad, 0x1b, 0x7d, 0x9c, 0xe0, 0x05, 0x27, 0x93, 0xce, 0x84, 0xe6, 0xfb, 0xd2, 0x46, +/*56c0:*/ 0x4b, 0xf6, 0x96, 0xa2, 0x6e, 0x4f, 0x81, 0x27, 0x5b, 0x1c, 0xb0, 0x68, 0x2f, 0xdd, 0x3b, 0x08, +/*56d0:*/ 0xe4, 0x31, 0xed, 0x78, 0xd3, 0xe3, 0x3f, 0xf4, 0x59, 0xee, 0x8e, 0xb6, 0xce, 0x94, 0xb5, 0xa2, +/*56e0:*/ 0x15, 0x95, 0x6b, 0x4e, 0x27, 0x5f, 0x6e, 0x72, 0x3b, 0x59, 0x08, 0xfe, 0xa2, 0xd2, 0x55, 0x67, +/*56f0:*/ 0xc9, 0x82, 0x81, 0xef, 0xa3, 0xdd, 0x3b, 0xa7, 0x29, 0x68, 0xc2, 0x58, 0x15, 0x03, 0xdf, 0x34, +/*5700:*/ 0xef, 0x32, 0xa3, 0x28, 0x10, 0x6b, 0x07, 0x74, 0x55, 0x81, 0x01, 0x0b, 0x85, 0x8d, 0x5a, 0x57, +/*5710:*/ 0x0b, 0x24, 0x05, 0x7e, 0x72, 0x07, 0x14, 0x6b, 0xea, 0x1b, 0x2d, 0xab, 0x51, 0xf1, 0xa4, 0x72, +/*5720:*/ 0x52, 0x76, 0x6d, 0x43, 0xe1, 0x5d, 0xe0, 0x96, 0x42, 0xf9, 0xb7, 0xc5, 0x7e, 0x2d, 0x49, 0x14, +/*5730:*/ 0x31, 0x94, 0x69, 0x45, 0x52, 0x98, 0x71, 0x36, 0xe7, 0x40, 0xb0, 0xc5, 0xb7, 0x4e, 0x07, 0xb8, +/*5740:*/ 0x5f, 0x37, 0x71, 0x1c, 0x8a, 0x9e, 0x3a, 0x2b, 0x42, 0xec, 0x27, 0xda, 0xd9, 0xfa, 0x55, 0xee, +/*5750:*/ 0xc2, 0x66, 0xbf, 0x24, 0xe4, 0xa9, 0x1b, 0xd3, 0x0f, 0xa5, 0x56, 0x75, 0x51, 0xf1, 0x7d, 0xaa, +/*5760:*/ 0x93, 0x46, 0x23, 0x60, 0x9c, 0xb9, 0xc7, 0xaa, 0xec, 0x25, 0x58, 0x21, 0xca, 0x46, 0xb0, 0xad, +/*5770:*/ 0x8c, 0x32, 0x3f, 0xdc, 0xdc, 0x94, 0x16, 0x33, 0x30, 0x0b, 0x65, 0xd1, 0x10, 0x77, 0xf7, 0xa5, +/*5780:*/ 0x51, 0x10, 0x2b, 0x98, 0xb1, 0x1d, 0xb7, 0xf7, 0x6a, 0xb3, 0x01, 0x1e, 0x19, 0xa7, 0x7f, 0x2d, +/*5790:*/ 0xb8, 0x70, 0x70, 0x8e, 0x95, 0xf9, 0x66, 0xd0, 0x05, 0x8f, 0x2d, 0xbb, 0x1c, 0xe4, 0x0e, 0x49, +/*57a0:*/ 0x80, 0xf8, 0xd9, 0x27, 0x63, 0xf8, 0x46, 0x02, 0xde, 0x65, 0x58, 0x4b, 0x6d, 0x35, 0xb5, 0x30, +/*57b0:*/ 0x92, 0xff, 0xf3, 0x6f, 0xfb, 0x57, 0x40, 0x68, 0x77, 0xa4, 0x88, 0x47, 0x33, 0x41, 0x76, 0x11, +/*57c0:*/ 0x8a, 0x9a, 0x08, 0x4a, 0x68, 0x01, 0xa3, 0x96, 0xc9, 0x67, 0x15, 0x62, 0x70, 0xfa, 0xaf, 0x30, +/*57d0:*/ 0x85, 0x6a, 0x31, 0xd3, 0x48, 0xb3, 0xe5, 0xb7, 0x96, 0xff, 0xb1, 0x60, 0x0c, 0x0f, 0x6d, 0xcb, +/*57e0:*/ 0x28, 0xf7, 0x9f, 0xd6, 0x61, 0xec, 0x25, 0x6c, 0xe1, 0x90, 0xec, 0xb6, 0x34, 0xaf, 0x92, 0xa3, +/*57f0:*/ 0x5a, 0x33, 0xe5, 0x27, 0x19, 0xa2, 0x08, 0x7e, 0x23, 0x63, 0x1d, 0xdb, 0x52, 0xf1, 0x4d, 0x8a, +/*5800:*/ 0x88, 0x0e, 0x70, 0xf9, 0x25, 0xbe, 0x3c, 0x69, 0x71, 0xa7, 0xb5, 0x1a, 0x91, 0x31, 0xaa, 0xd8, +/*5810:*/ 0xa6, 0x93, 0xf8, 0x3c, 0x18, 0xc3, 0x3f, 0x34, 0x44, 0x15, 0xaa, 0xbd, 0x29, 0x50, 0x70, 0x0a, +/*5820:*/ 0xc9, 0x6e, 0xc2, 0x76, 0x9b, 0x8d, 0x94, 0x76, 0xaa, 0x8d, 0x3d, 0x51, 0xdc, 0xf9, 0x85, 0x64, +/*5830:*/ 0x47, 0xeb, 0xc5, 0xb9, 0xa1, 0xb9, 0xa2, 0x2a, 0x9a, 0xdf, 0xb5, 0xc9, 0x94, 0x72, 0x7a, 0xc9, +/*5840:*/ 0xdc, 0xab, 0x6d, 0x0a, 0xdd, 0xfa, 0xfb, 0xb1, 0xca, 0xe6, 0x3e, 0xa7, 0xeb, 0x9b, 0x79, 0x17, +/*5850:*/ 0x65, 0x07, 0xd6, 0x7c, 0x8e, 0xbb, 0x9b, 0x7e, 0xef, 0xa4, 0x4a, 0xab, 0x7f, 0xd0, 0xdb, 0xbf, +/*5860:*/ 0x3b, 0x89, 0xd8, 0xcb, 0x69, 0x70, 0x2f, 0xd7, 0x6c, 0x09, 0xc6, 0x3c, 0x55, 0x60, 0x71, 0xaf, +/*5870:*/ 0x94, 0xa9, 0x3f, 0xac, 0x9c, 0xca, 0x95, 0x21, 0x01, 0xe1, 0xc6, 0x86, 0x5d, 0xe9, 0x86, 0xda, +/*5880:*/ 0x27, 0xe9, 0x36, 0xc8, 0x38, 0x4b, 0x45, 0x50, 0xcd, 0xd9, 0x3d, 0x41, 0x49, 0x1e, 0x08, 0x70, +/*5890:*/ 0x18, 0x1d, 0x96, 0x90, 0x95, 0x24, 0x3c, 0x55, 0x8c, 0xfb, 0xe1, 0x80, 0xd6, 0xcd, 0xbc, 0x77, +/*58a0:*/ 0x80, 0xa4, 0x39, 0xc0, 0x4b, 0x30, 0x8b, 0x40, 0x95, 0x45, 0x15, 0xcb, 0xf8, 0x6c, 0xc3, 0x20, +/*58b0:*/ 0x6d, 0xcf, 0xbf, 0x87, 0xec, 0xbc, 0x02, 0xee, 0xf5, 0xa6, 0x28, 0x9a, 0x6d, 0xb0, 0xb9, 0x8e, +/*58c0:*/ 0x11, 0xb6, 0xc0, 0x30, 0x77, 0x8c, 0x23, 0x44, 0xe0, 0xd2, 0x64, 0x0b, 0x31, 0x01, 0x90, 0x43, +/*58d0:*/ 0x95, 0x78, 0xf0, 0x35, 0x07, 0xab, 0xff, 0xb4, 0xa7, 0xfb, 0xcf, 0x22, 0xac, 0x27, 0x23, 0x23, +/*58e0:*/ 0xf5, 0x82, 0x40, 0x3e, 0xbb, 0x9f, 0xd7, 0x78, 0x05, 0x59, 0xfd, 0xf1, 0xf2, 0x03, 0x7d, 0x65, +/*58f0:*/ 0x5f, 0x48, 0xfc, 0x69, 0x1e, 0x9a, 0xa1, 0x71, 0x81, 0x51, 0x34, 0x9f, 0x73, 0xf8, 0x42, 0x1c, +/*5900:*/ 0x64, 0x64, 0x1e, 0xbd, 0x5f, 0x64, 0x40, 0x59, 0xc8, 0xe9, 0x84, 0xfe, 0x84, 0xce, 0xf0, 0xd7, +/*5910:*/ 0x5b, 0x2d, 0xcc, 0x56, 0xf1, 0x48, 0xa2, 0x68, 0x3d, 0xa9, 0x78, 0x0a, 0x10, 0xa2, 0x89, 0x19, +/*5920:*/ 0xe7, 0x83, 0xda, 0x80, 0x86, 0x8d, 0x4c, 0xfa, 0x5a, 0x82, 0xec, 0xca, 0x9f, 0xc4, 0xb6, 0x1a, +/*5930:*/ 0xd3, 0x95, 0xed, 0x50, 0xfb, 0x6a, 0xac, 0xb3, 0x76, 0x36, 0xdd, 0xb4, 0x1c, 0xcb, 0x9d, 0x44, +/*5940:*/ 0x0f, 0x3b, 0xdf, 0xcd, 0xd8, 0x06, 0x5d, 0x96, 0xd9, 0xd7, 0x4c, 0xe4, 0xcf, 0x0e, 0xef, 0x25, +/*5950:*/ 0x1a, 0xe4, 0xc2, 0x7f, 0x0f, 0x4d, 0x9f, 0xd8, 0x4f, 0xe0, 0xa0, 0xfb, 0x07, 0xbc, 0xc1, 0x41, +/*5960:*/ 0x66, 0x7f, 0xa5, 0x74, 0xc3, 0xce, 0x96, 0x2b, 0x9a, 0x95, 0x90, 0xbd, 0x26, 0x88, 0x81, 0x55, +/*5970:*/ 0x8d, 0xcd, 0xaf, 0x2a, 0x57, 0x1e, 0x3c, 0x39, 0x07, 0xe7, 0x76, 0x52, 0x5a, 0x54, 0x3d, 0x35, +/*5980:*/ 0xbd, 0x2c, 0x14, 0x8f, 0x94, 0xf7, 0x7c, 0x94, 0x54, 0x7e, 0xbf, 0x9f, 0x05, 0xf1, 0x23, 0x14, +/*5990:*/ 0xa9, 0x55, 0x4a, 0x92, 0x23, 0x8d, 0xc3, 0x36, 0x77, 0x47, 0x05, 0xaf, 0xbe, 0x31, 0xe7, 0x88, +/*59a0:*/ 0x22, 0x2e, 0x12, 0x70, 0x36, 0x00, 0xe4, 0x85, 0x80, 0x3f, 0x0e, 0xca, 0x82, 0x30, 0xf3, 0x2e, +/*59b0:*/ 0xa0, 0x57, 0x71, 0x62, 0x85, 0x66, 0xe5, 0x35, 0x4a, 0x7c, 0xdf, 0x5e, 0x4a, 0x40, 0xbf, 0x84, +/*59c0:*/ 0x84, 0x8a, 0xf8, 0xf4, 0xe4, 0xc3, 0xa1, 0x8a, 0xf7, 0x54, 0xdc, 0x79, 0x58, 0xfb, 0x6e, 0x04, +/*59d0:*/ 0x02, 0x88, 0x18, 0x82, 0xa5, 0x1a, 0x82, 0x39, 0x91, 0x08, 0x1d, 0x2e, 0x63, 0x4a, 0xe9, 0x08, +/*59e0:*/ 0xe5, 0x58, 0x0b, 0x5f, 0x0f, 0x39, 0xba, 0xe5, 0xbe, 0x6c, 0x23, 0x1c, 0xf2, 0xb3, 0x8b, 0x2e, +/*59f0:*/ 0x22, 0xf5, 0x88, 0xc7, 0xfc, 0xdf, 0x99, 0x01, 0x74, 0xe4, 0xb9, 0x21, 0x6b, 0xa1, 0x25, 0xb3, +/*5a00:*/ 0x1f, 0xf4, 0xb6, 0x5d, 0x2d, 0x06, 0x52, 0x95, 0xe4, 0xa9, 0xb8, 0x5a, 0x26, 0x48, 0xff, 0x94, +/*5a10:*/ 0x5e, 0xfb, 0x5f, 0xb1, 0x21, 0xc0, 0xa3, 0x01, 0xbd, 0x58, 0x88, 0xbd, 0x4d, 0x0d, 0x5b, 0x5d, +/*5a20:*/ 0x0b, 0x42, 0x29, 0xad, 0xd1, 0x5b, 0xbf, 0x81, 0x94, 0xf6, 0xac, 0x31, 0xaf, 0xa7, 0x48, 0xa2, +/*5a30:*/ 0xd3, 0xde, 0x99, 0x91, 0x63, 0x3f, 0xb4, 0xe6, 0x27, 0x2f, 0x08, 0x80, 0x9f, 0x4c, 0x11, 0xc8, +/*5a40:*/ 0xa0, 0xc2, 0x12, 0x55, 0xd9, 0x4d, 0x62, 0x4b, 0x5c, 0x8c, 0xf4, 0x09, 0xae, 0xae, 0x58, 0xa3, +/*5a50:*/ 0xdd, 0xc7, 0x76, 0x29, 0xa1, 0xef, 0x09, 0xef, 0x05, 0xe9, 0x5a, 0x41, 0xb2, 0x6f, 0x10, 0xba, +/*5a60:*/ 0xad, 0x3b, 0xf1, 0x50, 0x07, 0x05, 0xf8, 0xef, 0x8b, 0x20, 0x1b, 0x35, 0xaa, 0x56, 0xf7, 0x82, +/*5a70:*/ 0x7f, 0x37, 0xa4, 0xc0, 0x26, 0x9d, 0xa3, 0x50, 0x2e, 0x47, 0x8d, 0x23, 0xec, 0x6c, 0xff, 0xd4, +/*5a80:*/ 0x23, 0x7a, 0xa8, 0x92, 0xf6, 0x30, 0x56, 0x08, 0xba, 0x97, 0xdb, 0x80, 0x86, 0xbc, 0xf8, 0x62, +/*5a90:*/ 0xb8, 0xd5, 0xda, 0x4a, 0xc6, 0x5e, 0xd7, 0x45, 0xe4, 0xc6, 0x1a, 0x67, 0xf2, 0x79, 0x19, 0x99, +/*5aa0:*/ 0x84, 0xa9, 0xdb, 0x77, 0x83, 0x2b, 0xbf, 0x0f, 0x90, 0xcf, 0xf7, 0x1d, 0xee, 0xed, 0x71, 0x25, +/*5ab0:*/ 0x4f, 0x6d, 0xf6, 0x6a, 0xdd, 0x9c, 0x86, 0x2a, 0xca, 0xc2, 0x76, 0x68, 0xc6, 0x66, 0x90, 0x81, +/*5ac0:*/ 0x49, 0xfc, 0xef, 0x53, 0xcf, 0xf3, 0xff, 0x7f, 0xd6, 0xf7, 0x1a, 0x4b, 0xa3, 0xb2, 0x62, 0x1b, +/*5ad0:*/ 0xe0, 0x36, 0x48, 0x4f, 0x61, 0xb7, 0x09, 0x2d, 0x4e, 0x10, 0x33, 0x49, 0xc7, 0xd0, 0xed, 0x92, +/*5ae0:*/ 0x42, 0x03, 0xca, 0xd8, 0x87, 0x61, 0x86, 0x8a, 0x1d, 0x0a, 0x0e, 0x4f, 0x7f, 0x06, 0x68, 0x66, +/*5af0:*/ 0x40, 0x7f, 0xd6, 0x90, 0x69, 0x38, 0x51, 0x19, 0xd1, 0x5c, 0xd6, 0xde, 0x58, 0xd6, 0xcf, 0x1f, +/*5b00:*/ 0x10, 0xdf, 0x0b, 0xe5, 0x27, 0xfc, 0xf3, 0x81, 0x1d, 0xe6, 0x2a, 0x88, 0x4b, 0xcf, 0x9f, 0xda, +/*5b10:*/ 0x8d, 0xa4, 0xf3, 0x77, 0xfb, 0x3b, 0x39, 0xa2, 0x34, 0x8c, 0x90, 0x37, 0x08, 0x28, 0xc9, 0xdf, +/*5b20:*/ 0x30, 0x98, 0x42, 0x98, 0xc2, 0x98, 0xb8, 0xa9, 0x58, 0x3b, 0xbd, 0x67, 0x62, 0xfb, 0x73, 0x08, +/*5b30:*/ 0xcd, 0xe7, 0xc1, 0x58, 0xdb, 0x3a, 0xc0, 0x91, 0x7b, 0x5f, 0xd6, 0xed, 0x0a, 0x26, 0xe7, 0xd1, +/*5b40:*/ 0x82, 0x5f, 0x5f, 0x8e, 0xdf, 0x2d, 0x3f, 0xbd, 0xb1, 0x80, 0xd2, 0x1f, 0xf5, 0xa8, 0x67, 0x67, +/*5b50:*/ 0x27, 0x10, 0x50, 0x4d, 0x3b, 0x18, 0xc0, 0x37, 0xd2, 0xbd, 0x8d, 0xaf, 0x9d, 0xfb, 0xed, 0x08, +/*5b60:*/ 0xcf, 0x07, 0xac, 0xb5, 0xff, 0xd4, 0xe3, 0x8b, 0xf7, 0x58, 0x75, 0xa5, 0x05, 0x8f, 0x61, 0x5b, +/*5b70:*/ 0x7e, 0x46, 0x4d, 0xce, 0x03, 0x74, 0x94, 0xfb, 0xbd, 0x71, 0x31, 0x61, 0x66, 0x05, 0x3a, 0xbd, +/*5b80:*/ 0x56, 0x2b, 0x1c, 0xab, 0x0a, 0xf5, 0x27, 0x6f, 0x86, 0x2e, 0x65, 0x0f, 0xf0, 0x6d, 0x14, 0xfe, +/*5b90:*/ 0xcf, 0x02, 0xc1, 0xb2, 0x9e, 0x2a, 0x6b, 0x4c, 0xc2, 0x57, 0xd5, 0xf2, 0x17, 0x9d, 0xe1, 0xc5, +/*5ba0:*/ 0x03, 0xcc, 0x88, 0x84, 0xfa, 0x70, 0xcf, 0x91, 0x71, 0xb4, 0x33, 0xd1, 0xc0, 0x8a, 0xbf, 0x20, +/*5bb0:*/ 0x5e, 0xbc, 0x32, 0xf4, 0x1c, 0x77, 0xac, 0xcb, 0xe8, 0x56, 0xda, 0xf6, 0x0a, 0xba, 0xeb, 0x37, +/*5bc0:*/ 0xbd, 0x94, 0x39, 0x04, 0xd7, 0xbf, 0xe1, 0x18, 0xab, 0x6b, 0xb6, 0xde, 0x7a, 0xb6, 0xbe, 0x19, +/*5bd0:*/ 0xcd, 0x87, 0x09, 0x23, 0xcd, 0xb7, 0x37, 0x00, 0x68, 0x20, 0x99, 0x88, 0x39, 0xc9, 0x94, 0x4c, +/*5be0:*/ 0x78, 0x6f, 0xfe, 0x27, 0xb8, 0xd2, 0x13, 0xc2, 0xa9, 0x1b, 0xee, 0x6a, 0x27, 0x66, 0xc1, 0x63, +/*5bf0:*/ 0x4b, 0x7d, 0xc3, 0xa7, 0xa8, 0xd2, 0xe5, 0x80, 0x95, 0xd7, 0xc6, 0xf5, 0x63, 0x5f, 0x22, 0x0f, +/*5c00:*/ 0x2a, 0x3a, 0x4b, 0xf2, 0xe0, 0x62, 0x8e, 0x77, 0x4f, 0xc1, 0x82, 0xa5, 0x7b, 0xa1, 0x52, 0x64, +/*5c10:*/ 0x3d, 0x83, 0x08, 0xa1, 0x0d, 0x47, 0x58, 0xdb, 0xa1, 0x18, 0xce, 0xd8, 0x03, 0xb8, 0x46, 0x9e, +/*5c20:*/ 0xbf, 0xac, 0x44, 0x32, 0x96, 0x7e, 0xed, 0x6f, 0xc6, 0xfd, 0x2f, 0x12, 0x4d, 0xd0, 0xb6, 0x37, +/*5c30:*/ 0xf8, 0xf1, 0x9b, 0x4d, 0x4f, 0x07, 0x24, 0x90, 0x2a, 0x6e, 0xc2, 0x48, 0xe5, 0x32, 0x1f, 0xf9, +/*5c40:*/ 0x40, 0xc8, 0x5e, 0x92, 0xcb, 0x25, 0xf6, 0x06, 0x87, 0xef, 0x41, 0x72, 0xef, 0x8b, 0x7b, 0xf2, +/*5c50:*/ 0x25, 0x4c, 0x0a, 0x01, 0xd9, 0x9b, 0x8f, 0x22, 0x42, 0x03, 0x8e, 0x9c, 0xf1, 0x02, 0x44, 0xa0, +/*5c60:*/ 0xf0, 0x78, 0x1a, 0xb5, 0x96, 0x45, 0xeb, 0xc7, 0xc6, 0xec, 0x86, 0xeb, 0xc7, 0xde, 0x09, 0x18, +/*5c70:*/ 0x70, 0x3b, 0x02, 0x1e, 0xeb, 0xd0, 0x16, 0xf0, 0x25, 0xe0, 0x51, 0x7f, 0xfc, 0xe9, 0x82, 0x7f, +/*5c80:*/ 0x1c, 0xc0, 0xef, 0x4d, 0x39, 0x3b, 0xe2, 0xe2, 0x3b, 0x48, 0x85, 0x99, 0x6b, 0x42, 0x75, 0xe0, +/*5c90:*/ 0xcb, 0xbb, 0x27, 0x56, 0xc6, 0x87, 0x98, 0x74, 0xca, 0xd4, 0xe8, 0xba, 0x9a, 0x3d, 0x5d, 0x7d, +/*5ca0:*/ 0xe8, 0xc7, 0xe5, 0xd1, 0x20, 0xea, 0x83, 0x03, 0x84, 0xe4, 0xaf, 0x81, 0xe3, 0x3f, 0xed, 0xca, +/*5cb0:*/ 0x97, 0x2a, 0xda, 0xa6, 0x90, 0x26, 0x9e, 0x8e, 0x8f, 0x9a, 0xb4, 0x70, 0x78, 0x2f, 0xad, 0x58, +/*5cc0:*/ 0xbc, 0xf7, 0x0c, 0x2c, 0xdf, 0xd8, 0x7f, 0xa4, 0x3e, 0x49, 0xd8, 0x9e, 0x0e, 0x6f, 0x04, 0x8c, +/*5cd0:*/ 0x66, 0x6c, 0x24, 0x27, 0xf9, 0x0d, 0xf3, 0x70, 0xb6, 0xaa, 0x9d, 0x4e, 0xae, 0xb7, 0x24, 0x3f, +/*5ce0:*/ 0xa5, 0xdb, 0xf5, 0x72, 0x20, 0xdd, 0xb5, 0xa8, 0x9f, 0xdb, 0xf4, 0xb8, 0x65, 0x0d, 0x42, 0x4f, +/*5cf0:*/ 0x23, 0x51, 0x14, 0xf0, 0x0a, 0x99, 0x8a, 0xef, 0x64, 0x06, 0x58, 0xc3, 0xf4, 0x41, 0x6d, 0x47, +/*5d00:*/ 0xb2, 0x29, 0xcb, 0xc4, 0x65, 0x3a, 0x36, 0x05, 0x77, 0x9e, 0x3b, 0x8a, 0x86, 0x9f, 0xea, 0x2b, +/*5d10:*/ 0x93, 0xba, 0x76, 0xc1, 0x35, 0x22, 0x18, 0x0d, 0x31, 0xfd, 0xba, 0x48, 0x12, 0xc6, 0xe8, 0xc3, +/*5d20:*/ 0xfd, 0x20, 0xbf, 0xc7, 0xaf, 0xdc, 0x10, 0x85, 0xbe, 0x22, 0xbf, 0x03, 0x51, 0x55, 0x84, 0x4f, +/*5d30:*/ 0x60, 0x92, 0x61, 0x51, 0x93, 0x62, 0xce, 0x0b, 0x12, 0xb8, 0xdf, 0x30, 0xee, 0x8d, 0x4e, 0x43, +/*5d40:*/ 0x59, 0xcc, 0x90, 0x80, 0xa6, 0x80, 0xa0, 0x37, 0xe0, 0x80, 0x3d, 0x81, 0x18, 0x5f, 0x2f, 0xb2, +/*5d50:*/ 0x5b, 0x8a, 0x4d, 0x99, 0x14, 0x82, 0xb8, 0xb8, 0xc1, 0x38, 0x45, 0xc3, 0xb0, 0x1a, 0x22, 0x07, +/*5d60:*/ 0x60, 0xc9, 0x21, 0x25, 0x83, 0x2f, 0x67, 0x70, 0xa3, 0x71, 0xbc, 0xae, 0x7d, 0x5c, 0xe1, 0x4a, +/*5d70:*/ 0x6b, 0x25, 0x59, 0x34, 0x45, 0xee, 0xd0, 0xd9, 0xe4, 0xaa, 0x6c, 0xed, 0x20, 0x9d, 0x6a, 0xec, +/*5d80:*/ 0x18, 0x78, 0xcd, 0x22, 0x59, 0xc2, 0x44, 0xc6, 0xd3, 0x13, 0x9c, 0x83, 0x52, 0x1f, 0xba, 0x8e, +/*5d90:*/ 0x09, 0x19, 0xa0, 0x9f, 0xd2, 0x3c, 0xb3, 0x04, 0x65, 0xd3, 0x27, 0x1e, 0xed, 0xbd, 0x4f, 0x5a, +/*5da0:*/ 0xdb, 0x8f, 0xbf, 0x2e, 0x1c, 0x70, 0x4f, 0xa2, 0x7d, 0x3e, 0x0b, 0x56, 0xb6, 0xd5, 0x81, 0x65, +/*5db0:*/ 0x9d, 0xab, 0xf7, 0x2d, 0x32, 0x11, 0xe4, 0x96, 0xc9, 0x15, 0x6d, 0x51, 0xd6, 0x9e, 0x3f, 0x41, +/*5dc0:*/ 0x5c, 0xfd, 0x28, 0x9b, 0x65, 0x39, 0x20, 0x95, 0x92, 0xd4, 0xed, 0xa2, 0x62, 0x48, 0xcd, 0x2f, +/*5dd0:*/ 0xfc, 0x94, 0xcf, 0x60, 0x69, 0x50, 0xbb, 0x8b, 0xf8, 0x9b, 0xcb, 0x81, 0xf9, 0xba, 0xfc, 0xd3, +/*5de0:*/ 0x81, 0x70, 0x76, 0xb5, 0xcf, 0xd5, 0xc6, 0x73, 0x72, 0xde, 0xaa, 0x45, 0x7c, 0x5c, 0xec, 0xdf, +/*5df0:*/ 0x2b, 0xed, 0x31, 0x02, 0x47, 0x10, 0x65, 0xb2, 0x46, 0xcf, 0x3a, 0x52, 0x3c, 0x24, 0xb9, 0x28, +/*5e00:*/ 0x8c, 0xe5, 0x2b, 0x32, 0x73, 0x20, 0x49, 0xb0, 0x69, 0xc4, 0x07, 0x81, 0xbb, 0x61, 0x9e, 0x71, +/*5e10:*/ 0x78, 0xf7, 0x57, 0x51, 0x10, 0x68, 0xf6, 0xca, 0x0d, 0x1a, 0xf8, 0xa4, 0xa1, 0xf8, 0x1b, 0x30, +/*5e20:*/ 0xe1, 0x8c, 0x88, 0xfb, 0x94, 0x9f, 0xb2, 0xa8, 0x58, 0xcf, 0xe0, 0x62, 0x6f, 0x38, 0x75, 0x6f, +/*5e30:*/ 0x0e, 0x8a, 0x54, 0x97, 0xbc, 0xe3, 0xb1, 0x7f, 0xa9, 0xf2, 0x6e, 0xb5, 0xa9, 0x94, 0x5b, 0x7d, +/*5e40:*/ 0x20, 0xcf, 0xb1, 0x17, 0x87, 0x67, 0xdb, 0x6d, 0xc6, 0x6d, 0xb9, 0x64, 0xe8, 0x9b, 0x51, 0xaf, +/*5e50:*/ 0xc2, 0x0a, 0x8a, 0xab, 0x2f, 0x04, 0x20, 0xd9, 0xbd, 0xad, 0xdc, 0x30, 0x89, 0x62, 0xd5, 0xf4, +/*5e60:*/ 0x6c, 0xfd, 0x29, 0x9b, 0x57, 0x39, 0xa0, 0xdc, 0x8d, 0xda, 0x99, 0xba, 0x94, 0x8c, 0xd1, 0xd2, +/*5e70:*/ 0xa9, 0x6c, 0x6e, 0x60, 0x29, 0x6f, 0x20, 0xaf, 0xca, 0x3c, 0x37, 0xdb, 0x31, 0xfc, 0xd3, 0xac, +/*5e80:*/ 0x9a, 0x03, 0x70, 0x4e, 0xd5, 0xe5, 0xa9, 0x7d, 0x2c, 0xe1, 0x0f, 0x42, 0x08, 0xbb, 0xc5, 0xbd, +/*5e90:*/ 0xc6, 0xfa, 0xc4, 0x6c, 0xe4, 0x13, 0x2f, 0x2a, 0x7e, 0x51, 0xfe, 0x47, 0xb4, 0xd3, 0xc9, 0xcb, +/*5ea0:*/ 0x23, 0x57, 0x48, 0x50, 0xf8, 0x24, 0xa3, 0xcb, 0x9f, 0xf9, 0x85, 0x26, 0x5a, 0xf5, 0x6b, 0xd2, +/*5eb0:*/ 0xf9, 0xb7, 0x84, 0x71, 0x3d, 0x0d, 0x3a, 0xbe, 0x5f, 0xc5, 0xa9, 0x94, 0x2d, 0x6b, 0xaa, 0xc2, +/*5ec0:*/ 0x95, 0x00, 0x6a, 0x88, 0x1a, 0x04, 0xd9, 0xdd, 0xa6, 0xf0, 0x21, 0x55, 0x76, 0xbd, 0x71, 0x8c, +/*5ed0:*/ 0x1d, 0x8b, 0xe1, 0x0b, 0x16, 0xaf, 0x93, 0xde, 0xd1, 0xeb, 0xde, 0x42, 0xef, 0x5e, 0xcc, 0xc6, +/*5ee0:*/ 0xde, 0x5e, 0xbf, 0xa5, 0x79, 0xc1, 0x50, 0xe5, 0xa4, 0x4a, 0x1e, 0x77, 0xb8, 0xbe, 0x71, 0x2f, +/*5ef0:*/ 0x37, 0xd7, 0xa9, 0xbd, 0x29, 0xc7, 0xcf, 0x0b, 0xaf, 0xac, 0xb1, 0x84, 0x32, 0x20, 0xc5, 0xaa, +/*5f00:*/ 0xa0, 0x0c, 0xee, 0xcb, 0xde, 0x4a, 0x61, 0x7b, 0xf5, 0x4d, 0x17, 0xa1, 0xdb, 0xe2, 0x7c, 0x7b, +/*5f10:*/ 0x0f, 0x6d, 0x46, 0xa7, 0xc6, 0xce, 0xc6, 0xab, 0x3a, 0x67, 0xcc, 0xab, 0xba, 0x13, 0x34, 0x72, +/*5f20:*/ 0xa1, 0x84, 0x44, 0x02, 0xc2, 0x14, 0xff, 0x77, 0x15, 0xae, 0x07, 0xba, 0x20, 0x35, 0x99, 0xaa, +/*5f30:*/ 0x61, 0xa6, 0xac, 0x4f, 0x28, 0x4d, 0xbe, 0xe9, 0x99, 0x9a, 0xe9, 0xb2, 0xf0, 0xc8, 0xa8, 0xc8, +/*5f40:*/ 0x6f, 0x75, 0xfb, 0x66, 0xbb, 0x8a, 0x08, 0x55, 0x6a, 0x4d, 0x52, 0x31, 0x23, 0x59, 0x45, 0x8e, +/*5f50:*/ 0x27, 0x1a, 0x47, 0x71, 0xeb, 0x9e, 0xe2, 0xd4, 0x7a, 0x2d, 0x97, 0x30, 0xd9, 0x5b, 0x42, 0xdc, +/*5f60:*/ 0xef, 0x11, 0x0f, 0xb8, 0xce, 0xce, 0x24, 0xd3, 0x48, 0x98, 0x05, 0x7b, 0x80, 0xda, 0xce, 0xf8, +/*5f70:*/ 0xcb, 0x42, 0x1d, 0xd9, 0xb4, 0x47, 0x03, 0x5c, 0x6e, 0xb5, 0x73, 0x4c, 0x5f, 0xb8, 0xf4, 0x63, +/*5f80:*/ 0xd6, 0xc4, 0x30, 0xe2, 0xd8, 0xc2, 0xd7, 0x32, 0x7a, 0xf3, 0x2e, 0x96, 0x31, 0x66, 0x2a, 0xa1, +/*5f90:*/ 0xa6, 0xdd, 0x3d, 0x5b, 0xbb, 0xe1, 0x12, 0x9f, 0x6f, 0xc9, 0xc3, 0xc2, 0xa0, 0x70, 0x6b, 0x9c, +/*5fa0:*/ 0x5d, 0x71, 0xb3, 0x28, 0x57, 0xf2, 0x67, 0x79, 0xf6, 0x80, 0x38, 0xb1, 0x33, 0x5b, 0xe1, 0x1d, +/*5fb0:*/ 0x2c, 0xba, 0x0d, 0x3e, 0x07, 0xd4, 0xb0, 0xf9, 0xc9, 0x89, 0x04, 0x14, 0x13, 0x9f, 0x37, 0xe1, +/*5fc0:*/ 0x73, 0x98, 0xd6, 0x96, 0xa8, 0xbb, 0xaf, 0x41, 0xa4, 0x65, 0x0a, 0xe3, 0x6e, 0x08, 0x90, 0x04, +/*5fd0:*/ 0x80, 0x29, 0x53, 0xae, 0xc5, 0x55, 0x87, 0xdd, 0x63, 0x00, 0xff, 0xc5, 0x41, 0x5a, 0x76, 0xe2, +/*5fe0:*/ 0x7a, 0xcb, 0xd3, 0x5c, 0x99, 0x9f, 0x72, 0xe9, 0xa7, 0xf6, 0x0e, 0x2b, 0xda, 0x15, 0x4f, 0x03, +/*5ff0:*/ 0xe9, 0x4a, 0x03, 0x56, 0xa8, 0x3a, 0x51, 0x95, 0x9c, 0xa3, 0x6c, 0x6e, 0x23, 0x17, 0x9b, 0xf3, +/*6000:*/ 0x9b, 0x87, 0x71, 0xdd, 0x70, 0xaa, 0xf9, 0xc0, 0x38, 0xfa, 0xc2, 0x80, 0xbf, 0x4e, 0x89, 0xe8, +/*6010:*/ 0x8a, 0x25, 0xc7, 0x0c, 0x7c, 0x32, 0x45, 0x8b, 0x81, 0xef, 0x96, 0x8d, 0xda, 0x0f, 0xb2, 0xea, +/*6020:*/ 0x9b, 0xc9, 0xda, 0x43, 0xe2, 0xcd, 0x35, 0x0d, 0xe8, 0xaf, 0x8d, 0x11, 0x38, 0x68, 0x12, 0x9c, +/*6030:*/ 0x60, 0xb9, 0xdd, 0xea, 0xd6, 0x47, 0x7d, 0x00, 0x8b, 0xf1, 0x9a, 0x69, 0xfd, 0x4c, 0xce, 0x58, +/*6040:*/ 0x05, 0x6f, 0xb6, 0x39, 0x77, 0x3a, 0xe9, 0x1c, 0xe3, 0xf6, 0x9d, 0x73, 0x9d, 0xd3, 0x28, 0x31, +/*6050:*/ 0x4f, 0xc6, 0x82, 0x33, 0xa4, 0xb0, 0xfb, 0x0c, 0x9f, 0xc9, 0x5b, 0x66, 0xcb, 0x1e, 0xa7, 0xf6, +/*6060:*/ 0x42, 0xa9, 0xab, 0xe0, 0x89, 0x87, 0x9d, 0x5b, 0x84, 0xca, 0xaf, 0xef, 0xdd, 0x8c, 0x85, 0xf5, +/*6070:*/ 0xa6, 0xce, 0x21, 0x88, 0x25, 0xd7, 0x9a, 0x86, 0x0e, 0x9b, 0xe1, 0x41, 0x10, 0xac, 0x2b, 0x45, +/*6080:*/ 0x8f, 0xfe, 0x74, 0xb3, 0xb3, 0x92, 0x99, 0x1b, 0x8b, 0xdb, 0x6f, 0x4b, 0x29, 0xe5, 0xe1, 0xa2, +/*6090:*/ 0x74, 0xfb, 0xa4, 0xc2, 0x37, 0xa4, 0x8d, 0x2a, 0xbe, 0x52, 0x12, 0xe9, 0xb0, 0x92, 0x2b, 0x86, +/*60a0:*/ 0xb8, 0x2f, 0xbb, 0x12, 0x66, 0xd5, 0x8b, 0xdb, 0x45, 0x61, 0x07, 0x32, 0xfa, 0x45, 0x04, 0x97, +/*60b0:*/ 0x48, 0x90, 0x36, 0x0a, 0x5a, 0x3d, 0x91, 0x5d, 0xa9, 0x54, 0x22, 0x1b, 0x9c, 0x0c, 0x04, 0xe3, +/*60c0:*/ 0xc4, 0xfe, 0x48, 0x9c, 0xe2, 0xcc, 0xdd, 0x39, 0xda, 0x69, 0xfe, 0xba, 0xd2, 0x9f, 0x84, 0xfb, +/*60d0:*/ 0xa5, 0x36, 0xf5, 0x58, 0x35, 0x8d, 0xdc, 0x6c, 0xcb, 0x22, 0xca, 0xec, 0x58, 0x27, 0xcf, 0xc6, +/*60e0:*/ 0xbe, 0xfc, 0x71, 0x44, 0x1e, 0x59, 0x96, 0x78, 0x18, 0xa4, 0x0a, 0x37, 0xea, 0x67, 0x07, 0x5c, +/*60f0:*/ 0xd9, 0xf6, 0xa9, 0xf9, 0x15, 0x76, 0x4a, 0x5f, 0x44, 0x46, 0xaf, 0xc7, 0x9d, 0x6f, 0x73, 0x33, +/*6100:*/ 0xd3, 0xaf, 0xeb, 0x7e, 0xec, 0x7a, 0xae, 0xa8, 0xa0, 0xc8, 0x08, 0xb3, 0x2b, 0x51, 0xf2, 0x2b, +/*6110:*/ 0xab, 0xc6, 0xa6, 0x1c, 0x10, 0x5c, 0x43, 0x7f, 0x36, 0x79, 0xa5, 0x38, 0xbb, 0xa1, 0x6b, 0x9c, +/*6120:*/ 0x13, 0x7a, 0xcb, 0xa1, 0x60, 0x24, 0x33, 0x7c, 0xf4, 0x78, 0xd0, 0x03, 0xe2, 0x6b, 0xa7, 0x35, +/*6130:*/ 0x05, 0x12, 0x65, 0xf2, 0x23, 0xf7, 0x5b, 0x01, 0x77, 0x48, 0x99, 0x85, 0xc2, 0xc9, 0xd8, 0xbe, +/*6140:*/ 0x91, 0x90, 0xfc, 0xd2, 0x0c, 0x97, 0xbb, 0xb5, 0x64, 0xd5, 0x32, 0xf2, 0x68, 0x77, 0xc5, 0xc2, +/*6150:*/ 0x47, 0x61, 0xce, 0xfa, 0xe9, 0x8b, 0x3d, 0x1f, 0xb6, 0x65, 0x97, 0xb2, 0xa9, 0x53, 0xe1, 0xdc, +/*6160:*/ 0x13, 0x60, 0xff, 0xa1, 0x0e, 0xa1, 0x07, 0x87, 0x8a, 0xa5, 0x80, 0x76, 0x2a, 0x09, 0x20, 0x9b, +/*6170:*/ 0xa2, 0xf0, 0xc9, 0x13, 0xca, 0x06, 0xdb, 0x77, 0x32, 0xec, 0x03, 0x91, 0x4a, 0xa5, 0xf2, 0x44, +/*6180:*/ 0x97, 0xfb, 0xb0, 0x72, 0xb1, 0xc2, 0xfb, 0x9f, 0x7c, 0x3a, 0x3d, 0xea, 0x3a, 0xb3, 0xeb, 0x6a, +/*6190:*/ 0xe4, 0xe6, 0x3d, 0x65, 0x67, 0x85, 0xc9, 0xd0, 0xd8, 0x72, 0x0c, 0x1a, 0xbc, 0xdd, 0x41, 0x0e, +/*61a0:*/ 0x01, 0x3d, 0x23, 0x23, 0x21, 0x29, 0xed, 0xfb, 0xb0, 0xb3, 0x75, 0x64, 0x1d, 0xb7, 0x5e, 0x3e, +/*61b0:*/ 0xe3, 0x3a, 0xd2, 0xb7, 0xa3, 0xef, 0xe4, 0x88, 0x97, 0xd9, 0xd7, 0x16, 0xfa, 0xaa, 0xe8, 0xa9, +/*61c0:*/ 0x6a, 0x16, 0xdd, 0x95, 0x08, 0xea, 0xf1, 0x07, 0xa3, 0x1e, 0xc5, 0xd0, 0x4f, 0x8f, 0x4c, 0xc8, +/*61d0:*/ 0x7d, 0xa3, 0x91, 0xa3, 0x92, 0xfe, 0xbc, 0xef, 0x3b, 0xce, 0xc0, 0x31, 0x35, 0x7a, 0xd4, 0x49, +/*61e0:*/ 0xa9, 0x55, 0xaf, 0x34, 0x9c, 0x18, 0x77, 0x74, 0x9e, 0x2b, 0x28, 0x45, 0xd3, 0xe1, 0x0c, 0x5e, +/*61f0:*/ 0x74, 0x2e, 0x10, 0x0f, 0x30, 0xf2, 0x78, 0xe1, 0xb9, 0x04, 0xfa, 0x9f, 0xbc, 0xc8, 0x0d, 0xed, +/*6200:*/ 0x2a, 0x40, 0x8f, 0xf8, 0xc8, 0xf0, 0xb9, 0x48, 0xb9, 0x8f, 0xb8, 0x0f, 0xf6, 0x2f, 0x39, 0xbe, +/*6210:*/ 0x00, 0x92, 0xab, 0xac, 0x98, 0x30, 0xf1, 0x14, 0xa0, 0x36, 0xc0, 0xd3, 0xfe, 0x88, 0x41, 0x1e, +/*6220:*/ 0x87, 0x80, 0x62, 0x00, 0xb7, 0x04, 0x17, 0x33, 0xed, 0x73, 0x1e, 0x4d, 0xb2, 0x4b, 0xc9, 0x80, +/*6230:*/ 0x6c, 0x09, 0x25, 0x12, 0x08, 0x65, 0x68, 0x79, 0x45, 0x30, 0xf4, 0xe0, 0x81, 0xeb, 0x3c, 0x92, +/*6240:*/ 0xb6, 0x66, 0x2c, 0x55, 0x85, 0xef, 0x60, 0x47, 0x59, 0x36, 0x40, 0xde, 0x14, 0xbd, 0x04, 0x56, +/*6250:*/ 0xa3, 0x25, 0x6f, 0x13, 0x16, 0xf6, 0x04, 0x32, 0xb0, 0x9a, 0x47, 0xa6, 0xf6, 0x89, 0xc5, 0x30, +/*6260:*/ 0xf9, 0xee, 0x3b, 0x64, 0x1b, 0x02, 0xed, 0x7b, 0xc9, 0x0e, 0xe0, 0xc3, 0x09, 0x1f, 0xc8, 0x0d, +/*6270:*/ 0x62, 0x67, 0x6b, 0x72, 0x1f, 0x55, 0x03, 0xc6, 0xbd, 0x19, 0x93, 0x69, 0x3a, 0x2d, 0xc1, 0xeb, +/*6280:*/ 0x3b, 0x1f, 0x2b, 0xdf, 0x97, 0x4b, 0xf2, 0x74, 0x83, 0x6f, 0xff, 0xd0, 0x70, 0x78, 0xbb, 0xd5, +/*6290:*/ 0x0f, 0x05, 0xbf, 0xba, 0xde, 0xa8, 0x1d, 0xee, 0xde, 0x52, 0xdb, 0xd3, 0x4a, 0x53, 0x3c, 0xa4, +/*62a0:*/ 0x00, 0x73, 0x9f, 0x18, 0x5a, 0x47, 0x8d, 0xd9, 0x8d, 0x03, 0xd9, 0x85, 0x38, 0xca, 0xb4, 0xd0, +/*62b0:*/ 0x5f, 0xbb, 0x6e, 0x3d, 0x92, 0xc1, 0x13, 0xd7, 0xea, 0x90, 0xe4, 0x1a, 0x5a, 0x42, 0x7a, 0x3c, +/*62c0:*/ 0x07, 0xeb, 0x96, 0x27, 0xb9, 0x0a, 0x33, 0xea, 0x0b, 0xc7, 0x89, 0x0a, 0x8a, 0x13, 0x37, 0xee, +/*62d0:*/ 0xfb, 0x28, 0x78, 0x92, 0x29, 0x8f, 0x3c, 0xed, 0xa2, 0x40, 0x8b, 0xfc, 0x59, 0x20, 0x35, 0x52, +/*62e0:*/ 0x56, 0x0b, 0x68, 0x46, 0x6f, 0xda, 0x96, 0xbd, 0x66, 0x06, 0x65, 0x57, 0xc1, 0x78, 0x36, 0xa1, +/*62f0:*/ 0x85, 0x38, 0x2f, 0x98, 0x9e, 0x7b, 0xdc, 0xf0, 0x71, 0xb0, 0x57, 0xad, 0xf3, 0x19, 0x5e, 0x69, +/*6300:*/ 0xac, 0x5b, 0xf8, 0x68, 0x58, 0xd8, 0x3d, 0x27, 0xe4, 0x79, 0x3a, 0x8b, 0xd0, 0xb9, 0x1b, 0x22, +/*6310:*/ 0x0e, 0xea, 0xe2, 0xdc, 0x4e, 0x8d, 0x89, 0x76, 0x9b, 0x80, 0x40, 0xcb, 0x94, 0x93, 0xee, 0xb8, +/*6320:*/ 0xb5, 0x6a, 0xe6, 0x95, 0x2d, 0x0e, 0x2d, 0x6c, 0xc8, 0x9d, 0xd5, 0xf7, 0xab, 0xe7, 0xff, 0x07, +/*6330:*/ 0xed, 0x9c, 0x13, 0x81, 0x64, 0x27, 0x4e, 0xc4, 0x15, 0x35, 0x87, 0x3c, 0x9a, 0x2f, 0xd6, 0x6c, +/*6340:*/ 0x3c, 0xae, 0xa8, 0xab, 0x29, 0x44, 0x99, 0xd0, 0xfe, 0x02, 0x8f, 0xc1, 0x14, 0x1b, 0x0f, 0xa7, +/*6350:*/ 0x66, 0x46, 0x44, 0xa6, 0x64, 0x35, 0x4c, 0x66, 0x4b, 0x89, 0x67, 0xd1, 0x58, 0x7b, 0x1e, 0x86, +/*6360:*/ 0xc2, 0x1d, 0x51, 0x14, 0xe4, 0xaf, 0xdb, 0x33, 0x0f, 0x53, 0xcc, 0x88, 0x5d, 0xa4, 0x06, 0x5e, +/*6370:*/ 0x73, 0x0e, 0x95, 0x49, 0x05, 0xd0, 0x06, 0x5d, 0xe5, 0xa1, 0x1b, 0xe5, 0xee, 0xf2, 0x87, 0xc7, +/*6380:*/ 0x8f, 0x16, 0x97, 0x67, 0x63, 0x54, 0x05, 0x2b, 0x6f, 0x4a, 0xe4, 0xaa, 0x31, 0x7a, 0x29, 0x66, +/*6390:*/ 0xcc, 0x29, 0x57, 0x3f, 0xf5, 0x04, 0x19, 0xe4, 0x82, 0x8e, 0xb6, 0x15, 0xcc, 0x97, 0x8f, 0xa6, +/*63a0:*/ 0xfe, 0xf8, 0x48, 0xf6, 0x3e, 0x4a, 0x1e, 0x2d, 0xc9, 0x40, 0xd0, 0x16, 0x85, 0xf5, 0xaa, 0xf9, +/*63b0:*/ 0xce, 0xeb, 0x47, 0xf9, 0x99, 0x8c, 0x81, 0xdd, 0x02, 0x6f, 0xe2, 0xe2, 0x85, 0x67, 0xc3, 0x7a, +/*63c0:*/ 0xa6, 0xc2, 0x2f, 0x3a, 0x64, 0xa2, 0x00, 0x52, 0x05, 0x75, 0x89, 0x0b, 0x6b, 0x4d, 0x7a, 0xb0, +/*63d0:*/ 0x4b, 0xb7, 0x92, 0x10, 0x91, 0xaf, 0x18, 0x9b, 0x19, 0xfa, 0x55, 0x56, 0xdc, 0x1d, 0xa1, 0xd3, +/*63e0:*/ 0xf5, 0xe4, 0xcc, 0x5b, 0xdb, 0xc5, 0x9d, 0xad, 0xb8, 0x32, 0x21, 0x73, 0x66, 0x8b, 0x65, 0x0f, +/*63f0:*/ 0x64, 0x2e, 0x7e, 0x37, 0x29, 0xde, 0xd8, 0x89, 0xe8, 0x3d, 0x67, 0xaf, 0xf0, 0x6d, 0x62, 0x22, +/*6400:*/ 0xc1, 0x23, 0x15, 0xa3, 0xf7, 0xf5, 0x1d, 0x27, 0x4d, 0x7f, 0xfa, 0xb7, 0x55, 0x72, 0x09, 0x49, +/*6410:*/ 0xc8, 0x49, 0xbf, 0x93, 0x4e, 0xeb, 0x80, 0xcf, 0x57, 0xb1, 0x20, 0xa7, 0x18, 0xb0, 0x4e, 0x4d, +/*6420:*/ 0x5f, 0xd1, 0x72, 0xb2, 0x33, 0xc0, 0x6f, 0xae, 0x40, 0x89, 0x5d, 0xcd, 0xaa, 0xaa, 0x8d, 0xcf, +/*6430:*/ 0x79, 0xb6, 0x67, 0x10, 0x96, 0x7b, 0x9a, 0x69, 0xe9, 0x57, 0xc0, 0x61, 0xf9, 0x92, 0x1a, 0x42, +/*6440:*/ 0xa6, 0x7a, 0x4a, 0x0e, 0x74, 0xf8, 0x7c, 0xbb, 0x9e, 0xba, 0x55, 0x11, 0x46, 0x77, 0xb9, 0x2b, +/*6450:*/ 0x81, 0xe3, 0xe0, 0x99, 0xd2, 0x0e, 0xc4, 0x95, 0x55, 0xda, 0x7a, 0xe4, 0x03, 0x49, 0x0b, 0x57, +/*6460:*/ 0x36, 0x65, 0x0f, 0x30, 0xc7, 0xec, 0x53, 0x78, 0x8e, 0x01, 0x80, 0xc4, 0x14, 0xc2, 0xe4, 0xde, +/*6470:*/ 0x5a, 0xbd, 0xaf, 0x07, 0x08, 0x23, 0xd9, 0xfb, 0x6d, 0xb2, 0x97, 0x80, 0x1d, 0xff, 0x6e, 0x11, +/*6480:*/ 0x35, 0x23, 0x30, 0x47, 0xed, 0xc0, 0x58, 0x30, 0x27, 0xbd, 0x32, 0xa4, 0xff, 0x77, 0x71, 0xde, +/*6490:*/ 0x88, 0xbb, 0x37, 0x58, 0x92, 0xa3, 0xce, 0xe1, 0xaf, 0x95, 0x81, 0x1c, 0x73, 0xf5, 0xb6, 0x62, +/*64a0:*/ 0x46, 0x73, 0x30, 0x78, 0xdb, 0xa8, 0x76, 0xa3, 0x88, 0xf9, 0x66, 0x5a, 0x5b, 0x38, 0x24, 0x99, +/*64b0:*/ 0x28, 0xe3, 0xb3, 0x39, 0x71, 0xeb, 0xa8, 0xac, 0xf6, 0xc0, 0xef, 0xcd, 0x16, 0x2f, 0x60, 0x90, +/*64c0:*/ 0x87, 0x52, 0x3a, 0x99, 0xfb, 0xfe, 0xc2, 0x2b, 0x8e, 0x80, 0x7a, 0x71, 0x94, 0x34, 0x4e, 0x90, +/*64d0:*/ 0x38, 0x36, 0x96, 0x29, 0xff, 0xb0, 0xba, 0x4d, 0xf3, 0xbc, 0x6d, 0x8e, 0x7c, 0xb2, 0xd3, 0x4c, +/*64e0:*/ 0x25, 0xb0, 0xd4, 0x4f, 0x25, 0xe4, 0x01, 0x5d, 0xe3, 0x55, 0x51, 0x5b, 0x82, 0xaa, 0x3c, 0xbc, +/*64f0:*/ 0x3c, 0xc7, 0x01, 0xe3, 0xdd, 0xf1, 0x22, 0xe1, 0x18, 0x0b, 0xe5, 0x43, 0xaa, 0x7c, 0x92, 0xc6, +/*6500:*/ 0x8c, 0x7c, 0x8a, 0xb4, 0x9e, 0x5a, 0x1c, 0xe8, 0xad, 0xf7, 0x58, 0x55, 0x9d, 0x26, 0x94, 0x50, +/*6510:*/ 0x32, 0x63, 0x4c, 0x45, 0x13, 0x1a, 0x1f, 0xc8, 0xd4, 0xf9, 0x2f, 0x1d, 0x80, 0x4b, 0xf6, 0x92, +/*6520:*/ 0xe0, 0xef, 0xac, 0x49, 0x93, 0x49, 0x42, 0x17, 0xd9, 0x9b, 0xcb, 0x93, 0x42, 0x15, 0x95, 0xa7, +/*6530:*/ 0x78, 0xd6, 0x35, 0x39, 0x34, 0x10, 0xaf, 0x6c, 0xf9, 0x61, 0xb4, 0xba, 0x99, 0x9b, 0x81, 0x6c, +/*6540:*/ 0xe0, 0xbe, 0x1f, 0x9d, 0x29, 0xe2, 0x04, 0xdc, 0xfa, 0xda, 0x5d, 0x07, 0xcb, 0x56, 0x43, 0x60, +/*6550:*/ 0xde, 0x31, 0xae, 0xe0, 0x20, 0x17, 0x7d, 0xf7, 0xb8, 0x1b, 0xdf, 0xfc, 0x4e, 0x06, 0xbd, 0x9f, +/*6560:*/ 0x0a, 0x0f, 0x97, 0x40, 0x4c, 0x60, 0x13, 0x0f, 0xd2, 0x96, 0x98, 0x4e, 0x83, 0x9b, 0x4e, 0xf1, +/*6570:*/ 0x0d, 0xbd, 0x4f, 0xc4, 0x97, 0x3a, 0x0c, 0xb6, 0xaf, 0xdb, 0x7b, 0xe0, 0xc4, 0xef, 0x42, 0x87, +/*6580:*/ 0x2a, 0xde, 0xa4, 0xb8, 0x13, 0x43, 0xdc, 0x63, 0xa2, 0xbd, 0x42, 0x75, 0xb1, 0x36, 0x1a, 0xe7, +/*6590:*/ 0x73, 0x08, 0x3a, 0xda, 0x44, 0x94, 0xef, 0x05, 0x15, 0xdd, 0x14, 0xad, 0x23, 0x94, 0xaf, 0xb1, +/*65a0:*/ 0xbc, 0xaa, 0x7e, 0xf6, 0xaf, 0x1e, 0x93, 0x8e, 0xa9, 0x86, 0x12, 0x0c, 0xa8, 0xac, 0xa4, 0xeb, +/*65b0:*/ 0xa9, 0x74, 0x29, 0xdc, 0x88, 0xc7, 0xdd, 0x81, 0x18, 0xcc, 0xed, 0x6d, 0x63, 0x10, 0x65, 0x88, +/*65c0:*/ 0x31, 0x98, 0xf3, 0x20, 0x7a, 0x9b, 0x65, 0x17, 0x42, 0x35, 0x19, 0x0a, 0xcc, 0xd6, 0xed, 0xd0, +/*65d0:*/ 0xda, 0xec, 0x35, 0x14, 0x11, 0x8a, 0x37, 0xf0, 0x7a, 0x54, 0x6f, 0x7f, 0x1a, 0x45, 0x8a, 0x82, +/*65e0:*/ 0x44, 0xf4, 0xa0, 0x06, 0xec, 0xbc, 0x16, 0x1c, 0x7a, 0xc3, 0x60, 0x6b, 0xd9, 0xca, 0x85, 0xfa, +/*65f0:*/ 0x31, 0xa9, 0xba, 0x06, 0x20, 0x39, 0x72, 0xb9, 0x41, 0x9d, 0xa4, 0x82, 0x92, 0xfc, 0xa4, 0x55, +/*6600:*/ 0x5c, 0xd6, 0xa1, 0x44, 0xcd, 0x76, 0x24, 0x08, 0x13, 0xda, 0xb7, 0x0a, 0x11, 0xe5, 0x9c, 0xe9, +/*6610:*/ 0x0a, 0x21, 0xc6, 0x51, 0xe0, 0xa7, 0x64, 0xc7, 0x14, 0x33, 0x47, 0x0f, 0x2c, 0x7c, 0xd6, 0x18, +/*6620:*/ 0xd1, 0x2f, 0x22, 0x5c, 0xbe, 0x73, 0xb1, 0xbf, 0x40, 0x05, 0x77, 0x71, 0xf2, 0x6e, 0x5a, 0x03, +/*6630:*/ 0x40, 0x41, 0x96, 0x31, 0x3f, 0x98, 0x03, 0x5a, 0xa7, 0x41, 0xc2, 0xde, 0x17, 0x1e, 0x28, 0xd5, +/*6640:*/ 0x27, 0x0f, 0xf1, 0xf4, 0x64, 0xe1, 0xaf, 0x2b, 0x13, 0xfa, 0x8a, 0x8b, 0xc5, 0xd5, 0x76, 0x3e, +/*6650:*/ 0xaf, 0x56, 0x7f, 0xb3, 0x0f, 0xd7, 0xe7, 0x67, 0x23, 0x40, 0x8c, 0x13, 0x4e, 0x71, 0x1d, 0x29, +/*6660:*/ 0xe6, 0x83, 0x81, 0xb0, 0x44, 0x93, 0xa4, 0x48, 0xcf, 0x12, 0x53, 0xfa, 0x41, 0x99, 0x3d, 0xdb, +/*6670:*/ 0x1b, 0x2f, 0x4f, 0x25, 0x8c, 0xe3, 0x34, 0xbc, 0x4b, 0x86, 0x17, 0x48, 0x6b, 0xf5, 0x48, 0x26, +/*6680:*/ 0xae, 0x9e, 0x8c, 0x1f, 0x8e, 0x80, 0xc5, 0xe4, 0xc2, 0xe7, 0x93, 0x9e, 0x2f, 0x33, 0x2f, 0x77, +/*6690:*/ 0xa2, 0x92, 0xc2, 0x6f, 0x43, 0x55, 0x8d, 0xa8, 0xbb, 0x49, 0x8e, 0xf1, 0x57, 0x97, 0x2b, 0x74, +/*66a0:*/ 0x70, 0x2b, 0x59, 0xfe, 0x77, 0xa6, 0xa5, 0x8e, 0xde, 0xd0, 0xe8, 0xc7, 0xac, 0x23, 0xc2, 0x85, +/*66b0:*/ 0x73, 0xd9, 0x91, 0xc0, 0xb2, 0x03, 0xb3, 0x72, 0x13, 0xcc, 0xaa, 0x7e, 0x82, 0x1e, 0x19, 0xba, +/*66c0:*/ 0xb3, 0x46, 0x53, 0x7e, 0x76, 0xaa, 0x00, 0x6a, 0x8f, 0x08, 0x2c, 0xb9, 0xbf, 0x50, 0x74, 0x23, +/*66d0:*/ 0x2d, 0x04, 0x39, 0xdf, 0xcf, 0x79, 0x8e, 0xb7, 0x17, 0x22, 0x6d, 0x5c, 0x5c, 0x2e, 0xf5, 0xb5, +/*66e0:*/ 0xd1, 0x57, 0x2b, 0xb1, 0x24, 0x2d, 0x23, 0x54, 0x89, 0xa1, 0x96, 0x9d, 0x1a, 0xde, 0x49, 0x4d, +/*66f0:*/ 0x66, 0xf1, 0x6e, 0x1d, 0x7d, 0x65, 0xce, 0x40, 0x3a, 0xc0, 0x82, 0x42, 0x42, 0x7c, 0x27, 0x2e, +/*6700:*/ 0x04, 0x22, 0x3d, 0x4b, 0x44, 0x8f, 0xb3, 0x3d, 0x57, 0xa2, 0x77, 0x99, 0x65, 0xb2, 0x0d, 0x19, +/*6710:*/ 0x34, 0x42, 0xf8, 0x37, 0xeb, 0xde, 0xc6, 0xcc, 0x22, 0x80, 0x2c, 0x50, 0x1d, 0x86, 0x82, 0xcc, +/*6720:*/ 0x9c, 0x13, 0x86, 0x3b, 0x65, 0x26, 0x0a, 0x6b, 0xac, 0x1d, 0x87, 0x46, 0x0a, 0x48, 0xab, 0x95, +/*6730:*/ 0x89, 0x7b, 0x36, 0x93, 0x7c, 0x9e, 0x36, 0x9e, 0x03, 0xcd, 0x4a, 0x04, 0x7d, 0x6b, 0x4c, 0x09, +/*6740:*/ 0xf7, 0xc7, 0xe4, 0x0e, 0x62, 0x42, 0xa3, 0xd1, 0x2a, 0xf9, 0x32, 0xec, 0x75, 0xb1, 0xd6, 0xd5, +/*6750:*/ 0x84, 0xaf, 0xe8, 0x41, 0x68, 0x28, 0xf6, 0xbd, 0xf1, 0xc5, 0x37, 0x2f, 0x9d, 0x1a, 0xcc, 0xa1, +/*6760:*/ 0x48, 0x3c, 0x6f, 0xb9, 0xf3, 0xaf, 0x29, 0x42, 0x50, 0x98, 0x11, 0xc3, 0x4c, 0x5d, 0xaf, 0x3f, +/*6770:*/ 0x50, 0x8d, 0xec, 0xd6, 0xfa, 0xad, 0xdc, 0x3a, 0x98, 0xf7, 0xec, 0x65, 0x44, 0x6f, 0x05, 0x99, +/*6780:*/ 0xb0, 0x0a, 0xd0, 0x68, 0x86, 0xf2, 0x2c, 0x32, 0xd2, 0x89, 0x19, 0xa3, 0xef, 0x93, 0xdf, 0x01, +/*6790:*/ 0x72, 0xea, 0x6c, 0x56, 0x0c, 0x34, 0xe0, 0x22, 0x8e, 0x59, 0xbe, 0x86, 0x57, 0x65, 0x39, 0x86, +/*67a0:*/ 0x4a, 0x19, 0x73, 0xd0, 0x5b, 0x0b, 0x28, 0xc7, 0x7b, 0xbb, 0x8a, 0x9a, 0x77, 0x16, 0xd2, 0xf1, +/*67b0:*/ 0x3f, 0x84, 0x65, 0xb3, 0xed, 0x05, 0xd7, 0xeb, 0xe5, 0x13, 0xfa, 0x6c, 0x7f, 0x81, 0x28, 0x0a, +/*67c0:*/ 0xb0, 0xdb, 0xe1, 0xb8, 0x38, 0x93, 0xdf, 0xa2, 0xd5, 0x22, 0x56, 0xb2, 0xd5, 0x28, 0xb8, 0xc0, +/*67d0:*/ 0xc8, 0x26, 0xb6, 0xe0, 0x11, 0x3b, 0x19, 0x74, 0x27, 0xc2, 0x1f, 0x0c, 0xb3, 0x5f, 0x2d, 0xc1, +/*67e0:*/ 0x50, 0x11, 0x92, 0xca, 0x6f, 0x02, 0x7d, 0x5d, 0xc6, 0xd4, 0x82, 0x6c, 0xf1, 0xde, 0x72, 0xa9, +/*67f0:*/ 0x0c, 0x4f, 0xfa, 0x4d, 0x0f, 0x8d, 0x0b, 0x2c, 0x60, 0x06, 0x53, 0x4d, 0xb7, 0xef, 0x02, 0xfd, +/*6800:*/ 0xb4, 0xe9, 0xea, 0xd5, 0x18, 0xbb, 0xe0, 0x0b, 0x00, 0x04, 0x42, 0xff, 0xd2, 0x49, 0xd4, 0x53, +/*6810:*/ 0xf9, 0x6c, 0x78, 0xf2, 0x13, 0x5b, 0x23, 0x92, 0xec, 0x35, 0x06, 0x73, 0x24, 0xd2, 0x6d, 0x66, +/*6820:*/ 0x0b, 0xbd, 0x01, 0x31, 0x4b, 0xa3, 0x4e, 0x26, 0xdf, 0xf2, 0x69, 0x33, 0xa8, 0x9f, 0xea, 0xe5, +/*6830:*/ 0x67, 0x1b, 0x81, 0x91, 0xb5, 0x0f, 0x6f, 0x73, 0xdb, 0x67, 0x88, 0xe0, 0x7b, 0xf7, 0xd3, 0x2a, +/*6840:*/ 0xda, 0xf7, 0xba, 0xb2, 0xbf, 0x7f, 0x82, 0xe1, 0x50, 0x55, 0x30, 0xf0, 0x04, 0x1f, 0x7f, 0xae, +/*6850:*/ 0x61, 0x7b, 0xf7, 0xfa, 0x78, 0xe0, 0x88, 0x1b, 0x46, 0x2e, 0xea, 0x52, 0x5d, 0x00, 0xd4, 0x7c, +/*6860:*/ 0xed, 0x1c, 0xb0, 0x6a, 0x4d, 0xd3, 0x87, 0x80, 0x7f, 0x6a, 0xf3, 0x8c, 0xe4, 0x5b, 0x0c, 0xe3, +/*6870:*/ 0x40, 0x6d, 0x13, 0xd4, 0x7d, 0x17, 0x28, 0xcf, 0x10, 0xcd, 0x02, 0xf9, 0x0e, 0xc0, 0x21, 0x7f, +/*6880:*/ 0x5e, 0xd0, 0xd9, 0x2b, 0xa0, 0xa3, 0xa0, 0xd9, 0xfc, 0xa4, 0xde, 0x98, 0x2f, 0x70, 0x34, 0x2d, +/*6890:*/ 0x07, 0x16, 0x86, 0x15, 0x4f, 0xf3, 0xae, 0x06, 0x9f, 0x76, 0x51, 0xe0, 0x43, 0x02, 0x5a, 0x02, +/*68a0:*/ 0x79, 0x4a, 0xc2, 0x75, 0x4e, 0xfb, 0xda, 0x9d, 0x06, 0x46, 0x68, 0x3f, 0x77, 0xa4, 0x5b, 0x9d, +/*68b0:*/ 0x8d, 0x2b, 0xd2, 0xdc, 0x7e, 0xd3, 0xd0, 0xa9, 0x41, 0xfd, 0xcb, 0x62, 0xd8, 0x1d, 0xc5, 0x3e, +/*68c0:*/ 0x9f, 0x53, 0xf3, 0xde, 0x4b, 0x83, 0x1c, 0x88, 0xb3, 0xfb, 0x2b, 0x14, 0xf3, 0xe8, 0x90, 0x6a, +/*68d0:*/ 0xf6, 0x54, 0x1e, 0xa5, 0x54, 0xf3, 0xe3, 0x30, 0x5d, 0xb0, 0x79, 0xe9, 0x0d, 0x01, 0xf2, 0xa5, +/*68e0:*/ 0x3d, 0x55, 0x6c, 0x65, 0xc4, 0x81, 0x37, 0x2d, 0xfc, 0xc2, 0xcc, 0x03, 0x01, 0x6e, 0x00, 0x0e, +/*68f0:*/ 0x8b, 0x92, 0x33, 0x96, 0x8b, 0xb5, 0xc1, 0x58, 0x26, 0x20, 0x99, 0x04, 0x1d, 0x6b, 0xd1, 0x52, +/*6900:*/ 0xfe, 0x63, 0x27, 0xc3, 0x63, 0xc6, 0x43, 0x6f, 0xf4, 0x83, 0x81, 0x7e, 0x9f, 0xa7, 0xcd, 0x7e, +/*6910:*/ 0xf5, 0xc0, 0xe4, 0xd7, 0x82, 0xc8, 0x18, 0x56, 0xd8, 0xfd, 0xe8, 0x20, 0xb5, 0x99, 0x09, 0x89, +/*6920:*/ 0x8c, 0x1f, 0x2f, 0x4b, 0xdb, 0xc2, 0x80, 0x2e, 0xca, 0x67, 0x4a, 0x75, 0xdc, 0x25, 0x35, 0xc2, +/*6930:*/ 0xe5, 0xe6, 0xc6, 0xfc, 0xd9, 0x14, 0x37, 0x5c, 0x4b, 0x2b, 0xcb, 0x59, 0x47, 0x1f, 0x83, 0x93, +/*6940:*/ 0x50, 0x61, 0xb3, 0x3f, 0x91, 0x14, 0x54, 0x92, 0x34, 0xc7, 0x05, 0x64, 0x31, 0xaa, 0x8f, 0xbc, +/*6950:*/ 0xae, 0xcf, 0x54, 0x50, 0x41, 0x98, 0x94, 0x2e, 0x5c, 0xc3, 0xe6, 0xab, 0x38, 0xbd, 0x80, 0xe7, +/*6960:*/ 0x6f, 0x13, 0xf8, 0x41, 0xd5, 0x90, 0x7f, 0xea, 0xa9, 0x90, 0x64, 0x33, 0x9e, 0x55, 0xe1, 0xb2, +/*6970:*/ 0x8a, 0x9d, 0x1c, 0xaa, 0x73, 0x5f, 0xda, 0x27, 0xf4, 0x38, 0xd2, 0x48, 0x39, 0x61, 0x14, 0xd4, +/*6980:*/ 0x76, 0x2b, 0x47, 0x2b, 0xb2, 0x92, 0x7c, 0xa2, 0xb7, 0x8b, 0x52, 0x79, 0x6f, 0x91, 0xe5, 0x9e, +/*6990:*/ 0xc5, 0x7f, 0xe2, 0x44, 0x38, 0xfa, 0x1d, 0x25, 0x03, 0x5b, 0x6e, 0x2a, 0x84, 0xfd, 0xed, 0xa6, +/*69a0:*/ 0x78, 0x4e, 0xa8, 0x2e, 0x69, 0x81, 0x00, 0x5c, 0x90, 0x38, 0x6b, 0x6d, 0x0f, 0x71, 0x99, 0x92, +/*69b0:*/ 0x71, 0x5f, 0x5d, 0x45, 0x1a, 0x5b, 0x5e, 0xfd, 0x4d, 0x68, 0xca, 0xa2, 0xdb, 0xc6, 0x80, 0x61, +/*69c0:*/ 0x75, 0x07, 0x86, 0xd0, 0x72, 0xf6, 0x41, 0x7a, 0xd5, 0x1f, 0x59, 0x62, 0x61, 0x6f, 0x8a, 0xa9, +/*69d0:*/ 0x57, 0xa8, 0xfa, 0x76, 0x4d, 0x7a, 0x1d, 0xef, 0x22, 0xb4, 0x83, 0x28, 0x53, 0x78, 0x99, 0x80, +/*69e0:*/ 0x01, 0xb2, 0x78, 0xb4, 0xff, 0x57, 0x3d, 0x05, 0xaf, 0x36, 0x9c, 0x1e, 0x80, 0x2d, 0x10, 0xea, +/*69f0:*/ 0x39, 0x69, 0x52, 0xc6, 0x90, 0xcd, 0x43, 0x1d, 0x99, 0xf2, 0xd2, 0x8c, 0xd4, 0x31, 0xb8, 0xba, +/*6a00:*/ 0x14, 0xbb, 0x1a, 0x0d, 0x7b, 0x70, 0xb5, 0x65, 0x33, 0x71, 0xc3, 0x75, 0xd9, 0x3f, 0xa6, 0x2b, +/*6a10:*/ 0xb8, 0xb4, 0xb6, 0xad, 0x0a, 0x4c, 0x16, 0x2d, 0x14, 0xbb, 0xdc, 0x1f, 0x44, 0xf2, 0x58, 0x5d, +/*6a20:*/ 0x0c, 0x9d, 0xcf, 0x8f, 0xd3, 0x0f, 0xea, 0xee, 0x53, 0x69, 0xfc, 0x9c, 0xaa, 0xbc, 0xcf, 0x62, +/*6a30:*/ 0x81, 0x1b, 0x50, 0xd4, 0x9b, 0x7b, 0xf3, 0x43, 0xe3, 0x87, 0xc0, 0x5b, 0x27, 0x11, 0x0b, 0x29, +/*6a40:*/ 0x00, 0xb3, 0x48, 0x2e, 0xad, 0xf9, 0x24, 0x96, 0xb3, 0x41, 0x01, 0x5b, 0x14, 0xea, 0x25, 0x4e, +/*6a50:*/ 0xe7, 0x63, 0xf6, 0xfa, 0xd0, 0x1d, 0x7b, 0x30, 0x82, 0x4e, 0x55, 0xc3, 0xca, 0xa4, 0x7c, 0xe5, +/*6a60:*/ 0x1a, 0x8d, 0x30, 0xd6, 0x40, 0x1e, 0x2c, 0xa2, 0xc4, 0x0c, 0x77, 0x0d, 0xda, 0xd6, 0x9e, 0xc5, +/*6a70:*/ 0x25, 0xea, 0xa6, 0xde, 0x9f, 0xcd, 0xe8, 0xe8, 0x24, 0x7f, 0xfb, 0xe1, 0xc2, 0xce, 0x37, 0x4f, +/*6a80:*/ 0xc8, 0x06, 0xdd, 0xba, 0xa3, 0x52, 0x4f, 0x63, 0x33, 0x13, 0x8f, 0x8a, 0x77, 0xb4, 0xd5, 0xf8, +/*6a90:*/ 0x39, 0xe8, 0xdb, 0x01, 0x7c, 0xd4, 0xf1, 0x48, 0x2c, 0xab, 0xa1, 0x7f, 0xbe, 0x67, 0xe2, 0x30, +/*6aa0:*/ 0x1c, 0x41, 0x0c, 0x90, 0x57, 0x91, 0x08, 0x4f, 0x9e, 0xd0, 0xee, 0x07, 0x94, 0xff, 0x83, 0xe7, +/*6ab0:*/ 0x7b, 0xec, 0x22, 0xfb, 0xde, 0xc0, 0x0f, 0xba, 0x48, 0xd1, 0xe1, 0x4d, 0x14, 0xe1, 0x7b, 0x38, +/*6ac0:*/ 0x4c, 0x6d, 0x39, 0x35, 0xfe, 0x6b, 0x99, 0x30, 0x47, 0xd3, 0xf4, 0xec, 0x19, 0x65, 0x81, 0x19, +/*6ad0:*/ 0xfb, 0x7d, 0x86, 0xec, 0xe4, 0x7c, 0x7f, 0xe6, 0x8d, 0x45, 0x60, 0xdb, 0xcb, 0xbd, 0x1c, 0x12, +/*6ae0:*/ 0x4a, 0x45, 0x61, 0x07, 0xb2, 0xfc, 0x39, 0x9b, 0xa7, 0xe7, 0xd3, 0x20, 0x51, 0x92, 0x98, 0xc3, +/*6af0:*/ 0x88, 0x72, 0xc7, 0x2f, 0xf9, 0xdc, 0xf7, 0x2f, 0x19, 0x68, 0x13, 0x03, 0x9f, 0x0a, 0xdb, 0x46, +/*6b00:*/ 0x0e, 0x89, 0x36, 0x70, 0x7b, 0xb8, 0x6d, 0x62, 0x8e, 0x25, 0xdd, 0x6e, 0xf5, 0x5b, 0xd5, 0x4c, +/*6b10:*/ 0x8a, 0x35, 0x1d, 0x78, 0x44, 0x0d, 0x5d, 0xfe, 0xa4, 0xb3, 0x43, 0xc6, 0x67, 0x2f, 0x36, 0x9b, +/*6b20:*/ 0xfa, 0xc0, 0x9f, 0x18, 0x4e, 0xd3, 0x2a, 0x94, 0xf1, 0x4d, 0x23, 0x95, 0x89, 0x13, 0x7d, 0x1f, +/*6b30:*/ 0x30, 0x5b, 0xd8, 0x4e, 0x4b, 0x94, 0xcc, 0x52, 0xf5, 0x9e, 0xc6, 0xdb, 0xb3, 0x9e, 0x87, 0x0d, +/*6b40:*/ 0x99, 0xa0, 0x0d, 0x69, 0x9d, 0x6b, 0xd5, 0x75, 0x96, 0x43, 0xa4, 0xb3, 0x5f, 0x5f, 0x53, 0xcb, +/*6b50:*/ 0x7d, 0x75, 0x0e, 0xef, 0x25, 0x0d, 0x8c, 0x44, 0xa2, 0x35, 0x92, 0xd3, 0xaa, 0x4c, 0x83, 0xb8, +/*6b60:*/ 0xcf, 0x8f, 0xf4, 0xca, 0xa2, 0x04, 0x2f, 0x4a, 0x3e, 0x89, 0xd1, 0x8b, 0x69, 0x11, 0x7d, 0x3b, +/*6b70:*/ 0x3e, 0xf5, 0xd8, 0xaa, 0x5d, 0xc1, 0xb7, 0x1b, 0xc6, 0xe4, 0x95, 0x18, 0x11, 0xeb, 0xac, 0xd1, +/*6b80:*/ 0x4e, 0xc4, 0xd9, 0x33, 0x26, 0x2a, 0xc5, 0xb7, 0x3a, 0x1a, 0xf8, 0x67, 0xcc, 0x1d, 0x8e, 0xa6, +/*6b90:*/ 0xa2, 0xac, 0x34, 0x74, 0x29, 0xee, 0x4d, 0xfa, 0x3b, 0x5e, 0xb2, 0xe7, 0xc9, 0x7b, 0xf3, 0x53, +/*6ba0:*/ 0x40, 0x0e, 0x0d, 0xbd, 0x00, 0x5b, 0xe0, 0x44, 0x24, 0x73, 0xc3, 0xa8, 0xc1, 0x6b, 0x49, 0xb0, +/*6bb0:*/ 0x7d, 0x32, 0xac, 0xa6, 0x5f, 0x98, 0x4d, 0x1c, 0xdd, 0x18, 0xa8, 0x2d, 0x2d, 0x81, 0x42, 0x65, +/*6bc0:*/ 0xbd, 0x66, 0x06, 0x82, 0xdd, 0x56, 0x7f, 0x02, 0x75, 0xc9, 0x1e, 0x40, 0xa6, 0x23, 0x6d, 0x69, +/*6bd0:*/ 0xd6, 0xc8, 0x3c, 0xaa, 0xe4, 0xb8, 0xb4, 0xaf, 0x69, 0xa9, 0xe3, 0x8f, 0x15, 0x7c, 0x82, 0x78, +/*6be0:*/ 0x97, 0xf2, 0xb9, 0x72, 0x8b, 0x72, 0xc9, 0x6a, 0xa5, 0x33, 0x44, 0x16, 0xf8, 0x4d, 0x0c, 0xbd, +/*6bf0:*/ 0x9f, 0x54, 0x02, 0xd8, 0xd4, 0x7f, 0x80, 0x0f, 0x4c, 0x08, 0x26, 0xcf, 0x8e, 0xda, 0x69, 0x24, +/*6c00:*/ 0xf0, 0x6c, 0x22, 0x56, 0x7a, 0x2c, 0x6a, 0x97, 0x39, 0x82, 0x8c, 0xbc, 0x6a, 0x70, 0xc9, 0xb3, +/*6c10:*/ 0xca, 0x7d, 0x57, 0x27, 0x77, 0x1b, 0xd5, 0x4a, 0x80, 0x60, 0x7f, 0x0d, 0xb2, 0xdd, 0x9c, 0x63, +/*6c20:*/ 0xc8, 0xf4, 0xc3, 0xdd, 0x0b, 0xee, 0x1b, 0x7e, 0x7c, 0x75, 0xcb, 0x62, 0xee, 0x7f, 0x21, 0xd3, +/*6c30:*/ 0x9d, 0x3d, 0x25, 0x4f, 0xed, 0x96, 0x05, 0xa0, 0xce, 0x16, 0x9c, 0xf5, 0x46, 0xb5, 0xf0, 0x38, +/*6c40:*/ 0x66, 0x00, 0x55, 0x4a, 0x3f, 0xa4, 0xb1, 0x7a, 0xd5, 0x1b, 0x88, 0xfa, 0x7c, 0xd5, 0x7a, 0x2c, +/*6c50:*/ 0xec, 0x1a, 0xf7, 0x06, 0x4a, 0x01, 0xc4, 0x92, 0xd8, 0xcb, 0x6f, 0x47, 0xd4, 0x77, 0xd7, 0x28, +/*6c60:*/ 0xfd, 0xea, 0x7c, 0xbb, 0x9b, 0xb6, 0x35, 0x30, 0xea, 0xc8, 0x79, 0xe0, 0x2f, 0xcd, 0xf2, 0x4d, +/*6c70:*/ 0x9f, 0xd0, 0x29, 0x00, 0x55, 0xb4, 0xca, 0xc2, 0x3a, 0xb9, 0x30, 0x10, 0xb2, 0x94, 0xaf, 0x6f, +/*6c80:*/ 0x4d, 0x18, 0xd9, 0x6f, 0x7c, 0xb6, 0x6d, 0x43, 0xc6, 0xb5, 0x8a, 0x33, 0xd0, 0x4b, 0xcb, 0x14, +/*6c90:*/ 0x84, 0x93, 0x59, 0xcc, 0xe2, 0xc6, 0xe1, 0x42, 0x32, 0x13, 0xf0, 0xb8, 0x28, 0x40, 0x43, 0x22, +/*6ca0:*/ 0x65, 0x69, 0xf1, 0xa7, 0x8a, 0x3a, 0x24, 0x28, 0x87, 0x6f, 0x20, 0x2c, 0x4c, 0x22, 0x4a, 0x05, +/*6cb0:*/ 0x53, 0x8c, 0x93, 0x96, 0x41, 0x47, 0x3f, 0xca, 0xe9, 0x26, 0xf3, 0xdc, 0x24, 0x43, 0x84, 0x52, +/*6cc0:*/ 0x17, 0x76, 0xac, 0xdb, 0xde, 0x36, 0xfd, 0xa9, 0x37, 0x8c, 0x5e, 0x6b, 0x6b, 0xcd, 0xaf, 0xf5, +/*6cd0:*/ 0xb5, 0xe2, 0x0a, 0x42, 0xd9, 0x3a, 0x55, 0x22, 0x1b, 0x9f, 0x56, 0x78, 0x5b, 0x6c, 0x2f, 0x58, +/*6ce0:*/ 0x6a, 0x2d, 0x1b, 0xa3, 0x84, 0x52, 0xc6, 0x59, 0xc4, 0xe7, 0x66, 0x3d, 0x18, 0x45, 0x7d, 0x42, +/*6cf0:*/ 0x3b, 0x4f, 0x80, 0xa7, 0xc8, 0x54, 0x7b, 0xde, 0x87, 0x19, 0xdd, 0xd8, 0xfc, 0x8d, 0xef, 0x3a, +/*6d00:*/ 0x3f, 0x68, 0x82, 0xa2, 0x62, 0xb3, 0x0c, 0x82, 0x6a, 0x30, 0xb2, 0xc6, 0x64, 0xac, 0xd9, 0xda, +/*6d10:*/ 0xad, 0xa7, 0xe3, 0x91, 0xaa, 0xb9, 0x1e, 0xc5, 0x35, 0x6e, 0x74, 0x58, 0x6e, 0xc5, 0x57, 0x6c, +/*6d20:*/ 0x1a, 0x8e, 0x58, 0x4e, 0xe9, 0x60, 0xf7, 0xb5, 0x6c, 0x88, 0x49, 0xf3, 0x47, 0xd4, 0x6e, 0xf2, +/*6d30:*/ 0x70, 0xcd, 0x37, 0x18, 0x43, 0x61, 0x2f, 0x41, 0x67, 0xd8, 0xd1, 0x02, 0x73, 0x85, 0x87, 0xcc, +/*6d40:*/ 0xae, 0xcc, 0x0f, 0xbb, 0xaa, 0x72, 0x30, 0xad, 0x8f, 0x65, 0xbe, 0x71, 0xa6, 0xc7, 0x85, 0xf7, +/*6d50:*/ 0xd1, 0xc1, 0x27, 0x7b, 0xbc, 0xc2, 0xd5, 0x94, 0x91, 0x0f, 0x21, 0xc1, 0x43, 0x02, 0xbf, 0xe3, +/*6d60:*/ 0xdb, 0x27, 0xbb, 0x50, 0x01, 0x22, 0x52, 0x11, 0x66, 0x24, 0xed, 0x79, 0xbb, 0x1f, 0xe7, 0x80, +/*6d70:*/ 0x7b, 0xc5, 0xba, 0xdc, 0x20, 0xba, 0x04, 0xa2, 0x1c, 0x2f, 0x99, 0x4f, 0xe0, 0xee, 0xa9, 0x02, +/*6d80:*/ 0xf5, 0x86, 0xd9, 0xd4, 0x93, 0x43, 0x3b, 0xc7, 0x7a, 0x98, 0x91, 0xa4, 0xf1, 0xf0, 0x4f, 0x25, +/*6d90:*/ 0x2b, 0x33, 0x07, 0xfb, 0xd2, 0xc8, 0x55, 0xbf, 0x08, 0x03, 0x57, 0x9c, 0x57, 0x63, 0x01, 0xcb, +/*6da0:*/ 0x10, 0xd6, 0x06, 0xf8, 0x89, 0xa5, 0x79, 0xe1, 0xf9, 0x1e, 0x1e, 0x82, 0xec, 0x33, 0x9c, 0xb6, +/*6db0:*/ 0x89, 0xca, 0xb5, 0x3f, 0xee, 0xcd, 0x83, 0x1d, 0x82, 0xf1, 0x15, 0x71, 0x5f, 0x81, 0xe2, 0x99, +/*6dc0:*/ 0x01, 0x17, 0x41, 0x07, 0x02, 0x10, 0x93, 0x0b, 0x6c, 0x33, 0xd5, 0x86, 0xf4, 0xff, 0xaf, 0xe3, +/*6dd0:*/ 0x99, 0xae, 0xe0, 0xb1, 0x4f, 0xce, 0x2a, 0x75, 0xe1, 0x09, 0xb6, 0x90, 0x41, 0xa8, 0x4a, 0x02, +/*6de0:*/ 0x0f, 0xf1, 0x93, 0x1e, 0xa7, 0x91, 0x8d, 0x5a, 0xd8, 0x65, 0x97, 0x76, 0x50, 0xed, 0x39, 0x0a, +/*6df0:*/ 0x29, 0x39, 0x2f, 0x98, 0x41, 0x7a, 0x3b, 0x2c, 0x5f, 0xeb, 0x93, 0xb1, 0xf3, 0x32, 0xa5, 0xda, +/*6e00:*/ 0xf6, 0x97, 0x36, 0xdf, 0x50, 0xe5, 0x7a, 0x25, 0x1d, 0x4f, 0x66, 0x1b, 0x56, 0x45, 0x37, 0xe5, +/*6e10:*/ 0x2e, 0x72, 0x49, 0xe8, 0x8e, 0x20, 0x39, 0xe4, 0x52, 0xc3, 0xba, 0xc7, 0x48, 0xf1, 0x72, 0x17, +/*6e20:*/ 0xd6, 0x9a, 0xb9, 0x12, 0x54, 0x95, 0x64, 0x30, 0xd1, 0x4a, 0x91, 0x8d, 0xe5, 0xfd, 0x44, 0xd6, +/*6e30:*/ 0x79, 0xf7, 0xcf, 0x11, 0x93, 0xec, 0x44, 0xb6, 0xa9, 0x8d, 0xa6, 0x6a, 0xbc, 0x29, 0x99, 0x8a, +/*6e40:*/ 0x6a, 0x85, 0x3d, 0xaf, 0x4c, 0x90, 0x20, 0x73, 0xbd, 0x49, 0x15, 0x71, 0x83, 0xfb, 0xf1, 0xe0, +/*6e50:*/ 0xb5, 0x5c, 0xba, 0x07, 0x5b, 0xb2, 0xda, 0xf0, 0x53, 0xc8, 0xed, 0x49, 0x3b, 0x59, 0xdd, 0xf3, +/*6e60:*/ 0x03, 0xb5, 0x39, 0xd7, 0x75, 0x68, 0xf6, 0x20, 0x2a, 0xc2, 0xe8, 0x82, 0xbc, 0xf9, 0x72, 0xce, +/*6e70:*/ 0x6b, 0xcc, 0x36, 0x15, 0x44, 0x0d, 0x9c, 0x27, 0xdc, 0x79, 0x06, 0xba, 0xd9, 0x48, 0x3a, 0xf3, +/*6e80:*/ 0x75, 0xf8, 0x14, 0xbf, 0xae, 0xf5, 0xb8, 0x65, 0x3f, 0x04, 0xe8, 0xdd, 0xa4, 0x13, 0x55, 0x98, +/*6e90:*/ 0x53, 0x7c, 0xba, 0xbe, 0xe2, 0xa6, 0x71, 0x3b, 0x87, 0x72, 0x2e, 0xa7, 0x32, 0x52, 0xb7, 0x2d, +/*6ea0:*/ 0xc6, 0xd8, 0x66, 0x64, 0xbb, 0x14, 0x59, 0xa6, 0x43, 0x44, 0x62, 0x8d, 0xd7, 0x84, 0x01, 0xe4, +/*6eb0:*/ 0xf4, 0xe5, 0xbb, 0x40, 0x10, 0xc7, 0x45, 0x88, 0x72, 0x7a, 0xd6, 0xe2, 0x9f, 0xfa, 0x86, 0xbf, +/*6ec0:*/ 0x1a, 0x61, 0x27, 0xe7, 0x76, 0x7c, 0xa1, 0xc3, 0xfc, 0xbc, 0x03, 0x7b, 0xb0, 0xfb, 0x42, 0x6e, +/*6ed0:*/ 0xd6, 0x2f, 0x94, 0x9a, 0xd0, 0xb3, 0xf3, 0xfc, 0x9a, 0xef, 0x42, 0xc5, 0xa6, 0x1a, 0x98, 0x01, +/*6ee0:*/ 0x67, 0xd0, 0x59, 0xa4, 0x44, 0x51, 0x8f, 0x34, 0x80, 0xab, 0x6a, 0x64, 0x9e, 0xc0, 0xe8, 0x37, +/*6ef0:*/ 0x1a, 0x66, 0x59, 0x73, 0x80, 0x3f, 0x57, 0xd8, 0xb5, 0xa7, 0xa7, 0xeb, 0x34, 0xf4, 0x94, 0xc4, +/*6f00:*/ 0x00, 0x0f, 0x01, 0x00, 0x14, 0x14, 0x00, 0x00, 0x9b, 0x03, 0x87, 0x06, 0x80, 0x81, 0x82, 0x83, +/*6f10:*/ 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x10, 0x11, 0x12, 0x13, +/*6f20:*/ 0x14, 0x15, 0x16, 0x17, 0x18, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, +/*6f30:*/ 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0x00, 0x00, +/*6f40:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x3a, 0x00, 0x1e, 0x19, 0x05, 0xfd, 0xfd, 0x3d, 0x08, 0x00, +/*6f50:*/ 0x00, 0x00, 0xbc, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*6f60:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*6f70:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*6f80:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*6f90:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*6fa0:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*6fb0:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*6fc0:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*6fd0:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*6fe0:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*6ff0:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*7000:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*7010:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*7020:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*7030:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*7040:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*7050:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*7060:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*7070:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*7080:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*7090:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*70a0:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*70b0:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*70c0:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*70d0:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*70e0:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*70f0:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0x80, 0x60, 0x7d, +/*7100:*/ 0xFF }; + +#elif defined(CONFIG_MACH_BLADE2) //&& !defined(CONFIG_TOUCHSCREEN_VIRTUAL_KEYS) +// 736V + +// This is Synaptics Image File Data - Auto-Generated - DO NOT EDIT!!! + + +const unsigned char SynaFirmware[] = { +/*0000:*/ 0x36, 0x4c, 0xcb, 0x49, 0x00, 0x00, 0x00, 0x03, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +/*0010:*/ 0x54, 0x4d, 0x31, 0x39, 0x37, 0x37, 0x2d, 0x30, 0x30, 0x31, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, +/*0020:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*0030:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*0040:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*0050:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*0060:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*0070:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*0080:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*0090:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*00a0:*/ 0x49, 0x32, 0x43, 0x00, 0x0e, 0x00, 0xff, 0x00, 0x0c, 0x0d, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, +/*00b0:*/ 0x49, 0x32, 0x43, 0x00, 0x0e, 0x00, 0xff, 0x00, 0x0c, 0x0d, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, +/*00c0:*/ 0x28, 0x28, 0x2d, 0x3a, 0x4a, 0x72, 0xad, 0xfd, 0x2e, 0x85, 0xb2, 0xe7, 0x34, 0x9c, 0x0d, 0x6d, +/*00d0:*/ 0x66, 0xcd, 0x02, 0xcb, 0x9b, 0x99, 0x17, 0x72, 0x29, 0x2c, 0xab, 0x6b, 0x93, 0xbd, 0x96, 0x42, +/*00e0:*/ 0x14, 0xdb, 0x1b, 0x8a, 0xad, 0x9d, 0x8f, 0x91, 0xda, 0x12, 0xaa, 0xd0, 0x8a, 0x49, 0xa7, 0xc0, +/*00f0:*/ 0xee, 0x22, 0x63, 0xd1, 0x88, 0xf7, 0x56, 0x25, 0x02, 0xcb, 0x20, 0xff, 0x15, 0x48, 0xd0, 0x5d, +/*0100:*/ 0xf7, 0x38, 0xfb, 0xc0, 0x84, 0x38, 0xad, 0x1e, 0x50, 0x97, 0xc8, 0x15, 0x25, 0x26, 0xe4, 0xc8, +/*0110:*/ 0x45, 0x9c, 0xbf, 0x7e, 0x26, 0x26, 0xad, 0x00, 0xfc, 0xdf, 0x00, 0xbb, 0x5b, 0xd4, 0x84, 0x54, +/*0120:*/ 0xec, 0x78, 0x7b, 0xd0, 0x8b, 0x7f, 0x50, 0x1b, 0x85, 0x78, 0x0b, 0x3e, 0x34, 0x09, 0x4c, 0xb5, +/*0130:*/ 0x45, 0x3d, 0x28, 0xad, 0x06, 0x8e, 0x06, 0xd6, 0x5f, 0xb3, 0xdb, 0xca, 0x0d, 0xf9, 0x09, 0x12, +/*0140:*/ 0xb0, 0x12, 0x98, 0x51, 0x95, 0x49, 0xfc, 0x98, 0x0e, 0x89, 0xe8, 0x81, 0xfc, 0x3f, 0x52, 0x04, +/*0150:*/ 0x79, 0xf6, 0xa8, 0x84, 0xad, 0x96, 0x97, 0xa0, 0x34, 0x09, 0x5f, 0x76, 0x53, 0x1c, 0x74, 0x4d, +/*0160:*/ 0x3c, 0x76, 0xfa, 0x1d, 0xa7, 0x33, 0xf8, 0x2c, 0x08, 0x38, 0x12, 0x71, 0xa1, 0x1b, 0x93, 0x1b, +/*0170:*/ 0x71, 0x72, 0x0e, 0xd5, 0xfc, 0x82, 0x88, 0x36, 0xdd, 0xf3, 0xfd, 0xd5, 0x12, 0xee, 0x7c, 0x3f, +/*0180:*/ 0x27, 0x06, 0x0d, 0x7d, 0xa9, 0x50, 0x7e, 0x24, 0x4f, 0xf7, 0x5f, 0x27, 0x13, 0x9e, 0xc4, 0xf4, +/*0190:*/ 0x8f, 0xc9, 0x96, 0xab, 0x25, 0xc8, 0x57, 0xad, 0x83, 0x8e, 0x20, 0xe5, 0xfd, 0xb9, 0xf3, 0x67, +/*01a0:*/ 0x6d, 0xa9, 0xf3, 0x5b, 0x1f, 0x3c, 0xbf, 0xee, 0xa7, 0x16, 0x7b, 0xa5, 0xc0, 0x0f, 0x8f, 0xdd, +/*01b0:*/ 0xfd, 0x0c, 0x5c, 0x43, 0xb1, 0x61, 0xf5, 0x98, 0x87, 0x2e, 0xe7, 0xcd, 0x5c, 0x1f, 0xa9, 0xd1, +/*01c0:*/ 0x26, 0xdd, 0x85, 0x92, 0x18, 0x93, 0x7b, 0xcc, 0x9d, 0xfe, 0xf4, 0x82, 0x7a, 0x64, 0x1a, 0xae, +/*01d0:*/ 0xa3, 0xdb, 0x64, 0x6c, 0x1b, 0x4d, 0x68, 0xc4, 0x17, 0xbf, 0x65, 0xc1, 0x29, 0x19, 0xc7, 0x27, +/*01e0:*/ 0x7d, 0xf5, 0xca, 0xc6, 0x71, 0x7a, 0x56, 0x92, 0x4f, 0x9c, 0xd3, 0xe5, 0xff, 0xe5, 0xa3, 0xa3, +/*01f0:*/ 0xba, 0xfe, 0x0b, 0xc5, 0x34, 0xad, 0xdd, 0xea, 0x66, 0x94, 0x5f, 0x6b, 0x0f, 0x44, 0xb1, 0xa5, +/*0200:*/ 0x5f, 0xd7, 0xae, 0x3d, 0x92, 0x52, 0x59, 0x9c, 0xc4, 0x34, 0x09, 0x66, 0xc9, 0x9f, 0xf7, 0x0c, +/*0210:*/ 0xdd, 0x98, 0x4f, 0x1f, 0x60, 0x29, 0xbc, 0xa9, 0x50, 0x7c, 0xe6, 0xe0, 0xc6, 0x4e, 0x82, 0xe3, +/*0220:*/ 0x13, 0xc6, 0x06, 0xdd, 0x12, 0x16, 0xd0, 0x8e, 0x28, 0x56, 0xfe, 0xcd, 0x36, 0xed, 0xc9, 0x6a, +/*0230:*/ 0x9d, 0x65, 0x8e, 0xbf, 0x7e, 0xfe, 0x34, 0x1f, 0xd8, 0x46, 0x88, 0xb7, 0x59, 0x1d, 0xf8, 0x09, +/*0240:*/ 0x0d, 0x16, 0x77, 0x47, 0x9b, 0x8f, 0x55, 0x79, 0x7a, 0x29, 0x44, 0xa2, 0x6d, 0xf0, 0x7c, 0x24, +/*0250:*/ 0x1e, 0x84, 0x53, 0x0e, 0x1b, 0xd9, 0xda, 0x84, 0xfd, 0x34, 0xd3, 0xdb, 0x90, 0x45, 0x88, 0x96, +/*0260:*/ 0x07, 0x0e, 0x9f, 0x8d, 0x8f, 0xe6, 0xd5, 0xd3, 0x3f, 0x1e, 0x98, 0xc8, 0xe5, 0xfa, 0x7b, 0xf5, +/*0270:*/ 0xb0, 0xba, 0x84, 0xe9, 0xd5, 0xcc, 0x58, 0x92, 0x43, 0x6c, 0xb6, 0x5f, 0x56, 0xf2, 0x18, 0x5b, +/*0280:*/ 0xc5, 0x5e, 0x3e, 0x2f, 0xb8, 0x92, 0xd5, 0x17, 0x49, 0x32, 0x8d, 0x33, 0xac, 0xe8, 0x36, 0x9a, +/*0290:*/ 0x2e, 0x01, 0x8a, 0x86, 0x75, 0x55, 0x6b, 0x2c, 0xd7, 0x8e, 0x5c, 0x63, 0xc5, 0xaa, 0x6b, 0xa9, +/*02a0:*/ 0x9a, 0x41, 0x91, 0x32, 0x47, 0x9e, 0x3b, 0xec, 0x01, 0x78, 0xdc, 0x18, 0x59, 0x1f, 0xdc, 0x76, +/*02b0:*/ 0x66, 0x63, 0xe7, 0xdd, 0xaa, 0x9f, 0x39, 0x9b, 0x13, 0x74, 0xd4, 0x09, 0x6d, 0x45, 0xbb, 0xc9, +/*02c0:*/ 0x41, 0xcc, 0xaf, 0x7c, 0x3b, 0x86, 0xbc, 0x8a, 0x42, 0x96, 0xe1, 0x55, 0xe9, 0x20, 0xc2, 0xcb, +/*02d0:*/ 0xd0, 0x6f, 0x28, 0x82, 0xaf, 0xc8, 0xfc, 0xb8, 0xfb, 0x8d, 0x55, 0xb7, 0xe8, 0x3b, 0x0c, 0xcf, +/*02e0:*/ 0x24, 0x03, 0xfc, 0x0a, 0xd3, 0xa5, 0x1c, 0x96, 0x1c, 0xff, 0xdd, 0xf1, 0x7b, 0x40, 0x0d, 0x06, +/*02f0:*/ 0xca, 0x94, 0x76, 0x6d, 0x2f, 0x90, 0xcd, 0x5a, 0x62, 0x6e, 0xaa, 0xe6, 0xce, 0x60, 0xdf, 0xee, +/*0300:*/ 0x8b, 0xff, 0x5b, 0xc0, 0xe9, 0x4e, 0x96, 0xc3, 0x78, 0xd3, 0x25, 0x22, 0xfd, 0xc1, 0xac, 0x3e, +/*0310:*/ 0x3a, 0x68, 0x39, 0x86, 0x15, 0x35, 0x53, 0x73, 0x94, 0xc1, 0x16, 0xc4, 0x06, 0xdc, 0x80, 0xe0, +/*0320:*/ 0xba, 0x4d, 0xca, 0x17, 0x52, 0xf1, 0xff, 0x9f, 0x8a, 0x21, 0x20, 0x25, 0xbc, 0xf2, 0x8d, 0xc6, +/*0330:*/ 0x53, 0x03, 0xa1, 0xd8, 0xda, 0x40, 0x74, 0xf9, 0x6c, 0x67, 0x3b, 0x78, 0x8a, 0x4d, 0xd0, 0x4b, +/*0340:*/ 0xef, 0x76, 0x29, 0xc7, 0xcc, 0xd0, 0x34, 0xce, 0x05, 0x72, 0x21, 0x71, 0xcd, 0x85, 0xb4, 0xd5, +/*0350:*/ 0x75, 0x41, 0x18, 0x6b, 0x7b, 0x92, 0x74, 0x57, 0x0a, 0x0b, 0xbd, 0x61, 0x60, 0xd0, 0x51, 0xf8, +/*0360:*/ 0x5c, 0x6f, 0xec, 0x8d, 0x19, 0xc4, 0x33, 0x5b, 0xf6, 0x17, 0x56, 0xec, 0x25, 0x59, 0xe7, 0x1c, +/*0370:*/ 0x05, 0x29, 0x2d, 0x40, 0x1f, 0x07, 0x29, 0x83, 0x82, 0x9a, 0x8a, 0xad, 0x19, 0x40, 0x50, 0xa9, +/*0380:*/ 0x21, 0x8f, 0x98, 0xfe, 0x7b, 0xcb, 0xf2, 0xdf, 0xf2, 0xea, 0x8f, 0x00, 0x02, 0xd6, 0xb6, 0xed, +/*0390:*/ 0x20, 0xef, 0x2f, 0x7a, 0x21, 0x2e, 0x2e, 0x72, 0x84, 0x7d, 0x48, 0x9d, 0xf1, 0x62, 0x07, 0xe6, +/*03a0:*/ 0x58, 0x66, 0x08, 0x50, 0x65, 0xe4, 0x34, 0x9e, 0x04, 0xd3, 0xce, 0x2f, 0x5e, 0x87, 0xa4, 0x47, +/*03b0:*/ 0x38, 0xed, 0x00, 0x0f, 0xcf, 0x69, 0x05, 0x25, 0xd3, 0x1b, 0x02, 0xa3, 0x43, 0x5e, 0xce, 0x41, +/*03c0:*/ 0xd0, 0xf3, 0x6c, 0x04, 0x99, 0x2b, 0xca, 0x8a, 0x73, 0x75, 0xd1, 0xd5, 0xa2, 0xd5, 0xe7, 0x60, +/*03d0:*/ 0x23, 0x4e, 0xbe, 0x30, 0xe0, 0xf1, 0x8b, 0x44, 0x18, 0x11, 0xa6, 0xa2, 0x8c, 0xff, 0x2d, 0xb0, +/*03e0:*/ 0x6d, 0xc0, 0x4d, 0x87, 0x94, 0x93, 0x32, 0x34, 0x32, 0x10, 0x7f, 0x3d, 0x5d, 0xe8, 0x6b, 0x3c, +/*03f0:*/ 0xad, 0x6c, 0xfd, 0x21, 0x5d, 0x49, 0x9d, 0xdd, 0x55, 0x48, 0x7b, 0x7f, 0x9e, 0xb1, 0x6a, 0x9e, +/*0400:*/ 0x71, 0x10, 0x81, 0x44, 0xfa, 0x9c, 0x23, 0xaf, 0xe6, 0x53, 0xb4, 0x95, 0x0f, 0xdd, 0xfe, 0x90, +/*0410:*/ 0x6d, 0x02, 0x90, 0x2f, 0x32, 0xfd, 0x1e, 0xe8, 0x2c, 0xed, 0x67, 0x84, 0xdc, 0x6b, 0x1f, 0x5c, +/*0420:*/ 0xec, 0xa7, 0xd8, 0xe3, 0xdc, 0xac, 0x4f, 0xce, 0xcf, 0x77, 0x5b, 0x44, 0xb7, 0xba, 0xf4, 0x75, +/*0430:*/ 0x8d, 0x4c, 0x12, 0xef, 0x26, 0xfc, 0x09, 0x3d, 0x3b, 0x39, 0xbb, 0x39, 0x63, 0xb7, 0x64, 0xca, +/*0440:*/ 0xb7, 0x20, 0x35, 0x07, 0xbd, 0x1b, 0x48, 0xa4, 0xc7, 0xc3, 0x1e, 0x37, 0x81, 0x19, 0x8b, 0xd2, +/*0450:*/ 0x22, 0xf5, 0xfb, 0x95, 0x55, 0x5b, 0x2a, 0xcf, 0x82, 0xac, 0xf4, 0x29, 0x88, 0x4e, 0x56, 0x35, +/*0460:*/ 0xac, 0x10, 0x8a, 0xbb, 0x5d, 0xfb, 0x97, 0xee, 0x50, 0x94, 0xa6, 0xe3, 0xdc, 0xe5, 0x2b, 0xb5, +/*0470:*/ 0x9e, 0x00, 0xfa, 0x3b, 0x28, 0xc1, 0xde, 0xa5, 0x84, 0xb3, 0x69, 0x38, 0x2f, 0x5c, 0xed, 0x5e, +/*0480:*/ 0x39, 0x46, 0x2b, 0xda, 0x6b, 0x68, 0xca, 0x36, 0x2b, 0x1d, 0x37, 0xb0, 0x93, 0xbe, 0x2a, 0x12, +/*0490:*/ 0x06, 0xbe, 0x8a, 0x5d, 0x72, 0xc5, 0x47, 0xcf, 0x08, 0xd5, 0x10, 0x2e, 0x67, 0xde, 0x40, 0x94, +/*04a0:*/ 0x92, 0x2e, 0x93, 0xd8, 0x61, 0x90, 0x69, 0xfd, 0x8b, 0xa0, 0xc9, 0x2b, 0xfd, 0x10, 0x75, 0x60, +/*04b0:*/ 0xdf, 0xc7, 0x11, 0x64, 0x36, 0x4b, 0x08, 0x23, 0xed, 0x62, 0x17, 0x18, 0x8b, 0xb2, 0x20, 0x29, +/*04c0:*/ 0x90, 0xbb, 0x5d, 0x65, 0xe4, 0x1c, 0x9e, 0xa2, 0x97, 0x71, 0x3d, 0x7f, 0x92, 0x13, 0xda, 0xf2, +/*04d0:*/ 0x25, 0xc4, 0x8b, 0xa0, 0x5b, 0x31, 0x56, 0x74, 0x33, 0x3e, 0x9a, 0x53, 0xfa, 0x66, 0x50, 0xfc, +/*04e0:*/ 0xee, 0xb7, 0x11, 0x59, 0x81, 0x75, 0x55, 0x2d, 0xeb, 0x26, 0x3a, 0xec, 0x5e, 0x68, 0xd0, 0xf2, +/*04f0:*/ 0xd2, 0x3d, 0xed, 0x9b, 0x8b, 0x7f, 0xda, 0xa3, 0xb4, 0xb7, 0x55, 0xc4, 0xbc, 0x56, 0x5c, 0x71, +/*0500:*/ 0x63, 0x22, 0x0c, 0x5b, 0xbf, 0xa8, 0x10, 0x18, 0x8b, 0x51, 0xea, 0xd3, 0xb2, 0x1f, 0x3f, 0x40, +/*0510:*/ 0xcc, 0xa9, 0x67, 0x17, 0xa1, 0x45, 0x0a, 0x96, 0x5a, 0xe9, 0x26, 0xd1, 0x75, 0x0d, 0xeb, 0x8d, +/*0520:*/ 0xaf, 0xf1, 0xe7, 0x6b, 0xe7, 0xc0, 0x72, 0x90, 0xba, 0x2f, 0xaf, 0xc0, 0xd2, 0x4f, 0x09, 0x9e, +/*0530:*/ 0x17, 0xd4, 0x02, 0x72, 0x66, 0xef, 0x57, 0xdb, 0x23, 0xc8, 0x55, 0xb3, 0x3a, 0x17, 0x96, 0xfb, +/*0540:*/ 0x4e, 0x9d, 0x98, 0x09, 0x22, 0xdd, 0x62, 0x2b, 0xf9, 0x30, 0xb3, 0x87, 0x1f, 0x46, 0x6d, 0xa3, +/*0550:*/ 0x2f, 0x3f, 0xc5, 0x9c, 0x14, 0x6c, 0x30, 0x2f, 0xc1, 0x68, 0x25, 0x71, 0x56, 0xd9, 0x9a, 0xd9, +/*0560:*/ 0x27, 0x42, 0xc5, 0xfa, 0x42, 0xb4, 0x94, 0xc2, 0x0a, 0x27, 0x26, 0x47, 0x60, 0x60, 0x51, 0xe3, +/*0570:*/ 0xe2, 0xd8, 0xa0, 0x54, 0xef, 0x40, 0x3f, 0x67, 0x2f, 0x9b, 0xd5, 0x8a, 0x86, 0xe0, 0xa9, 0x8a, +/*0580:*/ 0xd6, 0xa2, 0x94, 0xc4, 0xfe, 0x5a, 0x04, 0x10, 0x24, 0x73, 0x7e, 0x6e, 0x64, 0x8a, 0x0b, 0xd6, +/*0590:*/ 0x89, 0x06, 0x04, 0x59, 0x93, 0xb0, 0xc7, 0xca, 0xe9, 0xae, 0x52, 0x3e, 0x49, 0xd5, 0x1f, 0x14, +/*05a0:*/ 0xfa, 0x44, 0xce, 0x54, 0x70, 0xe9, 0x47, 0xd2, 0x24, 0xc7, 0xe7, 0xc5, 0x2f, 0x18, 0x59, 0xb7, +/*05b0:*/ 0x18, 0x0f, 0xc6, 0xd1, 0x0f, 0x70, 0xf6, 0x74, 0xa6, 0x71, 0xe8, 0x08, 0xa6, 0x9e, 0x35, 0xcc, +/*05c0:*/ 0x99, 0x07, 0x8f, 0xfd, 0x8b, 0x98, 0xf1, 0x23, 0xab, 0x71, 0xbb, 0x1a, 0x51, 0x30, 0x06, 0x54, +/*05d0:*/ 0xe9, 0x3b, 0x16, 0x58, 0x3e, 0x86, 0x73, 0x42, 0x42, 0x16, 0x76, 0xd9, 0xae, 0x5a, 0xfe, 0xe2, +/*05e0:*/ 0x88, 0xa4, 0x2e, 0xf8, 0xaa, 0xad, 0x6e, 0x13, 0xa9, 0x10, 0xf6, 0x51, 0x8c, 0xce, 0xdf, 0xf8, +/*05f0:*/ 0x83, 0x06, 0x5d, 0xa6, 0x2d, 0x9b, 0xb1, 0x97, 0x00, 0x29, 0xb9, 0xdc, 0x10, 0x23, 0xb9, 0xe7, +/*0600:*/ 0x51, 0x80, 0x10, 0x7c, 0xb6, 0x1b, 0x26, 0x4d, 0x9a, 0x8f, 0x67, 0x5a, 0xff, 0xe6, 0xf7, 0x6d, +/*0610:*/ 0x4d, 0xee, 0x96, 0x1c, 0x57, 0x12, 0x8b, 0x1b, 0xf3, 0x55, 0x3e, 0x2d, 0x60, 0xfa, 0xf8, 0xb4, +/*0620:*/ 0xaf, 0xab, 0x95, 0x68, 0x45, 0x12, 0xa1, 0x2e, 0xb8, 0x32, 0x3c, 0xa7, 0x21, 0x4e, 0x8c, 0x27, +/*0630:*/ 0x7c, 0x8f, 0xfb, 0x79, 0x1e, 0x15, 0x90, 0xbd, 0x60, 0x29, 0xb2, 0x4c, 0x1e, 0xfd, 0xaf, 0x3b, +/*0640:*/ 0x1d, 0x17, 0x7f, 0x84, 0xab, 0xcc, 0x49, 0xab, 0x7d, 0xa7, 0x33, 0xf0, 0x7c, 0xa3, 0x99, 0x78, +/*0650:*/ 0x5f, 0xdf, 0x60, 0x3d, 0x6d, 0x42, 0xe1, 0xbc, 0xd5, 0x2f, 0x70, 0xa0, 0xe7, 0xab, 0xc6, 0xcd, +/*0660:*/ 0x66, 0x8a, 0xab, 0x2d, 0xa0, 0x01, 0xbc, 0x35, 0x96, 0x70, 0xef, 0x6d, 0x94, 0x7c, 0xea, 0x3a, +/*0670:*/ 0x48, 0xb8, 0xb4, 0xa8, 0x23, 0x08, 0x76, 0x7b, 0x4f, 0x96, 0x7e, 0x9c, 0xe2, 0x48, 0x92, 0x30, +/*0680:*/ 0x19, 0x50, 0x58, 0xf4, 0xcd, 0xfe, 0x9a, 0x1c, 0x81, 0xd4, 0x55, 0x1e, 0x81, 0x0b, 0xc4, 0x78, +/*0690:*/ 0x04, 0x69, 0x3c, 0x8a, 0xff, 0x06, 0xc2, 0xcf, 0xe5, 0xb6, 0xfb, 0x7e, 0x78, 0xae, 0xac, 0x09, +/*06a0:*/ 0x98, 0xd3, 0x1e, 0x98, 0x1f, 0x64, 0x20, 0x15, 0x0f, 0xd7, 0xc8, 0x80, 0x9e, 0xb7, 0xed, 0x26, +/*06b0:*/ 0x49, 0x17, 0xca, 0x53, 0x55, 0xd8, 0x7c, 0x68, 0xfb, 0x95, 0xf1, 0x44, 0xc7, 0x5f, 0xaf, 0x86, +/*06c0:*/ 0x2c, 0xb6, 0x1b, 0x5e, 0x94, 0xce, 0x7c, 0x42, 0xf5, 0xa6, 0x68, 0x6a, 0x40, 0xfb, 0xa9, 0x3c, +/*06d0:*/ 0xaf, 0x80, 0xa3, 0x92, 0x6e, 0x3f, 0xc4, 0xa3, 0x05, 0x13, 0x2d, 0x50, 0xc2, 0x0b, 0x0e, 0x30, +/*06e0:*/ 0x99, 0xa1, 0x2a, 0x20, 0xad, 0xf5, 0x74, 0x49, 0xab, 0x02, 0x29, 0x95, 0x75, 0x93, 0x8a, 0x64, +/*06f0:*/ 0x4d, 0xfa, 0x30, 0x14, 0xb6, 0x01, 0xa3, 0xe7, 0xf5, 0x0d, 0x6b, 0xa6, 0xfc, 0xec, 0x15, 0x64, +/*0700:*/ 0xc8, 0x3e, 0x8c, 0xb6, 0xa0, 0x3b, 0x18, 0x3b, 0xe2, 0x51, 0x95, 0x95, 0x4a, 0xde, 0xb3, 0x1c, +/*0710:*/ 0x3a, 0x56, 0x23, 0x19, 0x9e, 0xfa, 0xa0, 0x21, 0x13, 0x27, 0xaa, 0x92, 0x14, 0xde, 0x94, 0x35, +/*0720:*/ 0x58, 0xe4, 0x01, 0xde, 0xad, 0xe0, 0x78, 0xc1, 0x6f, 0xe7, 0x73, 0x41, 0xee, 0xa8, 0xfe, 0x3e, +/*0730:*/ 0xdd, 0x8a, 0xc2, 0x6f, 0x12, 0x0e, 0x4a, 0xf0, 0xd5, 0x59, 0x39, 0xcc, 0x01, 0xf9, 0x8e, 0xd1, +/*0740:*/ 0xce, 0x4b, 0x1f, 0x7e, 0x50, 0xd6, 0x2a, 0x64, 0x48, 0xf8, 0x4a, 0x14, 0xea, 0x56, 0x1b, 0x05, +/*0750:*/ 0x20, 0x98, 0x75, 0x59, 0x43, 0xa9, 0xb0, 0xc0, 0xde, 0x53, 0xbb, 0x83, 0x3c, 0x2c, 0xf9, 0xf8, +/*0760:*/ 0x81, 0x4a, 0xec, 0x12, 0x82, 0xe6, 0xcc, 0x07, 0x74, 0x46, 0x40, 0x1a, 0xc5, 0xfa, 0x8c, 0xef, +/*0770:*/ 0xf2, 0x4f, 0x8f, 0xff, 0x93, 0x91, 0xe8, 0x9a, 0xb7, 0x8d, 0x42, 0xfe, 0x14, 0xe1, 0x88, 0xd5, +/*0780:*/ 0x89, 0x02, 0xf6, 0xdd, 0x84, 0x4b, 0xb4, 0xe5, 0x10, 0xf0, 0x48, 0xc0, 0x20, 0x67, 0xfc, 0x00, +/*0790:*/ 0xa1, 0x19, 0x94, 0x92, 0x3b, 0x5e, 0x2f, 0x5b, 0x63, 0x93, 0x92, 0xca, 0x6f, 0x0c, 0x77, 0xf5, +/*07a0:*/ 0x4f, 0xcf, 0x6a, 0xf3, 0xbf, 0xf9, 0x8b, 0x69, 0xc0, 0x51, 0xbd, 0x2a, 0x89, 0xd4, 0xd2, 0x6a, +/*07b0:*/ 0xa7, 0x99, 0xfc, 0xcf, 0xce, 0x83, 0xbe, 0xf5, 0xf1, 0xc4, 0x85, 0xdf, 0x16, 0xf2, 0x4b, 0x17, +/*07c0:*/ 0x00, 0x3e, 0x7f, 0xa3, 0x47, 0x10, 0x52, 0xef, 0x69, 0xa0, 0x9b, 0xba, 0x41, 0xac, 0x5a, 0x49, +/*07d0:*/ 0xf2, 0x1b, 0x5f, 0x63, 0x93, 0x29, 0x76, 0x7f, 0x5f, 0x27, 0xbe, 0xfd, 0x4e, 0x51, 0x92, 0x9a, +/*07e0:*/ 0x93, 0x93, 0xd4, 0x60, 0x8c, 0xff, 0x49, 0x24, 0xf4, 0x3e, 0xe6, 0x64, 0xe1, 0x3d, 0x2c, 0xc5, +/*07f0:*/ 0x96, 0x5e, 0xb9, 0xad, 0xe6, 0x8a, 0x23, 0xdd, 0x17, 0x06, 0x06, 0x98, 0xaa, 0xc0, 0x9f, 0x3f, +/*0800:*/ 0x65, 0xff, 0xb8, 0xfa, 0x2c, 0x67, 0x4b, 0x17, 0x02, 0x54, 0xcf, 0x45, 0xc3, 0xe3, 0x76, 0xe4, +/*0810:*/ 0x04, 0xfe, 0xcc, 0xfd, 0x8c, 0xcc, 0xc3, 0x07, 0x3a, 0xa7, 0xe2, 0xc8, 0xf7, 0xcf, 0x93, 0xac, +/*0820:*/ 0x67, 0x9a, 0x75, 0x86, 0x22, 0xbf, 0x28, 0xa9, 0x18, 0xc1, 0xae, 0xe1, 0x5c, 0x40, 0x0c, 0xb4, +/*0830:*/ 0x09, 0x2d, 0x25, 0x93, 0xab, 0x34, 0xa4, 0xf4, 0xea, 0xaa, 0x9d, 0xad, 0xc8, 0x7a, 0xae, 0x8b, +/*0840:*/ 0x9f, 0xb0, 0x42, 0xdc, 0x53, 0x90, 0xc8, 0x1a, 0x41, 0x3c, 0xb4, 0x20, 0x10, 0x9c, 0x99, 0x2c, +/*0850:*/ 0x91, 0x0d, 0x83, 0x2a, 0x11, 0x83, 0xc6, 0x37, 0x2f, 0xac, 0x37, 0xb8, 0xfa, 0x1f, 0x8c, 0x7d, +/*0860:*/ 0xdd, 0xf7, 0xc3, 0xb8, 0x28, 0xae, 0x64, 0x1f, 0xb7, 0x51, 0xbd, 0x46, 0x64, 0x8e, 0xeb, 0xe2, +/*0870:*/ 0x4c, 0x86, 0xc5, 0xba, 0x2d, 0xac, 0x85, 0xcd, 0x71, 0xcb, 0xc8, 0x2f, 0x6d, 0x2e, 0x45, 0x73, +/*0880:*/ 0x3a, 0x00, 0xed, 0x77, 0xe0, 0x02, 0x43, 0xfc, 0xd8, 0x30, 0xa8, 0x97, 0x17, 0x3e, 0x9f, 0x26, +/*0890:*/ 0x24, 0x94, 0xd1, 0x39, 0x67, 0x34, 0xfd, 0xb0, 0xfc, 0x59, 0x6d, 0x6f, 0x59, 0x53, 0xea, 0x7c, +/*08a0:*/ 0xfd, 0x9a, 0xc6, 0x29, 0x52, 0x78, 0x8f, 0x81, 0xba, 0x8d, 0x5e, 0x4e, 0x05, 0x5f, 0x3c, 0x04, +/*08b0:*/ 0x51, 0x76, 0x14, 0x27, 0xb5, 0x4a, 0xab, 0x13, 0x0c, 0x15, 0x75, 0x9c, 0x38, 0xc1, 0xd2, 0xc9, +/*08c0:*/ 0x78, 0xa3, 0x5f, 0x72, 0x47, 0x93, 0xb4, 0xe5, 0x6f, 0x45, 0xe2, 0x7e, 0xe2, 0xad, 0x52, 0x48, +/*08d0:*/ 0x49, 0xd1, 0xe2, 0xe3, 0x62, 0xab, 0xee, 0x37, 0xf1, 0xf5, 0x4e, 0xb7, 0x25, 0x9a, 0x22, 0x33, +/*08e0:*/ 0xd8, 0xb7, 0x76, 0x74, 0x82, 0xc3, 0xa3, 0x38, 0x38, 0xbe, 0xab, 0x03, 0xb4, 0xb2, 0x0f, 0x35, +/*08f0:*/ 0xa6, 0xaa, 0xa8, 0xa4, 0xb1, 0xe9, 0x2e, 0xef, 0xd4, 0x8a, 0x88, 0xef, 0x07, 0x41, 0x89, 0x7d, +/*0900:*/ 0xc5, 0x27, 0xab, 0x6a, 0x1c, 0x2d, 0x6b, 0x44, 0xd3, 0x61, 0xf0, 0x6a, 0x31, 0xb5, 0x58, 0x9b, +/*0910:*/ 0x71, 0x88, 0x9b, 0xa9, 0x2c, 0x4c, 0x5a, 0x08, 0xfc, 0x3d, 0x40, 0x02, 0x44, 0x2b, 0xb8, 0xda, +/*0920:*/ 0x04, 0xc7, 0x46, 0xdf, 0x1d, 0x3a, 0x8d, 0xdf, 0x12, 0xfd, 0xda, 0x59, 0x2d, 0x11, 0x2f, 0x18, +/*0930:*/ 0x60, 0x28, 0xb4, 0x0e, 0xa0, 0x64, 0xef, 0xd1, 0x17, 0xa8, 0x4f, 0xe8, 0x72, 0xde, 0xb7, 0x35, +/*0940:*/ 0xf1, 0x1d, 0x05, 0xdb, 0x50, 0xe1, 0x89, 0x35, 0xd1, 0x51, 0xfb, 0xb0, 0xae, 0x84, 0x7a, 0x2a, +/*0950:*/ 0x0c, 0x0b, 0xe1, 0x3d, 0x5b, 0xbe, 0x1c, 0x8d, 0xe5, 0xfb, 0x66, 0xbd, 0x03, 0x38, 0x38, 0xd4, +/*0960:*/ 0xc2, 0xa6, 0x41, 0x3b, 0x6e, 0xf2, 0x0d, 0x11, 0xe3, 0xbd, 0x09, 0x6b, 0x67, 0x1d, 0xcc, 0x5e, +/*0970:*/ 0x13, 0x72, 0x16, 0x45, 0x80, 0xf2, 0xfc, 0x32, 0x93, 0x5b, 0xba, 0x3f, 0x71, 0x44, 0x3b, 0x12, +/*0980:*/ 0x48, 0x2b, 0x3b, 0x1a, 0x74, 0x94, 0xbd, 0x47, 0x49, 0x10, 0x80, 0x1a, 0x3c, 0xc7, 0x57, 0x3e, +/*0990:*/ 0xcf, 0x4a, 0xf1, 0x61, 0x39, 0x66, 0x96, 0xad, 0x79, 0xee, 0xee, 0x28, 0x19, 0x8e, 0x91, 0xd8, +/*09a0:*/ 0x9a, 0x4d, 0xcc, 0x8c, 0x41, 0xa0, 0x14, 0x0c, 0x2b, 0x3d, 0x98, 0xa2, 0x33, 0xb7, 0xcf, 0x97, +/*09b0:*/ 0x96, 0x81, 0xe3, 0xa7, 0xd1, 0x3d, 0x1a, 0x09, 0xc1, 0xea, 0x2f, 0xa7, 0x48, 0x16, 0x4c, 0x60, +/*09c0:*/ 0x9e, 0x36, 0x7d, 0xf6, 0x21, 0xa1, 0xa8, 0xc9, 0xa4, 0xb4, 0x40, 0xe6, 0x42, 0x0a, 0x1c, 0xe9, +/*09d0:*/ 0x98, 0xbe, 0x51, 0x15, 0x74, 0x7a, 0xa8, 0x76, 0xea, 0xff, 0xd8, 0xe5, 0xc4, 0x4c, 0x1d, 0x04, +/*09e0:*/ 0x65, 0x10, 0xf6, 0x90, 0x54, 0x7f, 0x8d, 0xdf, 0xda, 0x3d, 0xc3, 0x01, 0xc2, 0xde, 0xf0, 0x9b, +/*09f0:*/ 0x7f, 0xdd, 0xec, 0x71, 0x42, 0x61, 0x1d, 0xc6, 0xf6, 0x46, 0xe4, 0x74, 0x4d, 0x26, 0x39, 0x69, +/*0a00:*/ 0x27, 0x7a, 0xf9, 0xec, 0x11, 0xc1, 0x36, 0x90, 0xae, 0xa5, 0xd2, 0x76, 0x7c, 0x76, 0xcd, 0x30, +/*0a10:*/ 0x06, 0x7c, 0x69, 0xeb, 0x99, 0x2d, 0x10, 0xa2, 0x65, 0x83, 0x0a, 0xfd, 0x53, 0x11, 0xcc, 0x7b, +/*0a20:*/ 0xa2, 0x55, 0xc4, 0x2e, 0xfd, 0xfb, 0xa8, 0x4f, 0x66, 0xa7, 0xfd, 0x8f, 0x9d, 0x18, 0xd1, 0x37, +/*0a30:*/ 0xc9, 0x63, 0x77, 0x52, 0x44, 0x95, 0x09, 0x04, 0x68, 0x70, 0x18, 0x27, 0x02, 0x6a, 0xac, 0x9a, +/*0a40:*/ 0xab, 0x11, 0xf7, 0xdd, 0x7a, 0x20, 0x50, 0x22, 0x5c, 0x51, 0x43, 0x3b, 0x22, 0xec, 0x70, 0x26, +/*0a50:*/ 0xf1, 0xa0, 0xac, 0x3b, 0x34, 0x5e, 0xd4, 0x58, 0x51, 0x6b, 0x0b, 0xd8, 0xf3, 0xa4, 0x75, 0x90, +/*0a60:*/ 0x4a, 0xba, 0x6b, 0x32, 0x29, 0xb4, 0x80, 0x13, 0x23, 0xd5, 0x42, 0xef, 0xd5, 0x08, 0xe2, 0xfd, +/*0a70:*/ 0xa6, 0x73, 0x93, 0xdc, 0x3d, 0xf0, 0x73, 0x79, 0xa6, 0xab, 0x18, 0xf4, 0x33, 0xd7, 0x78, 0xca, +/*0a80:*/ 0x61, 0xaf, 0x82, 0x7e, 0xe2, 0x30, 0x2f, 0x92, 0xea, 0xad, 0xe3, 0x79, 0xf5, 0xfd, 0x9d, 0x20, +/*0a90:*/ 0x54, 0xbd, 0xeb, 0xe2, 0xf5, 0x79, 0xf0, 0x3d, 0x5a, 0x79, 0x5e, 0x54, 0x02, 0x32, 0x94, 0x6b, +/*0aa0:*/ 0x88, 0x73, 0x27, 0xb4, 0x6a, 0xa4, 0xb2, 0x97, 0x82, 0x83, 0x39, 0x4f, 0x24, 0x14, 0x6a, 0x29, +/*0ab0:*/ 0xdf, 0x2b, 0x25, 0x5a, 0xde, 0x43, 0x39, 0x33, 0x98, 0x44, 0x1a, 0x40, 0xbb, 0xc8, 0xb3, 0xdd, +/*0ac0:*/ 0x6b, 0x80, 0xbb, 0xb1, 0x37, 0x33, 0xb4, 0x02, 0x54, 0xdf, 0xe3, 0x7e, 0x7c, 0x46, 0x72, 0x41, +/*0ad0:*/ 0x32, 0x76, 0x03, 0xe5, 0x1b, 0xe1, 0x37, 0x9d, 0x9a, 0xd1, 0x78, 0xb5, 0xfe, 0xf4, 0xd1, 0xe9, +/*0ae0:*/ 0x1e, 0xb8, 0x8a, 0xe1, 0xec, 0x0a, 0x5b, 0xd7, 0xa3, 0x10, 0x4c, 0xf2, 0x42, 0x5a, 0x87, 0xdc, +/*0af0:*/ 0x49, 0xd5, 0xec, 0x7d, 0xd2, 0x04, 0x0f, 0x71, 0x65, 0x20, 0x08, 0x36, 0x02, 0x29, 0x82, 0x60, +/*0b00:*/ 0x70, 0x62, 0xa9, 0x21, 0xee, 0x06, 0x22, 0x7d, 0xa6, 0xbe, 0x35, 0xbd, 0x95, 0x8f, 0x9d, 0x9e, +/*0b10:*/ 0x0f, 0x92, 0x05, 0x33, 0x46, 0x51, 0x96, 0x51, 0xba, 0x31, 0xda, 0x2f, 0x4d, 0x39, 0x5d, 0x84, +/*0b20:*/ 0x6b, 0xd2, 0xdd, 0x09, 0x6d, 0xd5, 0x32, 0x7e, 0x4b, 0x9e, 0x77, 0xbe, 0x01, 0x52, 0xa3, 0xf0, +/*0b30:*/ 0x0a, 0x90, 0xaf, 0xd6, 0x81, 0x13, 0x99, 0xf6, 0xad, 0x41, 0xc5, 0x6b, 0x1b, 0xdc, 0x73, 0xde, +/*0b40:*/ 0x05, 0xb2, 0x00, 0x4d, 0x6a, 0xb6, 0x69, 0x47, 0x5c, 0x0a, 0x0f, 0x32, 0xcd, 0x15, 0x20, 0x9b, +/*0b50:*/ 0x45, 0x9e, 0x60, 0xa7, 0xfa, 0xdf, 0xb1, 0x74, 0x3f, 0x2e, 0x4a, 0x51, 0x15, 0xcd, 0xf7, 0x89, +/*0b60:*/ 0x91, 0xcb, 0xaa, 0x21, 0xd5, 0x88, 0x9a, 0x5d, 0x1b, 0x37, 0x07, 0x0f, 0xfc, 0x65, 0x41, 0xfd, +/*0b70:*/ 0xe1, 0xcf, 0x01, 0xeb, 0x9b, 0xdd, 0xae, 0x1a, 0x73, 0x3e, 0xc0, 0x1c, 0xe4, 0xf6, 0x54, 0xb3, +/*0b80:*/ 0x02, 0xa7, 0xe8, 0x99, 0x0a, 0xe0, 0x6c, 0xaa, 0xb6, 0xdb, 0x4e, 0xd2, 0x2c, 0x89, 0x4e, 0xf2, +/*0b90:*/ 0x9b, 0x0f, 0x83, 0x9f, 0xa1, 0xf7, 0x7f, 0x19, 0x8f, 0xcb, 0x3c, 0xf9, 0x90, 0xb4, 0x58, 0xd0, +/*0ba0:*/ 0x8f, 0xb8, 0x4f, 0x29, 0x10, 0xc4, 0xcb, 0xb1, 0xe4, 0x57, 0xe8, 0xdc, 0x27, 0xcd, 0xc6, 0x69, +/*0bb0:*/ 0xbd, 0x9e, 0x02, 0x85, 0xf7, 0x01, 0x8c, 0x15, 0xe6, 0xb3, 0x64, 0xb4, 0x9c, 0x1b, 0x70, 0x1b, +/*0bc0:*/ 0x80, 0xe0, 0xd7, 0x9f, 0x40, 0x67, 0x02, 0xbb, 0x35, 0xad, 0xd9, 0xfa, 0x20, 0xa2, 0xce, 0x9d, +/*0bd0:*/ 0x91, 0xa5, 0x24, 0x9a, 0x3e, 0x5b, 0x11, 0x53, 0x5c, 0x16, 0xad, 0xb7, 0xf9, 0x4c, 0xb7, 0x76, +/*0be0:*/ 0x51, 0x5c, 0x7b, 0x07, 0x72, 0x64, 0xa0, 0x40, 0x26, 0x2e, 0xfe, 0x77, 0xdf, 0xe2, 0x5b, 0xfe, +/*0bf0:*/ 0xb3, 0x55, 0xc5, 0xbb, 0x41, 0xc4, 0x43, 0x8d, 0x06, 0x9b, 0x5a, 0x34, 0xba, 0x81, 0xb1, 0x16, +/*0c00:*/ 0x39, 0x2c, 0x9f, 0xcb, 0x99, 0xb4, 0x33, 0x07, 0x5f, 0xc8, 0x74, 0xb8, 0x07, 0x10, 0xa0, 0x69, +/*0c10:*/ 0x7c, 0xba, 0xc5, 0xd1, 0x77, 0x1b, 0x92, 0xe1, 0xaa, 0x55, 0x93, 0xa1, 0x25, 0xbb, 0xdb, 0x65, +/*0c20:*/ 0x36, 0x5d, 0x18, 0x0b, 0xaf, 0x67, 0x0a, 0x6a, 0x1c, 0xd6, 0x07, 0x6a, 0x45, 0x5d, 0xe9, 0x14, +/*0c30:*/ 0x0d, 0x0d, 0xb1, 0xfe, 0x90, 0xad, 0xc1, 0x6d, 0x7c, 0x81, 0xf3, 0x6d, 0xe1, 0x41, 0xfb, 0x36, +/*0c40:*/ 0x33, 0xe1, 0x15, 0xde, 0x1f, 0x7a, 0x4a, 0x46, 0x7c, 0xf3, 0xa9, 0xad, 0x35, 0x18, 0x90, 0xe3, +/*0c50:*/ 0x42, 0xf4, 0x0b, 0xdd, 0xbf, 0x4e, 0xbe, 0xe5, 0x0d, 0x42, 0x7e, 0xe1, 0xdb, 0x33, 0x63, 0x26, +/*0c60:*/ 0x70, 0x1e, 0x70, 0x26, 0x50, 0xe7, 0x6c, 0x3c, 0x83, 0x92, 0xc9, 0x76, 0xcd, 0x1a, 0x57, 0x07, +/*0c70:*/ 0xef, 0x92, 0xa1, 0xdb, 0x1c, 0x8f, 0xd1, 0x5a, 0xcc, 0x6a, 0xf8, 0x75, 0xe8, 0xb2, 0x81, 0xd1, +/*0c80:*/ 0xf0, 0x2b, 0xd9, 0x13, 0xa5, 0xa3, 0x30, 0x4b, 0xc1, 0x18, 0xc3, 0xb6, 0x63, 0x5a, 0xac, 0x3f, +/*0c90:*/ 0x5a, 0x23, 0x8c, 0x7d, 0x71, 0x64, 0xd3, 0xf5, 0xfa, 0x41, 0xdc, 0x72, 0x13, 0xaa, 0xc4, 0xaa, +/*0ca0:*/ 0xe5, 0x83, 0x93, 0xda, 0xc6, 0x81, 0x3f, 0x83, 0x44, 0x62, 0xec, 0xa9, 0xeb, 0x83, 0x77, 0x99, +/*0cb0:*/ 0x7d, 0xc1, 0x41, 0x16, 0xd9, 0x0e, 0x58, 0xb1, 0xdc, 0xca, 0x51, 0xf2, 0xcf, 0xc9, 0x6f, 0x8e, +/*0cc0:*/ 0x6a, 0x5f, 0x82, 0xc7, 0x1a, 0xf5, 0xcd, 0x85, 0xb2, 0xd6, 0xbd, 0xb4, 0x1c, 0x71, 0x54, 0x7f, +/*0cd0:*/ 0xb9, 0x21, 0x5f, 0xdf, 0x8f, 0xe2, 0xb4, 0xce, 0xcc, 0xeb, 0xd2, 0x16, 0xde, 0x70, 0xb9, 0x83, +/*0ce0:*/ 0x9b, 0x6a, 0x52, 0x72, 0x88, 0x1b, 0x18, 0xb0, 0x0b, 0x79, 0xd6, 0x9d, 0x4f, 0x9c, 0x44, 0xf6, +/*0cf0:*/ 0x12, 0x3d, 0xcc, 0xa1, 0x51, 0x05, 0x0a, 0x27, 0x4c, 0x27, 0x29, 0xb5, 0x12, 0xc7, 0x0f, 0x74, +/*0d00:*/ 0x8e, 0xe8, 0x3a, 0xf0, 0x00, 0x19, 0x27, 0x28, 0x7c, 0x35, 0x18, 0x3d, 0x75, 0x60, 0xa5, 0x47, +/*0d10:*/ 0x01, 0x76, 0xc6, 0x04, 0x0b, 0x9a, 0xf7, 0x49, 0xe1, 0xa0, 0x2f, 0x60, 0x5c, 0x10, 0xbf, 0x50, +/*0d20:*/ 0x38, 0x14, 0x9f, 0x6a, 0x6a, 0xb5, 0x8d, 0x07, 0xf8, 0xd9, 0x6e, 0x12, 0x04, 0x1f, 0x61, 0x2e, +/*0d30:*/ 0x16, 0xc9, 0xc5, 0xf9, 0xab, 0xa4, 0xae, 0xca, 0xa3, 0x21, 0x0f, 0x21, 0xaa, 0xf8, 0x58, 0xcd, +/*0d40:*/ 0x96, 0x01, 0x8e, 0x16, 0xf5, 0x63, 0xc2, 0xcf, 0xa7, 0xb2, 0xc6, 0x10, 0x5d, 0x93, 0x63, 0x50, +/*0d50:*/ 0xe3, 0x22, 0xaa, 0x86, 0x1e, 0x77, 0x79, 0x15, 0x52, 0xc8, 0x3c, 0x41, 0xb9, 0x8b, 0x93, 0xc1, +/*0d60:*/ 0x86, 0x4e, 0x70, 0x31, 0x49, 0xec, 0xe5, 0xf1, 0x95, 0xbb, 0x42, 0xad, 0x69, 0xbb, 0x38, 0x8e, +/*0d70:*/ 0xc7, 0x86, 0x09, 0x61, 0x64, 0xd8, 0x8b, 0x75, 0x99, 0xbc, 0x8a, 0xde, 0x30, 0xe0, 0xf0, 0x92, +/*0d80:*/ 0x59, 0x59, 0x6d, 0xc7, 0x9f, 0x5d, 0xe2, 0xf8, 0xb1, 0xc5, 0xa3, 0x46, 0x76, 0xd7, 0xb0, 0xa4, +/*0d90:*/ 0x79, 0x34, 0x97, 0x18, 0x10, 0x94, 0x65, 0x67, 0xa2, 0xcf, 0x1d, 0xe3, 0x82, 0x25, 0x80, 0x3a, +/*0da0:*/ 0x08, 0x49, 0xb0, 0x13, 0x01, 0x76, 0xed, 0x73, 0x76, 0x2f, 0x54, 0xbc, 0x35, 0x9d, 0x59, 0x1f, +/*0db0:*/ 0x86, 0x3b, 0xe5, 0x6a, 0xb6, 0x3e, 0xe9, 0xe3, 0x7d, 0xa6, 0x74, 0xb9, 0xaa, 0x9f, 0x8f, 0x12, +/*0dc0:*/ 0x49, 0xcf, 0x1b, 0x98, 0xce, 0x72, 0xee, 0xa1, 0x69, 0x44, 0x3a, 0x8a, 0x76, 0x55, 0xbe, 0xa8, +/*0dd0:*/ 0xa4, 0x29, 0xf9, 0xe6, 0x4e, 0xff, 0x17, 0x17, 0x0f, 0xd1, 0xa8, 0x81, 0x33, 0x51, 0x90, 0xc5, +/*0de0:*/ 0x75, 0xd5, 0x4d, 0x37, 0x65, 0xc6, 0x85, 0x96, 0x69, 0x4f, 0x04, 0xc7, 0x98, 0xaf, 0x24, 0xf0, +/*0df0:*/ 0x7d, 0x11, 0xef, 0x59, 0x6e, 0x78, 0xa0, 0x0e, 0xa2, 0x0a, 0xff, 0x75, 0xcd, 0xc6, 0x5d, 0x5a, +/*0e00:*/ 0x4e, 0x36, 0xfd, 0x7e, 0x28, 0xf9, 0x69, 0x35, 0x1a, 0xc2, 0x8f, 0x98, 0xe2, 0x8c, 0xec, 0x9a, +/*0e10:*/ 0x1e, 0x36, 0x5c, 0x8d, 0x5a, 0x94, 0x69, 0xa5, 0x51, 0x69, 0xf6, 0x03, 0x5b, 0x1d, 0xf3, 0x9c, +/*0e20:*/ 0x64, 0xc9, 0x75, 0x38, 0x07, 0xc3, 0x14, 0x74, 0x62, 0x34, 0x2f, 0xa1, 0x77, 0xcc, 0x35, 0x54, +/*0e30:*/ 0xf8, 0x01, 0xa1, 0xa2, 0xa0, 0x2d, 0x3e, 0x30, 0x55, 0x47, 0x11, 0xf4, 0x9d, 0xe2, 0x1a, 0x2c, +/*0e40:*/ 0x96, 0x17, 0xb4, 0xda, 0x10, 0xf6, 0x2e, 0x08, 0xed, 0x55, 0x8c, 0x58, 0x5e, 0xce, 0x1b, 0xc7, +/*0e50:*/ 0x03, 0x63, 0xfc, 0x91, 0xfe, 0xb1, 0x21, 0x39, 0xc8, 0x5c, 0x42, 0xcd, 0xb2, 0x24, 0x33, 0x85, +/*0e60:*/ 0x3a, 0xa4, 0x8d, 0xef, 0xcf, 0x19, 0x41, 0xb2, 0x31, 0x3b, 0xd0, 0xde, 0xf2, 0x70, 0x6d, 0x9c, +/*0e70:*/ 0x4f, 0x02, 0x54, 0x99, 0x63, 0xc2, 0x5d, 0x77, 0x80, 0x71, 0xf3, 0x5d, 0x79, 0x0d, 0x94, 0x97, +/*0e80:*/ 0x0b, 0x80, 0xc6, 0x55, 0x41, 0xaf, 0x1d, 0x26, 0xa6, 0xc7, 0xeb, 0xbf, 0x41, 0x27, 0x99, 0x6e, +/*0e90:*/ 0x12, 0x85, 0x60, 0x6e, 0xe7, 0xb3, 0xbe, 0x55, 0x98, 0x1a, 0xcd, 0xa6, 0x05, 0x2e, 0xe4, 0x93, +/*0ea0:*/ 0xde, 0x8d, 0xec, 0xcf, 0x64, 0xd0, 0x82, 0xc4, 0x3e, 0xf7, 0xa7, 0xd9, 0x0a, 0xdc, 0x3c, 0xa8, +/*0eb0:*/ 0x03, 0xb8, 0xe0, 0x04, 0xb1, 0xc3, 0xd6, 0x70, 0x5f, 0x84, 0x1f, 0xb2, 0x1e, 0xf2, 0xb6, 0x55, +/*0ec0:*/ 0x9d, 0x6e, 0x86, 0x15, 0x0b, 0x8e, 0x76, 0x2a, 0xab, 0x7e, 0xa9, 0x37, 0x4f, 0xcf, 0x8a, 0xfc, +/*0ed0:*/ 0x74, 0xdc, 0xfd, 0x68, 0x8a, 0x25, 0x2f, 0x63, 0x74, 0x44, 0x59, 0xd9, 0x9c, 0x37, 0x5a, 0xc4, +/*0ee0:*/ 0x1c, 0xc6, 0xa5, 0xbe, 0x57, 0x71, 0x14, 0x75, 0xc5, 0xd3, 0x51, 0xfc, 0x78, 0x57, 0xe5, 0xf9, +/*0ef0:*/ 0x23, 0x2d, 0x37, 0x9a, 0x3b, 0xf8, 0x77, 0xbd, 0x72, 0x92, 0xb7, 0x8d, 0xf0, 0xac, 0x03, 0x31, +/*0f00:*/ 0x9b, 0x40, 0x1c, 0xd9, 0x80, 0x17, 0xb5, 0x05, 0xe9, 0xc6, 0x5e, 0xdf, 0x07, 0xc2, 0xf9, 0xbe, +/*0f10:*/ 0x7e, 0x54, 0xb6, 0x6d, 0x8a, 0xb2, 0xae, 0xfe, 0x13, 0x11, 0xd6, 0x2a, 0xbd, 0xa4, 0x4d, 0x5e, +/*0f20:*/ 0x4f, 0x86, 0x06, 0xa0, 0x06, 0xd8, 0x4a, 0x6b, 0xe8, 0xc2, 0x7d, 0x58, 0x70, 0xf9, 0x3e, 0x17, +/*0f30:*/ 0x5d, 0x88, 0x5f, 0x5b, 0xbe, 0xd6, 0xd8, 0xaa, 0x10, 0xb8, 0x3e, 0x43, 0x6a, 0x86, 0xe4, 0x18, +/*0f40:*/ 0x7c, 0xdc, 0x3f, 0x5d, 0x89, 0x5a, 0x97, 0x31, 0xa0, 0x7e, 0xbe, 0x58, 0x4a, 0xc8, 0x7b, 0x44, +/*0f50:*/ 0x67, 0x12, 0x77, 0xe4, 0x4d, 0x66, 0x68, 0xe7, 0xf2, 0x46, 0xd0, 0xf2, 0x38, 0x97, 0x4d, 0x14, +/*0f60:*/ 0x87, 0x1a, 0x5c, 0xd0, 0x18, 0x92, 0xf1, 0xf9, 0x86, 0xca, 0x4b, 0x63, 0xae, 0x1a, 0xa1, 0x68, +/*0f70:*/ 0x78, 0xc6, 0xde, 0x4e, 0x8d, 0x31, 0xe3, 0x50, 0x26, 0x01, 0x2a, 0x76, 0xa7, 0xfd, 0x16, 0xed, +/*0f80:*/ 0x76, 0x42, 0x1d, 0x0a, 0x71, 0x6c, 0xae, 0xb3, 0xd5, 0x21, 0x04, 0x88, 0xed, 0x59, 0xc5, 0xfa, +/*0f90:*/ 0x9e, 0x3a, 0x01, 0x87, 0x9d, 0x3f, 0x5d, 0xeb, 0xfd, 0xcc, 0x11, 0xca, 0x2d, 0x91, 0xd5, 0x2b, +/*0fa0:*/ 0xb8, 0xaa, 0xc8, 0x7b, 0xa8, 0xb4, 0x2b, 0xfe, 0x78, 0x88, 0x71, 0x54, 0xcc, 0xcc, 0x01, 0xf4, +/*0fb0:*/ 0xc2, 0x43, 0x54, 0x07, 0x0f, 0xcc, 0x98, 0x28, 0xfd, 0x37, 0xdf, 0x57, 0xfc, 0xb4, 0x84, 0xb5, +/*0fc0:*/ 0x40, 0x80, 0x9e, 0xb2, 0x53, 0xec, 0x8f, 0x35, 0x0c, 0xfe, 0x68, 0x17, 0x8f, 0xf3, 0x81, 0x92, +/*0fd0:*/ 0xe0, 0x9d, 0xf0, 0x32, 0x4b, 0x73, 0x70, 0x3f, 0x35, 0x42, 0x32, 0x93, 0x15, 0x1f, 0x34, 0x49, +/*0fe0:*/ 0x44, 0xa5, 0xea, 0xe0, 0x6f, 0xa5, 0x5d, 0xff, 0x2b, 0x58, 0x7e, 0x80, 0xf7, 0x77, 0xea, 0x1a, +/*0ff0:*/ 0x15, 0xbb, 0x28, 0xb5, 0xf5, 0x21, 0x15, 0x9b, 0x70, 0x33, 0xcc, 0x76, 0x5d, 0xb3, 0x4a, 0x7a, +/*1000:*/ 0xfc, 0xe7, 0x90, 0x87, 0x38, 0x3b, 0x32, 0x8e, 0x96, 0x87, 0x16, 0x6a, 0xb7, 0xf3, 0x88, 0xdc, +/*1010:*/ 0x5e, 0x6f, 0x60, 0x6b, 0x88, 0x03, 0x84, 0x8d, 0x5e, 0xb4, 0xb6, 0x07, 0xf1, 0xdf, 0x87, 0x58, +/*1020:*/ 0x36, 0x91, 0x78, 0x6b, 0x68, 0x54, 0xe5, 0xd1, 0xe3, 0x0b, 0xd1, 0x11, 0x48, 0xec, 0x60, 0x4a, +/*1030:*/ 0xca, 0x7b, 0x45, 0x7e, 0x36, 0x8a, 0x4a, 0xd9, 0xeb, 0xc9, 0xc5, 0xd3, 0x82, 0x75, 0x58, 0xca, +/*1040:*/ 0x53, 0xb8, 0x42, 0x79, 0x4b, 0x9a, 0xfe, 0x06, 0xdb, 0x9a, 0x7d, 0x45, 0x81, 0x9b, 0xf0, 0x9f, +/*1050:*/ 0x08, 0xad, 0x63, 0xb2, 0xea, 0xab, 0x9c, 0x8e, 0x7a, 0xcb, 0x65, 0x55, 0x2a, 0x5e, 0xcf, 0x87, +/*1060:*/ 0x79, 0x38, 0x63, 0xa9, 0xd2, 0x60, 0x24, 0xec, 0xac, 0x07, 0x44, 0xe5, 0xf5, 0x04, 0x79, 0x4e, +/*1070:*/ 0xf9, 0x15, 0x83, 0x33, 0x71, 0xe1, 0x2a, 0x72, 0x39, 0x76, 0xa6, 0x27, 0x99, 0xa3, 0xaa, 0xb0, +/*1080:*/ 0x89, 0x63, 0xf9, 0xb9, 0xe7, 0xbe, 0x6b, 0xc6, 0xb2, 0x6e, 0x1f, 0x55, 0x3e, 0xc5, 0xcd, 0x54, +/*1090:*/ 0x31, 0xb2, 0xdc, 0xd1, 0x3a, 0x18, 0x4b, 0xf0, 0x02, 0x1d, 0xaa, 0xbc, 0x8c, 0x37, 0x3c, 0x0a, +/*10a0:*/ 0x69, 0xce, 0x0a, 0x1f, 0xe5, 0xaf, 0xeb, 0x10, 0x75, 0xdd, 0x0c, 0x70, 0xc1, 0x6d, 0xd1, 0x57, +/*10b0:*/ 0x6f, 0x5a, 0x6f, 0x95, 0x2c, 0x7c, 0xcd, 0x1a, 0xa4, 0xd3, 0xd9, 0xe4, 0xe9, 0x33, 0x69, 0xd0, +/*10c0:*/ 0xd3, 0x1f, 0xb3, 0x34, 0x6e, 0x3e, 0x3b, 0xc8, 0xce, 0xac, 0xf3, 0x28, 0xb8, 0x6c, 0x52, 0xb7, +/*10d0:*/ 0xdf, 0x07, 0x05, 0x5c, 0xeb, 0x9e, 0xb9, 0x13, 0x3f, 0x6b, 0xed, 0xc1, 0x2b, 0x0e, 0x5d, 0x5c, +/*10e0:*/ 0x54, 0xf7, 0xe0, 0xce, 0x4d, 0xc3, 0x5e, 0xe7, 0x78, 0x2a, 0xd2, 0x37, 0xdb, 0x69, 0xd3, 0xef, +/*10f0:*/ 0xb5, 0x7e, 0x60, 0xd3, 0x82, 0xd1, 0xc0, 0xe6, 0x83, 0x19, 0x7a, 0xee, 0xf6, 0x36, 0x85, 0x62, +/*1100:*/ 0x0f, 0x7e, 0x4c, 0x0e, 0x6f, 0x0b, 0x30, 0x41, 0x63, 0x3a, 0x67, 0xfc, 0x75, 0x8c, 0xfd, 0x7f, +/*1110:*/ 0x08, 0x2d, 0x2f, 0x06, 0x54, 0x04, 0x96, 0x41, 0x16, 0x6d, 0x91, 0x63, 0x65, 0x92, 0x74, 0xf5, +/*1120:*/ 0x13, 0x61, 0xc9, 0xa4, 0x35, 0xcb, 0xdb, 0xf3, 0x22, 0x77, 0xdb, 0xa3, 0x61, 0x26, 0xef, 0x29, +/*1130:*/ 0xb9, 0x78, 0xaf, 0x20, 0xb9, 0xb7, 0x2c, 0x1b, 0x44, 0x91, 0x25, 0xcf, 0xea, 0x43, 0x1e, 0x29, +/*1140:*/ 0xd6, 0x8a, 0x73, 0xff, 0x4a, 0xe9, 0x0d, 0x5c, 0x57, 0x67, 0x2c, 0xaa, 0x2f, 0x96, 0x29, 0x4b, +/*1150:*/ 0xfe, 0xd3, 0x62, 0x25, 0xd6, 0xd8, 0x7d, 0xfc, 0x51, 0xf4, 0xf3, 0xfa, 0x19, 0x0a, 0x41, 0x90, +/*1160:*/ 0x8f, 0x66, 0x90, 0xf1, 0xcc, 0x96, 0xc6, 0x90, 0xc7, 0x80, 0x2d, 0x64, 0xd6, 0xee, 0x71, 0x53, +/*1170:*/ 0xdf, 0x56, 0xfa, 0x1a, 0xd8, 0x9c, 0xf1, 0xbb, 0x06, 0x46, 0xe7, 0x15, 0x38, 0xfe, 0x35, 0xea, +/*1180:*/ 0xa6, 0x0d, 0x3d, 0x18, 0x82, 0xc1, 0xbe, 0x21, 0x81, 0x3d, 0x16, 0x92, 0x3c, 0x86, 0xd5, 0x9c, +/*1190:*/ 0x62, 0x64, 0x5e, 0x34, 0x44, 0xa5, 0x06, 0x3c, 0xfc, 0xa4, 0x88, 0xaa, 0x35, 0xf9, 0xcd, 0xa9, +/*11a0:*/ 0x8b, 0x22, 0x64, 0x71, 0x33, 0xb6, 0x65, 0xad, 0x1f, 0x75, 0x18, 0xd8, 0xb3, 0x06, 0xf7, 0xfc, +/*11b0:*/ 0x3a, 0x84, 0xba, 0x55, 0x3e, 0xf8, 0x20, 0xf2, 0x5a, 0x90, 0x6c, 0x0d, 0x94, 0x89, 0x96, 0xc2, +/*11c0:*/ 0x79, 0x91, 0xb2, 0xb3, 0xa5, 0x83, 0x93, 0xbb, 0x61, 0x75, 0x6a, 0x13, 0x3a, 0x97, 0xee, 0x84, +/*11d0:*/ 0x0f, 0x98, 0x95, 0x37, 0x3d, 0xae, 0x30, 0x49, 0x27, 0xce, 0xc5, 0xe0, 0xb5, 0x70, 0xd9, 0x97, +/*11e0:*/ 0x3b, 0xc9, 0x6f, 0x50, 0x34, 0x35, 0x8f, 0x24, 0x85, 0xfe, 0x90, 0x50, 0x14, 0xbb, 0x79, 0xcd, +/*11f0:*/ 0xfb, 0x13, 0x3f, 0x15, 0x92, 0x69, 0x7c, 0xd7, 0x0a, 0x56, 0xf8, 0x2f, 0x90, 0x09, 0xd7, 0x16, +/*1200:*/ 0x33, 0x95, 0xd3, 0xa5, 0x60, 0xdd, 0x10, 0x7e, 0x5e, 0x63, 0x9b, 0xdd, 0x1a, 0xce, 0xed, 0x80, +/*1210:*/ 0xba, 0xd8, 0xc8, 0x56, 0x64, 0x6f, 0xd0, 0x27, 0x5d, 0x1a, 0xaf, 0xe3, 0xca, 0x9b, 0xaa, 0x5a, +/*1220:*/ 0x86, 0x08, 0x97, 0x3f, 0xa8, 0x38, 0xb5, 0x6d, 0xcb, 0x16, 0x24, 0x13, 0x9a, 0x6b, 0xea, 0xac, +/*1230:*/ 0x97, 0x11, 0x32, 0xa2, 0x87, 0x33, 0x2a, 0xd7, 0x59, 0x78, 0x61, 0x80, 0x2f, 0x16, 0xde, 0xeb, +/*1240:*/ 0xee, 0x28, 0x7f, 0x8a, 0x6d, 0x55, 0x84, 0xbc, 0x84, 0x8a, 0x5f, 0x7b, 0x1b, 0x8f, 0x85, 0x6e, +/*1250:*/ 0x59, 0xc3, 0xd3, 0xba, 0x0f, 0xb8, 0x73, 0xfe, 0xd9, 0x33, 0x41, 0x61, 0x1a, 0x88, 0x1a, 0x83, +/*1260:*/ 0x9b, 0x98, 0x68, 0xb7, 0xdd, 0x97, 0xa8, 0xe1, 0xf0, 0x6e, 0x2a, 0x0b, 0x6b, 0x37, 0x7e, 0x13, +/*1270:*/ 0xeb, 0x07, 0xb7, 0x6c, 0x93, 0xc0, 0x4f, 0x96, 0xda, 0x91, 0xbb, 0x3d, 0xc6, 0x20, 0xe2, 0x63, +/*1280:*/ 0x7d, 0xab, 0x85, 0xb0, 0x0b, 0xc6, 0x51, 0x7b, 0xc2, 0x35, 0x98, 0x5f, 0xc1, 0xb1, 0xbd, 0x45, +/*1290:*/ 0xe3, 0x84, 0x2d, 0xc3, 0x93, 0x8b, 0xdd, 0x73, 0x2d, 0x7e, 0x54, 0xca, 0x5a, 0xb6, 0x14, 0x09, +/*12a0:*/ 0x5f, 0x58, 0xfe, 0x27, 0xcc, 0xca, 0xb2, 0x07, 0xcd, 0x3f, 0x7e, 0x47, 0x01, 0x3a, 0x94, 0x96, +/*12b0:*/ 0x85, 0x8f, 0xcd, 0xa1, 0x3f, 0x34, 0xae, 0xb1, 0x26, 0xec, 0xee, 0x88, 0x2a, 0xd9, 0x65, 0x42, +/*12c0:*/ 0xf3, 0x18, 0x81, 0xf5, 0x9e, 0xf1, 0x07, 0xe1, 0x19, 0x03, 0x7d, 0x6f, 0x77, 0x3b, 0x02, 0xa6, +/*12d0:*/ 0x0e, 0x98, 0x57, 0x97, 0xfc, 0xfc, 0xe0, 0xb3, 0x3e, 0x70, 0x48, 0x33, 0x18, 0xbb, 0x52, 0xff, +/*12e0:*/ 0x97, 0xb6, 0x41, 0x69, 0xea, 0x39, 0xfd, 0xcb, 0x3e, 0x1c, 0xae, 0x62, 0xe8, 0x47, 0x1c, 0x4f, +/*12f0:*/ 0xab, 0x2c, 0x2d, 0xd7, 0xc5, 0x5b, 0x6d, 0xec, 0x6f, 0x51, 0x24, 0xeb, 0x16, 0x7b, 0x80, 0x06, +/*1300:*/ 0xf0, 0x22, 0x1c, 0x47, 0xa3, 0x82, 0xed, 0xab, 0x4e, 0x76, 0x30, 0xcd, 0x0d, 0x9a, 0x72, 0xe1, +/*1310:*/ 0x39, 0x9b, 0x42, 0x07, 0xad, 0xab, 0xa2, 0xd9, 0x59, 0xb3, 0xe9, 0xc0, 0x8a, 0xa7, 0x1b, 0x28, +/*1320:*/ 0x5f, 0x62, 0xcb, 0x79, 0xcc, 0xa7, 0x58, 0xe0, 0x5d, 0xdc, 0x0c, 0xb7, 0x1f, 0x80, 0x4b, 0xa4, +/*1330:*/ 0xeb, 0xdd, 0x83, 0x4e, 0xd3, 0x50, 0x4a, 0xfe, 0x78, 0x9c, 0xb0, 0x47, 0x46, 0x6c, 0x76, 0x75, +/*1340:*/ 0xaa, 0x78, 0xfc, 0x47, 0x30, 0xcc, 0xd4, 0x67, 0x06, 0x28, 0x80, 0x2a, 0xa3, 0x7a, 0x07, 0x45, +/*1350:*/ 0xce, 0xff, 0x74, 0x2c, 0x09, 0x39, 0x79, 0xff, 0xb3, 0x2e, 0xd6, 0x7a, 0xbe, 0x67, 0xbd, 0x9e, +/*1360:*/ 0x46, 0xaa, 0xd9, 0xc8, 0x49, 0x12, 0x48, 0x3d, 0xdd, 0xc4, 0x3c, 0x90, 0x51, 0x93, 0xff, 0x80, +/*1370:*/ 0xe4, 0xa8, 0x99, 0xc0, 0xb7, 0xf0, 0xd1, 0x00, 0xa1, 0x9a, 0xf6, 0x9a, 0xea, 0x18, 0x25, 0x9c, +/*1380:*/ 0x8c, 0x06, 0xaa, 0x08, 0x34, 0xe4, 0xdf, 0x91, 0x84, 0x52, 0xd7, 0xa1, 0x1b, 0xd7, 0xcb, 0x5a, +/*1390:*/ 0xac, 0x0e, 0x8b, 0xe5, 0x26, 0xdd, 0x77, 0x10, 0x62, 0x12, 0xa3, 0xfa, 0xab, 0x6a, 0x89, 0xce, +/*13a0:*/ 0xbd, 0x71, 0x8b, 0x37, 0xd1, 0x7a, 0x47, 0x1a, 0xa3, 0x9b, 0x00, 0x0b, 0x08, 0xcf, 0x6b, 0x7c, +/*13b0:*/ 0xdf, 0xb8, 0xe0, 0x07, 0x5a, 0xb8, 0x37, 0xfc, 0x31, 0xff, 0xf9, 0xa7, 0xb9, 0x80, 0x41, 0x9d, +/*13c0:*/ 0x73, 0x05, 0x9b, 0x50, 0xe1, 0xd2, 0xe5, 0x49, 0xc8, 0x72, 0x93, 0x71, 0xa9, 0x33, 0x48, 0x27, +/*13d0:*/ 0x0c, 0xdb, 0x4a, 0xb0, 0x5f, 0xb9, 0xd2, 0xaf, 0x47, 0x19, 0x55, 0x80, 0x37, 0xb0, 0xb1, 0x39, +/*13e0:*/ 0xd2, 0xd2, 0x1d, 0x9d, 0x0c, 0x19, 0x8e, 0xba, 0x81, 0xaf, 0xd3, 0xf1, 0xeb, 0x91, 0x84, 0x2c, +/*13f0:*/ 0x8c, 0x38, 0x29, 0xd8, 0x75, 0x68, 0x2c, 0x24, 0x42, 0xa0, 0x0a, 0x1e, 0x10, 0xf0, 0xc9, 0x08, +/*1400:*/ 0xe7, 0x97, 0x48, 0xd7, 0xe7, 0x29, 0x71, 0xe9, 0x66, 0xb2, 0x0c, 0xa7, 0xcb, 0x45, 0x62, 0x45, +/*1410:*/ 0x9e, 0xee, 0x91, 0xb7, 0xb9, 0x22, 0xe0, 0xf9, 0x1c, 0x3c, 0x3f, 0xba, 0x1e, 0x00, 0x93, 0x6f, +/*1420:*/ 0xbc, 0x72, 0xb2, 0x00, 0x4a, 0x95, 0xa9, 0xf6, 0xf9, 0x18, 0xd9, 0x46, 0x4f, 0x32, 0x29, 0xff, +/*1430:*/ 0x0a, 0x52, 0x3d, 0xde, 0x61, 0xee, 0xac, 0x82, 0xa1, 0x4d, 0x77, 0x49, 0x58, 0x4e, 0x2d, 0x96, +/*1440:*/ 0x17, 0xdb, 0x44, 0xed, 0x11, 0x6e, 0x8b, 0x0c, 0x0a, 0x4b, 0xff, 0x6f, 0x2f, 0xd2, 0x90, 0x6e, +/*1450:*/ 0xf9, 0x82, 0x65, 0x62, 0x96, 0x89, 0xa8, 0x67, 0x4e, 0x31, 0x93, 0x9c, 0xa5, 0xad, 0x01, 0xc5, +/*1460:*/ 0x45, 0x0a, 0x29, 0xd9, 0xba, 0xc4, 0xa7, 0xeb, 0x99, 0x22, 0xad, 0x4a, 0x5d, 0x17, 0x8d, 0xc1, +/*1470:*/ 0x9d, 0xb7, 0x29, 0xd9, 0x72, 0xad, 0x54, 0x08, 0xc3, 0x56, 0x73, 0x65, 0xec, 0x2d, 0xd0, 0x59, +/*1480:*/ 0x5c, 0x22, 0xed, 0x53, 0x6f, 0xed, 0xbe, 0xb9, 0x3f, 0x3a, 0x67, 0x58, 0x1d, 0x47, 0xdd, 0x2b, +/*1490:*/ 0x2d, 0x5c, 0xd0, 0x84, 0xc0, 0xf1, 0x77, 0x7e, 0x49, 0xf6, 0x9f, 0x8b, 0x84, 0x8e, 0x8b, 0xe1, +/*14a0:*/ 0x4d, 0x3d, 0xf4, 0xb5, 0x3a, 0xdb, 0xb0, 0x13, 0x3c, 0xf4, 0x46, 0xf6, 0xdd, 0x76, 0x1b, 0x8a, +/*14b0:*/ 0xd7, 0x49, 0xdf, 0x1c, 0xa2, 0x66, 0xd1, 0x38, 0xc4, 0x3c, 0x16, 0xb6, 0xbd, 0xac, 0x21, 0xb5, +/*14c0:*/ 0x93, 0x8f, 0x1a, 0x73, 0xe5, 0x15, 0x19, 0xc0, 0x94, 0x3c, 0x59, 0x65, 0x9f, 0x72, 0x5d, 0xfc, +/*14d0:*/ 0xb4, 0x22, 0x3f, 0xb6, 0xe1, 0x7c, 0x6a, 0x16, 0x06, 0x5b, 0xc3, 0x5d, 0xe0, 0xd2, 0x45, 0x64, +/*14e0:*/ 0xe8, 0xf7, 0x24, 0x92, 0x3d, 0x30, 0x34, 0xd0, 0x0e, 0x64, 0x09, 0xc2, 0x94, 0x23, 0x99, 0x8a, +/*14f0:*/ 0xc6, 0xbc, 0x71, 0xd0, 0x02, 0x6e, 0x19, 0xb6, 0x06, 0x6c, 0xfe, 0xc1, 0x8a, 0x22, 0x59, 0x7a, +/*1500:*/ 0xd5, 0x81, 0xb9, 0x3f, 0x40, 0x10, 0xe9, 0x26, 0xee, 0x8d, 0xbf, 0x29, 0x52, 0x1b, 0x25, 0x54, +/*1510:*/ 0x44, 0x70, 0x61, 0x5f, 0xf3, 0xeb, 0x6f, 0x27, 0xee, 0xfa, 0x16, 0xf5, 0x90, 0xd0, 0xe6, 0x03, +/*1520:*/ 0x0d, 0xec, 0x5b, 0xb5, 0x2e, 0xe2, 0x6b, 0xe1, 0xeb, 0x02, 0xba, 0x9d, 0x7b, 0x80, 0x53, 0xff, +/*1530:*/ 0xb8, 0xc2, 0x6b, 0x93, 0x2e, 0xe2, 0x01, 0x63, 0x8e, 0x24, 0xae, 0xd0, 0x62, 0x9e, 0x78, 0x10, +/*1540:*/ 0x27, 0x83, 0x50, 0x07, 0xb1, 0x75, 0x79, 0x7c, 0xc7, 0x43, 0x6e, 0xdc, 0x75, 0xee, 0x2a, 0xb8, +/*1550:*/ 0x4e, 0x24, 0xa0, 0xfb, 0xb3, 0xed, 0xf5, 0x91, 0xc3, 0xc8, 0x2c, 0xe7, 0x0f, 0x36, 0x21, 0x98, +/*1560:*/ 0x07, 0x61, 0xc9, 0x92, 0xb9, 0x72, 0x49, 0xe0, 0x50, 0xaa, 0x2a, 0x97, 0xa8, 0xf4, 0x68, 0xf6, +/*1570:*/ 0x1f, 0x53, 0xed, 0xb6, 0x7a, 0x14, 0xb1, 0xac, 0xdd, 0xfd, 0xdf, 0x9a, 0xde, 0x3f, 0x2b, 0xc8, +/*1580:*/ 0x14, 0xe5, 0xf8, 0x48, 0x3b, 0xa3, 0x00, 0x48, 0xd2, 0x2a, 0x97, 0x60, 0x1f, 0x6a, 0xed, 0x7a, +/*1590:*/ 0xe0, 0x78, 0xe6, 0x73, 0xa6, 0xa4, 0x80, 0xff, 0x58, 0x6e, 0xb1, 0x16, 0x95, 0xd4, 0xe4, 0x29, +/*15a0:*/ 0xf7, 0x3f, 0x56, 0x7d, 0xe7, 0xf5, 0x7a, 0x0c, 0x78, 0x5a, 0x30, 0x0d, 0x16, 0x8d, 0x6b, 0x58, +/*15b0:*/ 0xee, 0x2e, 0xa9, 0x41, 0x91, 0xe0, 0x69, 0x55, 0x25, 0xd6, 0x4a, 0x11, 0xce, 0x70, 0x32, 0xe0, +/*15c0:*/ 0x37, 0x1d, 0x3f, 0x0e, 0x72, 0xb9, 0xee, 0x8b, 0xda, 0x9e, 0x28, 0xa6, 0xd0, 0xde, 0xea, 0x94, +/*15d0:*/ 0x9e, 0x3d, 0x05, 0xe2, 0x43, 0xd5, 0x87, 0x09, 0x26, 0x0b, 0x89, 0x4c, 0x78, 0x2b, 0xdf, 0x4e, +/*15e0:*/ 0x7b, 0x26, 0x9e, 0xa9, 0x38, 0xc5, 0x08, 0xdb, 0x2e, 0x93, 0x74, 0xd8, 0x70, 0x04, 0xe3, 0x11, +/*15f0:*/ 0xc5, 0x5d, 0xbf, 0x7b, 0x28, 0xb4, 0xfd, 0xe6, 0xef, 0x2e, 0x9c, 0x30, 0x5a, 0x0c, 0xc0, 0xeb, +/*1600:*/ 0xb6, 0xdc, 0x95, 0x71, 0x7c, 0x07, 0x60, 0x97, 0x34, 0x3f, 0xa7, 0xfc, 0x8d, 0x56, 0xd3, 0xc6, +/*1610:*/ 0x1c, 0xff, 0x3c, 0x0f, 0xcb, 0x16, 0x58, 0x2a, 0x07, 0x70, 0x7a, 0x85, 0xc9, 0x8a, 0x17, 0xaa, +/*1620:*/ 0xad, 0xae, 0x4a, 0xb8, 0xfd, 0xdb, 0x00, 0x6d, 0xaa, 0x06, 0x1c, 0x12, 0x86, 0xae, 0x75, 0x37, +/*1630:*/ 0xc0, 0x07, 0xa5, 0xb9, 0xfe, 0x79, 0xd0, 0x64, 0x3b, 0xfd, 0xfb, 0xad, 0x24, 0x3a, 0xe1, 0x56, +/*1640:*/ 0x4e, 0xe2, 0xa1, 0x88, 0x89, 0x85, 0x4e, 0x42, 0x06, 0x44, 0x3f, 0x67, 0x00, 0xbb, 0x35, 0x43, +/*1650:*/ 0x4d, 0x68, 0x26, 0x73, 0xe7, 0xc5, 0x2e, 0xbe, 0x1e, 0xac, 0xa2, 0xad, 0x0e, 0x97, 0x41, 0xd7, +/*1660:*/ 0x60, 0xb9, 0x63, 0xf4, 0x9d, 0x61, 0x7d, 0xee, 0xea, 0xf8, 0xda, 0x74, 0x2a, 0x12, 0x21, 0xf6, +/*1670:*/ 0x48, 0x2b, 0xfe, 0x02, 0x69, 0xe4, 0xf3, 0x66, 0x72, 0x61, 0xb1, 0x63, 0xef, 0x27, 0x0d, 0x90, +/*1680:*/ 0x8d, 0x67, 0x37, 0xec, 0x03, 0xce, 0x28, 0xda, 0xac, 0x40, 0x28, 0xdc, 0xa8, 0x3e, 0x68, 0xbc, +/*1690:*/ 0x6d, 0x77, 0x10, 0x40, 0x36, 0xd3, 0xf6, 0x7b, 0x59, 0x58, 0x90, 0x89, 0x6c, 0x3b, 0xf2, 0x3f, +/*16a0:*/ 0x79, 0x30, 0x62, 0xdc, 0x2a, 0x64, 0xe9, 0xaf, 0x09, 0x92, 0xbd, 0xbd, 0x3e, 0x4e, 0x55, 0x6c, +/*16b0:*/ 0x1e, 0x89, 0x6c, 0xa4, 0x4e, 0xb0, 0xb9, 0x8c, 0xa1, 0xc0, 0xb1, 0xae, 0x20, 0xdb, 0x86, 0x23, +/*16c0:*/ 0xf0, 0x80, 0x34, 0xfe, 0x15, 0x3d, 0x8b, 0xe0, 0x37, 0x74, 0x2e, 0xe8, 0xbb, 0xe6, 0x11, 0x86, +/*16d0:*/ 0x7a, 0xec, 0x27, 0x9f, 0xce, 0x9f, 0x02, 0x8d, 0x9c, 0x29, 0xe8, 0xdb, 0xb8, 0xa9, 0xef, 0xa4, +/*16e0:*/ 0x4e, 0x13, 0x88, 0xd1, 0x26, 0x63, 0x4b, 0xf4, 0x99, 0xb7, 0x11, 0x6a, 0xd1, 0xb8, 0x3a, 0x32, +/*16f0:*/ 0x3f, 0xee, 0x89, 0x71, 0x41, 0x55, 0x21, 0x64, 0x34, 0xb0, 0x1d, 0x81, 0x5b, 0x6f, 0x34, 0x3b, +/*1700:*/ 0x25, 0xdf, 0x2b, 0xef, 0x5c, 0x42, 0xe0, 0x18, 0xc0, 0x47, 0x46, 0x7f, 0x8e, 0xa2, 0xb7, 0x32, +/*1710:*/ 0x76, 0xee, 0x7b, 0x17, 0xf9, 0x4d, 0x6c, 0x5e, 0x9c, 0x33, 0x9d, 0x9e, 0x5f, 0x66, 0xbf, 0x6d, +/*1720:*/ 0xfd, 0x65, 0x01, 0xf6, 0x4c, 0x43, 0xd1, 0x13, 0xe9, 0x0a, 0x37, 0xb6, 0xe8, 0x18, 0x91, 0xee, +/*1730:*/ 0x8c, 0xb5, 0x61, 0xb4, 0xeb, 0x32, 0xff, 0x3d, 0xea, 0x13, 0xae, 0x78, 0x1d, 0xc2, 0x05, 0x9c, +/*1740:*/ 0xd3, 0x79, 0x20, 0x4a, 0xac, 0xb1, 0x0d, 0x26, 0x8d, 0x88, 0x0e, 0x86, 0x1d, 0x42, 0x2e, 0x0a, +/*1750:*/ 0xe0, 0x16, 0x0f, 0x2a, 0x54, 0x95, 0xb6, 0xe9, 0x8c, 0xc6, 0xe8, 0xc0, 0x9a, 0x9a, 0xa8, 0x85, +/*1760:*/ 0x3d, 0x95, 0xb1, 0xbb, 0x00, 0xc3, 0x84, 0xfa, 0x88, 0x19, 0xca, 0x53, 0xa7, 0x83, 0xee, 0x2f, +/*1770:*/ 0xc6, 0xd0, 0xe7, 0xfe, 0xff, 0x46, 0x65, 0xc0, 0x5c, 0xdb, 0x1c, 0xb8, 0x0e, 0xaa, 0x85, 0x06, +/*1780:*/ 0xeb, 0xfd, 0x26, 0x2a, 0x70, 0x3a, 0x35, 0x34, 0xd2, 0xb3, 0xe5, 0xd1, 0x9a, 0x0e, 0x77, 0x51, +/*1790:*/ 0x24, 0xd8, 0x33, 0x46, 0xe7, 0xc5, 0xc5, 0xf5, 0xff, 0xbe, 0xf6, 0x83, 0x83, 0x03, 0x1e, 0x75, +/*17a0:*/ 0x1f, 0x12, 0xab, 0xc3, 0x87, 0xa0, 0xde, 0xca, 0x1e, 0xd0, 0xec, 0xf3, 0x8a, 0xbc, 0xe0, 0x34, +/*17b0:*/ 0xa7, 0xc5, 0xa1, 0x3a, 0xf0, 0x4a, 0x72, 0x8b, 0x25, 0xb8, 0x1f, 0x13, 0x1e, 0x9d, 0xaf, 0x80, +/*17c0:*/ 0x6d, 0xe9, 0x39, 0x19, 0xad, 0x96, 0xce, 0xea, 0xf9, 0x7d, 0x87, 0x94, 0x96, 0x15, 0xaf, 0xc9, +/*17d0:*/ 0x3a, 0xae, 0x1a, 0x66, 0x3a, 0x49, 0x5e, 0xd1, 0x47, 0x27, 0x87, 0x09, 0xcc, 0x7f, 0xe9, 0x22, +/*17e0:*/ 0xd8, 0x00, 0x7f, 0x5b, 0x10, 0x30, 0xfd, 0x39, 0x00, 0xea, 0x8a, 0x2f, 0x89, 0xf3, 0x71, 0x26, +/*17f0:*/ 0x72, 0xce, 0xfe, 0xcc, 0xf3, 0x02, 0xd8, 0xb1, 0xfa, 0x02, 0xfb, 0x28, 0x78, 0xca, 0xe1, 0xdf, +/*1800:*/ 0xff, 0xaf, 0x39, 0x56, 0x77, 0xca, 0x6d, 0x63, 0x50, 0xab, 0x8d, 0x93, 0x0e, 0x1f, 0xff, 0x9f, +/*1810:*/ 0x7f, 0xf2, 0x60, 0x32, 0x56, 0xe6, 0x9a, 0xc7, 0x27, 0xa6, 0x54, 0xce, 0x98, 0xa6, 0xb9, 0xae, +/*1820:*/ 0x17, 0x32, 0xee, 0xd7, 0x78, 0x5b, 0x6f, 0xe6, 0x43, 0x4f, 0x21, 0xaa, 0x3a, 0x8d, 0x10, 0x4b, +/*1830:*/ 0x15, 0xbc, 0x8f, 0x58, 0xc4, 0xd0, 0xb5, 0x4c, 0x3a, 0x9b, 0x03, 0x10, 0xa3, 0xe7, 0x2f, 0x16, +/*1840:*/ 0x9e, 0x7d, 0xb4, 0x23, 0x8d, 0x5c, 0x56, 0x92, 0x0d, 0xec, 0xd2, 0x91, 0x46, 0xac, 0x2f, 0x49, +/*1850:*/ 0x0a, 0x53, 0xb8, 0x00, 0x3e, 0x1c, 0x99, 0x0f, 0xb0, 0x92, 0x85, 0xd0, 0xa7, 0x7c, 0x61, 0xa2, +/*1860:*/ 0x3c, 0xb7, 0xf4, 0xd2, 0x47, 0x80, 0x59, 0xec, 0x0f, 0xf9, 0x7b, 0xbd, 0x74, 0x62, 0x49, 0xac, +/*1870:*/ 0x5d, 0x83, 0xe3, 0xab, 0xf3, 0x85, 0x26, 0x8a, 0x93, 0xf5, 0xbf, 0x2e, 0xdf, 0x6a, 0x5b, 0x4a, +/*1880:*/ 0xa6, 0xa6, 0x3e, 0x75, 0x34, 0x91, 0x3f, 0x65, 0xe2, 0x84, 0xc8, 0x43, 0xdf, 0xb2, 0x80, 0xa0, +/*1890:*/ 0x5a, 0x02, 0xf2, 0x67, 0xfb, 0x6c, 0x2e, 0x67, 0x9e, 0xbf, 0x69, 0xd8, 0x0b, 0xa4, 0x2b, 0xee, +/*18a0:*/ 0xf4, 0x19, 0xe2, 0x8e, 0xb4, 0xc9, 0x85, 0xe4, 0x1b, 0xf1, 0x05, 0x7b, 0x5c, 0xb6, 0xe1, 0x75, +/*18b0:*/ 0x9e, 0xae, 0x3e, 0xf1, 0x9d, 0xac, 0x8f, 0xfa, 0x96, 0x32, 0x0d, 0x02, 0xe4, 0x25, 0x0b, 0xaf, +/*18c0:*/ 0x0e, 0xbc, 0x47, 0xe6, 0xac, 0x3b, 0x92, 0xc4, 0x5b, 0x1e, 0x8e, 0x50, 0x53, 0xf9, 0xa1, 0x5b, +/*18d0:*/ 0xf4, 0xf9, 0xd9, 0x27, 0xd0, 0x18, 0xcb, 0xe6, 0xb0, 0x99, 0x13, 0x74, 0x83, 0x72, 0xad, 0x5c, +/*18e0:*/ 0x61, 0xc5, 0xa8, 0xa8, 0x9b, 0xe0, 0xbc, 0x4a, 0xc0, 0xd8, 0x42, 0x04, 0xd6, 0xa2, 0xab, 0x4a, +/*18f0:*/ 0x47, 0xe3, 0xc1, 0xb8, 0x61, 0xec, 0x6b, 0xf6, 0x91, 0x65, 0x41, 0xc1, 0xe1, 0xfa, 0x79, 0x9a, +/*1900:*/ 0x90, 0x3f, 0xd9, 0x54, 0xb3, 0x5f, 0x08, 0x6c, 0x23, 0x75, 0x7f, 0xb3, 0x05, 0x83, 0x19, 0x1c, +/*1910:*/ 0x0b, 0xb6, 0x0c, 0x5b, 0x2d, 0x1f, 0xd4, 0x08, 0xa7, 0xc7, 0xfc, 0x38, 0xed, 0x98, 0x37, 0xe4, +/*1920:*/ 0x3b, 0xf1, 0xd0, 0x39, 0x18, 0x38, 0xc4, 0xe9, 0xef, 0x60, 0xea, 0x40, 0x9a, 0x2b, 0xdf, 0xac, +/*1930:*/ 0x79, 0x1e, 0x8a, 0x93, 0x38, 0x78, 0x5c, 0x93, 0x1f, 0x2b, 0x7d, 0x89, 0xda, 0x23, 0x6e, 0x63, +/*1940:*/ 0x6a, 0xdf, 0xe7, 0xfe, 0xd5, 0x7e, 0xc8, 0x29, 0x01, 0xdc, 0x3f, 0xfb, 0x3f, 0x50, 0x8c, 0x7d, +/*1950:*/ 0x87, 0x1b, 0x17, 0xcb, 0xf5, 0x78, 0x6a, 0xaa, 0x3d, 0x28, 0xc8, 0xf1, 0x1e, 0x3f, 0x39, 0xf6, +/*1960:*/ 0xba, 0x2f, 0x22, 0x2c, 0x0c, 0xbc, 0xbd, 0x40, 0x3b, 0x51, 0x92, 0x8b, 0x25, 0x3d, 0x7f, 0x64, +/*1970:*/ 0x25, 0xc0, 0x82, 0x4f, 0x9a, 0xae, 0x98, 0xed, 0xb0, 0xea, 0x83, 0xdd, 0xb3, 0xb9, 0xfb, 0xe0, +/*1980:*/ 0x2e, 0xf5, 0x57, 0xd8, 0x2e, 0x64, 0xaf, 0xc0, 0xac, 0x9d, 0xc4, 0x7d, 0xca, 0xcb, 0x71, 0xfa, +/*1990:*/ 0x8e, 0xc9, 0x5f, 0x9b, 0x55, 0x14, 0xdd, 0xc3, 0xad, 0x9d, 0x3d, 0x48, 0x4a, 0x29, 0x45, 0x76, +/*19a0:*/ 0xed, 0x36, 0x0b, 0x41, 0xa8, 0x89, 0x41, 0xcb, 0x7d, 0x60, 0xbc, 0x47, 0x49, 0x70, 0x03, 0x77, +/*19b0:*/ 0xd7, 0xf8, 0x57, 0xac, 0xab, 0x0f, 0x96, 0xe0, 0x47, 0x61, 0x47, 0x05, 0x09, 0xac, 0xa1, 0xef, +/*19c0:*/ 0x68, 0x10, 0xe0, 0x7f, 0x0a, 0x06, 0x32, 0x48, 0x64, 0xdf, 0x7e, 0x39, 0x2d, 0x54, 0xa2, 0x20, +/*19d0:*/ 0xa4, 0xdc, 0x80, 0x88, 0x37, 0xbf, 0x34, 0xb5, 0xe1, 0x43, 0xf9, 0xb9, 0x4c, 0x80, 0x64, 0xd9, +/*19e0:*/ 0xf8, 0x61, 0x28, 0x1e, 0x21, 0xc1, 0xb4, 0x5f, 0xfe, 0x68, 0xe0, 0x05, 0x24, 0x93, 0x3e, 0x73, +/*19f0:*/ 0x34, 0xb7, 0x3f, 0xfc, 0x09, 0x5a, 0xe4, 0x76, 0x97, 0x39, 0x2d, 0xf7, 0x63, 0x39, 0x79, 0x87, +/*1a00:*/ 0xf8, 0x13, 0x39, 0xd6, 0x96, 0x29, 0x99, 0x02, 0xf7, 0x01, 0x21, 0x5c, 0xe8, 0x2d, 0xa7, 0xd8, +/*1a10:*/ 0xe6, 0xb3, 0xd4, 0xcf, 0x0c, 0xa8, 0xa7, 0x32, 0x63, 0xe1, 0x05, 0xc8, 0xf9, 0x77, 0xad, 0x2b, +/*1a20:*/ 0x69, 0xd2, 0xe5, 0xc2, 0xd3, 0x0a, 0x52, 0xde, 0x4e, 0xb4, 0xd6, 0x9f, 0x73, 0x3b, 0x50, 0x7f, +/*1a30:*/ 0x14, 0x0e, 0xb0, 0x7d, 0x08, 0x82, 0xbd, 0x64, 0x9c, 0xcd, 0x46, 0xe4, 0x07, 0x86, 0xa9, 0xcb, +/*1a40:*/ 0xa7, 0x59, 0xf3, 0x7d, 0x17, 0xc9, 0xc4, 0x3a, 0x1e, 0x0b, 0xd1, 0xe2, 0x05, 0x58, 0x4b, 0x04, +/*1a50:*/ 0x4b, 0xfd, 0x41, 0x51, 0x2d, 0xaa, 0x6c, 0x65, 0xea, 0xa0, 0xd3, 0x72, 0x9d, 0x6b, 0xa4, 0x8f, +/*1a60:*/ 0x6d, 0x98, 0x99, 0x53, 0x5e, 0x1e, 0xbc, 0x54, 0xa7, 0x0f, 0x92, 0xe7, 0xe8, 0xc3, 0xcb, 0x00, +/*1a70:*/ 0x75, 0xf9, 0xe7, 0xd9, 0xec, 0xbf, 0x56, 0x19, 0x87, 0xbc, 0xf8, 0x15, 0x58, 0xc1, 0xc1, 0x0b, +/*1a80:*/ 0x80, 0x30, 0xc9, 0x54, 0x6d, 0xed, 0xf5, 0x5c, 0x63, 0xbd, 0xc7, 0xb0, 0x44, 0xc0, 0xc3, 0xd9, +/*1a90:*/ 0x93, 0xa5, 0xb8, 0x49, 0x4d, 0x32, 0xcd, 0xf4, 0xf8, 0x93, 0x96, 0x5c, 0x90, 0xc7, 0xb9, 0xdc, +/*1aa0:*/ 0xbd, 0x84, 0xf0, 0x90, 0x59, 0xd5, 0xe5, 0x6b, 0x62, 0xfd, 0x10, 0x8d, 0x45, 0x91, 0x16, 0x81, +/*1ab0:*/ 0xaf, 0x5c, 0x11, 0xd4, 0xa8, 0x3e, 0xb6, 0xc1, 0x40, 0x18, 0x7f, 0x1e, 0x04, 0x3e, 0x54, 0xb6, +/*1ac0:*/ 0xb8, 0x30, 0x56, 0x27, 0x91, 0xa8, 0x1f, 0xcf, 0xad, 0x2e, 0xf2, 0x0d, 0x24, 0x2f, 0xaf, 0x2d, +/*1ad0:*/ 0xa0, 0x1d, 0xdf, 0xd3, 0x3c, 0x27, 0xb7, 0x86, 0x58, 0x65, 0xad, 0xfb, 0x47, 0xbe, 0x8b, 0x2c, +/*1ae0:*/ 0xa2, 0x9e, 0xbc, 0x11, 0x2c, 0x99, 0xfe, 0xc9, 0x41, 0xf4, 0xd1, 0x89, 0x35, 0x59, 0x38, 0xab, +/*1af0:*/ 0x68, 0x86, 0x68, 0x7b, 0xff, 0x86, 0x01, 0x0a, 0x30, 0xa0, 0xdd, 0x80, 0xb1, 0xf1, 0x8e, 0x8c, +/*1b00:*/ 0xd5, 0x28, 0x4d, 0xf6, 0xe4, 0xa9, 0x85, 0xbe, 0xf9, 0x34, 0xa1, 0xd5, 0x74, 0x43, 0xa2, 0xac, +/*1b10:*/ 0xd3, 0xf1, 0x23, 0xc8, 0x6b, 0x05, 0xae, 0x8f, 0x69, 0xc8, 0xde, 0x5c, 0x0e, 0xb2, 0x5e, 0xf6, +/*1b20:*/ 0xb7, 0xd8, 0x53, 0x45, 0xd3, 0xe3, 0xc5, 0x2e, 0x50, 0x50, 0xdd, 0xba, 0xdb, 0x84, 0x34, 0x56, +/*1b30:*/ 0xe9, 0xf6, 0x90, 0x93, 0xce, 0x45, 0x39, 0x9b, 0x56, 0xd7, 0xb7, 0x7c, 0xb6, 0x93, 0xb9, 0xaf, +/*1b40:*/ 0xaa, 0x2c, 0x16, 0x2a, 0x9e, 0xe8, 0xb1, 0x6c, 0x9c, 0x54, 0xc6, 0x93, 0x77, 0xc6, 0xc7, 0xb6, +/*1b50:*/ 0x5c, 0xc4, 0xb5, 0x7c, 0xa4, 0x81, 0xed, 0x13, 0x66, 0x38, 0x63, 0xa8, 0x3c, 0x85, 0x66, 0x2c, +/*1b60:*/ 0x27, 0x93, 0x2a, 0x4f, 0x6d, 0x51, 0x80, 0xab, 0x63, 0x96, 0x2c, 0xf2, 0xc0, 0x2e, 0x68, 0x05, +/*1b70:*/ 0xfe, 0xc4, 0xc9, 0x6e, 0x0e, 0xf5, 0x9d, 0xee, 0xfb, 0x52, 0x7f, 0x4c, 0x17, 0x70, 0x10, 0x7c, +/*1b80:*/ 0x1a, 0xfb, 0x68, 0xce, 0x00, 0xa6, 0xa8, 0x87, 0xab, 0xa4, 0x77, 0x33, 0x06, 0xf6, 0x4f, 0xe7, +/*1b90:*/ 0xb7, 0xce, 0x5e, 0x5f, 0xd0, 0xe8, 0x98, 0xfe, 0xc0, 0x20, 0x80, 0x7a, 0xd3, 0xd5, 0x8a, 0x16, +/*1ba0:*/ 0x05, 0x06, 0x90, 0xa3, 0x5b, 0xfa, 0x30, 0xc1, 0x65, 0x1a, 0xac, 0x4d, 0x97, 0x27, 0x40, 0xd2, +/*1bb0:*/ 0xbc, 0x13, 0x39, 0x60, 0x34, 0x6b, 0x49, 0x62, 0x6c, 0xb0, 0x2f, 0x09, 0xba, 0x3c, 0xa6, 0x71, +/*1bc0:*/ 0x4a, 0x48, 0xe9, 0x23, 0x9c, 0xd7, 0x3f, 0xfe, 0x85, 0x7e, 0x3f, 0xd7, 0x4f, 0xf5, 0x6a, 0x19, +/*1bd0:*/ 0xe7, 0x10, 0x89, 0x9c, 0x75, 0xde, 0x7a, 0x31, 0xcb, 0x1c, 0xa4, 0x03, 0xa4, 0xa9, 0xd0, 0x9e, +/*1be0:*/ 0x78, 0x87, 0xdf, 0x1e, 0x08, 0x27, 0x25, 0xd8, 0x35, 0xec, 0xbe, 0x17, 0x96, 0x5d, 0x6a, 0x07, +/*1bf0:*/ 0x9f, 0x84, 0x96, 0x33, 0xf4, 0x30, 0x47, 0x8f, 0x06, 0xbf, 0xe3, 0x6e, 0xa7, 0x34, 0xc3, 0x0a, +/*1c00:*/ 0x4f, 0x26, 0xba, 0xcb, 0x6d, 0x3f, 0xa3, 0x44, 0xe4, 0xbf, 0x2b, 0x5c, 0xf0, 0xf7, 0x31, 0xf2, +/*1c10:*/ 0x3a, 0xbd, 0x77, 0xaa, 0x90, 0xdf, 0xb8, 0x08, 0x28, 0x66, 0x4d, 0xdb, 0x20, 0xc4, 0xfc, 0x8f, +/*1c20:*/ 0x80, 0x4f, 0x48, 0x5a, 0xd2, 0x65, 0xfe, 0x9a, 0x2c, 0xc4, 0x33, 0xb4, 0x5d, 0x31, 0x3a, 0x5d, +/*1c30:*/ 0xb8, 0x9c, 0xa7, 0x3a, 0x3f, 0x6f, 0xfc, 0x4f, 0x9e, 0x69, 0xd7, 0x51, 0x6f, 0xf0, 0xc5, 0x90, +/*1c40:*/ 0x0f, 0x93, 0x22, 0xe7, 0x23, 0xeb, 0xeb, 0x6b, 0xcf, 0x5d, 0xa5, 0xa9, 0xc1, 0xca, 0xf7, 0xbf, +/*1c50:*/ 0x98, 0x95, 0x5d, 0x64, 0xa8, 0x2b, 0x8a, 0xe0, 0xe9, 0x18, 0x39, 0x7f, 0x2a, 0xc8, 0x12, 0xda, +/*1c60:*/ 0xef, 0xa2, 0xee, 0xec, 0x8b, 0x54, 0x2f, 0xd5, 0xc1, 0x20, 0x22, 0xef, 0x5f, 0x5d, 0x52, 0x9d, +/*1c70:*/ 0xd4, 0x4e, 0x83, 0x8f, 0x11, 0x2f, 0x13, 0x43, 0x26, 0xfc, 0x26, 0x9d, 0xfb, 0x5a, 0xa6, 0x82, +/*1c80:*/ 0x05, 0xc0, 0xce, 0x07, 0x43, 0x13, 0xfc, 0x7d, 0xb2, 0x26, 0xec, 0xf1, 0x48, 0x4c, 0xd6, 0x6d, +/*1c90:*/ 0x41, 0x55, 0x8c, 0x69, 0x1e, 0xe9, 0xba, 0xaf, 0x4a, 0x2a, 0xa6, 0x3e, 0x17, 0x6c, 0x21, 0x56, +/*1ca0:*/ 0xb1, 0x10, 0xbb, 0xf3, 0x66, 0xd4, 0x2e, 0x7c, 0x6c, 0x2a, 0x44, 0x67, 0x9c, 0x1e, 0x25, 0x15, +/*1cb0:*/ 0x27, 0x53, 0x30, 0xf8, 0xf0, 0x5b, 0x76, 0x24, 0x8b, 0x7f, 0x8c, 0x2d, 0xdd, 0x60, 0x2f, 0xd0, +/*1cc0:*/ 0x1a, 0x3e, 0xf5, 0x5a, 0xe9, 0x7b, 0x4c, 0x4b, 0x67, 0x82, 0x10, 0xa7, 0xbe, 0x08, 0xd0, 0xd8, +/*1cd0:*/ 0x6b, 0x5a, 0x4f, 0xf3, 0x2b, 0xfc, 0xdb, 0xc6, 0x57, 0x89, 0x43, 0x2a, 0xf5, 0x79, 0x03, 0x39, +/*1ce0:*/ 0xfa, 0x1e, 0x5e, 0x09, 0x33, 0x10, 0x4e, 0xb8, 0xb0, 0xb3, 0x85, 0xfe, 0x87, 0x40, 0x7a, 0x43, +/*1cf0:*/ 0x4b, 0x38, 0x56, 0x0a, 0xee, 0xce, 0x0b, 0x7e, 0x9f, 0xea, 0xfa, 0xef, 0xac, 0x3b, 0x7c, 0x77, +/*1d00:*/ 0xa4, 0x0e, 0xc9, 0xdc, 0xe3, 0x58, 0xb9, 0x0b, 0x92, 0xde, 0xc0, 0xde, 0xf0, 0x4e, 0x16, 0x7b, +/*1d10:*/ 0xc1, 0x4e, 0xda, 0x70, 0x63, 0x5a, 0xda, 0xd5, 0x35, 0xfe, 0xc8, 0x08, 0x0e, 0x6f, 0xea, 0x2f, +/*1d20:*/ 0x89, 0x88, 0x35, 0xb8, 0x5d, 0xf3, 0xe1, 0xcf, 0x71, 0x9f, 0x14, 0x8c, 0x46, 0x0a, 0x89, 0xd0, +/*1d30:*/ 0x03, 0x91, 0x13, 0xc6, 0x59, 0x81, 0x74, 0x23, 0x8d, 0xef, 0x80, 0xd9, 0x56, 0x52, 0x3b, 0xdb, +/*1d40:*/ 0xcb, 0xdf, 0x6f, 0xb7, 0x39, 0x30, 0xd8, 0xda, 0xde, 0x3c, 0xc0, 0x10, 0x34, 0x66, 0x7b, 0xb8, +/*1d50:*/ 0x77, 0x56, 0x2a, 0x4c, 0x05, 0x3c, 0x0d, 0xbf, 0x14, 0xa3, 0x32, 0xb1, 0x59, 0xc7, 0xd1, 0x1d, +/*1d60:*/ 0x92, 0x02, 0x0f, 0x52, 0x6d, 0x9e, 0x50, 0x53, 0xee, 0x33, 0x45, 0x75, 0x45, 0x58, 0x02, 0xc1, +/*1d70:*/ 0x59, 0x1b, 0x3e, 0x7e, 0x76, 0xd4, 0xfa, 0xd5, 0x3a, 0x10, 0x90, 0x51, 0x0d, 0xbd, 0xb4, 0xe9, +/*1d80:*/ 0x0a, 0xb1, 0x23, 0x3b, 0x87, 0xd8, 0x0d, 0x49, 0x08, 0x8c, 0x91, 0x1f, 0xa0, 0x4b, 0xe6, 0x74, +/*1d90:*/ 0xf1, 0xe1, 0xc5, 0x43, 0x3e, 0xa2, 0x85, 0x20, 0xc9, 0x30, 0xf0, 0x41, 0x39, 0x8a, 0x4b, 0x80, +/*1da0:*/ 0x7c, 0x94, 0x48, 0x7e, 0x06, 0x0c, 0xec, 0xed, 0x8a, 0x93, 0x02, 0xe3, 0x4c, 0x71, 0xd8, 0xf5, +/*1db0:*/ 0x82, 0x24, 0x0b, 0x63, 0x71, 0xe1, 0x4e, 0x7b, 0xfe, 0xfa, 0xbd, 0xf4, 0x3f, 0xfb, 0xb2, 0xf2, +/*1dc0:*/ 0xba, 0x11, 0x91, 0x9a, 0xcd, 0xcb, 0x07, 0xf7, 0xc7, 0x46, 0xaf, 0x75, 0xc2, 0x23, 0x14, 0x79, +/*1dd0:*/ 0x09, 0xa4, 0xdd, 0x6f, 0x65, 0xac, 0x8f, 0xc2, 0x71, 0x07, 0xfe, 0x27, 0x86, 0xea, 0xd7, 0x2b, +/*1de0:*/ 0xfe, 0x9d, 0x34, 0xe5, 0x63, 0x0e, 0x19, 0x19, 0x38, 0x29, 0xd9, 0x30, 0x00, 0x56, 0xd0, 0xd1, +/*1df0:*/ 0x86, 0x6c, 0xfe, 0x0a, 0x72, 0x97, 0xe9, 0x62, 0xd8, 0xfb, 0xfe, 0x21, 0x6a, 0x16, 0x67, 0xbd, +/*1e00:*/ 0x02, 0xd2, 0xbf, 0x54, 0xc6, 0x97, 0xd8, 0x0a, 0x9b, 0xd3, 0xb5, 0x48, 0xa8, 0x95, 0xa1, 0x2d, +/*1e10:*/ 0x6d, 0x83, 0xa8, 0x2d, 0xbc, 0x1e, 0x16, 0x9b, 0x5c, 0x2a, 0x51, 0x67, 0xfb, 0xb5, 0x7b, 0x2e, +/*1e20:*/ 0xd2, 0xdb, 0x39, 0x3e, 0xfc, 0xcf, 0x18, 0x1d, 0xb9, 0x03, 0xab, 0x79, 0x4d, 0xe0, 0x12, 0x12, +/*1e30:*/ 0xc8, 0x51, 0x9a, 0x40, 0x0e, 0x70, 0xf0, 0x5f, 0x7b, 0xd5, 0x86, 0xe9, 0xf3, 0xe4, 0xbd, 0x07, +/*1e40:*/ 0xc0, 0x7a, 0x44, 0x5f, 0x72, 0x26, 0x64, 0x98, 0x20, 0xe4, 0x45, 0xba, 0xe8, 0xd9, 0x7a, 0x33, +/*1e50:*/ 0x44, 0xa1, 0xed, 0xf8, 0x74, 0x30, 0xee, 0x95, 0x82, 0x2d, 0xfd, 0xd8, 0x40, 0x38, 0xe0, 0x43, +/*1e60:*/ 0x94, 0x10, 0x1d, 0x17, 0x9a, 0x0b, 0xaa, 0xa7, 0x21, 0xae, 0x84, 0x07, 0x23, 0x2a, 0xf9, 0xc6, +/*1e70:*/ 0x1b, 0xf1, 0xa9, 0x54, 0xe5, 0x07, 0x72, 0x44, 0x5f, 0x4f, 0xbc, 0xb2, 0x1e, 0xb4, 0xe3, 0x37, +/*1e80:*/ 0x29, 0xc7, 0xef, 0x21, 0xed, 0x5c, 0x1b, 0xad, 0x77, 0xef, 0x0f, 0xd6, 0x1f, 0x28, 0x2e, 0x93, +/*1e90:*/ 0xdf, 0xd7, 0x68, 0x7c, 0x6b, 0x39, 0x9b, 0x5f, 0xaf, 0x7f, 0xd0, 0x53, 0x16, 0xe0, 0xbb, 0x19, +/*1ea0:*/ 0x19, 0x91, 0x05, 0xc8, 0x9c, 0x37, 0x29, 0xcc, 0x2e, 0xa8, 0xeb, 0xfb, 0x48, 0x0a, 0x04, 0xd0, +/*1eb0:*/ 0x82, 0x73, 0xb7, 0x93, 0x00, 0xcf, 0x82, 0xd8, 0x3d, 0x6d, 0xc6, 0x02, 0xc3, 0xa0, 0x32, 0xb7, +/*1ec0:*/ 0x59, 0x86, 0x73, 0x2f, 0xe5, 0x67, 0x9c, 0x64, 0x90, 0xe0, 0x6f, 0x9e, 0x96, 0x36, 0x7b, 0x86, +/*1ed0:*/ 0x2e, 0x10, 0x45, 0x7f, 0x23, 0x01, 0xf0, 0xad, 0x2f, 0x8b, 0x03, 0x73, 0xd3, 0x4d, 0x6b, 0x7b, +/*1ee0:*/ 0xa8, 0xb4, 0x3a, 0xe8, 0x04, 0x6d, 0x0b, 0x97, 0xca, 0x05, 0x12, 0x12, 0x9d, 0x31, 0x89, 0xf4, +/*1ef0:*/ 0x3d, 0xea, 0x11, 0x8d, 0x39, 0xcc, 0x65, 0x29, 0x16, 0xb7, 0x33, 0xcd, 0x17, 0x9d, 0x14, 0xff, +/*1f00:*/ 0x81, 0xbc, 0xaa, 0xd3, 0x93, 0xc9, 0x6f, 0x78, 0x29, 0x26, 0xf9, 0x1a, 0xd5, 0x0b, 0x0e, 0xe0, +/*1f10:*/ 0xbf, 0x9c, 0xac, 0xc5, 0x89, 0xee, 0xbc, 0x05, 0xf4, 0x7d, 0xc4, 0x39, 0xa8, 0x48, 0xde, 0x4e, +/*1f20:*/ 0x73, 0x39, 0x31, 0x9b, 0xbf, 0x7a, 0xe3, 0x60, 0x56, 0x5f, 0xd1, 0x5e, 0x2c, 0xf8, 0xed, 0x1f, +/*1f30:*/ 0x42, 0x5e, 0x63, 0xb6, 0x7b, 0x53, 0x1c, 0x88, 0x3b, 0x00, 0x90, 0xbc, 0x2f, 0xa1, 0xf1, 0x38, +/*1f40:*/ 0x12, 0x16, 0x21, 0xdf, 0x3a, 0x62, 0x43, 0xc8, 0xf3, 0x2b, 0x9f, 0xf6, 0x2e, 0xf9, 0xbf, 0x5d, +/*1f50:*/ 0x2a, 0x6d, 0x16, 0xe3, 0xee, 0xff, 0x91, 0xf9, 0x51, 0x6d, 0x1c, 0xce, 0xf5, 0x45, 0x43, 0x7f, +/*1f60:*/ 0x0d, 0xa1, 0x1d, 0x97, 0x00, 0xc5, 0xf3, 0x11, 0xfb, 0xf9, 0x49, 0xf2, 0x64, 0xe8, 0x3a, 0x32, +/*1f70:*/ 0x6a, 0x96, 0x2d, 0x2d, 0x03, 0xb0, 0x95, 0x13, 0x3d, 0x19, 0xa2, 0x3e, 0xb3, 0x69, 0x92, 0x3b, +/*1f80:*/ 0x44, 0x60, 0x3f, 0x3c, 0xfd, 0x51, 0x66, 0x9c, 0x40, 0x99, 0x2c, 0x7b, 0x41, 0x75, 0x13, 0x41, +/*1f90:*/ 0x04, 0x98, 0xb0, 0x6d, 0x84, 0x82, 0xa2, 0xbc, 0xf1, 0x72, 0x83, 0x1f, 0xbc, 0x45, 0x40, 0x2d, +/*1fa0:*/ 0x49, 0x49, 0x3b, 0x80, 0x4e, 0xb7, 0x46, 0x61, 0x2b, 0x63, 0x8e, 0x31, 0xf6, 0x19, 0x7f, 0xa5, +/*1fb0:*/ 0xca, 0x50, 0xd2, 0xef, 0xc0, 0x93, 0xb2, 0x17, 0x92, 0x92, 0x24, 0x5c, 0xeb, 0x16, 0xc1, 0x8e, +/*1fc0:*/ 0xa1, 0xb5, 0xad, 0x09, 0x55, 0xfa, 0x24, 0x0f, 0x4f, 0xc1, 0x48, 0x7d, 0x48, 0x9e, 0x43, 0xbb, +/*1fd0:*/ 0xc6, 0x7d, 0xf7, 0x60, 0xb9, 0xf4, 0x96, 0x49, 0x8d, 0x77, 0x9b, 0x7e, 0x5d, 0xc1, 0x02, 0xe3, +/*1fe0:*/ 0xc5, 0x2a, 0x27, 0x9e, 0x13, 0x49, 0x67, 0xef, 0xa1, 0x57, 0x9e, 0x08, 0x77, 0x44, 0x0c, 0x66, +/*1ff0:*/ 0x6b, 0x55, 0xd3, 0x48, 0x15, 0xd5, 0x89, 0x8c, 0x51, 0xb1, 0xbe, 0xda, 0x99, 0xe2, 0x23, 0xec, +/*2000:*/ 0xb3, 0xb4, 0xd3, 0xc4, 0xd5, 0xa9, 0x7f, 0x5c, 0x7b, 0x6c, 0x84, 0xfc, 0x87, 0x8c, 0xbd, 0xdb, +/*2010:*/ 0x24, 0x50, 0x1c, 0x40, 0x84, 0x45, 0x50, 0xc4, 0x96, 0xda, 0xfa, 0xd3, 0x78, 0x35, 0x16, 0xc0, +/*2020:*/ 0xbe, 0xbb, 0x03, 0x9e, 0x73, 0xd8, 0x30, 0xa4, 0x00, 0xb8, 0xcd, 0x8c, 0x4d, 0x04, 0xe8, 0x3d, +/*2030:*/ 0xf5, 0x25, 0xba, 0xea, 0x8a, 0xe9, 0x11, 0xb4, 0xc1, 0x00, 0x1e, 0xd3, 0xb6, 0xdc, 0x72, 0xcb, +/*2040:*/ 0x3d, 0xbe, 0xb2, 0xc8, 0xec, 0x8c, 0xb1, 0x3b, 0xc5, 0x0b, 0x91, 0xbc, 0xcf, 0x31, 0x4b, 0xa6, +/*2050:*/ 0x37, 0xad, 0x35, 0x61, 0xd5, 0x20, 0x29, 0x20, 0xc8, 0xce, 0xab, 0xd7, 0xdf, 0x4a, 0x4c, 0x1f, +/*2060:*/ 0xdc, 0x19, 0xed, 0x59, 0x2f, 0x98, 0x8e, 0xa4, 0x6d, 0xda, 0x4f, 0x88, 0x0e, 0x51, 0xb1, 0xf1, +/*2070:*/ 0xe1, 0x23, 0xf2, 0x6d, 0xcc, 0x8d, 0x2c, 0x00, 0x17, 0xc6, 0x99, 0x78, 0xaf, 0x63, 0x02, 0x24, +/*2080:*/ 0xe6, 0xbc, 0xeb, 0x0b, 0x4d, 0x67, 0xca, 0x03, 0x37, 0xef, 0x7e, 0x60, 0xd0, 0xdc, 0x1c, 0xec, +/*2090:*/ 0x44, 0xd1, 0xd5, 0x51, 0x4b, 0x3c, 0x93, 0x75, 0x75, 0x04, 0x94, 0x3f, 0x49, 0xdb, 0x74, 0x96, +/*20a0:*/ 0xbb, 0x39, 0x43, 0x7c, 0x0f, 0x19, 0x23, 0xf3, 0x11, 0x3e, 0x4b, 0x46, 0xcc, 0xbe, 0xdd, 0xe4, +/*20b0:*/ 0x2f, 0xfd, 0x53, 0xce, 0x27, 0x12, 0xc4, 0x5d, 0x74, 0xff, 0x8f, 0xbf, 0x4b, 0x7a, 0x87, 0x88, +/*20c0:*/ 0x30, 0x51, 0x5c, 0xe3, 0x91, 0xac, 0xbb, 0x35, 0x73, 0xf8, 0x20, 0x0c, 0xbb, 0x12, 0xe5, 0x26, +/*20d0:*/ 0x35, 0xed, 0x16, 0x28, 0x75, 0x55, 0x1d, 0xc3, 0xfe, 0x29, 0xb6, 0xa8, 0x18, 0xc6, 0x30, 0x52, +/*20e0:*/ 0xc3, 0x1f, 0x0e, 0x61, 0xbe, 0xa0, 0x64, 0xc8, 0x98, 0xf8, 0xee, 0x30, 0x27, 0x3c, 0x4c, 0x70, +/*20f0:*/ 0x05, 0x67, 0x26, 0x61, 0xae, 0x42, 0xec, 0x56, 0xde, 0x34, 0x68, 0xca, 0x0a, 0xdf, 0xac, 0x14, +/*2100:*/ 0xc5, 0x28, 0x9e, 0xf6, 0x36, 0xc0, 0x9d, 0xae, 0xfa, 0x5e, 0xb0, 0x44, 0xe0, 0x06, 0x19, 0xfd, +/*2110:*/ 0x48, 0xc8, 0xae, 0xe1, 0x42, 0xe4, 0xfa, 0x2c, 0x8a, 0x5e, 0xd6, 0x17, 0x53, 0x8d, 0x43, 0x13, +/*2120:*/ 0x62, 0x42, 0x98, 0xa6, 0x81, 0xf2, 0x48, 0xeb, 0x48, 0xf0, 0x54, 0xac, 0x94, 0x6e, 0xd4, 0xef, +/*2130:*/ 0x6e, 0xbd, 0xb1, 0xc9, 0xc6, 0x61, 0xb2, 0x68, 0xda, 0x63, 0xf5, 0x48, 0xde, 0xd0, 0xe9, 0x55, +/*2140:*/ 0xfb, 0xdb, 0xb0, 0x95, 0x76, 0xdc, 0xc2, 0xff, 0x65, 0x62, 0x19, 0xd8, 0x48, 0x8b, 0x96, 0x7e, +/*2150:*/ 0xba, 0x5f, 0x17, 0xd8, 0x28, 0x56, 0x45, 0xcf, 0x57, 0xd8, 0x41, 0x89, 0x66, 0x83, 0xbb, 0x8e, +/*2160:*/ 0x6c, 0x2a, 0x51, 0x98, 0x38, 0x25, 0x26, 0x8f, 0x4c, 0xea, 0x24, 0xe2, 0xfb, 0x23, 0xc2, 0x46, +/*2170:*/ 0x5f, 0x70, 0x97, 0xa6, 0x15, 0x7e, 0xfb, 0x5f, 0x1c, 0xf8, 0x08, 0x51, 0x73, 0x40, 0xf1, 0x7d, +/*2180:*/ 0xda, 0x31, 0xd1, 0x6e, 0xc3, 0xe6, 0xad, 0x8e, 0x57, 0x69, 0x91, 0xa5, 0x67, 0xeb, 0x49, 0x67, +/*2190:*/ 0x46, 0x99, 0xda, 0x42, 0x26, 0xc1, 0x5e, 0xc9, 0x71, 0xdc, 0xf4, 0x21, 0xb6, 0xb2, 0xa9, 0xe7, +/*21a0:*/ 0x07, 0xcb, 0x29, 0x03, 0xe1, 0x14, 0x4d, 0x47, 0x25, 0x8b, 0xb4, 0x77, 0x1e, 0xbd, 0xc7, 0x6b, +/*21b0:*/ 0x09, 0xf9, 0xb9, 0x92, 0xa2, 0x14, 0xf4, 0x5e, 0xcf, 0x0a, 0x29, 0x4c, 0xcf, 0x26, 0x76, 0x92, +/*21c0:*/ 0xd7, 0xb5, 0x9e, 0xdc, 0xc5, 0x65, 0x1d, 0xb1, 0xaf, 0xe8, 0x13, 0xf9, 0xe4, 0x2d, 0x1a, 0x8d, +/*21d0:*/ 0x7f, 0xd0, 0x5f, 0xcc, 0x7d, 0xb8, 0x66, 0xb4, 0xd5, 0x1d, 0x54, 0x89, 0x79, 0xc7, 0x86, 0x48, +/*21e0:*/ 0x65, 0xa8, 0xf1, 0x6d, 0xf0, 0xaa, 0xd5, 0xbd, 0xbd, 0xb9, 0xeb, 0x1b, 0x85, 0x9f, 0x29, 0x43, +/*21f0:*/ 0x38, 0x2e, 0xb4, 0xa7, 0x40, 0x92, 0x82, 0x25, 0x1f, 0xdb, 0x91, 0x0d, 0x60, 0x4e, 0x59, 0x29, +/*2200:*/ 0x62, 0xa8, 0xae, 0xee, 0xd4, 0xaf, 0xb0, 0x39, 0xb5, 0xee, 0x8f, 0x8f, 0x9f, 0x22, 0x1e, 0x90, +/*2210:*/ 0x34, 0x7f, 0x8a, 0x99, 0x86, 0xd7, 0xb5, 0x37, 0x8e, 0x6f, 0x5d, 0x06, 0xf3, 0xc9, 0xce, 0x26, +/*2220:*/ 0xfa, 0x87, 0xc6, 0x3b, 0x53, 0x84, 0xe3, 0xae, 0x1f, 0x07, 0x18, 0xa7, 0xb5, 0xf5, 0x9c, 0x10, +/*2230:*/ 0x2b, 0x89, 0x0c, 0x67, 0x05, 0xe1, 0xe7, 0x09, 0xbd, 0x62, 0xde, 0x9c, 0xcd, 0x17, 0x24, 0x51, +/*2240:*/ 0xd3, 0xab, 0x00, 0x07, 0xd7, 0x6b, 0x03, 0x7e, 0x2a, 0xad, 0x42, 0x52, 0xa8, 0x09, 0xc5, 0x1c, +/*2250:*/ 0x55, 0x6f, 0xd4, 0x81, 0x73, 0x18, 0x55, 0xf7, 0x71, 0xc4, 0x9c, 0x31, 0x8e, 0x54, 0xe9, 0xd5, +/*2260:*/ 0x8a, 0x22, 0x64, 0x49, 0xf4, 0x2c, 0xa5, 0x45, 0x0b, 0xaa, 0xbe, 0x90, 0xc7, 0x14, 0xc2, 0x60, +/*2270:*/ 0xf7, 0x5d, 0x93, 0xe7, 0x60, 0xd2, 0xa4, 0x6b, 0x4e, 0x78, 0x5c, 0x77, 0x78, 0x1c, 0x36, 0x1f, +/*2280:*/ 0xbf, 0x87, 0x0d, 0xa0, 0x2c, 0x8c, 0x27, 0x06, 0x21, 0x1c, 0x47, 0x35, 0x57, 0x43, 0xb5, 0x8c, +/*2290:*/ 0x97, 0x8e, 0x2a, 0x89, 0x1f, 0xe8, 0x3d, 0xc9, 0xcd, 0x23, 0x74, 0xbd, 0x69, 0x82, 0x45, 0x39, +/*22a0:*/ 0xf9, 0x27, 0xbe, 0x86, 0xb0, 0x5c, 0xe8, 0x9e, 0x43, 0x27, 0xce, 0x15, 0x60, 0x0d, 0x25, 0x69, +/*22b0:*/ 0x81, 0xbc, 0x55, 0xc9, 0xe2, 0x6e, 0x1d, 0x67, 0x2d, 0xbc, 0xd0, 0x99, 0x82, 0x41, 0x27, 0x0e, +/*22c0:*/ 0x91, 0x5d, 0x85, 0xd1, 0xe7, 0xfb, 0xa1, 0x0e, 0x11, 0x58, 0x4d, 0x45, 0x9a, 0x31, 0x1d, 0x53, +/*22d0:*/ 0xa3, 0xf4, 0x0d, 0x3c, 0x2c, 0xce, 0xd4, 0xec, 0x83, 0xcb, 0xfd, 0x27, 0xa8, 0xfd, 0x2b, 0x5e, +/*22e0:*/ 0xce, 0xe1, 0x0e, 0x5d, 0xe0, 0xb0, 0x4e, 0xbe, 0x81, 0x30, 0x2b, 0x0a, 0x2a, 0x91, 0x75, 0x34, +/*22f0:*/ 0xed, 0xe1, 0x44, 0xb8, 0x02, 0x7f, 0x12, 0xb6, 0x09, 0x9d, 0xac, 0x4e, 0x4d, 0x79, 0x7f, 0xe3, +/*2300:*/ 0x8d, 0x5a, 0x49, 0xf6, 0xde, 0xa0, 0x58, 0x6c, 0x8a, 0x6e, 0x64, 0x6c, 0x79, 0x36, 0xe3, 0xaf, +/*2310:*/ 0xed, 0x03, 0xc5, 0xd8, 0xcc, 0xc9, 0x56, 0x0b, 0x90, 0xa9, 0x9b, 0xe6, 0x6d, 0x96, 0x28, 0x40, +/*2320:*/ 0x2a, 0xfa, 0xc1, 0xfc, 0x2b, 0x75, 0xed, 0x85, 0xfd, 0x19, 0xdf, 0x8d, 0x92, 0x84, 0xf8, 0xbc, +/*2330:*/ 0x8b, 0x6c, 0xda, 0xe5, 0x0b, 0x32, 0x75, 0xd1, 0x29, 0x15, 0x9c, 0x03, 0x71, 0xf5, 0x99, 0xd8, +/*2340:*/ 0x60, 0x21, 0x37, 0x4c, 0xe0, 0x7c, 0x75, 0xdb, 0xd8, 0xcb, 0x23, 0x8a, 0x96, 0xe3, 0x56, 0x4f, +/*2350:*/ 0x7e, 0xff, 0x0e, 0x05, 0x39, 0x33, 0xed, 0x3b, 0xf6, 0xbe, 0x6b, 0x12, 0x29, 0xd3, 0xe3, 0x27, +/*2360:*/ 0x07, 0xa5, 0x18, 0x60, 0x89, 0x66, 0x07, 0x45, 0xa2, 0x36, 0xcc, 0x71, 0x5e, 0x31, 0xeb, 0xd3, +/*2370:*/ 0x0c, 0x30, 0x2f, 0x02, 0x65, 0x3d, 0xb9, 0x50, 0x20, 0x56, 0xc2, 0x2f, 0xfa, 0x76, 0x72, 0xbd, +/*2380:*/ 0x22, 0x08, 0x6a, 0x85, 0x37, 0x91, 0x49, 0x8f, 0x8f, 0xd7, 0x34, 0x1a, 0xf2, 0x7d, 0xd4, 0x57, +/*2390:*/ 0x61, 0x13, 0x9b, 0x7c, 0x30, 0x9e, 0x3c, 0x22, 0x7b, 0xf0, 0x5c, 0xc5, 0xad, 0xcf, 0x6f, 0xf1, +/*23a0:*/ 0xc8, 0x6c, 0x52, 0x8e, 0x69, 0xee, 0x0e, 0xbc, 0x43, 0xce, 0xab, 0x3b, 0x9a, 0xc8, 0xf6, 0x76, +/*23b0:*/ 0x0d, 0xff, 0x1e, 0xdb, 0xb4, 0x02, 0x0b, 0x9c, 0x0f, 0x59, 0x70, 0x4b, 0x23, 0x6d, 0x9d, 0xfa, +/*23c0:*/ 0xb6, 0xe2, 0x55, 0x49, 0x0f, 0xd5, 0x0b, 0xf3, 0x7e, 0x87, 0x51, 0xf4, 0xa7, 0x29, 0x67, 0xd5, +/*23d0:*/ 0xd0, 0xab, 0x68, 0xb8, 0x85, 0x42, 0x5f, 0x6e, 0x8b, 0x0b, 0x4b, 0xd5, 0x13, 0xe3, 0xf7, 0xf1, +/*23e0:*/ 0xe7, 0x19, 0xc2, 0x84, 0xc4, 0xe2, 0x3a, 0x3a, 0xda, 0x02, 0xdc, 0xc0, 0x9c, 0x41, 0x0c, 0x99, +/*23f0:*/ 0xf3, 0x52, 0xb2, 0x8e, 0xcc, 0x41, 0x94, 0xaa, 0xc1, 0x48, 0x3f, 0x81, 0x93, 0xf1, 0xa8, 0x54, +/*2400:*/ 0x85, 0xcf, 0x90, 0xef, 0xa7, 0x03, 0x9f, 0x8d, 0x21, 0xa8, 0x93, 0x63, 0xbb, 0xe4, 0xf4, 0x65, +/*2410:*/ 0xc9, 0x66, 0xe9, 0x8e, 0xeb, 0xa8, 0x66, 0x6b, 0xb9, 0xaa, 0xe2, 0x03, 0x49, 0xf9, 0x47, 0xfe, +/*2420:*/ 0x77, 0xce, 0x72, 0xc6, 0xbb, 0xe6, 0x69, 0x03, 0xea, 0x36, 0x83, 0xf4, 0x27, 0xbb, 0x9e, 0x8e, +/*2430:*/ 0x0e, 0x7b, 0x0a, 0x01, 0x8e, 0x11, 0x68, 0xbc, 0x48, 0xb7, 0xe2, 0x9f, 0x77, 0x28, 0xb5, 0x97, +/*2440:*/ 0x3d, 0x26, 0xda, 0xe5, 0x5a, 0x61, 0xa9, 0xeb, 0xa8, 0xbe, 0x7f, 0xd3, 0x74, 0xdb, 0x8a, 0x7b, +/*2450:*/ 0xf3, 0xf7, 0x1c, 0xc4, 0x28, 0xcd, 0x7a, 0x6e, 0x1d, 0x1c, 0x62, 0xb7, 0xb7, 0xca, 0xc2, 0xbb, +/*2460:*/ 0x6e, 0xc5, 0x5b, 0xb8, 0x18, 0x22, 0x7f, 0x9b, 0xdb, 0x7b, 0x24, 0xed, 0xa4, 0xb1, 0xf6, 0x4f, +/*2470:*/ 0xf7, 0x0f, 0x61, 0x0c, 0x8c, 0xdb, 0x46, 0x50, 0x9d, 0xeb, 0x79, 0x38, 0xfe, 0x28, 0x99, 0x47, +/*2480:*/ 0xdf, 0xff, 0xd9, 0x55, 0x4c, 0x74, 0x05, 0x49, 0x1e, 0xbf, 0xee, 0xb2, 0x99, 0x90, 0x82, 0x96, +/*2490:*/ 0xfc, 0xdc, 0x22, 0x7b, 0x54, 0x73, 0x2a, 0x6b, 0x60, 0x89, 0xf9, 0x49, 0x1d, 0x84, 0x52, 0x84, +/*24a0:*/ 0xc6, 0x0f, 0x8f, 0x9c, 0x7b, 0x61, 0x6d, 0x50, 0x05, 0xce, 0xc0, 0xfb, 0x5d, 0xdd, 0xfa, 0x7e, +/*24b0:*/ 0xb3, 0x3f, 0x66, 0xeb, 0x86, 0x06, 0x56, 0x7e, 0xdf, 0xd5, 0x85, 0x1c, 0x59, 0x6e, 0x2d, 0xd0, +/*24c0:*/ 0xef, 0x59, 0xe0, 0x8a, 0x19, 0x29, 0x11, 0x56, 0xd2, 0x5b, 0xb9, 0x42, 0xdf, 0x94, 0x1f, 0x53, +/*24d0:*/ 0xbe, 0xe0, 0x51, 0x6e, 0x19, 0x58, 0xb1, 0x37, 0x2a, 0xa7, 0x8b, 0xe6, 0xb4, 0x2b, 0x94, 0x44, +/*24e0:*/ 0x95, 0x70, 0xf7, 0x10, 0x3f, 0x7f, 0x3f, 0x6c, 0x49, 0x45, 0xfc, 0x4c, 0x02, 0x35, 0x7c, 0x25, +/*24f0:*/ 0xb0, 0x0c, 0x20, 0x1d, 0x54, 0xf8, 0x7f, 0x26, 0x1a, 0x9f, 0xeb, 0xea, 0x23, 0x29, 0x73, 0xca, +/*2500:*/ 0x24, 0x0a, 0x3c, 0xef, 0xac, 0xc4, 0x78, 0x4a, 0xf6, 0x85, 0x65, 0x09, 0xed, 0xae, 0x19, 0x1e, +/*2510:*/ 0xc0, 0x81, 0x82, 0xfb, 0xa6, 0x49, 0xed, 0xa6, 0xda, 0x3f, 0x6d, 0x5b, 0xca, 0xdd, 0xe4, 0x59, +/*2520:*/ 0x71, 0x3f, 0x9d, 0xdb, 0x2e, 0x8a, 0xe7, 0x48, 0x8d, 0x5b, 0xe8, 0x61, 0x38, 0xb5, 0x23, 0x4e, +/*2530:*/ 0x78, 0xd9, 0xa7, 0x9e, 0x93, 0x6c, 0x11, 0x37, 0x53, 0x6c, 0xab, 0x7f, 0x72, 0xc8, 0x6e, 0x24, +/*2540:*/ 0x93, 0xfa, 0xbb, 0xe3, 0x23, 0xd4, 0x58, 0xd6, 0x8c, 0x6b, 0x01, 0xa3, 0xff, 0x58, 0x3f, 0x27, +/*2550:*/ 0x81, 0xfd, 0x51, 0x46, 0xae, 0xc1, 0x38, 0x05, 0xd7, 0x95, 0x05, 0xd5, 0xb6, 0xf2, 0xec, 0x4e, +/*2560:*/ 0x1f, 0x6c, 0x9a, 0x69, 0x22, 0x10, 0x3d, 0xce, 0xa8, 0x39, 0xca, 0xfc, 0x64, 0x1b, 0x21, 0x91, +/*2570:*/ 0x64, 0xd3, 0x8f, 0x81, 0xb2, 0x85, 0x0d, 0x0b, 0x50, 0x51, 0x6f, 0xfc, 0x38, 0x49, 0x66, 0x62, +/*2580:*/ 0x08, 0x8b, 0x96, 0xd2, 0x0e, 0x68, 0xe1, 0x11, 0x7e, 0xf6, 0x8d, 0x51, 0x4d, 0xcd, 0xe0, 0x97, +/*2590:*/ 0xe7, 0x1d, 0xef, 0x81, 0x64, 0x02, 0x85, 0x27, 0x76, 0x34, 0xa6, 0xc8, 0xc0, 0xe6, 0x6e, 0xa7, +/*25a0:*/ 0x2b, 0xd3, 0x63, 0x47, 0xdf, 0x47, 0x60, 0xd0, 0x1c, 0x1b, 0xc1, 0x28, 0x1d, 0x21, 0xcb, 0x8f, +/*25b0:*/ 0xba, 0x3d, 0x77, 0x00, 0x29, 0x3f, 0xbe, 0x49, 0x1f, 0x7b, 0x98, 0x67, 0xa0, 0x2f, 0x54, 0xde, +/*25c0:*/ 0x62, 0x0f, 0x91, 0x10, 0xd3, 0x66, 0x97, 0xb2, 0x3f, 0x4a, 0xbe, 0x3b, 0xad, 0x5e, 0xfe, 0xd0, +/*25d0:*/ 0xe5, 0xbd, 0x21, 0x5e, 0x0a, 0x61, 0x8b, 0x98, 0x33, 0x71, 0xce, 0x9d, 0x40, 0x95, 0xae, 0x9a, +/*25e0:*/ 0x29, 0x03, 0xc9, 0xdc, 0x54, 0x21, 0x55, 0xa3, 0xf1, 0x87, 0x0c, 0x9d, 0xc0, 0x0d, 0x6d, 0x01, +/*25f0:*/ 0xc3, 0x64, 0x3b, 0xd7, 0x02, 0x4e, 0x23, 0xd9, 0xa3, 0x36, 0x63, 0x74, 0x8c, 0x44, 0x86, 0xd9, +/*2600:*/ 0x7c, 0xf8, 0xa6, 0x71, 0x82, 0x27, 0x1c, 0x9a, 0x7a, 0x49, 0xf8, 0xdd, 0xcb, 0x10, 0xd6, 0x74, +/*2610:*/ 0xb0, 0x97, 0x9b, 0xcb, 0x9d, 0x67, 0x62, 0xb7, 0xbe, 0x35, 0x51, 0xc5, 0xc8, 0x83, 0xa1, 0xfa, +/*2620:*/ 0xb3, 0x39, 0x2b, 0x0f, 0xfc, 0x8a, 0x8d, 0x2f, 0xa5, 0x5b, 0x5a, 0x6f, 0x9a, 0x46, 0x74, 0x1a, +/*2630:*/ 0x5c, 0x9d, 0x69, 0xcf, 0x5e, 0x1d, 0x40, 0x28, 0xe7, 0x79, 0x2e, 0x04, 0x54, 0xd6, 0x52, 0x57, +/*2640:*/ 0xa2, 0x85, 0x6a, 0x45, 0x1e, 0x3e, 0xf5, 0xc7, 0x82, 0x67, 0x5f, 0x78, 0x5c, 0x16, 0x26, 0x5d, +/*2650:*/ 0x13, 0xf0, 0x41, 0x31, 0x57, 0x34, 0x8b, 0xc9, 0x25, 0x1b, 0x06, 0x25, 0xc6, 0x00, 0x97, 0x9e, +/*2660:*/ 0x7c, 0x63, 0x64, 0xfc, 0xda, 0x8b, 0x50, 0x80, 0x66, 0x70, 0x15, 0x9c, 0x04, 0xaf, 0xa5, 0x95, +/*2670:*/ 0xb8, 0x54, 0x5c, 0xa6, 0x13, 0x42, 0xed, 0xeb, 0xb2, 0xb8, 0xe2, 0x06, 0xb9, 0x21, 0xdb, 0x04, +/*2680:*/ 0xba, 0x63, 0x87, 0xcb, 0xc9, 0xee, 0x04, 0x14, 0x78, 0xac, 0x00, 0x4a, 0x2e, 0x46, 0xee, 0x54, +/*2690:*/ 0x12, 0x18, 0xe4, 0x6b, 0x0c, 0x3f, 0xcc, 0xfb, 0x4f, 0xcd, 0x5a, 0xf3, 0x70, 0x85, 0xeb, 0xf1, +/*26a0:*/ 0x2b, 0x7b, 0x83, 0xad, 0x19, 0xb2, 0x6f, 0xda, 0xa3, 0xca, 0x46, 0xc2, 0xf8, 0xb0, 0x34, 0x59, +/*26b0:*/ 0x40, 0x07, 0x60, 0x0c, 0xb0, 0xb3, 0xc9, 0x6a, 0xeb, 0x82, 0x1a, 0x6e, 0xe0, 0x13, 0x5e, 0x7a, +/*26c0:*/ 0x32, 0x5f, 0xe7, 0xe2, 0x9a, 0x12, 0x77, 0x41, 0xd6, 0x3c, 0xa7, 0x79, 0x20, 0x69, 0x72, 0x63, +/*26d0:*/ 0x6d, 0x83, 0xbc, 0xc8, 0x8e, 0x62, 0xa0, 0x46, 0xf5, 0x70, 0xab, 0x35, 0x5f, 0x57, 0xfa, 0x9f, +/*26e0:*/ 0x7c, 0xb5, 0x7a, 0xd8, 0xce, 0x82, 0x92, 0xbd, 0x83, 0xb7, 0xb7, 0xb7, 0xc0, 0x3a, 0x01, 0x47, +/*26f0:*/ 0x50, 0x9a, 0xe9, 0x83, 0x59, 0x8f, 0xee, 0x09, 0x27, 0x40, 0xf1, 0x51, 0x88, 0x52, 0x8d, 0x82, +/*2700:*/ 0xff, 0x23, 0x91, 0x81, 0xc8, 0x2b, 0x35, 0x72, 0xad, 0xdb, 0x1e, 0xfa, 0xb2, 0x3c, 0xce, 0x71, +/*2710:*/ 0xd9, 0xc4, 0x74, 0xa9, 0x12, 0x20, 0x71, 0x04, 0xdb, 0xca, 0x4d, 0x8d, 0x3e, 0x95, 0xb1, 0x5c, +/*2720:*/ 0x6c, 0x69, 0xed, 0xce, 0x5b, 0x8f, 0x8a, 0xb0, 0x6e, 0x0b, 0x36, 0x60, 0x7f, 0xb1, 0x2b, 0xcc, +/*2730:*/ 0xad, 0xac, 0x70, 0x01, 0xfa, 0x82, 0x62, 0x93, 0x0b, 0x54, 0x37, 0xfd, 0xae, 0x58, 0xf8, 0x39, +/*2740:*/ 0x21, 0xd1, 0xda, 0xbd, 0x68, 0xfa, 0xff, 0x93, 0x4a, 0xff, 0x0d, 0x15, 0xdd, 0xf5, 0x4e, 0x95, +/*2750:*/ 0xa8, 0x0a, 0x85, 0xac, 0x4e, 0x81, 0x20, 0x5b, 0xec, 0x56, 0x89, 0x3f, 0xf5, 0x8c, 0x08, 0xe4, +/*2760:*/ 0x45, 0x01, 0x81, 0xc7, 0xf6, 0x62, 0xe4, 0x99, 0x99, 0xaa, 0x6e, 0x08, 0xc9, 0x16, 0x05, 0x50, +/*2770:*/ 0x87, 0x9f, 0x33, 0x43, 0xf4, 0x08, 0xe9, 0x24, 0x11, 0x54, 0xbc, 0x24, 0x3c, 0x8a, 0xb3, 0xa9, +/*2780:*/ 0xd6, 0x49, 0x5c, 0xa6, 0xa2, 0x46, 0x0f, 0x2a, 0xa1, 0x38, 0xe2, 0xf7, 0x8b, 0x0d, 0x7f, 0xb9, +/*2790:*/ 0x41, 0x81, 0x13, 0xdb, 0x5b, 0xc4, 0xc5, 0x17, 0xad, 0xbc, 0xd4, 0x7a, 0xd6, 0xe0, 0x20, 0x0a, +/*27a0:*/ 0x03, 0x9d, 0x31, 0xa3, 0x39, 0xf6, 0xff, 0x53, 0x83, 0x06, 0x08, 0x3e, 0xb8, 0x97, 0x7b, 0xc1, +/*27b0:*/ 0xa4, 0xd8, 0xe3, 0x5b, 0xe7, 0x44, 0x4b, 0x19, 0x89, 0xdf, 0x68, 0x95, 0x56, 0xd1, 0x59, 0x52, +/*27c0:*/ 0x69, 0xf5, 0x97, 0x3c, 0xee, 0x6a, 0xf1, 0xaa, 0xed, 0x60, 0x46, 0x19, 0x58, 0x2c, 0x73, 0xa6, +/*27d0:*/ 0x9c, 0x1b, 0x96, 0x4a, 0x23, 0x4c, 0x88, 0x6a, 0x5d, 0xdc, 0x77, 0x9d, 0x2a, 0xbf, 0x06, 0xa0, +/*27e0:*/ 0x9c, 0x2a, 0x4a, 0xa3, 0x9d, 0x9a, 0xeb, 0x99, 0x30, 0x74, 0xc7, 0xd8, 0x29, 0x52, 0x53, 0x92, +/*27f0:*/ 0x24, 0xa8, 0x10, 0xd2, 0x96, 0xa8, 0x60, 0xfb, 0x1f, 0x5b, 0x75, 0x1e, 0x60, 0x0f, 0x85, 0xe7, +/*2800:*/ 0x3d, 0xbe, 0x34, 0x66, 0x46, 0xee, 0x6f, 0xf6, 0x7e, 0x83, 0x08, 0xb2, 0xe1, 0x3c, 0xc6, 0x8c, +/*2810:*/ 0x15, 0x84, 0xd2, 0x15, 0x71, 0x6d, 0x12, 0x84, 0xb8, 0x34, 0x52, 0x15, 0x63, 0xab, 0x00, 0xfc, +/*2820:*/ 0x10, 0x7a, 0x4a, 0x76, 0xb8, 0xe5, 0x56, 0x08, 0x18, 0x32, 0x01, 0xa4, 0x93, 0xe5, 0xd3, 0x58, +/*2830:*/ 0xa3, 0x8b, 0x09, 0x92, 0xe0, 0x4d, 0x19, 0xe6, 0x38, 0x5f, 0x88, 0x08, 0x94, 0xb2, 0xfe, 0xe3, +/*2840:*/ 0xee, 0x08, 0x98, 0x9f, 0x54, 0x79, 0xa1, 0x17, 0xdf, 0xf5, 0x52, 0xa5, 0xe7, 0x0f, 0xd0, 0x9f, +/*2850:*/ 0x13, 0x28, 0x80, 0xc6, 0x3d, 0x9a, 0xe4, 0x2e, 0xac, 0x7d, 0x6c, 0x8a, 0x00, 0xaa, 0xaa, 0xd4, +/*2860:*/ 0x25, 0x35, 0x1f, 0x1f, 0xc3, 0xd4, 0xf8, 0x40, 0xe0, 0x81, 0xbc, 0xe1, 0xd3, 0xb6, 0x12, 0x12, +/*2870:*/ 0x89, 0x11, 0x5e, 0x3a, 0x79, 0x12, 0xb1, 0x2d, 0xb2, 0x51, 0x2b, 0x98, 0x18, 0x48, 0xbd, 0x63, +/*2880:*/ 0x30, 0xe8, 0x36, 0x6a, 0x3a, 0xf4, 0x7d, 0x5a, 0x64, 0x0e, 0xa6, 0xb1, 0xd0, 0x1c, 0x26, 0xfa, +/*2890:*/ 0x79, 0xed, 0x02, 0x81, 0xe4, 0x85, 0x2f, 0xb3, 0x41, 0xa0, 0x43, 0x93, 0x78, 0x5f, 0xf0, 0xb7, +/*28a0:*/ 0x4a, 0x10, 0x09, 0x59, 0x77, 0x81, 0xbc, 0x53, 0x26, 0xc9, 0xc6, 0x33, 0xf7, 0x1f, 0xe5, 0x68, +/*28b0:*/ 0xd6, 0x9a, 0x0a, 0x39, 0xf4, 0x10, 0xd5, 0x51, 0x68, 0xfe, 0x0d, 0x4e, 0x93, 0xb9, 0xc3, 0xc6, +/*28c0:*/ 0x3d, 0xa3, 0x16, 0x3c, 0x8f, 0xcd, 0xc2, 0xb8, 0xc4, 0x23, 0x2c, 0xd8, 0x05, 0xea, 0xad, 0x61, +/*28d0:*/ 0x7e, 0x51, 0x57, 0x71, 0xb1, 0x74, 0xec, 0x5b, 0x10, 0x65, 0x45, 0x21, 0xc6, 0x07, 0xc6, 0xce, +/*28e0:*/ 0xf2, 0x4d, 0x83, 0x87, 0x33, 0x83, 0x3b, 0x40, 0x5c, 0x23, 0xcf, 0xef, 0xcf, 0xd5, 0xd7, 0x2c, +/*28f0:*/ 0x52, 0x3c, 0xf6, 0x8b, 0x4d, 0x33, 0xc1, 0xce, 0xe1, 0xd4, 0xcd, 0x39, 0xba, 0x1a, 0x0a, 0xd1, +/*2900:*/ 0x88, 0xf2, 0x79, 0x52, 0x91, 0x26, 0x71, 0x90, 0x2c, 0xc0, 0x8f, 0xcb, 0xb8, 0x00, 0x52, 0x38, +/*2910:*/ 0x1f, 0xcf, 0x7e, 0xfd, 0xd9, 0x86, 0xb2, 0xe6, 0xf5, 0x46, 0x75, 0x6d, 0x81, 0x77, 0xc9, 0x7a, +/*2920:*/ 0x60, 0xa8, 0xc6, 0xe4, 0x77, 0xc2, 0x22, 0xc0, 0x9e, 0xac, 0x31, 0xd9, 0xfd, 0xa8, 0xed, 0x53, +/*2930:*/ 0x72, 0x21, 0xca, 0x2c, 0x1b, 0xf6, 0x5c, 0xb9, 0xfe, 0x79, 0x84, 0xa8, 0x14, 0xc7, 0x14, 0x91, +/*2940:*/ 0x35, 0x6f, 0x07, 0x8e, 0x8f, 0x34, 0x70, 0x49, 0xeb, 0x85, 0x61, 0x19, 0x6f, 0x67, 0xe0, 0xe6, +/*2950:*/ 0x13, 0x9c, 0x16, 0x8a, 0xa8, 0x14, 0xed, 0x9c, 0xa6, 0xd9, 0x14, 0xc7, 0xd1, 0xba, 0x9d, 0xef, +/*2960:*/ 0x36, 0x0e, 0x69, 0x11, 0xdc, 0x7d, 0x5b, 0x18, 0xd3, 0x81, 0x86, 0x89, 0xde, 0x38, 0xe5, 0x2f, +/*2970:*/ 0x04, 0x71, 0xd2, 0xda, 0x21, 0x9e, 0x97, 0x91, 0xf1, 0x14, 0x43, 0xdf, 0x27, 0xb9, 0x41, 0x02, +/*2980:*/ 0x16, 0x27, 0x91, 0x36, 0xe2, 0x8b, 0x6e, 0x5b, 0x00, 0xa8, 0x5d, 0x0f, 0xad, 0x1c, 0xb2, 0x1d, +/*2990:*/ 0xba, 0xa2, 0x55, 0xf3, 0xbe, 0x0c, 0x44, 0x84, 0x09, 0xcb, 0xe9, 0x7c, 0x55, 0xbd, 0x42, 0x52, +/*29a0:*/ 0xf4, 0x50, 0xbe, 0xd2, 0x6d, 0x10, 0x86, 0x32, 0x17, 0x4a, 0x80, 0x97, 0xde, 0xa1, 0xbc, 0x08, +/*29b0:*/ 0x83, 0x2f, 0xce, 0x62, 0x02, 0xae, 0x0d, 0x08, 0x2f, 0x44, 0x73, 0x6d, 0xf7, 0xa9, 0x97, 0xf2, +/*29c0:*/ 0x0f, 0x80, 0xce, 0x1f, 0xfe, 0x97, 0x22, 0x7d, 0xfb, 0xc9, 0x12, 0x10, 0x20, 0x7e, 0xab, 0x08, +/*29d0:*/ 0xa3, 0xd3, 0x77, 0xfb, 0xfb, 0x3a, 0xad, 0xae, 0x6a, 0xd5, 0x2c, 0x5c, 0xd0, 0x4e, 0xca, 0xfc, +/*29e0:*/ 0xd7, 0xaf, 0x5a, 0x14, 0x0c, 0xd2, 0x11, 0x18, 0x2d, 0x0e, 0x05, 0x53, 0xb0, 0x22, 0x43, 0x8a, +/*29f0:*/ 0xe3, 0x99, 0x84, 0x1d, 0x16, 0xd2, 0xf2, 0x77, 0x26, 0xe2, 0x55, 0xb0, 0x58, 0x7e, 0x0b, 0xb8, +/*2a00:*/ 0xa7, 0x88, 0x50, 0x1b, 0x9d, 0x2f, 0x09, 0x03, 0x8f, 0x62, 0x06, 0x89, 0x83, 0x26, 0x44, 0x78, +/*2a10:*/ 0xb4, 0x64, 0x20, 0x6d, 0xc7, 0x8a, 0xf1, 0x53, 0xaa, 0xaf, 0xab, 0x5e, 0xa4, 0x30, 0x09, 0x22, +/*2a20:*/ 0xea, 0x7b, 0x82, 0x73, 0x50, 0xff, 0x60, 0x73, 0xc3, 0xfc, 0xba, 0xec, 0xfb, 0xae, 0x6e, 0xfc, +/*2a30:*/ 0x59, 0xda, 0xde, 0xef, 0xbc, 0xae, 0x8e, 0x4c, 0xb1, 0xf5, 0xd7, 0x97, 0xf4, 0x93, 0x91, 0x13, +/*2a40:*/ 0x24, 0x3c, 0xd1, 0xed, 0xf0, 0xb4, 0x19, 0xb8, 0x6d, 0xbe, 0x13, 0x9b, 0xc3, 0xea, 0x94, 0xcb, +/*2a50:*/ 0x7d, 0x2b, 0x54, 0xd4, 0xb9, 0xb8, 0x25, 0x3d, 0x5f, 0xdd, 0x82, 0x1f, 0x0f, 0x09, 0x8f, 0xb0, +/*2a60:*/ 0xe9, 0x34, 0x6f, 0x7e, 0x3d, 0x3e, 0xd4, 0x79, 0x44, 0x2f, 0xcf, 0xb5, 0xb3, 0x2c, 0x23, 0xb4, +/*2a70:*/ 0xd3, 0xd0, 0x19, 0x24, 0xf7, 0x9c, 0x24, 0xd4, 0x8d, 0x41, 0x04, 0x72, 0x7d, 0x88, 0x88, 0xa8, +/*2a80:*/ 0xda, 0x71, 0xf3, 0x99, 0x96, 0x4d, 0x0d, 0x7e, 0x22, 0xb0, 0x7c, 0xde, 0x20, 0xe8, 0x8d, 0xcf, +/*2a90:*/ 0x94, 0x27, 0x5e, 0x0c, 0x65, 0xc1, 0xe3, 0xb7, 0x09, 0x97, 0xe0, 0x32, 0x3f, 0x43, 0xf2, 0xbe, +/*2aa0:*/ 0x50, 0x8e, 0x6d, 0xe6, 0xc4, 0x18, 0xe6, 0xed, 0xaf, 0x45, 0x22, 0x79, 0x99, 0x72, 0x95, 0x45, +/*2ab0:*/ 0x4a, 0xb5, 0x0e, 0x5d, 0x17, 0x23, 0x72, 0xff, 0x96, 0xb9, 0x84, 0xbb, 0x08, 0x54, 0xe7, 0xef, +/*2ac0:*/ 0x6b, 0x4f, 0xf3, 0xd9, 0x0d, 0xe3, 0x0a, 0x78, 0x71, 0xb3, 0x8f, 0x5f, 0x58, 0x49, 0x4c, 0x4f, +/*2ad0:*/ 0x49, 0xa0, 0x4d, 0x2d, 0xf7, 0x79, 0xe5, 0x9f, 0xd6, 0xa2, 0x62, 0x39, 0x78, 0xf7, 0xd6, 0x79, +/*2ae0:*/ 0x2d, 0x44, 0xde, 0x81, 0x73, 0x6f, 0x33, 0x3c, 0xcb, 0xd9, 0x4c, 0x4d, 0x0f, 0x04, 0x8a, 0x68, +/*2af0:*/ 0x49, 0x4a, 0xa5, 0x51, 0x77, 0x1a, 0x6e, 0x19, 0x5f, 0xe2, 0x2a, 0x8b, 0x94, 0x11, 0x36, 0xb0, +/*2b00:*/ 0x22, 0x20, 0x3f, 0xeb, 0x17, 0xab, 0xbb, 0x93, 0xa3, 0x7e, 0xa0, 0x55, 0x4c, 0x1f, 0x8e, 0x3b, +/*2b10:*/ 0x78, 0x82, 0xd7, 0x3f, 0xf7, 0xca, 0x68, 0xa7, 0x6f, 0xf2, 0xd1, 0xfa, 0x36, 0x5e, 0xe0, 0xe3, +/*2b20:*/ 0x78, 0x7b, 0xf8, 0x92, 0xc0, 0xc9, 0xc9, 0xba, 0x98, 0x59, 0x31, 0x12, 0x42, 0xfb, 0xd3, 0x5f, +/*2b30:*/ 0xc0, 0xcb, 0xb1, 0x45, 0xf6, 0xa4, 0x49, 0xf8, 0x28, 0x90, 0xb1, 0x13, 0xc2, 0x15, 0x99, 0x25, +/*2b40:*/ 0x28, 0x23, 0xe6, 0x3c, 0x97, 0xc4, 0x3b, 0xf1, 0xf5, 0xb9, 0x68, 0x85, 0x5d, 0x2a, 0x94, 0x29, +/*2b50:*/ 0x6c, 0xc6, 0x77, 0xba, 0x27, 0x10, 0xaa, 0x02, 0x0d, 0x23, 0x69, 0x41, 0xdd, 0xcf, 0xe7, 0xbf, +/*2b60:*/ 0xa4, 0xf1, 0xeb, 0xa7, 0x84, 0x16, 0x0d, 0x5a, 0x40, 0x0e, 0xfb, 0x4c, 0x72, 0xa5, 0x8b, 0x3c, +/*2b70:*/ 0x38, 0x09, 0xfe, 0x0f, 0x36, 0xd7, 0x57, 0x1b, 0x22, 0x0c, 0xd9, 0xc2, 0xe1, 0xf1, 0x2a, 0xbe, +/*2b80:*/ 0x4f, 0x9b, 0x0c, 0x9a, 0x46, 0xba, 0x60, 0x29, 0x8c, 0x06, 0xbc, 0x51, 0x2b, 0x63, 0x7a, 0x5a, +/*2b90:*/ 0x96, 0xb0, 0xa1, 0x3b, 0x5a, 0x54, 0x88, 0x21, 0xa5, 0x49, 0x48, 0xa5, 0x42, 0x28, 0xac, 0xcc, +/*2ba0:*/ 0x34, 0xe1, 0x1c, 0x20, 0x18, 0xb7, 0x40, 0x75, 0xc1, 0x1a, 0xb7, 0x35, 0x32, 0x7b, 0x5a, 0x5f, +/*2bb0:*/ 0xc3, 0xff, 0x98, 0x5a, 0xd2, 0xa0, 0x29, 0x8a, 0xa4, 0xab, 0x69, 0xc2, 0x70, 0xff, 0x2c, 0xbb, +/*2bc0:*/ 0x8f, 0x2b, 0x4d, 0x34, 0x29, 0x35, 0x46, 0xdd, 0x95, 0xc5, 0x38, 0x7d, 0x89, 0x22, 0x1d, 0xe7, +/*2bd0:*/ 0xfb, 0xf4, 0x6f, 0xcc, 0xf2, 0x97, 0xe4, 0xb1, 0xe3, 0x8f, 0x31, 0x3b, 0x75, 0x92, 0xff, 0x7b, +/*2be0:*/ 0x0a, 0x5b, 0x9a, 0x97, 0x6b, 0x15, 0xfa, 0x24, 0x2a, 0xcc, 0x8e, 0x6c, 0xbd, 0x35, 0x5e, 0x51, +/*2bf0:*/ 0x77, 0x5c, 0xdd, 0x24, 0x96, 0x11, 0x29, 0x22, 0x76, 0xe4, 0xf8, 0xc5, 0xa7, 0x07, 0x1e, 0x92, +/*2c00:*/ 0xf0, 0x48, 0xa8, 0x85, 0x17, 0x14, 0x79, 0x8f, 0x97, 0xeb, 0x13, 0x10, 0xcf, 0xf1, 0x86, 0x59, +/*2c10:*/ 0x54, 0x46, 0xac, 0xb6, 0x46, 0x48, 0x85, 0x47, 0xe9, 0xfd, 0x7b, 0x4e, 0x38, 0xbe, 0xac, 0x3a, +/*2c20:*/ 0xce, 0xfa, 0x9a, 0xe2, 0xc6, 0x21, 0xf6, 0x9b, 0xef, 0x85, 0x24, 0x86, 0x93, 0x91, 0x6a, 0x6c, +/*2c30:*/ 0xea, 0x27, 0x57, 0xc1, 0x83, 0x67, 0x78, 0x68, 0x12, 0x9b, 0x25, 0xdd, 0x31, 0x5d, 0x0a, 0x94, +/*2c40:*/ 0x29, 0x9c, 0x73, 0x40, 0x95, 0x87, 0x9c, 0x00, 0xb0, 0xd1, 0xd8, 0xb4, 0xd4, 0xaf, 0x1d, 0x4f, +/*2c50:*/ 0x21, 0x70, 0x1d, 0x5d, 0x40, 0xb2, 0x6f, 0x50, 0x97, 0x26, 0x4f, 0x96, 0xa8, 0x1a, 0x0e, 0xb2, +/*2c60:*/ 0x8d, 0x29, 0x45, 0x20, 0x21, 0x48, 0x91, 0x86, 0xd2, 0x85, 0xd6, 0x62, 0x2e, 0x33, 0xf5, 0xe4, +/*2c70:*/ 0xf3, 0x11, 0xa4, 0x59, 0x4b, 0x35, 0x61, 0xa2, 0x29, 0x73, 0x39, 0x7e, 0xe6, 0xfb, 0x4c, 0x99, +/*2c80:*/ 0x00, 0x2a, 0x82, 0xf2, 0xd9, 0x2c, 0x82, 0x0a, 0x52, 0xdd, 0xe1, 0x23, 0x92, 0x55, 0x77, 0xdd, +/*2c90:*/ 0xf2, 0xf1, 0x68, 0x5d, 0x7e, 0xdf, 0xd4, 0x0f, 0xfc, 0xa5, 0x4d, 0xcc, 0xb3, 0x0e, 0x35, 0xe2, +/*2ca0:*/ 0x83, 0x60, 0x93, 0x7a, 0x40, 0x8d, 0x4b, 0xc1, 0x97, 0x17, 0x79, 0xb0, 0x10, 0x7f, 0x1e, 0x59, +/*2cb0:*/ 0x7a, 0xfe, 0x8f, 0xd9, 0xa1, 0xf0, 0x00, 0x32, 0x08, 0x5d, 0x8d, 0xa0, 0xd1, 0xca, 0x05, 0xb8, +/*2cc0:*/ 0xfa, 0xc6, 0xd1, 0xaa, 0x4d, 0x59, 0xb8, 0xa4, 0xdc, 0x06, 0x30, 0x73, 0x69, 0x87, 0x44, 0x6e, +/*2cd0:*/ 0xa0, 0xff, 0xbc, 0x78, 0x73, 0x59, 0xfc, 0x60, 0xe3, 0xe2, 0xea, 0xb9, 0x4b, 0x69, 0xb9, 0xb3, +/*2ce0:*/ 0x7c, 0xe5, 0xf2, 0x4f, 0xd9, 0xa0, 0x57, 0x67, 0x04, 0x12, 0x47, 0xbf, 0xde, 0x05, 0x43, 0xdd, +/*2cf0:*/ 0xa2, 0x28, 0xed, 0xab, 0x05, 0x97, 0xf6, 0xb9, 0xf5, 0x65, 0x27, 0xe4, 0xca, 0xcc, 0x5a, 0x45, +/*2d00:*/ 0xcc, 0x07, 0x03, 0xf8, 0x77, 0x88, 0xf8, 0x96, 0x1c, 0x04, 0x17, 0x16, 0x5a, 0x7f, 0x80, 0xa3, +/*2d10:*/ 0x5e, 0x58, 0x71, 0x38, 0x45, 0x73, 0x4e, 0x09, 0xb2, 0x80, 0xf4, 0xe1, 0xe2, 0xa1, 0x35, 0x50, +/*2d20:*/ 0xc1, 0xec, 0xb9, 0xaa, 0xc5, 0xd9, 0x6b, 0x5d, 0xce, 0x5c, 0x6e, 0x41, 0x9e, 0x79, 0x9a, 0x3a, +/*2d30:*/ 0x6a, 0x6a, 0xd4, 0x15, 0xce, 0xe5, 0x08, 0x49, 0xa3, 0x96, 0x9b, 0xc4, 0xfc, 0x88, 0x83, 0x2c, +/*2d40:*/ 0x1a, 0x46, 0x5e, 0xcf, 0x95, 0xc9, 0x48, 0xc8, 0xcb, 0x9a, 0x6f, 0x60, 0xdd, 0xf0, 0x88, 0x26, +/*2d50:*/ 0x0d, 0x74, 0x37, 0x0d, 0xc9, 0x80, 0x9a, 0xe5, 0x89, 0x15, 0xd6, 0x7f, 0x1a, 0xea, 0xa0, 0x66, +/*2d60:*/ 0x85, 0x55, 0x96, 0xcf, 0x24, 0x31, 0x65, 0x4f, 0x97, 0x7a, 0x4f, 0x8a, 0x10, 0x9c, 0xa1, 0xf2, +/*2d70:*/ 0xe3, 0x27, 0xff, 0x6e, 0x12, 0x77, 0xfd, 0x9d, 0x64, 0xbe, 0xb1, 0x73, 0xf0, 0xb3, 0x27, 0x71, +/*2d80:*/ 0x91, 0x84, 0x93, 0x4d, 0x21, 0xff, 0x8f, 0x1a, 0xbc, 0x9d, 0x54, 0x3f, 0x2d, 0x24, 0xdb, 0xfb, +/*2d90:*/ 0xa6, 0x3a, 0x5d, 0x08, 0x14, 0x2c, 0x65, 0x9e, 0x10, 0x58, 0x3c, 0x6d, 0x8b, 0x55, 0x2d, 0xe7, +/*2da0:*/ 0x85, 0x9e, 0xcc, 0x5f, 0xe6, 0xff, 0x4c, 0x5c, 0x5c, 0x13, 0x3d, 0xfd, 0xfa, 0x99, 0x48, 0x96, +/*2db0:*/ 0xe5, 0xa0, 0xf7, 0x84, 0xe4, 0x29, 0x8d, 0x1f, 0xf5, 0x03, 0xa9, 0xb0, 0x8e, 0x17, 0x09, 0x5f, +/*2dc0:*/ 0xbe, 0x20, 0x03, 0x18, 0xd8, 0xfb, 0x74, 0xfa, 0x06, 0x5e, 0x90, 0x57, 0x7b, 0x19, 0x0f, 0xfd, +/*2dd0:*/ 0x5f, 0x4c, 0xe1, 0x97, 0xa9, 0xff, 0xe2, 0x36, 0xd8, 0x04, 0x25, 0xee, 0x19, 0xb1, 0x38, 0x6c, +/*2de0:*/ 0x59, 0xfb, 0x83, 0x63, 0x48, 0xd4, 0x9f, 0x31, 0x3c, 0x93, 0x43, 0xb5, 0x37, 0x05, 0x6c, 0x11, +/*2df0:*/ 0x52, 0x69, 0x69, 0xf8, 0x37, 0xb7, 0x59, 0xb3, 0xe5, 0x56, 0x9b, 0xa8, 0x81, 0x17, 0x9a, 0x18, +/*2e00:*/ 0xc3, 0x2f, 0x2f, 0xb9, 0x00, 0x59, 0xc0, 0xa1, 0xb0, 0x21, 0x5f, 0x5f, 0xa6, 0x69, 0x38, 0x76, +/*2e10:*/ 0x98, 0x64, 0xfa, 0x30, 0xb5, 0xef, 0x4d, 0x02, 0x57, 0xb6, 0x1d, 0x9d, 0x9b, 0x23, 0xa9, 0x78, +/*2e20:*/ 0xe5, 0xed, 0x9f, 0x07, 0x67, 0x38, 0x4e, 0x54, 0xb5, 0x62, 0x7b, 0x31, 0x1a, 0xa0, 0xed, 0xd3, +/*2e30:*/ 0x0b, 0x38, 0x44, 0x47, 0x64, 0xf9, 0xd0, 0xa9, 0x30, 0x5a, 0x24, 0xe4, 0xa1, 0x9f, 0x3a, 0x2b, +/*2e40:*/ 0xd5, 0x79, 0xff, 0xc0, 0x09, 0x56, 0xe3, 0x32, 0x6a, 0x6b, 0x1e, 0xce, 0x9d, 0x4b, 0xaa, 0x80, +/*2e50:*/ 0x10, 0xec, 0x08, 0x24, 0xd4, 0xf0, 0xae, 0x8d, 0x45, 0x8d, 0x72, 0x4c, 0x80, 0xb5, 0x42, 0x14, +/*2e60:*/ 0x98, 0xc5, 0x91, 0x84, 0xaa, 0x78, 0x73, 0xdf, 0x1d, 0xe6, 0xaa, 0x3d, 0xf8, 0x4c, 0xa9, 0xcf, +/*2e70:*/ 0xa8, 0x3f, 0xb8, 0x55, 0xa5, 0x15, 0xb5, 0x8f, 0xda, 0xc2, 0x4b, 0x85, 0x54, 0x3a, 0x76, 0x1a, +/*2e80:*/ 0xd9, 0xe4, 0x0d, 0x62, 0x28, 0x27, 0x05, 0x03, 0xd7, 0x79, 0x20, 0xd9, 0x93, 0x26, 0x88, 0xda, +/*2e90:*/ 0x82, 0xd0, 0x41, 0xf5, 0x2f, 0xeb, 0xc6, 0x9f, 0x90, 0x80, 0x4c, 0x2b, 0x3c, 0xae, 0xce, 0x2b, +/*2ea0:*/ 0x82, 0x6b, 0x49, 0x9b, 0xd6, 0x38, 0xeb, 0x0c, 0x99, 0x44, 0x6b, 0xf0, 0x2a, 0xd3, 0x87, 0x9c, +/*2eb0:*/ 0x51, 0xa3, 0x7d, 0x01, 0x99, 0x66, 0x7a, 0xb4, 0xc1, 0xc9, 0xcc, 0x3d, 0x82, 0x2f, 0xca, 0xef, +/*2ec0:*/ 0x29, 0xd3, 0x64, 0x01, 0x9e, 0x57, 0xb7, 0x4f, 0xde, 0xe5, 0xff, 0xc1, 0xe9, 0x18, 0x48, 0xe1, +/*2ed0:*/ 0x53, 0xcc, 0x0e, 0x4c, 0xff, 0x3e, 0x02, 0xb7, 0x8c, 0x59, 0x6d, 0x81, 0x28, 0x66, 0x02, 0x6a, +/*2ee0:*/ 0x41, 0x40, 0x32, 0xdb, 0x47, 0x2f, 0x64, 0xff, 0x63, 0x56, 0x9b, 0x2c, 0x89, 0x69, 0xe4, 0x72, +/*2ef0:*/ 0x5f, 0x17, 0xd1, 0x97, 0xd2, 0x5b, 0xcf, 0x9f, 0x9f, 0xde, 0x1c, 0xeb, 0xab, 0x1e, 0xe3, 0x2d, +/*2f00:*/ 0xb4, 0x1e, 0x59, 0xfa, 0x1c, 0x18, 0x25, 0x10, 0x92, 0x1f, 0xa5, 0xdf, 0x8d, 0x50, 0x6e, 0xe6, +/*2f10:*/ 0x5e, 0x99, 0xc1, 0xf3, 0x2c, 0xaf, 0xa4, 0xb2, 0x2e, 0x9f, 0xf9, 0x3f, 0xde, 0x84, 0x2f, 0x70, +/*2f20:*/ 0x8b, 0x0c, 0x51, 0x7c, 0x21, 0xa6, 0x22, 0x75, 0x3d, 0x50, 0xc9, 0x73, 0xf8, 0x15, 0x68, 0x7d, +/*2f30:*/ 0x4b, 0x93, 0x4a, 0x56, 0xa1, 0xc8, 0xda, 0xf7, 0xd3, 0x73, 0x14, 0xfb, 0xe3, 0x44, 0xc1, 0x57, +/*2f40:*/ 0xb6, 0x27, 0xc9, 0xb9, 0x5e, 0xe9, 0xc1, 0x04, 0x5e, 0x30, 0x06, 0x3d, 0xfa, 0x12, 0xf2, 0x41, +/*2f50:*/ 0xf9, 0xea, 0xef, 0x2c, 0xa8, 0x3e, 0xfb, 0xd1, 0x22, 0xe0, 0x10, 0x06, 0xff, 0x30, 0xb4, 0xfc, +/*2f60:*/ 0x79, 0xe6, 0xdb, 0xe9, 0xbd, 0x62, 0x54, 0xc1, 0x1c, 0x88, 0x99, 0xb5, 0xf1, 0x15, 0x58, 0xd0, +/*2f70:*/ 0xf5, 0x5a, 0xf8, 0xdd, 0xbc, 0xea, 0x40, 0xb2, 0x6f, 0x62, 0x8a, 0xf0, 0x90, 0xb9, 0x58, 0xa8, +/*2f80:*/ 0x90, 0xdf, 0x1b, 0x3b, 0x4d, 0xdf, 0xf6, 0x43, 0xfb, 0x6d, 0x3d, 0xa6, 0xfa, 0xaf, 0x59, 0x65, +/*2f90:*/ 0xaf, 0xc2, 0x62, 0x50, 0xa1, 0x80, 0x4b, 0xd5, 0x50, 0x71, 0x8f, 0x8e, 0xf7, 0xba, 0xfa, 0x92, +/*2fa0:*/ 0xb8, 0x8a, 0xc5, 0x68, 0xca, 0x08, 0xe5, 0x4a, 0xe0, 0xe2, 0x80, 0xad, 0x22, 0x05, 0xce, 0xe6, +/*2fb0:*/ 0xb5, 0x65, 0x92, 0xb6, 0x8b, 0x36, 0xa7, 0x72, 0x2c, 0x7e, 0x79, 0x5a, 0xba, 0xbd, 0xdf, 0x77, +/*2fc0:*/ 0xc4, 0x51, 0x19, 0xcd, 0xfa, 0x2c, 0xf5, 0x81, 0xec, 0x25, 0x18, 0x31, 0xb2, 0xaa, 0xe6, 0x69, +/*2fd0:*/ 0x71, 0xc9, 0x5d, 0xd3, 0x6c, 0x43, 0x0b, 0x33, 0x7f, 0xb5, 0x86, 0xbd, 0xa2, 0xb8, 0x90, 0xd3, +/*2fe0:*/ 0x01, 0xe9, 0x94, 0x11, 0x15, 0x55, 0x8f, 0xb3, 0x76, 0xc8, 0xcc, 0xb2, 0x29, 0xd0, 0xa7, 0xa5, +/*2ff0:*/ 0xdf, 0x8c, 0x6e, 0x2a, 0xda, 0x27, 0x09, 0x55, 0xfa, 0x98, 0xea, 0x29, 0x74, 0xdc, 0xc5, 0x7a, +/*3000:*/ 0x5f, 0xf5, 0x83, 0x34, 0xdf, 0x97, 0x13, 0xde, 0xdf, 0xb2, 0xa5, 0xf2, 0x29, 0x93, 0xd9, 0xe8, +/*3010:*/ 0x7c, 0x63, 0x39, 0xfe, 0xbd, 0xc7, 0xc1, 0xd1, 0xc1, 0x58, 0x20, 0x58, 0x3d, 0x57, 0x78, 0x12, +/*3020:*/ 0x6e, 0xbb, 0xbe, 0x11, 0xae, 0xe2, 0x05, 0x4f, 0xfb, 0xb5, 0x1e, 0x4b, 0xc0, 0xe0, 0xa9, 0xfb, +/*3030:*/ 0xdc, 0x71, 0x4f, 0x14, 0x9f, 0xda, 0xfd, 0x25, 0xc9, 0xa0, 0x52, 0xb5, 0x86, 0xb0, 0xdb, 0xdd, +/*3040:*/ 0x30, 0x93, 0xd8, 0xc8, 0xee, 0xb9, 0x67, 0xe3, 0x8d, 0xe3, 0x15, 0x0e, 0xf9, 0xed, 0x9c, 0xa1, +/*3050:*/ 0xa9, 0xa2, 0xe8, 0x7c, 0x88, 0x5e, 0x7c, 0x1a, 0x61, 0xdb, 0x47, 0xc5, 0x21, 0x52, 0x1b, 0xe3, +/*3060:*/ 0x2f, 0x36, 0x7d, 0xc7, 0x9e, 0xbf, 0xd8, 0xa1, 0x47, 0xf0, 0xf1, 0xff, 0x5f, 0xf0, 0x76, 0x10, +/*3070:*/ 0x2f, 0x3d, 0xa8, 0x36, 0x34, 0x4b, 0x35, 0x43, 0x41, 0x6a, 0xe2, 0xa1, 0x47, 0x56, 0xb6, 0x7f, +/*3080:*/ 0xee, 0xa8, 0x40, 0xef, 0xa8, 0xf8, 0x1d, 0x4d, 0x0d, 0xd3, 0x15, 0x5a, 0xcd, 0x41, 0xa3, 0x59, +/*3090:*/ 0xa1, 0x11, 0x1e, 0x06, 0xb4, 0xc0, 0x87, 0xa8, 0x9b, 0xfc, 0x9b, 0xf0, 0x1a, 0x63, 0x49, 0x7a, +/*30a0:*/ 0x11, 0xc9, 0xc4, 0x20, 0xd6, 0xc6, 0x26, 0xdf, 0x01, 0x71, 0xd8, 0x0d, 0x79, 0x27, 0xc9, 0x45, +/*30b0:*/ 0xe4, 0x01, 0xed, 0x3c, 0x27, 0x6d, 0x4b, 0x48, 0x6a, 0x7a, 0x7f, 0xd7, 0x55, 0x93, 0x39, 0x81, +/*30c0:*/ 0x94, 0x15, 0x3e, 0x47, 0xd3, 0x61, 0xc5, 0xbf, 0x81, 0xa4, 0x69, 0xdb, 0xa3, 0x35, 0x5f, 0x16, +/*30d0:*/ 0x2f, 0xe7, 0x22, 0xea, 0xf2, 0x2e, 0x4e, 0x6a, 0x97, 0x81, 0xe0, 0xdc, 0xc9, 0x58, 0xf1, 0x86, +/*30e0:*/ 0xbd, 0x0c, 0x5c, 0x93, 0xca, 0xbd, 0xc7, 0x19, 0x57, 0x70, 0x5f, 0xca, 0x4d, 0x87, 0xe4, 0x02, +/*30f0:*/ 0xda, 0x93, 0xa6, 0x07, 0x7b, 0x24, 0x45, 0xf3, 0x94, 0x47, 0x1c, 0x9b, 0x35, 0x5e, 0xd6, 0xb4, +/*3100:*/ 0xb4, 0x05, 0x44, 0xff, 0x29, 0x92, 0xc0, 0xd8, 0x8e, 0x08, 0xb6, 0x6b, 0xf3, 0x37, 0xd1, 0x13, +/*3110:*/ 0x79, 0xe1, 0x6b, 0x2a, 0xf7, 0xea, 0xd2, 0x18, 0x66, 0x84, 0x63, 0xbe, 0x42, 0x66, 0xe2, 0x07, +/*3120:*/ 0xec, 0xf4, 0xa7, 0xfa, 0xf2, 0xc6, 0x7e, 0x2d, 0xb1, 0xaf, 0x8c, 0x96, 0x04, 0x8d, 0xe5, 0x37, +/*3130:*/ 0xbb, 0xe9, 0x1b, 0x0c, 0xd9, 0x5e, 0x28, 0xae, 0x49, 0xdd, 0x07, 0xda, 0x0a, 0x66, 0xf1, 0x01, +/*3140:*/ 0x33, 0x65, 0x54, 0xc4, 0x6b, 0xa0, 0x8b, 0x74, 0xbe, 0xb4, 0x40, 0xfa, 0x38, 0x6e, 0x7b, 0x76, +/*3150:*/ 0xaf, 0x7c, 0x28, 0x22, 0x56, 0xdc, 0x9c, 0x40, 0x17, 0xd4, 0x41, 0xf3, 0x4e, 0xc8, 0x3c, 0xb1, +/*3160:*/ 0xda, 0xed, 0x6e, 0x0c, 0xcb, 0x7a, 0xe3, 0x2a, 0xc1, 0xb5, 0xf4, 0x7e, 0x9c, 0x59, 0x94, 0xbd, +/*3170:*/ 0x7f, 0xcf, 0xef, 0xfd, 0x34, 0x38, 0x1c, 0x11, 0x8f, 0xca, 0xc7, 0x9b, 0xac, 0x43, 0xf4, 0xed, +/*3180:*/ 0x3d, 0x9f, 0xca, 0x2f, 0x61, 0xb6, 0x33, 0xdf, 0x9a, 0x48, 0x23, 0x6e, 0x51, 0xfd, 0xc1, 0x06, +/*3190:*/ 0xde, 0xc3, 0x31, 0x94, 0x82, 0xc4, 0xbe, 0x4a, 0x9d, 0x78, 0x1d, 0x83, 0x2d, 0xae, 0x46, 0x4f, +/*31a0:*/ 0xd2, 0x8f, 0x24, 0xee, 0x70, 0xe6, 0x8b, 0x20, 0x0a, 0x27, 0xec, 0x85, 0x02, 0xdb, 0x39, 0x54, +/*31b0:*/ 0x48, 0x9d, 0xdf, 0xb0, 0x1f, 0xdd, 0xa5, 0xfc, 0x9b, 0xf1, 0x42, 0xfc, 0x89, 0x0c, 0xfb, 0xf0, +/*31c0:*/ 0xfc, 0xc2, 0x07, 0x70, 0x32, 0x96, 0xdc, 0x5b, 0xd6, 0x28, 0x08, 0x09, 0x76, 0xfc, 0xc5, 0xea, +/*31d0:*/ 0x12, 0xc2, 0x53, 0x2d, 0x29, 0x59, 0x49, 0x35, 0x98, 0x26, 0x27, 0xad, 0xd9, 0x46, 0x4b, 0x6b, +/*31e0:*/ 0x8c, 0x89, 0x68, 0xa2, 0x08, 0xe5, 0x17, 0x2f, 0x9d, 0x91, 0x43, 0x8a, 0xe5, 0xb1, 0xeb, 0x41, +/*31f0:*/ 0x7d, 0xb9, 0xa8, 0x1b, 0x92, 0x69, 0xc0, 0xd1, 0x26, 0x64, 0xd1, 0x9b, 0xaf, 0x02, 0x3c, 0x2a, +/*3200:*/ 0xd2, 0xc5, 0xa3, 0x3c, 0x96, 0x89, 0xa2, 0x99, 0x19, 0x1e, 0xa1, 0xe7, 0xa3, 0x9a, 0x47, 0xd3, +/*3210:*/ 0x21, 0x22, 0x33, 0x97, 0x53, 0x8f, 0xd4, 0x02, 0x05, 0xda, 0x49, 0x52, 0xab, 0x01, 0x45, 0xfc, +/*3220:*/ 0xfb, 0x08, 0x88, 0x8d, 0x8c, 0xc5, 0xfc, 0x37, 0x13, 0x8b, 0xa8, 0xc8, 0x6a, 0x7f, 0x26, 0x02, +/*3230:*/ 0xc9, 0x6a, 0xdf, 0x16, 0x33, 0x03, 0xd0, 0x3e, 0x95, 0xfe, 0x59, 0xe0, 0x0a, 0x57, 0x6f, 0x37, +/*3240:*/ 0x99, 0xca, 0xd8, 0xac, 0x0d, 0x9c, 0x83, 0x5e, 0xa4, 0xf6, 0x22, 0xa6, 0x1f, 0xe3, 0x08, 0x19, +/*3250:*/ 0x23, 0x78, 0x09, 0x5a, 0xab, 0xd1, 0x05, 0x97, 0x67, 0xb3, 0xc6, 0x4f, 0xb5, 0xe2, 0x75, 0x7d, +/*3260:*/ 0x9f, 0x80, 0xfa, 0x41, 0xad, 0xed, 0x5b, 0x1d, 0x36, 0xd7, 0xda, 0xe3, 0xa6, 0x01, 0x6a, 0x5e, +/*3270:*/ 0x23, 0xc2, 0x68, 0x0a, 0xf1, 0xfa, 0xcb, 0x88, 0xa4, 0x39, 0x65, 0x41, 0x73, 0x93, 0x59, 0x69, +/*3280:*/ 0xb7, 0x24, 0x96, 0x85, 0xcc, 0xbd, 0x95, 0x9a, 0xf0, 0xeb, 0x78, 0xe6, 0x17, 0xf5, 0xee, 0x62, +/*3290:*/ 0x92, 0x86, 0xa4, 0x40, 0x9b, 0xa9, 0x16, 0x5c, 0x13, 0xbf, 0x36, 0x1d, 0x90, 0xc3, 0xcc, 0x0e, +/*32a0:*/ 0x64, 0x4a, 0x10, 0x41, 0xf3, 0x53, 0x7b, 0x77, 0x5f, 0xc9, 0x2c, 0xc4, 0x58, 0x8f, 0x42, 0x8a, +/*32b0:*/ 0xaa, 0xf1, 0x14, 0x17, 0x10, 0x47, 0x71, 0x30, 0xa5, 0xb4, 0x4b, 0x3b, 0x7f, 0x8b, 0x8a, 0xfc, +/*32c0:*/ 0x07, 0x17, 0xf3, 0x6b, 0x1f, 0xa2, 0xf3, 0x4d, 0xaf, 0x14, 0x71, 0xc1, 0x21, 0xc6, 0x92, 0xf1, +/*32d0:*/ 0xd2, 0x75, 0x80, 0xcf, 0x6c, 0xb5, 0x42, 0x94, 0x0f, 0x88, 0x94, 0xef, 0x8a, 0x93, 0x77, 0x87, +/*32e0:*/ 0xa3, 0x4e, 0xd1, 0xd1, 0x97, 0x3a, 0x9d, 0x16, 0x64, 0x05, 0x25, 0xf1, 0xac, 0x82, 0x0e, 0x0b, +/*32f0:*/ 0xdf, 0x61, 0x40, 0x4b, 0x7a, 0xe1, 0x48, 0xe2, 0x1d, 0x3c, 0x99, 0xe3, 0xa7, 0x95, 0x82, 0x5c, +/*3300:*/ 0xa8, 0x01, 0xe6, 0xc9, 0x28, 0xeb, 0x91, 0x9a, 0xc7, 0xb5, 0x3c, 0x18, 0x87, 0x39, 0x2d, 0xd4, +/*3310:*/ 0x90, 0x77, 0xfb, 0x99, 0xb9, 0xd5, 0x7a, 0x6c, 0xd6, 0xf2, 0x74, 0xa5, 0xf3, 0x89, 0x63, 0x87, +/*3320:*/ 0x29, 0x17, 0x2b, 0x5b, 0x4d, 0xac, 0x55, 0xc6, 0x61, 0x23, 0xe6, 0x35, 0xee, 0x77, 0x43, 0x44, +/*3330:*/ 0x93, 0x71, 0x64, 0xaa, 0xab, 0xe9, 0x36, 0x1b, 0x0f, 0xb6, 0x5c, 0x07, 0xee, 0xe4, 0xbb, 0x7f, +/*3340:*/ 0xe4, 0x21, 0x04, 0x3b, 0xa7, 0x17, 0xe4, 0xeb, 0x95, 0xbd, 0x3f, 0xba, 0x25, 0x3c, 0xf1, 0x53, +/*3350:*/ 0x82, 0x3d, 0x37, 0x72, 0x33, 0x49, 0x25, 0xbc, 0x92, 0x37, 0x57, 0x5c, 0x3d, 0xa5, 0x54, 0xd2, +/*3360:*/ 0x25, 0xc8, 0xab, 0x7b, 0xa6, 0xf4, 0x86, 0x21, 0xd6, 0x9c, 0xbb, 0xbb, 0xd0, 0x82, 0x8b, 0x09, +/*3370:*/ 0xc3, 0xbe, 0x0b, 0xe7, 0xa8, 0xb7, 0xe7, 0x81, 0x5d, 0xef, 0x31, 0x84, 0x89, 0x1d, 0x61, 0xd3, +/*3380:*/ 0x47, 0xc0, 0xa6, 0xcc, 0xfe, 0x2f, 0x26, 0xb2, 0x01, 0xf4, 0xe3, 0xd5, 0x08, 0x2c, 0xf3, 0xdf, +/*3390:*/ 0x9e, 0x20, 0x9f, 0x64, 0xde, 0x67, 0xde, 0xba, 0xc2, 0x44, 0xf4, 0xd1, 0x17, 0xea, 0xa7, 0xad, +/*33a0:*/ 0xe0, 0x02, 0x82, 0x16, 0xdc, 0x5a, 0x77, 0x8c, 0x9a, 0x75, 0xe2, 0xff, 0x31, 0xa1, 0xcc, 0xb4, +/*33b0:*/ 0x9e, 0xb5, 0xea, 0x72, 0xa9, 0x16, 0x78, 0x29, 0x21, 0xa9, 0x93, 0x91, 0x6c, 0xe6, 0x8a, 0xb7, +/*33c0:*/ 0x69, 0x28, 0x42, 0x6b, 0x7e, 0xa7, 0xd7, 0x77, 0x03, 0x41, 0x91, 0xe6, 0x0c, 0xdf, 0x78, 0x30, +/*33d0:*/ 0x91, 0xe4, 0x19, 0xf7, 0xcb, 0xc5, 0x37, 0xca, 0xb1, 0xb1, 0x39, 0xdf, 0x74, 0xd9, 0x2f, 0x60, +/*33e0:*/ 0x39, 0xbb, 0xf9, 0x5a, 0xa0, 0xa9, 0x1c, 0xca, 0xb1, 0x6d, 0x13, 0xa7, 0x37, 0x30, 0xcb, 0x45, +/*33f0:*/ 0x6e, 0x21, 0xe7, 0xd2, 0x02, 0x84, 0x54, 0x7d, 0x9b, 0xcf, 0xfb, 0xe7, 0xaa, 0x5d, 0x30, 0xb6, +/*3400:*/ 0x4d, 0xd9, 0xa1, 0x4f, 0x0e, 0xf6, 0x72, 0x92, 0xbf, 0x74, 0x3e, 0x69, 0x47, 0x0d, 0x9c, 0xbd, +/*3410:*/ 0x1a, 0x49, 0xc9, 0x13, 0x67, 0x66, 0x14, 0x39, 0x96, 0x14, 0x0c, 0xd5, 0x1c, 0x85, 0xab, 0xf4, +/*3420:*/ 0x61, 0xec, 0x33, 0xf9, 0xb6, 0x8e, 0x61, 0x40, 0x35, 0x91, 0xc9, 0x22, 0x89, 0x06, 0x7d, 0x5d, +/*3430:*/ 0x70, 0x3e, 0xa6, 0xe9, 0xe9, 0xd5, 0x44, 0xfd, 0x25, 0x1d, 0x58, 0xb9, 0xf8, 0xfa, 0x0c, 0x12, +/*3440:*/ 0x3b, 0x45, 0xfd, 0x36, 0x30, 0x8e, 0x96, 0x78, 0xc3, 0xbe, 0x09, 0xdf, 0xcd, 0xd7, 0xbe, 0x2a, +/*3450:*/ 0x88, 0xf5, 0xda, 0x3a, 0x47, 0x9a, 0x25, 0x10, 0xaa, 0xbe, 0x18, 0xe8, 0x50, 0xdb, 0xd8, 0x45, +/*3460:*/ 0xd1, 0xb5, 0xbc, 0xbf, 0x13, 0x1a, 0xd0, 0x06, 0x31, 0xab, 0x83, 0x64, 0x51, 0x34, 0x35, 0x68, +/*3470:*/ 0x5e, 0xaf, 0x5d, 0x69, 0xd3, 0x09, 0x92, 0x77, 0x07, 0x25, 0xc2, 0x9d, 0x3d, 0x88, 0xdb, 0x52, +/*3480:*/ 0xf5, 0x2c, 0xcb, 0xb8, 0xd6, 0x9b, 0x14, 0xdf, 0x1f, 0x3f, 0xec, 0xd1, 0xed, 0x4e, 0x2e, 0x80, +/*3490:*/ 0x0e, 0x9d, 0x69, 0x5c, 0x1b, 0xfb, 0x5d, 0x12, 0xce, 0x4f, 0xb5, 0xce, 0xfa, 0xd1, 0xfa, 0xe4, +/*34a0:*/ 0x5a, 0x75, 0x7a, 0x5a, 0x0c, 0x68, 0x83, 0x4c, 0x09, 0xc8, 0x0c, 0x57, 0x29, 0x53, 0xa7, 0x53, +/*34b0:*/ 0x50, 0x11, 0x04, 0xb3, 0x0f, 0x61, 0x3e, 0x9b, 0xfb, 0x20, 0x28, 0xcf, 0x94, 0xfc, 0xa1, 0xa2, +/*34c0:*/ 0xc7, 0xc2, 0x37, 0xa7, 0x32, 0x5d, 0x85, 0x21, 0xad, 0x2b, 0x8e, 0x47, 0xae, 0xce, 0x98, 0x90, +/*34d0:*/ 0x20, 0x61, 0xfc, 0x1e, 0xef, 0xce, 0xcf, 0xd1, 0xf1, 0x90, 0xa1, 0xb6, 0x5d, 0x68, 0x5b, 0xc3, +/*34e0:*/ 0x7a, 0xd2, 0x05, 0xe8, 0x6f, 0xe3, 0x0a, 0x1a, 0x04, 0x4d, 0x89, 0xb9, 0xe6, 0x84, 0x0e, 0x92, +/*34f0:*/ 0xdc, 0xb2, 0xcb, 0xaa, 0x27, 0xb9, 0x53, 0xdd, 0x9b, 0x21, 0x91, 0xf6, 0xd0, 0x00, 0xb4, 0x8d, +/*3500:*/ 0xea, 0x18, 0xd0, 0xf1, 0x24, 0x8b, 0x1f, 0xc9, 0x27, 0xb3, 0x28, 0x07, 0x08, 0xee, 0x00, 0xf5, +/*3510:*/ 0xd3, 0xc5, 0x11, 0x97, 0x1a, 0xfd, 0x8b, 0x37, 0xb8, 0x89, 0xc4, 0x3e, 0x37, 0x2c, 0xd2, 0x4f, +/*3520:*/ 0xaa, 0x00, 0x2c, 0xba, 0xa6, 0xba, 0xd4, 0x85, 0x37, 0xc4, 0x8e, 0x73, 0xac, 0x24, 0x7b, 0x7f, +/*3530:*/ 0x5f, 0x12, 0x5d, 0x59, 0xde, 0x8c, 0x3a, 0xf2, 0xad, 0x9c, 0x9a, 0xc1, 0x2b, 0xbc, 0x5a, 0xb3, +/*3540:*/ 0x2a, 0x16, 0xd6, 0xf5, 0x9f, 0xc2, 0x3e, 0x70, 0x5a, 0x32, 0x53, 0xa5, 0x82, 0xa7, 0x94, 0xee, +/*3550:*/ 0x78, 0x34, 0xbf, 0xcb, 0xb8, 0x40, 0x9d, 0xa4, 0x4e, 0xdc, 0xc7, 0xe7, 0x1c, 0x86, 0xaa, 0x00, +/*3560:*/ 0x3b, 0xc7, 0x69, 0xb7, 0x0c, 0x5e, 0xdb, 0xf2, 0xde, 0x2d, 0x41, 0x58, 0xc4, 0x71, 0xbd, 0x44, +/*3570:*/ 0x1b, 0x2f, 0xa6, 0x3a, 0xdb, 0xf0, 0xc3, 0x48, 0x57, 0x6c, 0x98, 0xc8, 0x07, 0x5f, 0x70, 0x1f, +/*3580:*/ 0x0d, 0x62, 0xff, 0x85, 0x83, 0x71, 0x3f, 0xcf, 0x60, 0x94, 0x9a, 0xce, 0x0e, 0x09, 0x18, 0x6c, +/*3590:*/ 0xdb, 0x4b, 0x42, 0x68, 0xd3, 0x9c, 0x2a, 0x77, 0x7b, 0xd3, 0x6b, 0x6a, 0x5f, 0x1f, 0xdc, 0xb0, +/*35a0:*/ 0x89, 0xe9, 0xbe, 0xcd, 0x27, 0x57, 0x30, 0x49, 0xdc, 0x67, 0x7f, 0x0e, 0xb8, 0xa2, 0x4c, 0x8c, +/*35b0:*/ 0x58, 0xf8, 0x66, 0xfa, 0xc9, 0x75, 0xa1, 0x9e, 0x2e, 0xa6, 0x63, 0xdf, 0xa1, 0x72, 0x52, 0x4e, +/*35c0:*/ 0x8d, 0x51, 0x0a, 0x5e, 0x1a, 0x84, 0x27, 0x32, 0x6d, 0xdd, 0x4b, 0x91, 0xc8, 0xb4, 0xae, 0x43, +/*35d0:*/ 0x8a, 0x35, 0xc0, 0x13, 0x4c, 0xbe, 0x54, 0x83, 0x18, 0x77, 0xfe, 0x1a, 0x5d, 0x41, 0x6a, 0x5b, +/*35e0:*/ 0x37, 0xab, 0x63, 0x16, 0x47, 0xa8, 0xe3, 0x2f, 0x0d, 0x33, 0x73, 0x01, 0xda, 0xf7, 0x9a, 0xf5, +/*35f0:*/ 0xd4, 0xe2, 0x0c, 0xf4, 0x93, 0x54, 0x90, 0x59, 0xa8, 0x8c, 0x64, 0xe7, 0x78, 0x3a, 0x0e, 0xb4, +/*3600:*/ 0x5e, 0x09, 0x16, 0x9c, 0xa6, 0x9a, 0x9b, 0xf1, 0x90, 0x7b, 0x2e, 0x19, 0xea, 0x87, 0x28, 0xc6, +/*3610:*/ 0xd7, 0x8d, 0x16, 0xfb, 0xc9, 0xa3, 0x18, 0x0e, 0xc0, 0xe8, 0xb9, 0xc4, 0x6c, 0x4f, 0x60, 0x63, +/*3620:*/ 0xfa, 0xfd, 0xef, 0x15, 0xce, 0xef, 0x79, 0xc8, 0xcb, 0x36, 0x24, 0x65, 0xc5, 0x33, 0x73, 0xed, +/*3630:*/ 0x10, 0x5b, 0x25, 0xaa, 0x31, 0xe5, 0xa8, 0x03, 0x02, 0x04, 0x8d, 0x21, 0x7f, 0xb3, 0x62, 0xb6, +/*3640:*/ 0x1f, 0x31, 0x09, 0xab, 0xa1, 0x05, 0xf3, 0xed, 0x78, 0xc0, 0xab, 0xad, 0x31, 0x5c, 0x16, 0xcd, +/*3650:*/ 0x91, 0x4d, 0xbf, 0x7b, 0xcc, 0x4a, 0xdf, 0x10, 0x4c, 0x42, 0xb6, 0x3b, 0x2b, 0xcf, 0xdd, 0x2d, +/*3660:*/ 0xdc, 0x4b, 0xfd, 0x1a, 0xcf, 0x34, 0xa0, 0xd0, 0x1b, 0x2b, 0x62, 0x86, 0xc9, 0x82, 0xfd, 0x2a, +/*3670:*/ 0xbd, 0x08, 0x2f, 0x30, 0x21, 0x39, 0xee, 0x56, 0x52, 0x07, 0x1f, 0xa0, 0xf5, 0x61, 0xb7, 0x10, +/*3680:*/ 0x59, 0x49, 0x6c, 0x1a, 0x6b, 0x61, 0xff, 0xe1, 0x91, 0x16, 0x4a, 0xe9, 0x1c, 0xa4, 0x6f, 0xca, +/*3690:*/ 0x34, 0x94, 0xec, 0xf8, 0x10, 0x19, 0xa3, 0x80, 0xbc, 0xe0, 0xbc, 0x4b, 0xd8, 0xfd, 0x8d, 0xc0, +/*36a0:*/ 0xa2, 0xa2, 0x23, 0x5b, 0x2f, 0xbb, 0xc7, 0xf5, 0xad, 0x5b, 0x97, 0xcf, 0x74, 0x86, 0x11, 0x9c, +/*36b0:*/ 0x51, 0xb8, 0xc9, 0xac, 0x3b, 0xb9, 0xe3, 0x8c, 0xfb, 0xf4, 0x28, 0x6d, 0x70, 0xf4, 0x63, 0xa0, +/*36c0:*/ 0x9f, 0x03, 0xa1, 0xfe, 0xe3, 0x17, 0x92, 0xe3, 0x1d, 0x74, 0x2b, 0x62, 0xfd, 0xb7, 0x90, 0x4f, +/*36d0:*/ 0xa9, 0x5d, 0xda, 0x67, 0xe5, 0x5f, 0x86, 0x0e, 0xec, 0xe1, 0xaa, 0x69, 0x00, 0x90, 0xef, 0x8c, +/*36e0:*/ 0x1a, 0xac, 0x6e, 0x2c, 0x6e, 0xc4, 0xed, 0x07, 0x06, 0x16, 0xe8, 0x3f, 0x50, 0x79, 0x13, 0x6d, +/*36f0:*/ 0x5f, 0x3c, 0x3e, 0x81, 0xa0, 0xd0, 0x1f, 0xe7, 0x89, 0x57, 0x87, 0x72, 0xc5, 0x87, 0x64, 0x1d, +/*3700:*/ 0x0c, 0x6a, 0xef, 0xe6, 0xf8, 0xb2, 0xcf, 0x6c, 0xcf, 0x7f, 0xe0, 0xd9, 0x68, 0x8a, 0x1c, 0x38, +/*3710:*/ 0x29, 0xe3, 0x3d, 0x50, 0x38, 0x92, 0xde, 0xc2, 0xab, 0x7d, 0x19, 0x35, 0x2e, 0xc7, 0x68, 0x68, +/*3720:*/ 0xb1, 0x1e, 0xd9, 0x8e, 0xf2, 0x0b, 0xe4, 0x36, 0x73, 0xc6, 0x02, 0x37, 0xe0, 0xa4, 0x17, 0xe7, +/*3730:*/ 0x4b, 0xed, 0xc1, 0xc9, 0x95, 0x1e, 0xf0, 0x2a, 0x8d, 0xec, 0xa0, 0xe0, 0x33, 0xf0, 0xf8, 0x73, +/*3740:*/ 0x1c, 0xa5, 0x7d, 0xcb, 0xe0, 0x7f, 0xcf, 0x8f, 0xaa, 0x88, 0x66, 0x35, 0xe9, 0x25, 0x11, 0x47, +/*3750:*/ 0x1b, 0xf7, 0x3d, 0x74, 0xe1, 0x1a, 0x53, 0xfe, 0x1b, 0xd0, 0x0e, 0x89, 0xe3, 0xd0, 0x9a, 0xe6, +/*3760:*/ 0xec, 0x99, 0xed, 0x80, 0x5a, 0xb3, 0x8c, 0x52, 0x77, 0x1c, 0x97, 0x0e, 0x71, 0xc5, 0x76, 0xa2, +/*3770:*/ 0x88, 0xdd, 0xf9, 0x65, 0x23, 0x17, 0x47, 0x9f, 0x6c, 0x15, 0xa1, 0xa9, 0x7f, 0x47, 0x01, 0x49, +/*3780:*/ 0xd6, 0xb1, 0x64, 0xd7, 0x79, 0xd2, 0xc3, 0x8b, 0x0d, 0xb6, 0x8c, 0x9d, 0x22, 0xbc, 0x3a, 0x78, +/*3790:*/ 0x85, 0x8c, 0x8b, 0x15, 0xe8, 0x03, 0x7e, 0x9c, 0x5e, 0xf5, 0x42, 0x7b, 0x62, 0xd9, 0xdd, 0xd0, +/*37a0:*/ 0x1e, 0x91, 0x50, 0x42, 0x28, 0x46, 0x19, 0x3f, 0x09, 0x4f, 0x9b, 0xfc, 0x6a, 0x32, 0xf7, 0x3b, +/*37b0:*/ 0x52, 0xdc, 0xd6, 0x9d, 0x78, 0x36, 0xd0, 0x38, 0x98, 0xd4, 0x54, 0x5d, 0xec, 0x24, 0x77, 0x25, +/*37c0:*/ 0xe7, 0xac, 0xe2, 0x19, 0xce, 0xd1, 0x03, 0xe2, 0x1d, 0x39, 0x8a, 0xd7, 0xf8, 0x17, 0x07, 0x9b, +/*37d0:*/ 0x80, 0x3d, 0x6d, 0x17, 0xb4, 0xd0, 0x45, 0x14, 0x73, 0x11, 0x59, 0x7a, 0xd8, 0x48, 0x3b, 0xc1, +/*37e0:*/ 0xdc, 0xd1, 0x71, 0x11, 0x84, 0xdd, 0xe8, 0xc0, 0x25, 0xb7, 0x3f, 0xc4, 0xad, 0x71, 0x06, 0xc3, +/*37f0:*/ 0xf7, 0x97, 0x25, 0x2b, 0xeb, 0x47, 0x91, 0x52, 0x5f, 0xe6, 0xcb, 0x8a, 0x67, 0x1e, 0x15, 0x54, +/*3800:*/ 0x90, 0x36, 0xc1, 0x47, 0x70, 0x43, 0xa6, 0x04, 0xa2, 0xce, 0xea, 0x13, 0x5d, 0xda, 0x22, 0xc4, +/*3810:*/ 0x0c, 0x60, 0x63, 0x7f, 0x32, 0x8d, 0x10, 0xc7, 0x7b, 0x98, 0xa6, 0x48, 0xd1, 0x8e, 0xc6, 0xc2, +/*3820:*/ 0x77, 0x07, 0xc7, 0x9d, 0x77, 0x4a, 0xd7, 0x6a, 0xc8, 0xb7, 0xc5, 0x0d, 0x61, 0x97, 0x35, 0x21, +/*3830:*/ 0x63, 0xb0, 0x96, 0xa6, 0xb4, 0xa5, 0xa4, 0x94, 0xcf, 0xb0, 0xae, 0x11, 0x8a, 0x18, 0x92, 0xa7, +/*3840:*/ 0x53, 0x10, 0x52, 0xac, 0x0e, 0x70, 0x6e, 0xa5, 0x54, 0xa9, 0x2b, 0xae, 0x6e, 0xee, 0xdd, 0x75, +/*3850:*/ 0xcd, 0xac, 0xaf, 0x1c, 0x98, 0x6a, 0xab, 0xee, 0xfa, 0x5a, 0x4d, 0x18, 0xdb, 0x90, 0x1b, 0x24, +/*3860:*/ 0xf0, 0x0b, 0x4d, 0x82, 0x68, 0xc2, 0xd8, 0x8d, 0xb1, 0x84, 0xaf, 0xd5, 0xbd, 0x69, 0x27, 0x82, +/*3870:*/ 0x5f, 0xda, 0x5e, 0xad, 0x12, 0x22, 0xeb, 0x86, 0x97, 0x32, 0x40, 0xd4, 0xeb, 0x07, 0xb7, 0xd9, +/*3880:*/ 0x59, 0x73, 0xe8, 0x5d, 0x8c, 0xb1, 0x02, 0x57, 0x27, 0x4a, 0xd2, 0xab, 0x26, 0x1a, 0x8e, 0x14, +/*3890:*/ 0xed, 0x91, 0x71, 0x4b, 0x20, 0xf4, 0x59, 0xcb, 0xea, 0xc3, 0xa6, 0x82, 0x76, 0xd4, 0xa2, 0xe8, +/*38a0:*/ 0xe5, 0x52, 0x53, 0x70, 0x21, 0x6f, 0xc3, 0xd3, 0xc3, 0x97, 0xf6, 0x03, 0xaf, 0xf5, 0x2f, 0xee, +/*38b0:*/ 0xcd, 0x02, 0x0c, 0x5a, 0x35, 0x6d, 0xee, 0xef, 0xbe, 0xb8, 0xe4, 0xb7, 0x7d, 0xdf, 0x7d, 0xf6, +/*38c0:*/ 0x94, 0x2c, 0x6a, 0x5e, 0xe5, 0xa4, 0x48, 0x30, 0xd2, 0x09, 0xed, 0x6f, 0xb0, 0x5e, 0xd9, 0x16, +/*38d0:*/ 0x2d, 0x0b, 0x4f, 0xf9, 0x4d, 0x5d, 0x00, 0x40, 0x14, 0x8f, 0x3b, 0x54, 0xd4, 0x0c, 0x49, 0xea, +/*38e0:*/ 0x01, 0x1e, 0xf8, 0x4f, 0x3f, 0x9a, 0xe3, 0x8f, 0x66, 0x0b, 0x2b, 0xa7, 0xee, 0x3a, 0x88, 0x02, +/*38f0:*/ 0x94, 0xbd, 0x77, 0xda, 0x1b, 0xb9, 0x0e, 0xc5, 0x6f, 0xa0, 0xbf, 0xa9, 0x26, 0x91, 0x7d, 0x52, +/*3900:*/ 0x33, 0x28, 0x2f, 0xa0, 0xea, 0x4c, 0xd5, 0x14, 0xd2, 0x35, 0x77, 0x79, 0x72, 0x73, 0x65, 0xb6, +/*3910:*/ 0x46, 0x26, 0x70, 0x63, 0x7a, 0x87, 0x44, 0xfe, 0x69, 0x77, 0x25, 0x3b, 0x75, 0x76, 0x9f, 0x7a, +/*3920:*/ 0x56, 0xd4, 0xb5, 0x23, 0x70, 0x73, 0xb9, 0xdb, 0x9b, 0x47, 0x02, 0x18, 0xad, 0x4c, 0x59, 0x39, +/*3930:*/ 0xac, 0x53, 0x6b, 0x19, 0x01, 0xac, 0x3a, 0xcb, 0x12, 0xc9, 0xec, 0xbb, 0xcd, 0x54, 0x89, 0xa0, +/*3940:*/ 0xb4, 0x2e, 0x1a, 0x5a, 0x4f, 0x2b, 0x39, 0x67, 0xbf, 0x61, 0x9d, 0x8f, 0x34, 0x8f, 0x13, 0x77, +/*3950:*/ 0x9e, 0xc5, 0x18, 0x9c, 0x5b, 0x77, 0x64, 0x8d, 0x67, 0x8d, 0xdc, 0xc7, 0x22, 0x34, 0x58, 0x91, +/*3960:*/ 0xd9, 0x93, 0xab, 0x80, 0x6f, 0x80, 0x97, 0x64, 0x8d, 0xd9, 0xa9, 0xa2, 0x9e, 0x11, 0x47, 0x2f, +/*3970:*/ 0xf0, 0xa1, 0x0a, 0x09, 0x0c, 0xf6, 0xb5, 0xf9, 0xcd, 0x76, 0xb6, 0x76, 0xa5, 0x6f, 0x99, 0x55, +/*3980:*/ 0x1e, 0x19, 0x07, 0x04, 0x50, 0x32, 0xb9, 0x68, 0x37, 0xe9, 0x53, 0xe9, 0x96, 0xc3, 0x51, 0xa7, +/*3990:*/ 0x44, 0x0d, 0x5d, 0xfd, 0x94, 0x0d, 0x2f, 0x6b, 0xa7, 0xfe, 0x5e, 0x7e, 0xed, 0xe3, 0xe6, 0x15, +/*39a0:*/ 0xae, 0x01, 0x77, 0xc4, 0xe6, 0x54, 0xe8, 0xad, 0x5b, 0x54, 0x6b, 0x39, 0xf3, 0xa4, 0x60, 0x0a, +/*39b0:*/ 0xbb, 0x9a, 0xb2, 0x5c, 0x3b, 0xa6, 0xd9, 0xd4, 0x42, 0x52, 0xea, 0xeb, 0x58, 0x5e, 0xbf, 0x4a, +/*39c0:*/ 0x87, 0xc2, 0xda, 0x62, 0xf8, 0xcb, 0x87, 0xa2, 0x9a, 0x5e, 0xa0, 0x8e, 0xda, 0x72, 0x41, 0x6b, +/*39d0:*/ 0x89, 0xda, 0x55, 0x85, 0x00, 0x39, 0x9e, 0x63, 0x60, 0x4c, 0xff, 0x1a, 0x52, 0xbf, 0xa1, 0xf0, +/*39e0:*/ 0xda, 0x90, 0x9a, 0x24, 0xe7, 0x5c, 0x57, 0xaf, 0xd9, 0xd7, 0xf1, 0x4d, 0xd6, 0x1a, 0xd5, 0xe7, +/*39f0:*/ 0x3f, 0x08, 0x78, 0x91, 0xdb, 0x0e, 0xc7, 0x29, 0x57, 0xf5, 0xa8, 0x68, 0x4e, 0x9d, 0xca, 0xf3, +/*3a00:*/ 0x75, 0x63, 0x6c, 0xff, 0xe5, 0xc8, 0x23, 0xf0, 0xa7, 0x7e, 0x6d, 0x2c, 0x84, 0xba, 0x60, 0x60, +/*3a10:*/ 0xc9, 0x3e, 0xf3, 0xf4, 0x09, 0xe0, 0xcc, 0xfd, 0x78, 0x63, 0x3e, 0x5b, 0x34, 0xd9, 0xe3, 0xaa, +/*3a20:*/ 0xf3, 0x27, 0x97, 0x14, 0xe4, 0x12, 0x15, 0xe0, 0xea, 0xd6, 0x81, 0x14, 0x6d, 0xe0, 0x5e, 0xad, +/*3a30:*/ 0x3f, 0x44, 0x88, 0x0c, 0x17, 0xc9, 0x1c, 0xa4, 0xe2, 0xa6, 0xc7, 0xda, 0x2f, 0x19, 0x66, 0x7a, +/*3a40:*/ 0x3b, 0xd4, 0x95, 0x02, 0x41, 0xb9, 0x7e, 0x8e, 0x5e, 0x25, 0x84, 0x2c, 0x7f, 0x40, 0x0b, 0xe5, +/*3a50:*/ 0xc3, 0xdd, 0x9a, 0x27, 0xa6, 0x68, 0xa8, 0x59, 0x2f, 0xd6, 0x3b, 0x5f, 0xeb, 0x16, 0xbe, 0x4e, +/*3a60:*/ 0x61, 0xc1, 0xbb, 0xf3, 0x84, 0x8f, 0x62, 0xea, 0xb7, 0x1c, 0x84, 0x73, 0x54, 0xf3, 0xd7, 0x59, +/*3a70:*/ 0x0b, 0xc0, 0x6f, 0xcd, 0x53, 0x89, 0xfb, 0xdf, 0x08, 0xa5, 0x6d, 0x3c, 0x7c, 0xd9, 0x7d, 0x82, +/*3a80:*/ 0xaf, 0x0f, 0xc5, 0x64, 0xfe, 0xb0, 0x80, 0x36, 0x0e, 0x7e, 0x77, 0x3f, 0x19, 0x76, 0x45, 0xbd, +/*3a90:*/ 0x84, 0xb0, 0xe1, 0x96, 0xef, 0x6d, 0x19, 0x62, 0xf9, 0x3c, 0x68, 0xb6, 0x1b, 0x9f, 0xd4, 0x7a, +/*3aa0:*/ 0x58, 0x96, 0x78, 0xaa, 0x61, 0x17, 0x81, 0x24, 0xab, 0xa5, 0xe2, 0x6a, 0xae, 0x99, 0x9e, 0x46, +/*3ab0:*/ 0xdd, 0x9c, 0xfa, 0xfd, 0x37, 0x61, 0xbb, 0xc9, 0x06, 0x40, 0xff, 0x6e, 0xd6, 0xd9, 0x71, 0xaa, +/*3ac0:*/ 0x21, 0xc0, 0xfd, 0x85, 0xb1, 0xf3, 0xd4, 0xea, 0xd4, 0x25, 0xdd, 0x78, 0x0e, 0x2d, 0x68, 0x66, +/*3ad0:*/ 0x48, 0xf1, 0x13, 0xeb, 0x80, 0x75, 0xd7, 0x16, 0xb0, 0xb4, 0x88, 0x51, 0xf6, 0x83, 0xd4, 0xbd, +/*3ae0:*/ 0x08, 0x3a, 0x63, 0x8c, 0x03, 0x5a, 0x00, 0x41, 0x19, 0x93, 0xf4, 0x68, 0xeb, 0x02, 0xcb, 0x6b, +/*3af0:*/ 0x91, 0x57, 0xa5, 0x7d, 0x5b, 0x9c, 0x8b, 0x59, 0x38, 0xef, 0x12, 0x1a, 0x15, 0xba, 0x5c, 0xe0, +/*3b00:*/ 0x52, 0x7c, 0x76, 0x0a, 0x6e, 0x50, 0x30, 0x30, 0xee, 0x19, 0x17, 0xcf, 0xb4, 0x13, 0x1a, 0xa3, +/*3b10:*/ 0x42, 0xbe, 0xcc, 0x42, 0x21, 0xf0, 0xd4, 0x32, 0x92, 0x72, 0x33, 0x01, 0xf1, 0xac, 0x36, 0xb2, +/*3b20:*/ 0x67, 0xfd, 0x2c, 0x4d, 0x56, 0xaa, 0x72, 0x63, 0xcd, 0x50, 0x0f, 0xbe, 0x8d, 0x6d, 0x0e, 0x5e, +/*3b30:*/ 0x59, 0xba, 0x55, 0xe9, 0x6b, 0x07, 0x42, 0xc6, 0x3c, 0xd1, 0x0a, 0x59, 0x98, 0x4f, 0x19, 0x2c, +/*3b40:*/ 0x9e, 0xa3, 0xa3, 0x95, 0x2b, 0xf5, 0x49, 0x38, 0x4f, 0xf9, 0x24, 0xaa, 0x34, 0x8a, 0xf4, 0xdc, +/*3b50:*/ 0x5a, 0xd0, 0x72, 0x5b, 0x11, 0xcd, 0xef, 0x4b, 0x12, 0xd5, 0x71, 0x95, 0xb8, 0x61, 0x9a, 0xa9, +/*3b60:*/ 0x0b, 0x32, 0x2d, 0x4c, 0x72, 0x6f, 0xdc, 0xcb, 0xe3, 0x0a, 0x91, 0x48, 0x2f, 0x1a, 0x93, 0x19, +/*3b70:*/ 0x36, 0x31, 0xce, 0x95, 0x8a, 0x1c, 0xa4, 0xce, 0x8e, 0xc4, 0x99, 0xc3, 0x51, 0x02, 0x52, 0xb8, +/*3b80:*/ 0x07, 0x81, 0x64, 0x65, 0x87, 0x5c, 0xfc, 0x51, 0x46, 0x36, 0x64, 0xca, 0x52, 0x04, 0xa6, 0x7d, +/*3b90:*/ 0x8c, 0x86, 0xfd, 0x69, 0xea, 0xe3, 0x62, 0x86, 0x85, 0x5a, 0x6b, 0x45, 0xd8, 0x03, 0x56, 0x13, +/*3ba0:*/ 0xa6, 0xd7, 0xde, 0x3c, 0x9d, 0xd1, 0x4f, 0xbe, 0x96, 0x1f, 0x8a, 0x69, 0x1e, 0x9c, 0x99, 0x7d, +/*3bb0:*/ 0x90, 0xe5, 0xcc, 0x08, 0x78, 0xc7, 0x6d, 0x02, 0x48, 0x0a, 0x98, 0x58, 0x23, 0x38, 0x03, 0x82, +/*3bc0:*/ 0xf1, 0x7c, 0x30, 0x99, 0x58, 0x5c, 0xa1, 0x2c, 0x2c, 0xfa, 0x8a, 0xd9, 0xe5, 0xab, 0x3f, 0xf3, +/*3bd0:*/ 0x38, 0x7a, 0x6c, 0x93, 0xe9, 0x04, 0x8b, 0xe9, 0x5f, 0x94, 0x95, 0x9e, 0xc9, 0xed, 0x4d, 0x20, +/*3be0:*/ 0xdb, 0x4a, 0x73, 0x1e, 0x87, 0x6f, 0x71, 0xa0, 0x3d, 0xb0, 0x76, 0x50, 0xf3, 0x23, 0x39, 0x04, +/*3bf0:*/ 0xbf, 0x22, 0x10, 0xd4, 0x71, 0x9a, 0x85, 0x88, 0x7c, 0x27, 0xe1, 0x35, 0x2f, 0x94, 0x7c, 0x73, +/*3c00:*/ 0xd0, 0xc9, 0x8c, 0xba, 0x9d, 0x79, 0x13, 0xbe, 0xa1, 0x07, 0x63, 0x7d, 0xe4, 0x7a, 0x6a, 0x93, +/*3c10:*/ 0x0c, 0xe6, 0x5c, 0x55, 0x46, 0xa1, 0xac, 0x4f, 0x14, 0x0f, 0x5d, 0x55, 0x8a, 0x26, 0x88, 0xfc, +/*3c20:*/ 0xd8, 0x53, 0x60, 0x25, 0x99, 0xbd, 0x72, 0x61, 0x45, 0xd8, 0x30, 0x67, 0xd1, 0x4b, 0xc6, 0xdc, +/*3c30:*/ 0x5d, 0xe1, 0x0a, 0xfa, 0x5e, 0xfc, 0x17, 0x0e, 0xbe, 0x7e, 0x6b, 0x73, 0x22, 0xe7, 0x82, 0x1c, +/*3c40:*/ 0x37, 0xb7, 0xa9, 0xaa, 0x8e, 0x6d, 0xfd, 0xce, 0x9b, 0xda, 0x05, 0xa8, 0x6e, 0x93, 0x27, 0xfb, +/*3c50:*/ 0xf2, 0xe5, 0xc0, 0x52, 0xe6, 0x87, 0x09, 0x6c, 0xf8, 0xc2, 0xb1, 0x10, 0x1b, 0xfe, 0xe7, 0xef, +/*3c60:*/ 0xea, 0xc7, 0x94, 0xfb, 0x0b, 0xf2, 0x4f, 0x14, 0x8d, 0xc9, 0xe7, 0x4f, 0xde, 0x19, 0x02, 0x04, +/*3c70:*/ 0x6c, 0x4d, 0x18, 0x3c, 0xc1, 0x10, 0x42, 0xcc, 0x0d, 0xf9, 0xe2, 0x29, 0xf9, 0x83, 0x27, 0xaa, +/*3c80:*/ 0x4e, 0x93, 0xd9, 0x56, 0x03, 0x01, 0xfb, 0xda, 0xbf, 0x31, 0x37, 0x29, 0xcf, 0x85, 0x4a, 0xf7, +/*3c90:*/ 0x78, 0xbe, 0xa0, 0xd1, 0x2d, 0x4d, 0x80, 0x65, 0xe1, 0x40, 0x4b, 0xdf, 0x9c, 0x49, 0x56, 0x4e, +/*3ca0:*/ 0x98, 0x1a, 0x26, 0x29, 0xde, 0x04, 0x77, 0x3c, 0xd8, 0xa5, 0x67, 0x50, 0xbb, 0x38, 0xf8, 0x34, +/*3cb0:*/ 0x38, 0xd3, 0x17, 0x81, 0x7c, 0x03, 0xdb, 0x67, 0xbc, 0xc7, 0x5b, 0x03, 0x97, 0x72, 0x50, 0x77, +/*3cc0:*/ 0x48, 0x08, 0xa1, 0x11, 0x69, 0xd8, 0xa4, 0x87, 0xff, 0xfa, 0x6f, 0x86, 0xb2, 0xac, 0xf2, 0xd9, +/*3cd0:*/ 0x54, 0x66, 0x3e, 0x3c, 0xd8, 0x7c, 0xd2, 0x68, 0x63, 0xfa, 0xca, 0xe7, 0x1d, 0x04, 0x61, 0x02, +/*3ce0:*/ 0x67, 0x79, 0xe6, 0xab, 0x99, 0xad, 0x52, 0xd8, 0xce, 0xff, 0x37, 0x76, 0x4e, 0xa7, 0x34, 0xde, +/*3cf0:*/ 0x6b, 0xe7, 0x44, 0xfe, 0xf0, 0xd8, 0x60, 0x60, 0xb5, 0x86, 0x64, 0xcf, 0x8c, 0x44, 0x82, 0xad, +/*3d00:*/ 0x88, 0x0c, 0x1c, 0x98, 0xab, 0xd1, 0x53, 0xec, 0x86, 0x86, 0x91, 0xf3, 0xbb, 0xa5, 0xf4, 0x75, +/*3d10:*/ 0xad, 0x7d, 0xf8, 0x0b, 0x8e, 0xfe, 0x2e, 0x1d, 0x32, 0x4e, 0x48, 0x1d, 0x2c, 0x55, 0x39, 0xac, +/*3d20:*/ 0xc8, 0xde, 0xec, 0xc4, 0xd8, 0xec, 0xcc, 0xde, 0x96, 0x44, 0x42, 0x26, 0xb9, 0x1c, 0xe4, 0xa6, +/*3d30:*/ 0x50, 0x02, 0xeb, 0xd5, 0xdd, 0xdc, 0xc6, 0x0d, 0x80, 0xce, 0xed, 0xcc, 0xf4, 0x71, 0xf3, 0xd7, +/*3d40:*/ 0xf5, 0xd2, 0xcd, 0xa8, 0x72, 0x0b, 0x56, 0x8b, 0x35, 0xdc, 0x30, 0x8c, 0x4c, 0xdf, 0x96, 0xdf, +/*3d50:*/ 0x51, 0x92, 0x1d, 0x9c, 0x72, 0xc0, 0x63, 0x41, 0xbe, 0x8f, 0xf4, 0x8d, 0x9d, 0xcd, 0x21, 0x08, +/*3d60:*/ 0xf4, 0x46, 0xea, 0x0c, 0x27, 0x0e, 0x2b, 0x87, 0x0a, 0x4c, 0x49, 0x52, 0x14, 0x61, 0x85, 0xc2, +/*3d70:*/ 0x63, 0x7e, 0x3a, 0x54, 0x57, 0x66, 0xb9, 0x07, 0xce, 0x62, 0x9f, 0xa4, 0x56, 0x16, 0x50, 0xe8, +/*3d80:*/ 0x19, 0xbb, 0x01, 0x6a, 0x85, 0x70, 0x4e, 0xc6, 0xed, 0x51, 0xb9, 0x99, 0xa2, 0x02, 0x3c, 0x3a, +/*3d90:*/ 0xa4, 0x57, 0xfe, 0xa5, 0x32, 0x0a, 0x29, 0xb3, 0xe0, 0x64, 0x23, 0x7b, 0x04, 0xbf, 0xce, 0x8b, +/*3da0:*/ 0x2b, 0xad, 0x8a, 0xc8, 0x0d, 0x08, 0x43, 0x72, 0xca, 0x1d, 0x81, 0x1b, 0x81, 0x1c, 0x5d, 0x8f, +/*3db0:*/ 0x07, 0xd5, 0x4e, 0x7d, 0x81, 0x4c, 0xd1, 0xa7, 0xe2, 0xd0, 0x86, 0xa8, 0x76, 0xd9, 0x4e, 0x96, +/*3dc0:*/ 0xb0, 0x62, 0xbc, 0x63, 0x98, 0xae, 0x20, 0xac, 0x6f, 0x07, 0x13, 0x72, 0xf7, 0xab, 0xbe, 0x3d, +/*3dd0:*/ 0xc1, 0xa3, 0x7b, 0xf2, 0xa5, 0x42, 0x57, 0xa5, 0xe4, 0xaa, 0xe1, 0xc3, 0x22, 0x06, 0x57, 0x65, +/*3de0:*/ 0x7a, 0x02, 0x5f, 0x8e, 0xa0, 0x53, 0x79, 0x26, 0xdd, 0x16, 0x6f, 0xcf, 0x5d, 0x25, 0xe0, 0xb7, +/*3df0:*/ 0x88, 0xb9, 0x6b, 0x88, 0xb9, 0xa2, 0x0d, 0xa0, 0x29, 0x6e, 0x2a, 0x2a, 0xc5, 0x8c, 0x37, 0xbf, +/*3e00:*/ 0x5d, 0x4f, 0xcb, 0x9c, 0xd3, 0x5f, 0xce, 0xe4, 0x6e, 0x5d, 0x22, 0xc8, 0xc1, 0x70, 0x13, 0x12, +/*3e10:*/ 0x41, 0xc3, 0xd3, 0xa9, 0xae, 0x6b, 0x3f, 0xf7, 0x03, 0xff, 0x54, 0xeb, 0x73, 0x57, 0x48, 0x29, +/*3e20:*/ 0x9e, 0xed, 0x5a, 0x1e, 0x91, 0x75, 0x87, 0x50, 0xf4, 0x0b, 0xea, 0xae, 0x1d, 0x2f, 0xf9, 0xfb, +/*3e30:*/ 0x54, 0xfe, 0x61, 0x18, 0xd7, 0x30, 0xc3, 0x90, 0x98, 0xf8, 0xb6, 0x18, 0x99, 0xd9, 0x47, 0xa2, +/*3e40:*/ 0x09, 0xf1, 0x26, 0x9a, 0x00, 0x74, 0xf0, 0x79, 0x89, 0x85, 0xe9, 0x1c, 0x31, 0x62, 0x83, 0x5a, +/*3e50:*/ 0x13, 0x6b, 0xe1, 0x8e, 0xb2, 0xa7, 0xbf, 0xa8, 0x4c, 0x9c, 0x52, 0xd0, 0x94, 0x22, 0x60, 0x23, +/*3e60:*/ 0xad, 0x0e, 0x86, 0x06, 0xc3, 0x89, 0x34, 0x5d, 0x3b, 0xd6, 0x58, 0x80, 0x77, 0x0b, 0x30, 0x1f, +/*3e70:*/ 0xa0, 0xb4, 0x86, 0x8d, 0x68, 0x68, 0x2f, 0xe1, 0x62, 0x36, 0x7b, 0xec, 0xce, 0xc7, 0x13, 0xa8, +/*3e80:*/ 0x05, 0xaf, 0xd8, 0xcf, 0xde, 0x0b, 0x31, 0x06, 0xd8, 0xda, 0xe7, 0x3c, 0x69, 0xcc, 0x53, 0x36, +/*3e90:*/ 0x1a, 0x67, 0x80, 0xc1, 0x01, 0xb1, 0x1e, 0xc3, 0x8d, 0x7e, 0x4c, 0x44, 0xba, 0xfe, 0xb1, 0xbf, +/*3ea0:*/ 0x05, 0x3b, 0x91, 0xcf, 0x03, 0x4b, 0x42, 0x4b, 0x66, 0xf1, 0x0b, 0x14, 0x30, 0xb7, 0xea, 0xf8, +/*3eb0:*/ 0xcf, 0x11, 0xc8, 0xfd, 0x24, 0xf9, 0xc0, 0xe1, 0x8f, 0x0f, 0x84, 0xf9, 0x32, 0xe9, 0x99, 0xa0, +/*3ec0:*/ 0x8a, 0x52, 0x1c, 0x10, 0x0e, 0x26, 0x28, 0x31, 0xff, 0x2b, 0x79, 0x1e, 0x2c, 0x5b, 0xcd, 0x71, +/*3ed0:*/ 0x6e, 0x0b, 0x30, 0xd5, 0x49, 0xfb, 0xc5, 0x0b, 0xd3, 0x64, 0x92, 0x64, 0x6e, 0x7d, 0x6f, 0xb4, +/*3ee0:*/ 0xfe, 0xef, 0xf7, 0x72, 0x3e, 0x98, 0xcf, 0x43, 0xa4, 0x76, 0xa9, 0x6d, 0xc7, 0x88, 0xbb, 0x67, +/*3ef0:*/ 0x63, 0xdf, 0x27, 0xe3, 0xa4, 0xeb, 0x50, 0xd4, 0x1e, 0x21, 0x79, 0x39, 0xb9, 0xeb, 0x32, 0xa5, +/*3f00:*/ 0xf6, 0x5f, 0xb2, 0x8f, 0xf7, 0x8d, 0x04, 0x3e, 0xa9, 0x61, 0x1f, 0x64, 0x64, 0x1e, 0xfa, 0x72, +/*3f10:*/ 0x87, 0x3e, 0xd3, 0xdb, 0xbe, 0xd1, 0x9d, 0x3b, 0xac, 0x2b, 0x92, 0xf2, 0xd8, 0xf6, 0x5a, 0xd3, +/*3f20:*/ 0xa1, 0x1c, 0x75, 0x0e, 0xf6, 0xfd, 0x09, 0x43, 0xf8, 0x02, 0x64, 0x52, 0x46, 0x18, 0x3c, 0x46, +/*3f30:*/ 0x2d, 0x9a, 0x97, 0x29, 0xa7, 0x3c, 0xd0, 0x53, 0xbc, 0x79, 0xe5, 0x53, 0xb4, 0x94, 0xfd, 0x72, +/*3f40:*/ 0xf5, 0xdc, 0x93, 0xd3, 0x9a, 0x6e, 0x13, 0x22, 0x04, 0x3e, 0x7c, 0x24, 0x80, 0x21, 0x29, 0x82, +/*3f50:*/ 0x0a, 0x02, 0x5e, 0x8a, 0x9e, 0xab, 0xce, 0x2b, 0x1e, 0x52, 0x10, 0x27, 0x92, 0xb5, 0x1c, 0x7b, +/*3f60:*/ 0xe9, 0xf1, 0xa5, 0x48, 0xfa, 0x32, 0xec, 0x16, 0xd8, 0x6d, 0xbd, 0xea, 0x58, 0x1c, 0xee, 0x37, +/*3f70:*/ 0x8b, 0xd2, 0x1c, 0x77, 0x7d, 0xf8, 0x79, 0xf3, 0x1b, 0x87, 0x23, 0x65, 0x1c, 0xa3, 0x4e, 0x30, +/*3f80:*/ 0x66, 0x79, 0xbd, 0x1b, 0x1e, 0xa0, 0x91, 0xf2, 0x08, 0xba, 0x3a, 0xe5, 0xbf, 0xf7, 0x28, 0x24, +/*3f90:*/ 0x02, 0xd6, 0xeb, 0xab, 0xdf, 0xdc, 0x3d, 0xac, 0xe9, 0x2a, 0x03, 0xf2, 0xc9, 0x23, 0x61, 0x73, +/*3fa0:*/ 0xee, 0x4f, 0x70, 0xfb, 0x6e, 0xdc, 0x85, 0x99, 0x66, 0x80, 0x82, 0x76, 0xa9, 0xf1, 0xff, 0x87, +/*3fb0:*/ 0x0f, 0x46, 0xe1, 0xfc, 0x38, 0x66, 0xe4, 0xdf, 0xa9, 0x8e, 0x1b, 0xaf, 0xc1, 0x35, 0x37, 0x17, +/*3fc0:*/ 0x95, 0x35, 0xe4, 0x36, 0x25, 0x77, 0x3b, 0x17, 0xfa, 0x97, 0xff, 0x70, 0xb8, 0xaa, 0x38, 0xb0, +/*3fd0:*/ 0x7b, 0xa9, 0xdf, 0x33, 0x4a, 0x3b, 0xaf, 0xbd, 0x61, 0x69, 0x93, 0x1c, 0x21, 0xa5, 0x79, 0x20, +/*3fe0:*/ 0xae, 0x40, 0x7c, 0x73, 0x5a, 0x86, 0xf0, 0x23, 0x6b, 0xec, 0x82, 0x89, 0x5d, 0xbb, 0x7b, 0x26, +/*3ff0:*/ 0xf3, 0x9a, 0x83, 0xe6, 0x35, 0x27, 0xb6, 0xd8, 0x79, 0x8c, 0xa6, 0xdd, 0xd5, 0x0d, 0xdb, 0x93, +/*4000:*/ 0x9c, 0x75, 0xef, 0xc7, 0xfc, 0xd5, 0x14, 0xa1, 0x7e, 0x65, 0x64, 0x81, 0x97, 0x9f, 0xc2, 0xe2, +/*4010:*/ 0xb2, 0xd2, 0x49, 0xd0, 0xca, 0xb7, 0x54, 0x17, 0xcf, 0x08, 0xaa, 0x79, 0x78, 0xa1, 0x03, 0x14, +/*4020:*/ 0xbf, 0xdc, 0x02, 0xe8, 0x19, 0xc1, 0xf7, 0xe4, 0x40, 0x23, 0xf0, 0x85, 0x39, 0xf3, 0x7b, 0xe3, +/*4030:*/ 0x47, 0x87, 0xf9, 0x98, 0xda, 0x3f, 0x96, 0x06, 0xec, 0xc3, 0x74, 0x05, 0xfa, 0x17, 0xfd, 0x0e, +/*4040:*/ 0xed, 0xfd, 0xeb, 0x80, 0x1a, 0xed, 0x89, 0xce, 0xfd, 0x5f, 0xa5, 0x5f, 0x65, 0xd0, 0xb0, 0x8e, +/*4050:*/ 0xdd, 0x61, 0x8f, 0xe7, 0x9e, 0xc5, 0x0f, 0x71, 0xb1, 0x8e, 0x64, 0xef, 0x06, 0xc9, 0x1a, 0xbc, +/*4060:*/ 0x63, 0xc4, 0xbd, 0x7d, 0x91, 0x6e, 0xe6, 0x9f, 0xb7, 0xab, 0x0d, 0xb3, 0xc6, 0xd6, 0x16, 0x87, +/*4070:*/ 0x50, 0x17, 0xf7, 0xa4, 0xf3, 0x6e, 0x81, 0x04, 0x90, 0x54, 0x51, 0xaa, 0x0f, 0xda, 0xe3, 0xed, +/*4080:*/ 0xd3, 0x89, 0x2e, 0x7c, 0xdf, 0x6c, 0x7c, 0x42, 0xd5, 0xc8, 0xdd, 0xd2, 0xff, 0x9c, 0x06, 0x08, +/*4090:*/ 0x44, 0xc5, 0x87, 0x60, 0x08, 0x3c, 0xb7, 0x50, 0xeb, 0x39, 0x29, 0x96, 0xc3, 0xab, 0x3f, 0x12, +/*40a0:*/ 0xfc, 0xd6, 0x7f, 0xde, 0xe1, 0x43, 0x55, 0x32, 0xa3, 0xef, 0xa3, 0x9f, 0x19, 0x19, 0x10, 0x12, +/*40b0:*/ 0x25, 0xf8, 0x5f, 0x35, 0xe6, 0xd8, 0xf4, 0xbf, 0xc2, 0x65, 0x82, 0xfa, 0x3e, 0x90, 0xc6, 0xcc, +/*40c0:*/ 0x2b, 0xf8, 0x53, 0x79, 0x08, 0x6f, 0xa1, 0xe6, 0x71, 0x72, 0x4d, 0x64, 0x77, 0xc2, 0x63, 0x54, +/*40d0:*/ 0x9c, 0xe5, 0x0f, 0x46, 0x4b, 0xf5, 0x53, 0xc9, 0xfe, 0x8f, 0x6c, 0xd7, 0xed, 0xe6, 0x29, 0x31, +/*40e0:*/ 0xeb, 0xe5, 0xbf, 0x1a, 0x12, 0x36, 0x06, 0x5a, 0x78, 0x92, 0x49, 0x70, 0xaf, 0x56, 0x98, 0xf4, +/*40f0:*/ 0x9d, 0x9a, 0x85, 0x4f, 0xaf, 0x33, 0xce, 0x64, 0x95, 0x43, 0xea, 0x46, 0x23, 0xb1, 0x05, 0x7f, +/*4100:*/ 0xe6, 0x43, 0x80, 0x65, 0x99, 0x53, 0xca, 0x2f, 0xe6, 0x97, 0xca, 0xa3, 0xe0, 0x19, 0xc9, 0x48, +/*4110:*/ 0x71, 0x7b, 0xc9, 0xeb, 0x25, 0x27, 0x87, 0xf7, 0x9a, 0x76, 0xac, 0xa8, 0x7f, 0x05, 0x65, 0x97, +/*4120:*/ 0x45, 0x24, 0x4b, 0xef, 0x73, 0x0b, 0x0c, 0x02, 0x6e, 0xad, 0x11, 0x21, 0x45, 0xda, 0x97, 0xf4, +/*4130:*/ 0x9b, 0xad, 0x09, 0x36, 0x15, 0x00, 0x64, 0xc6, 0x61, 0x38, 0x46, 0xe6, 0x7f, 0x99, 0x26, 0xab, +/*4140:*/ 0xe4, 0xfe, 0x8f, 0xdd, 0xd0, 0xf0, 0xb2, 0xa7, 0x07, 0xb0, 0xb4, 0xe4, 0xaf, 0x31, 0xea, 0xda, +/*4150:*/ 0xc2, 0x7f, 0x48, 0x82, 0x6d, 0xbe, 0xbd, 0x5d, 0xcb, 0x97, 0x1a, 0x69, 0xaf, 0x84, 0x70, 0x33, +/*4160:*/ 0xd0, 0x77, 0xd1, 0x3e, 0xea, 0x9b, 0x16, 0xff, 0x3b, 0x9f, 0xab, 0x8d, 0xab, 0x8b, 0x92, 0x42, +/*4170:*/ 0xfc, 0xb2, 0x78, 0x6c, 0xe1, 0x69, 0xcc, 0xe3, 0x27, 0x04, 0xe9, 0xa2, 0x52, 0xf9, 0xa8, 0xbc, +/*4180:*/ 0x2e, 0x89, 0x78, 0x19, 0x08, 0x21, 0x60, 0x7a, 0x08, 0x46, 0x88, 0x41, 0xc9, 0xf2, 0x45, 0x9f, +/*4190:*/ 0x5a, 0x46, 0x5f, 0xff, 0x9f, 0xd9, 0x83, 0xff, 0x8c, 0xe8, 0x3c, 0x47, 0xa4, 0x00, 0xad, 0xc4, +/*41a0:*/ 0x91, 0x06, 0x40, 0x1b, 0x9d, 0x6a, 0xd3, 0x10, 0xb4, 0xed, 0x69, 0xc1, 0x2f, 0x54, 0x5f, 0x87, +/*41b0:*/ 0xde, 0xaa, 0xff, 0x2e, 0x5f, 0x4c, 0x98, 0xf0, 0xac, 0x4e, 0x70, 0x63, 0xb9, 0xf1, 0xec, 0x2d, +/*41c0:*/ 0xa7, 0xb8, 0xa2, 0xae, 0x12, 0x83, 0xa9, 0x7d, 0x27, 0x76, 0xa8, 0x79, 0x4b, 0xbd, 0x41, 0x86, +/*41d0:*/ 0x68, 0xdc, 0x17, 0xc8, 0x8c, 0x21, 0xa5, 0x98, 0x9a, 0x04, 0xd7, 0x7f, 0x51, 0xd6, 0x26, 0x72, +/*41e0:*/ 0xf3, 0x34, 0xb1, 0x8a, 0x9a, 0x27, 0x77, 0xdf, 0x20, 0x51, 0x53, 0xdb, 0x52, 0x6b, 0xf9, 0x3f, +/*41f0:*/ 0x1d, 0xa3, 0xb3, 0x9c, 0x68, 0x81, 0xf3, 0x53, 0xad, 0xf3, 0x71, 0xd7, 0x02, 0x52, 0x19, 0xac, +/*4200:*/ 0x5a, 0xa4, 0x59, 0xa3, 0x40, 0x3b, 0xe7, 0x95, 0x53, 0x69, 0x3b, 0x02, 0x7d, 0x5e, 0x46, 0x5d, +/*4210:*/ 0x35, 0x37, 0x57, 0xda, 0x9a, 0xf0, 0x8e, 0x2a, 0x00, 0x3c, 0xec, 0xba, 0xdd, 0xa4, 0xe2, 0x53, +/*4220:*/ 0x2d, 0x56, 0x62, 0x09, 0x82, 0x34, 0xbc, 0xb6, 0x5a, 0x1a, 0x92, 0xc2, 0xc7, 0x16, 0xbb, 0x0b, +/*4230:*/ 0xfe, 0xb9, 0xc8, 0xf2, 0x6a, 0xab, 0xc5, 0x06, 0x15, 0x47, 0xab, 0x7d, 0x3c, 0xf0, 0x49, 0xda, +/*4240:*/ 0x26, 0x9c, 0x74, 0x93, 0xe3, 0xe9, 0x5d, 0x0e, 0xeb, 0xaf, 0x2c, 0x82, 0xf9, 0x0c, 0x05, 0x58, +/*4250:*/ 0xae, 0xdc, 0xce, 0x6b, 0x3f, 0xba, 0xcf, 0x8f, 0xb5, 0x3f, 0x69, 0xda, 0xde, 0x05, 0x16, 0xe4, +/*4260:*/ 0x60, 0xf8, 0xa6, 0x7e, 0xcc, 0xe9, 0x21, 0x61, 0xa9, 0x7b, 0x11, 0x81, 0x02, 0x0e, 0xe6, 0xba, +/*4270:*/ 0x6c, 0xdf, 0xfa, 0x56, 0xbf, 0xe7, 0x53, 0x08, 0xa8, 0x74, 0x32, 0xd8, 0x12, 0xa5, 0x26, 0x61, +/*4280:*/ 0x56, 0x20, 0xb2, 0x43, 0xc7, 0x17, 0xfe, 0xe0, 0x51, 0x17, 0x44, 0x53, 0x8f, 0xd6, 0x3e, 0x31, +/*4290:*/ 0x38, 0xed, 0xcd, 0x16, 0xd5, 0xac, 0x49, 0x43, 0xfc, 0x2f, 0x5b, 0x70, 0xcb, 0x6d, 0x78, 0xfe, +/*42a0:*/ 0x7a, 0xe4, 0x08, 0xef, 0x53, 0x88, 0xc0, 0x1f, 0x05, 0x74, 0x3d, 0xb3, 0x80, 0xed, 0xae, 0x7f, +/*42b0:*/ 0xe9, 0xf2, 0x5c, 0x5a, 0x83, 0x03, 0xf3, 0x04, 0x7a, 0x82, 0x08, 0x5b, 0xb7, 0xe6, 0x0c, 0x5a, +/*42c0:*/ 0x2c, 0xdc, 0x41, 0xb1, 0xd3, 0x9a, 0x1b, 0x76, 0x16, 0x01, 0x3e, 0xad, 0x94, 0x2f, 0x78, 0xd0, +/*42d0:*/ 0xad, 0x69, 0x2e, 0x50, 0xb5, 0x98, 0x63, 0xb4, 0x3e, 0x37, 0xaa, 0x6a, 0xb7, 0x7c, 0x1e, 0x09, +/*42e0:*/ 0x2c, 0x4a, 0x40, 0x13, 0xe7, 0x5e, 0xf7, 0x98, 0xcf, 0xb0, 0x19, 0x90, 0x85, 0xf3, 0x59, 0x1c, +/*42f0:*/ 0x8f, 0xb2, 0x64, 0x7c, 0xae, 0x8d, 0xf4, 0xce, 0x2b, 0x18, 0x4d, 0xc9, 0x92, 0x2b, 0xce, 0xc3, +/*4300:*/ 0x22, 0x29, 0x3f, 0xc9, 0x8c, 0x53, 0xcc, 0x52, 0xb7, 0x1b, 0xc8, 0xf0, 0x4f, 0xbf, 0x40, 0xa0, +/*4310:*/ 0x27, 0x99, 0x0e, 0xad, 0xd9, 0x8e, 0x73, 0xe6, 0x0f, 0xd0, 0xd6, 0x6f, 0xe8, 0x95, 0xb5, 0x9c, +/*4320:*/ 0x3b, 0x1c, 0x84, 0xc5, 0xa5, 0x56, 0x82, 0x96, 0x94, 0xee, 0xda, 0x96, 0x1c, 0x82, 0x1c, 0xef, +/*4330:*/ 0xcb, 0x6e, 0xb1, 0xac, 0x45, 0x54, 0x31, 0x6c, 0x7d, 0x13, 0xc3, 0x22, 0x64, 0x81, 0x2a, 0xf4, +/*4340:*/ 0xf1, 0x4f, 0xf6, 0xb5, 0x2d, 0xdb, 0x6b, 0xcb, 0xa4, 0xd8, 0xbb, 0x46, 0x33, 0xe2, 0xf9, 0x65, +/*4350:*/ 0x73, 0x00, 0x39, 0x80, 0x11, 0x8a, 0xa6, 0x45, 0xbd, 0x6f, 0xd1, 0x50, 0x7a, 0xef, 0x71, 0xad, +/*4360:*/ 0x94, 0x5f, 0x67, 0x64, 0x06, 0x33, 0x32, 0xac, 0x87, 0x56, 0x83, 0x52, 0x39, 0x8e, 0x95, 0x89, +/*4370:*/ 0xd8, 0xab, 0xcd, 0xd6, 0x38, 0x52, 0xd8, 0x96, 0x67, 0x44, 0x3b, 0xd3, 0x94, 0x73, 0x9e, 0x42, +/*4380:*/ 0x70, 0xb4, 0xf1, 0x6e, 0x6b, 0xff, 0x6b, 0x8a, 0xe4, 0x35, 0xca, 0xad, 0x3c, 0x3d, 0xec, 0x73, +/*4390:*/ 0x7f, 0x4a, 0x9b, 0x23, 0x15, 0xef, 0xf7, 0xaf, 0xa7, 0x89, 0x57, 0x1e, 0x9e, 0x74, 0xa2, 0xbb, +/*43a0:*/ 0xeb, 0x51, 0xf4, 0x83, 0x30, 0x72, 0x5e, 0x9c, 0x96, 0x76, 0x9a, 0xad, 0x26, 0x05, 0xd0, 0x4a, +/*43b0:*/ 0x6b, 0x77, 0x91, 0x63, 0x44, 0xe3, 0xf4, 0x67, 0x48, 0x07, 0xad, 0xa9, 0x43, 0x1f, 0x34, 0x43, +/*43c0:*/ 0xff, 0xdb, 0x88, 0x6e, 0xa2, 0x01, 0x3e, 0x5d, 0x3b, 0x0c, 0x65, 0xd4, 0x13, 0x3b, 0x71, 0xba, +/*43d0:*/ 0x1f, 0x70, 0x01, 0x92, 0x65, 0x75, 0x6b, 0xfa, 0x9f, 0xf9, 0xe6, 0x35, 0x90, 0xca, 0xc8, 0x4f, +/*43e0:*/ 0x93, 0x04, 0xad, 0xe6, 0xe1, 0xf1, 0x27, 0xc3, 0x84, 0xf2, 0x8b, 0xb6, 0xed, 0x56, 0x05, 0xb2, +/*43f0:*/ 0xfa, 0x3e, 0x37, 0x2b, 0x3c, 0x4b, 0x52, 0xbc, 0xac, 0x37, 0x19, 0x05, 0xd0, 0x5c, 0x47, 0x5c, +/*4400:*/ 0x56, 0x90, 0xa2, 0x8b, 0x30, 0xab, 0x9c, 0x05, 0x2a, 0xc3, 0x0c, 0x8a, 0x64, 0xf4, 0x4e, 0xb5, +/*4410:*/ 0xe4, 0x39, 0x31, 0xdc, 0x30, 0xfc, 0x70, 0x47, 0xa3, 0x59, 0x93, 0x7e, 0x49, 0xb3, 0x82, 0x86, +/*4420:*/ 0x5d, 0xd6, 0xc5, 0xc1, 0xe1, 0x09, 0x2d, 0x7b, 0x17, 0x53, 0xa9, 0x27, 0x98, 0xc2, 0x6a, 0xae, +/*4430:*/ 0x89, 0x80, 0x7c, 0xed, 0x30, 0xa0, 0x48, 0x42, 0x77, 0x84, 0xfe, 0x9a, 0x5a, 0x4e, 0x04, 0xed, +/*4440:*/ 0x4e, 0x6e, 0x04, 0x43, 0x04, 0xbd, 0xa8, 0xca, 0x0d, 0xd6, 0xbc, 0x7b, 0x3e, 0x4c, 0xe4, 0x88, +/*4450:*/ 0xa9, 0x7f, 0x96, 0x84, 0xa1, 0x02, 0x98, 0x3f, 0x95, 0xbc, 0x31, 0xbd, 0x54, 0xc3, 0x79, 0x78, +/*4460:*/ 0xc4, 0xdf, 0xb8, 0xf5, 0x79, 0x51, 0x05, 0x48, 0x04, 0x11, 0x34, 0x9f, 0x65, 0x44, 0x70, 0x96, +/*4470:*/ 0xc8, 0x01, 0xc8, 0xa8, 0xff, 0xb3, 0x3e, 0x22, 0xd0, 0xbe, 0x6d, 0xc9, 0x87, 0x4c, 0x32, 0x79, +/*4480:*/ 0x9a, 0x91, 0x4c, 0x5f, 0x7e, 0x6d, 0x60, 0x22, 0xab, 0xf5, 0x24, 0x2c, 0x38, 0x6f, 0x76, 0x69, +/*4490:*/ 0xd4, 0xd8, 0x1a, 0x4d, 0x39, 0xf0, 0x61, 0x28, 0xed, 0xce, 0x8c, 0x89, 0x68, 0x49, 0x2d, 0xcb, +/*44a0:*/ 0xa6, 0x8d, 0x70, 0xb2, 0x82, 0x4b, 0x56, 0xa3, 0x09, 0x99, 0x76, 0xa9, 0xae, 0x81, 0xf8, 0xe3, +/*44b0:*/ 0x95, 0xae, 0x92, 0x2d, 0xd5, 0x82, 0xbb, 0x4e, 0x68, 0x61, 0x01, 0x4f, 0xab, 0xf4, 0xaa, 0x42, +/*44c0:*/ 0xb4, 0x68, 0xfa, 0x57, 0xef, 0xc7, 0x06, 0x28, 0x70, 0x56, 0x7a, 0xeb, 0xee, 0xe5, 0x99, 0x5c, +/*44d0:*/ 0x73, 0xb9, 0x94, 0xd1, 0x04, 0x77, 0xfb, 0x7c, 0xa5, 0xfd, 0xd0, 0x54, 0xc5, 0xad, 0x24, 0x90, +/*44e0:*/ 0x99, 0x20, 0xb9, 0x27, 0xbf, 0xf7, 0x80, 0x4e, 0x4e, 0x30, 0x50, 0x45, 0x59, 0x4e, 0x5c, 0x43, +/*44f0:*/ 0xcf, 0x8f, 0xfb, 0xd1, 0x92, 0x74, 0x6c, 0x41, 0x4d, 0xe1, 0x77, 0xba, 0x35, 0x64, 0x8d, 0xe1, +/*4500:*/ 0xa8, 0xf4, 0x3d, 0x36, 0x28, 0x8d, 0xcf, 0xf2, 0x9b, 0xdc, 0x5b, 0x41, 0x4d, 0x5d, 0xa2, 0x45, +/*4510:*/ 0xf8, 0xa5, 0xde, 0x94, 0xf4, 0xc6, 0x3a, 0x7f, 0xd3, 0x53, 0x29, 0x4a, 0x1f, 0x93, 0x31, 0x7e, +/*4520:*/ 0x92, 0x21, 0xbb, 0x60, 0x30, 0xe2, 0xa9, 0xfe, 0x4d, 0x8e, 0xe0, 0xdf, 0x92, 0x8a, 0x60, 0x59, +/*4530:*/ 0xdc, 0x4b, 0x22, 0x20, 0x2b, 0x8d, 0x3b, 0xe1, 0x12, 0x72, 0x5d, 0x11, 0xae, 0xa1, 0x59, 0x26, +/*4540:*/ 0x70, 0x2f, 0xc9, 0xae, 0x3d, 0xeb, 0xa3, 0x9a, 0x4e, 0x05, 0x81, 0x0c, 0xc6, 0xfe, 0xf3, 0x94, +/*4550:*/ 0x8f, 0xe1, 0x2b, 0xd2, 0xd8, 0xc2, 0xe3, 0x35, 0x88, 0x86, 0x37, 0x90, 0xf2, 0x27, 0x23, 0x93, +/*4560:*/ 0x47, 0x22, 0xfc, 0x44, 0x68, 0xaf, 0x82, 0x75, 0x15, 0xb4, 0xd5, 0xa5, 0x0c, 0x8d, 0x3b, 0x18, +/*4570:*/ 0x52, 0xa0, 0x94, 0x2f, 0x9a, 0x13, 0x49, 0x49, 0x05, 0xff, 0x79, 0x09, 0x5d, 0x4d, 0xff, 0x1f, +/*4580:*/ 0x49, 0x31, 0x71, 0x58, 0x83, 0x24, 0x28, 0xb3, 0xeb, 0x32, 0xd3, 0x68, 0x47, 0x6f, 0xf2, 0xd9, +/*4590:*/ 0xf9, 0x90, 0x1b, 0x45, 0xaf, 0x5b, 0x69, 0x02, 0x7c, 0xf3, 0x8d, 0x34, 0x51, 0x14, 0x71, 0x3f, +/*45a0:*/ 0x9e, 0x04, 0xc6, 0x6f, 0xe0, 0xf9, 0x38, 0xbf, 0xff, 0xc5, 0x35, 0x94, 0x74, 0x1d, 0xf9, 0x20, +/*45b0:*/ 0x04, 0xec, 0x6f, 0x58, 0x2b, 0xf1, 0xf6, 0x94, 0xbb, 0x85, 0x30, 0x62, 0xc9, 0xea, 0x26, 0x31, +/*45c0:*/ 0x5d, 0x2d, 0x9a, 0xc9, 0xe0, 0xe3, 0x86, 0x70, 0x93, 0xa3, 0x5d, 0x26, 0xf8, 0x84, 0x63, 0xdc, +/*45d0:*/ 0xa3, 0xca, 0x90, 0xd6, 0xd9, 0x77, 0xcc, 0x80, 0x79, 0x09, 0xa6, 0x5b, 0x75, 0xa7, 0x9b, 0x7c, +/*45e0:*/ 0x29, 0xb4, 0x24, 0xe1, 0x08, 0x0c, 0xb6, 0x98, 0x3e, 0xf2, 0xf0, 0x40, 0x5a, 0xcd, 0x72, 0x25, +/*45f0:*/ 0xd2, 0xa0, 0x68, 0xf0, 0x3c, 0x64, 0x84, 0x0e, 0x3e, 0x87, 0xaf, 0xe1, 0x1e, 0x29, 0xc1, 0x88, +/*4600:*/ 0x1c, 0x40, 0x51, 0x4b, 0xcb, 0x91, 0x55, 0xf5, 0xb9, 0x91, 0xd1, 0xde, 0x6d, 0x08, 0x34, 0x0b, +/*4610:*/ 0xfc, 0xf0, 0x80, 0x27, 0x23, 0x60, 0xcb, 0xfb, 0xa2, 0xea, 0xfe, 0xc1, 0xb7, 0x29, 0xaf, 0x01, +/*4620:*/ 0xf4, 0xb5, 0x84, 0x41, 0x60, 0x1c, 0xb4, 0x12, 0x80, 0x32, 0xc9, 0xce, 0x30, 0x46, 0x2f, 0x02, +/*4630:*/ 0xdb, 0xf3, 0x31, 0xd9, 0xdb, 0xf7, 0xba, 0xc2, 0x98, 0x07, 0x7c, 0x61, 0x8f, 0xfa, 0x44, 0x54, +/*4640:*/ 0xdf, 0xe6, 0x41, 0xe2, 0xec, 0xb0, 0x02, 0x5a, 0x1f, 0x37, 0xb1, 0x9b, 0x5f, 0xa6, 0x67, 0xc6, +/*4650:*/ 0x57, 0x3b, 0x95, 0x0e, 0x03, 0xaa, 0x07, 0x6c, 0x7c, 0xde, 0x22, 0x37, 0x76, 0x87, 0x0e, 0x3d, +/*4660:*/ 0x97, 0xa6, 0x41, 0x10, 0x3d, 0x7f, 0xca, 0x83, 0xa7, 0x58, 0xb3, 0xff, 0xc6, 0x10, 0x86, 0x33, +/*4670:*/ 0x10, 0x75, 0x7e, 0x05, 0xd8, 0xf3, 0x10, 0x7a, 0x62, 0x12, 0xa7, 0x43, 0x2a, 0x31, 0xf5, 0x00, +/*4680:*/ 0x61, 0x16, 0x1c, 0x6c, 0x47, 0x72, 0xe3, 0x73, 0x47, 0xd1, 0xac, 0xe9, 0x74, 0x8a, 0x23, 0x45, +/*4690:*/ 0x85, 0x98, 0x4a, 0xf6, 0xb0, 0x44, 0xe9, 0x4a, 0xf5, 0xc5, 0xbd, 0xc2, 0x6f, 0x22, 0x8d, 0x90, +/*46a0:*/ 0x9f, 0x59, 0x3e, 0x18, 0x2c, 0x37, 0xa4, 0x5e, 0xa3, 0x04, 0x99, 0x19, 0x71, 0x76, 0x32, 0xe8, +/*46b0:*/ 0xc8, 0xa1, 0x14, 0xb8, 0x05, 0x4c, 0x9b, 0x39, 0x00, 0x72, 0x49, 0xcc, 0xdc, 0x8f, 0x2c, 0x9a, +/*46c0:*/ 0x5d, 0x01, 0x64, 0x73, 0x46, 0x38, 0xa6, 0xf2, 0xd6, 0x03, 0xa7, 0x0c, 0x1a, 0x62, 0xc1, 0x3b, +/*46d0:*/ 0xf0, 0x12, 0x35, 0x24, 0x01, 0x21, 0x55, 0x99, 0x57, 0x03, 0x93, 0xfd, 0x28, 0x14, 0xeb, 0x02, +/*46e0:*/ 0xd0, 0x26, 0x8c, 0xde, 0x26, 0xb2, 0x91, 0x9b, 0xa7, 0x68, 0x5d, 0x91, 0x6b, 0x48, 0x98, 0xa2, +/*46f0:*/ 0x5a, 0xf8, 0xb1, 0x71, 0x01, 0x3f, 0xa4, 0x03, 0x77, 0xa3, 0xfb, 0xab, 0x21, 0xb8, 0x22, 0xb9, +/*4700:*/ 0xc2, 0x6d, 0x66, 0xe5, 0xbd, 0x6f, 0x9e, 0xfa, 0x55, 0xa6, 0x80, 0x8c, 0xda, 0x3c, 0x1d, 0x96, +/*4710:*/ 0xf3, 0x10, 0x55, 0x5e, 0x73, 0xc7, 0x84, 0x79, 0xe3, 0x3e, 0x18, 0x68, 0x22, 0xaa, 0xd4, 0xad, +/*4720:*/ 0x77, 0x4c, 0x15, 0xbd, 0xd9, 0x59, 0x85, 0xcf, 0x7d, 0x56, 0xbc, 0xdd, 0xbf, 0x39, 0x83, 0x66, +/*4730:*/ 0x4c, 0xfd, 0x84, 0xb9, 0xa5, 0x8b, 0xdb, 0xb3, 0x18, 0xef, 0x82, 0x5d, 0xb0, 0x45, 0x2b, 0x83, +/*4740:*/ 0x2c, 0x58, 0x50, 0x48, 0x27, 0xd8, 0xd8, 0x05, 0xa4, 0xe9, 0x70, 0x0b, 0xd9, 0x06, 0x51, 0xf0, +/*4750:*/ 0xab, 0x2b, 0xa0, 0x6e, 0xdc, 0xc6, 0x46, 0xb9, 0xcc, 0x1d, 0x65, 0x09, 0x08, 0xcd, 0xca, 0x0a, +/*4760:*/ 0x62, 0x40, 0xe9, 0x79, 0x8f, 0xf8, 0x87, 0x3b, 0x1b, 0xc2, 0xf8, 0x5a, 0x0e, 0x55, 0x4f, 0x59, +/*4770:*/ 0x5f, 0x60, 0xed, 0xdb, 0x8d, 0xdb, 0xab, 0x7e, 0xc0, 0x38, 0x6f, 0x0d, 0xec, 0x5b, 0x4e, 0x3d, +/*4780:*/ 0x68, 0x14, 0x07, 0x41, 0x5a, 0xd0, 0x44, 0xca, 0xf5, 0x84, 0xbf, 0xd6, 0xfe, 0x5b, 0x14, 0xae, +/*4790:*/ 0x00, 0xf1, 0x28, 0x4d, 0xe0, 0x74, 0x33, 0xc7, 0x22, 0xcd, 0x19, 0x97, 0xad, 0x58, 0xac, 0x68, +/*47a0:*/ 0x1c, 0x4d, 0x42, 0x1a, 0xd7, 0x0e, 0x3b, 0x13, 0x55, 0x9a, 0xc1, 0xc5, 0xb9, 0x6a, 0x19, 0xca, +/*47b0:*/ 0x2e, 0xc6, 0x48, 0x18, 0x7a, 0x1d, 0x9a, 0x15, 0xba, 0xd4, 0x7c, 0x9b, 0x6d, 0xfa, 0xc8, 0x1c, +/*47c0:*/ 0xed, 0xc6, 0x47, 0xd3, 0xcf, 0x22, 0xf5, 0x19, 0x80, 0xcb, 0xeb, 0xf7, 0x1e, 0xcd, 0xb6, 0x8d, +/*47d0:*/ 0x41, 0x27, 0x40, 0x6a, 0xd4, 0x23, 0x8f, 0xfb, 0x71, 0x44, 0x85, 0xa0, 0xea, 0x1a, 0xfc, 0x31, +/*47e0:*/ 0x8b, 0xed, 0x04, 0x67, 0xc6, 0xa8, 0xe1, 0xf1, 0xb0, 0x05, 0x79, 0xc2, 0x39, 0xe3, 0x94, 0x18, +/*47f0:*/ 0xf4, 0xee, 0xad, 0x48, 0xd1, 0xd4, 0xc2, 0x04, 0xd5, 0x31, 0xc8, 0x9f, 0xf0, 0x10, 0x70, 0x0c, +/*4800:*/ 0x19, 0x1d, 0xc7, 0xcf, 0xce, 0x10, 0xa6, 0xf3, 0xd3, 0xd0, 0x9c, 0xc8, 0x0b, 0x13, 0xcc, 0x4c, +/*4810:*/ 0xbf, 0x36, 0x8f, 0x81, 0x78, 0x7f, 0x30, 0xfc, 0x6f, 0x0f, 0x81, 0xc2, 0x72, 0x91, 0xb5, 0x92, +/*4820:*/ 0x65, 0xe8, 0xdd, 0xbe, 0x65, 0xf4, 0xb2, 0x30, 0x0a, 0x59, 0xe0, 0x8f, 0x85, 0x99, 0x20, 0xf2, +/*4830:*/ 0x95, 0xb7, 0x6d, 0x16, 0x52, 0x29, 0xc7, 0xc8, 0x8b, 0xd3, 0xae, 0x2a, 0xfa, 0xb3, 0x7d, 0xb5, +/*4840:*/ 0xff, 0x4d, 0x28, 0x53, 0xc8, 0x60, 0xaf, 0x5a, 0xd9, 0x0d, 0x6a, 0xfc, 0x02, 0x8b, 0x47, 0x72, +/*4850:*/ 0xc1, 0x10, 0xf4, 0x92, 0x98, 0xe9, 0xe1, 0x51, 0xe3, 0x48, 0x10, 0x17, 0xf2, 0xae, 0xb5, 0x80, +/*4860:*/ 0x24, 0x2e, 0xec, 0x92, 0x9d, 0x27, 0xcd, 0x20, 0xab, 0xad, 0xea, 0x36, 0xfa, 0x99, 0x84, 0xf0, +/*4870:*/ 0x0b, 0xb3, 0xd6, 0x00, 0xc0, 0x99, 0x48, 0xb5, 0xe7, 0xf8, 0xe0, 0xe0, 0xd1, 0x85, 0x66, 0xa6, +/*4880:*/ 0x89, 0x37, 0x15, 0x37, 0xad, 0x1c, 0x30, 0xcf, 0x5c, 0xf1, 0x64, 0xd8, 0x0c, 0x60, 0x2e, 0xdc, +/*4890:*/ 0xe6, 0xf5, 0x95, 0x56, 0x28, 0x89, 0x61, 0x1e, 0x35, 0x47, 0x38, 0xf2, 0x1f, 0x2d, 0x1b, 0xec, +/*48a0:*/ 0x0b, 0x60, 0x79, 0xdd, 0xce, 0x7f, 0x1f, 0x05, 0x53, 0x15, 0xad, 0x24, 0x75, 0x1c, 0xa0, 0x6f, +/*48b0:*/ 0x30, 0xa2, 0x77, 0xde, 0x10, 0x5d, 0x74, 0x1c, 0xab, 0xd7, 0x1d, 0x2f, 0x4c, 0x13, 0x09, 0x17, +/*48c0:*/ 0x71, 0x01, 0x67, 0x44, 0xe6, 0x8b, 0xfc, 0x78, 0x69, 0xa9, 0xd3, 0x60, 0xb4, 0xfa, 0x3b, 0x1c, +/*48d0:*/ 0x4f, 0x07, 0xee, 0x31, 0xd1, 0xa2, 0x14, 0x1f, 0x7d, 0xe2, 0xc6, 0x8f, 0x5f, 0x3b, 0x68, 0x4c, +/*48e0:*/ 0x9c, 0xa1, 0xc1, 0x3a, 0xdb, 0x08, 0xd4, 0x9d, 0x46, 0x0d, 0x3e, 0x97, 0xfa, 0xe7, 0x24, 0xca, +/*48f0:*/ 0xc9, 0xdb, 0xaf, 0x19, 0xbe, 0x7c, 0x63, 0x88, 0x49, 0x04, 0x38, 0x32, 0x39, 0x35, 0x42, 0x9a, +/*4900:*/ 0x99, 0xfa, 0x89, 0x4e, 0x9b, 0xd1, 0xf8, 0x4b, 0x06, 0xa0, 0xa7, 0xae, 0xeb, 0x3e, 0x3b, 0xab, +/*4910:*/ 0xe0, 0x1a, 0x18, 0x43, 0xf6, 0xca, 0xb3, 0x8f, 0xc9, 0x43, 0x66, 0x68, 0x87, 0x7b, 0xd6, 0xdf, +/*4920:*/ 0x94, 0x87, 0xa0, 0x21, 0xbf, 0x72, 0x43, 0x9a, 0xe1, 0x85, 0xb5, 0x65, 0xc2, 0x1e, 0xa1, 0xb6, +/*4930:*/ 0x21, 0xa0, 0x20, 0xdf, 0x4e, 0xed, 0x21, 0xc2, 0xa8, 0xbb, 0xa4, 0x2f, 0xba, 0x43, 0x87, 0xe6, +/*4940:*/ 0xf6, 0x05, 0xef, 0xa8, 0xa9, 0x1b, 0x42, 0xd3, 0x5c, 0x90, 0xde, 0x8f, 0xf0, 0xe0, 0xdb, 0xba, +/*4950:*/ 0xe9, 0xba, 0x23, 0x7b, 0x4c, 0x25, 0x44, 0x52, 0x2d, 0xdc, 0x6a, 0x95, 0xeb, 0xab, 0x40, 0xe7, +/*4960:*/ 0x8c, 0x09, 0x35, 0xac, 0xac, 0xdf, 0x04, 0xe2, 0x36, 0x3d, 0xa0, 0x9c, 0x1d, 0x83, 0x0c, 0xd8, +/*4970:*/ 0x7c, 0x55, 0x52, 0x94, 0xf5, 0x7c, 0x76, 0x50, 0x64, 0xe2, 0xae, 0x4c, 0x27, 0xa4, 0x9d, 0xc8, +/*4980:*/ 0xd2, 0x88, 0x37, 0x5a, 0x79, 0x7c, 0x13, 0x4e, 0x56, 0x9f, 0xec, 0x2a, 0xd0, 0x15, 0x69, 0xb0, +/*4990:*/ 0x0f, 0x1e, 0x92, 0xd9, 0x86, 0x20, 0xbf, 0x9f, 0x2e, 0x9a, 0xa1, 0x49, 0xe6, 0xca, 0x86, 0x1f, +/*49a0:*/ 0x2c, 0x50, 0x9d, 0xf4, 0x92, 0xa4, 0x3e, 0xcb, 0x19, 0xcb, 0x94, 0x60, 0x60, 0x9f, 0xa1, 0x29, +/*49b0:*/ 0x41, 0x50, 0x11, 0x7c, 0xc2, 0xa9, 0xdb, 0x6b, 0x4c, 0x70, 0x84, 0x65, 0x3a, 0xa1, 0xbf, 0xf2, +/*49c0:*/ 0x41, 0x49, 0xfb, 0xd3, 0xd2, 0x8b, 0xf4, 0xf6, 0x73, 0xa1, 0xb9, 0x01, 0x9e, 0xc7, 0xe4, 0x1e, +/*49d0:*/ 0x89, 0x6a, 0x40, 0x2f, 0xd0, 0x29, 0xe5, 0xa4, 0x37, 0x44, 0xf0, 0x4e, 0x09, 0xd5, 0xc9, 0x09, +/*49e0:*/ 0xe6, 0x4d, 0x8d, 0x15, 0x2b, 0x55, 0x3c, 0xf0, 0xee, 0xa2, 0x56, 0xff, 0xa2, 0x60, 0x63, 0xf1, +/*49f0:*/ 0x19, 0xfe, 0x7c, 0xee, 0x43, 0xad, 0xa9, 0x4d, 0x3b, 0x2c, 0xfb, 0x24, 0xbd, 0xed, 0x9d, 0xb7, +/*4a00:*/ 0x4f, 0x95, 0xb5, 0xe1, 0x3f, 0x3b, 0xc4, 0x41, 0xa8, 0xb5, 0x68, 0xfe, 0x9d, 0x4f, 0xeb, 0x85, +/*4a10:*/ 0xe0, 0x69, 0x4f, 0x8f, 0x06, 0x88, 0x24, 0xe0, 0xcf, 0x35, 0x30, 0x86, 0x5e, 0x40, 0x70, 0x1f, +/*4a20:*/ 0x40, 0x1a, 0xdf, 0xcb, 0xc0, 0xac, 0xec, 0xd5, 0x76, 0xe5, 0x21, 0x48, 0xa7, 0xac, 0x4e, 0x22, +/*4a30:*/ 0x62, 0xd9, 0x91, 0x8a, 0x8c, 0x58, 0x06, 0x65, 0xaf, 0x69, 0x44, 0xe2, 0x7e, 0x4d, 0x4b, 0x69, +/*4a40:*/ 0x7e, 0x9b, 0xba, 0xa2, 0x36, 0x1b, 0xeb, 0xeb, 0x05, 0xa6, 0x2a, 0xf5, 0x24, 0x18, 0xe2, 0x8c, +/*4a50:*/ 0x02, 0x3b, 0xf5, 0x19, 0x17, 0x82, 0x9e, 0x9d, 0x4c, 0x90, 0x62, 0x86, 0x8f, 0x95, 0x99, 0x96, +/*4a60:*/ 0x1c, 0xec, 0x51, 0x8d, 0xf4, 0xc2, 0x75, 0x45, 0x0a, 0x51, 0x79, 0x39, 0x3f, 0x52, 0x42, 0xe5, +/*4a70:*/ 0x6c, 0x82, 0xf4, 0x2b, 0xa0, 0x2e, 0xb1, 0xce, 0x04, 0x7d, 0x20, 0xd5, 0x9c, 0x15, 0xb2, 0x10, +/*4a80:*/ 0xb7, 0x95, 0x47, 0x65, 0x07, 0x39, 0x21, 0xe3, 0xaf, 0xe7, 0xfd, 0xab, 0x6b, 0x97, 0x97, 0xf5, +/*4a90:*/ 0xd3, 0x5b, 0x1f, 0x67, 0xb6, 0xaf, 0xb4, 0x4b, 0x66, 0x10, 0xfe, 0x2f, 0xf9, 0x67, 0x8d, 0x3a, +/*4aa0:*/ 0xdf, 0x8c, 0x88, 0x66, 0x59, 0x9d, 0x11, 0x24, 0x32, 0x92, 0x09, 0xa9, 0x83, 0x07, 0x18, 0xee, +/*4ab0:*/ 0x78, 0x8c, 0x8c, 0xff, 0x0a, 0xda, 0xe8, 0x88, 0xa1, 0x3c, 0x10, 0xb4, 0x95, 0xfc, 0x5b, 0xe3, +/*4ac0:*/ 0x29, 0x47, 0x58, 0xde, 0x4c, 0xfd, 0xd3, 0x35, 0x58, 0x99, 0x86, 0x9a, 0xfb, 0xfa, 0xb1, 0x79, +/*4ad0:*/ 0xb0, 0xd1, 0x1d, 0x4b, 0x6c, 0xf6, 0x3e, 0x84, 0x52, 0xfb, 0xcb, 0x9a, 0xaa, 0x59, 0x09, 0x94, +/*4ae0:*/ 0x81, 0xeb, 0xb3, 0x93, 0x27, 0x97, 0x58, 0x29, 0x0a, 0x3e, 0x30, 0x30, 0xa5, 0xc7, 0xe4, 0x46, +/*4af0:*/ 0x9a, 0xa6, 0x5c, 0x27, 0x0c, 0xad, 0xe1, 0x77, 0x48, 0x1b, 0x71, 0x1f, 0x06, 0x93, 0x59, 0x1c, +/*4b00:*/ 0x8e, 0xb4, 0xe5, 0x8f, 0x35, 0x0b, 0x6b, 0x45, 0x47, 0x1d, 0xd6, 0xf2, 0x88, 0xad, 0xfb, 0x1b, +/*4b10:*/ 0x71, 0xf7, 0x52, 0x8b, 0x75, 0x17, 0xe2, 0xcc, 0xf3, 0x2d, 0x9e, 0x74, 0xb9, 0x59, 0xb8, 0xa0, +/*4b20:*/ 0x59, 0xe0, 0x6c, 0xc0, 0xb1, 0xa7, 0x33, 0x49, 0x6b, 0x92, 0x67, 0xe4, 0x4d, 0xe7, 0x43, 0xf3, +/*4b30:*/ 0x0f, 0x67, 0xfa, 0xef, 0x4f, 0xd3, 0x27, 0x31, 0x06, 0xe3, 0x90, 0xe8, 0x62, 0x27, 0x27, 0xbf, +/*4b40:*/ 0x4d, 0x83, 0xb2, 0x99, 0x64, 0x8b, 0x36, 0x26, 0x58, 0x37, 0x87, 0x5e, 0x04, 0x30, 0x66, 0x63, +/*4b50:*/ 0x7a, 0xe2, 0x0d, 0xec, 0x2e, 0xc7, 0xa5, 0x44, 0xad, 0xbf, 0xd0, 0xc0, 0xcf, 0xb5, 0xbb, 0xa0, +/*4b60:*/ 0x55, 0xa9, 0xcd, 0x4b, 0x82, 0xad, 0x13, 0x14, 0xd8, 0xab, 0x0f, 0x23, 0x14, 0xcf, 0xcc, 0x64, +/*4b70:*/ 0xfb, 0x80, 0x17, 0x58, 0x9d, 0xb2, 0x36, 0xb8, 0x6d, 0x82, 0xce, 0x21, 0xe7, 0x52, 0xf2, 0xb6, +/*4b80:*/ 0x31, 0x3e, 0x7e, 0x68, 0x18, 0xbf, 0xba, 0xd3, 0x8a, 0xe8, 0x71, 0x24, 0x9a, 0x9e, 0xce, 0xe5, +/*4b90:*/ 0xbe, 0x49, 0x2f, 0xe4, 0x37, 0x6c, 0xb6, 0x1b, 0x25, 0x16, 0x83, 0xbc, 0x1e, 0x6d, 0x9b, 0x68, +/*4ba0:*/ 0xa7, 0xb2, 0x9f, 0xea, 0x8d, 0x9d, 0xa2, 0xf0, 0xdd, 0x23, 0x32, 0xd0, 0x13, 0x8f, 0xa1, 0x29, +/*4bb0:*/ 0xcc, 0xcc, 0xba, 0xd3, 0x05, 0xfe, 0x90, 0x49, 0x4c, 0x99, 0x5e, 0x0c, 0x15, 0xa7, 0x08, 0x6a, +/*4bc0:*/ 0xe4, 0x4e, 0x89, 0x28, 0xca, 0xfc, 0x42, 0x61, 0x26, 0xfb, 0x26, 0x4b, 0x4d, 0xab, 0x91, 0x8f, +/*4bd0:*/ 0xe0, 0xd9, 0xa6, 0x25, 0xcf, 0x85, 0x62, 0x45, 0xdf, 0x7e, 0x5e, 0xc0, 0xd8, 0x9d, 0xb2, 0xfd, +/*4be0:*/ 0xbe, 0xb2, 0x81, 0xeb, 0xee, 0x06, 0x44, 0x48, 0xf9, 0x70, 0x2e, 0xc2, 0xd9, 0xe0, 0x5d, 0x49, +/*4bf0:*/ 0xe0, 0x7e, 0xe8, 0x9b, 0xe3, 0xc7, 0x46, 0x49, 0xe8, 0xcb, 0x08, 0x3b, 0x8f, 0xd6, 0xaa, 0xdf, +/*4c00:*/ 0xa5, 0xec, 0xe7, 0x7b, 0x12, 0x91, 0x18, 0xcd, 0xd2, 0x83, 0x40, 0xb5, 0xa4, 0x2a, 0x17, 0xfc, +/*4c10:*/ 0x34, 0x6a, 0x13, 0x9d, 0x7c, 0xce, 0x2c, 0x45, 0x82, 0xfb, 0x0d, 0x14, 0xcf, 0xec, 0x0f, 0xaf, +/*4c20:*/ 0x6d, 0x96, 0x86, 0xcf, 0xa8, 0xc0, 0x2c, 0x86, 0xe9, 0x9d, 0x40, 0x33, 0x5f, 0xff, 0x1d, 0x18, +/*4c30:*/ 0x02, 0xba, 0xfa, 0xb5, 0xac, 0xd3, 0xde, 0xeb, 0x2a, 0x8e, 0xdc, 0x00, 0x9a, 0x5e, 0x1b, 0x81, +/*4c40:*/ 0x1b, 0x32, 0xb2, 0x83, 0x37, 0x8e, 0x17, 0x74, 0xf7, 0x00, 0x0a, 0x80, 0xa0, 0x33, 0x71, 0x4d, +/*4c50:*/ 0x9c, 0xed, 0x51, 0x03, 0xe9, 0x68, 0x0c, 0xa1, 0xce, 0xd2, 0x96, 0xd4, 0x7d, 0x5c, 0x64, 0xd3, +/*4c60:*/ 0xaf, 0x55, 0x82, 0xf2, 0x4d, 0x4a, 0xfb, 0xbc, 0x35, 0x6a, 0x01, 0xce, 0xa0, 0xf4, 0xc0, 0xdc, +/*4c70:*/ 0xe8, 0x1b, 0x76, 0xf9, 0xd1, 0x6b, 0xa0, 0x41, 0x4a, 0xa3, 0x91, 0xe3, 0xb8, 0x4b, 0xcf, 0x70, +/*4c80:*/ 0x2c, 0x6c, 0xf7, 0xba, 0x19, 0xe9, 0x75, 0xe9, 0xf3, 0x36, 0x12, 0xe4, 0x0a, 0x44, 0xe2, 0x3f, +/*4c90:*/ 0xf9, 0x99, 0xf5, 0xc1, 0x4f, 0x25, 0xb0, 0xc3, 0x7a, 0xaf, 0x90, 0x79, 0xbc, 0x45, 0xa6, 0x86, +/*4ca0:*/ 0x7f, 0x95, 0x63, 0x62, 0x1a, 0xc4, 0x84, 0x5e, 0xf7, 0x9e, 0xd5, 0xf3, 0xba, 0xc1, 0xdd, 0x3c, +/*4cb0:*/ 0x7a, 0xd9, 0xc1, 0x2d, 0x82, 0x56, 0x38, 0x20, 0xc4, 0x92, 0x66, 0x73, 0x65, 0xf5, 0x3c, 0xe9, +/*4cc0:*/ 0x95, 0x80, 0x33, 0x57, 0xe2, 0xce, 0x57, 0x2c, 0x0c, 0x1b, 0xbb, 0x1d, 0x8e, 0x9f, 0xf7, 0xfc, +/*4cd0:*/ 0xe9, 0x90, 0xc6, 0x78, 0x26, 0xa5, 0x6b, 0xff, 0x32, 0x37, 0xb0, 0xc1, 0x17, 0x18, 0xe0, 0x4a, +/*4ce0:*/ 0x3f, 0xe7, 0xdf, 0x7c, 0xca, 0x9c, 0x0b, 0xfe, 0x6b, 0xd8, 0x4d, 0x51, 0xc8, 0x47, 0xf4, 0x5c, +/*4cf0:*/ 0xb8, 0x82, 0xed, 0x76, 0x47, 0xde, 0x0d, 0xdb, 0x0d, 0xa8, 0xd5, 0x47, 0x78, 0xa8, 0xb2, 0x4f, +/*4d00:*/ 0x96, 0x7f, 0xa4, 0xca, 0x6d, 0xc2, 0x34, 0xf0, 0x06, 0xb3, 0xfe, 0x09, 0x71, 0x57, 0xf5, 0x72, +/*4d10:*/ 0x98, 0x41, 0xa9, 0x62, 0x76, 0xcc, 0x87, 0x04, 0x40, 0x6a, 0x3d, 0x4b, 0x75, 0x3a, 0x0a, 0x3c, +/*4d20:*/ 0x77, 0xc4, 0x05, 0xd2, 0xa9, 0x3a, 0x48, 0x51, 0x18, 0x58, 0xc6, 0x42, 0xd2, 0xde, 0x79, 0xbb, +/*4d30:*/ 0xea, 0xde, 0xe9, 0x8f, 0x5d, 0xb1, 0xcb, 0xf1, 0x96, 0x93, 0x00, 0xbe, 0x39, 0x89, 0x6e, 0x64, +/*4d40:*/ 0x8e, 0xd4, 0x2a, 0x40, 0x99, 0x54, 0xf1, 0x96, 0xfc, 0xd0, 0x58, 0xb9, 0x4b, 0xff, 0x1b, 0x9f, +/*4d50:*/ 0x4a, 0x20, 0x8e, 0xea, 0x14, 0xf1, 0x21, 0x56, 0x28, 0x98, 0x48, 0x9f, 0x7f, 0xe3, 0x3c, 0xb6, +/*4d60:*/ 0xed, 0xaf, 0xa1, 0x54, 0x51, 0x6e, 0x2b, 0xd8, 0x30, 0xe8, 0xbe, 0xa8, 0x5c, 0xea, 0xd9, 0x90, +/*4d70:*/ 0x11, 0xd6, 0x64, 0xf5, 0xaa, 0xe0, 0x24, 0xa7, 0xda, 0x2d, 0x79, 0x36, 0x57, 0x08, 0x11, 0x1e, +/*4d80:*/ 0xb3, 0xe9, 0xc4, 0xfd, 0x42, 0x10, 0x3b, 0x01, 0x11, 0xc3, 0x75, 0x1f, 0x2e, 0xf6, 0x10, 0x6a, +/*4d90:*/ 0x47, 0x1f, 0xc4, 0x9a, 0x7c, 0x0e, 0xa9, 0x04, 0x03, 0x93, 0x27, 0x22, 0x66, 0xdf, 0x72, 0x66, +/*4da0:*/ 0x7f, 0x56, 0x21, 0x8e, 0xed, 0xd5, 0x0d, 0xbb, 0xb5, 0xe4, 0x4c, 0x34, 0xd8, 0x13, 0x5b, 0x98, +/*4db0:*/ 0x97, 0xd3, 0x26, 0x92, 0x00, 0xce, 0x27, 0xdd, 0xe4, 0x8e, 0xd0, 0x74, 0x42, 0x8e, 0x6d, 0xa4, +/*4dc0:*/ 0x22, 0x39, 0x3d, 0xa3, 0x8e, 0xff, 0x03, 0x00, 0x20, 0xc8, 0x65, 0x62, 0xab, 0xdc, 0xec, 0x84, +/*4dd0:*/ 0x15, 0x3a, 0x49, 0xfe, 0x17, 0xf9, 0x84, 0x0a, 0xb1, 0x07, 0x2c, 0xcc, 0x79, 0x6c, 0x76, 0xb3, +/*4de0:*/ 0xe5, 0x2a, 0xf9, 0xa9, 0x8b, 0x59, 0x0f, 0x3a, 0xba, 0xe2, 0x97, 0x33, 0xfe, 0x5d, 0x13, 0xd0, +/*4df0:*/ 0x5d, 0xd2, 0x6c, 0xac, 0x26, 0x8b, 0xa5, 0xd1, 0xf3, 0xf1, 0xee, 0x68, 0xd6, 0xff, 0x8e, 0x14, +/*4e00:*/ 0xf4, 0x2a, 0xb8, 0x04, 0x94, 0x4b, 0x04, 0x08, 0xa7, 0xa2, 0xf6, 0x6c, 0x24, 0x06, 0xa7, 0xe8, +/*4e10:*/ 0x79, 0xd2, 0x4b, 0xd9, 0xf1, 0x83, 0x56, 0xe3, 0x79, 0xd0, 0x81, 0x38, 0xb9, 0x7d, 0x14, 0x96, +/*4e20:*/ 0x98, 0xae, 0x93, 0x64, 0x75, 0x20, 0x0d, 0xeb, 0xea, 0x62, 0xc4, 0x41, 0xe5, 0x96, 0xe8, 0x0f, +/*4e30:*/ 0xd3, 0xeb, 0x48, 0xca, 0x38, 0x2f, 0x6f, 0x34, 0xe0, 0xad, 0xac, 0x17, 0x78, 0x5b, 0x3c, 0xd7, +/*4e40:*/ 0x36, 0xa6, 0xac, 0xa3, 0x5d, 0x85, 0x6b, 0xeb, 0x8b, 0x4d, 0xb6, 0x45, 0x73, 0xe3, 0x79, 0xcb, +/*4e50:*/ 0xf2, 0x67, 0x5b, 0xe9, 0x27, 0x18, 0x67, 0xcf, 0x23, 0x82, 0x8c, 0x49, 0x47, 0x12, 0x7e, 0xee, +/*4e60:*/ 0xe6, 0xf8, 0xe2, 0xe2, 0x13, 0x7d, 0xb9, 0xe2, 0xc1, 0x2b, 0x0d, 0x9c, 0x92, 0xe4, 0xfd, 0x17, +/*4e70:*/ 0x6e, 0x71, 0xc3, 0x60, 0xe6, 0x2f, 0xca, 0x83, 0x5f, 0xf0, 0xd1, 0xea, 0x64, 0xbd, 0xe5, 0x6e, +/*4e80:*/ 0x89, 0x12, 0x11, 0xb4, 0x67, 0x43, 0xc1, 0xb7, 0x71, 0x95, 0xd3, 0xcb, 0xac, 0xdf, 0x23, 0x9e, +/*4e90:*/ 0x46, 0x25, 0x22, 0x6f, 0xfb, 0xe6, 0x37, 0x9a, 0xa7, 0x37, 0xdc, 0xde, 0x0e, 0x59, 0x24, 0x15, +/*4ea0:*/ 0x0c, 0x55, 0x2d, 0x21, 0x4c, 0xdb, 0x61, 0xe6, 0x34, 0xb3, 0x47, 0xf8, 0x3c, 0xa1, 0x6d, 0x3c, +/*4eb0:*/ 0x99, 0x6a, 0xb8, 0xf9, 0x09, 0xf1, 0x6f, 0xd3, 0xe5, 0xc0, 0x93, 0x7b, 0x62, 0x3c, 0x97, 0x56, +/*4ec0:*/ 0xe7, 0x19, 0xe8, 0x39, 0x08, 0x50, 0xd9, 0xc1, 0x72, 0x65, 0xcb, 0x4a, 0xd4, 0xf5, 0x26, 0xdf, +/*4ed0:*/ 0x0f, 0x77, 0xa1, 0xaa, 0x15, 0xa0, 0xd8, 0x1b, 0x5a, 0xca, 0xfd, 0x9b, 0xe8, 0x98, 0x46, 0x91, +/*4ee0:*/ 0x5a, 0xdc, 0x62, 0x96, 0xd7, 0x4a, 0x9a, 0x4f, 0xd2, 0x66, 0x7a, 0xaf, 0x8b, 0x4f, 0x49, 0x2c, +/*4ef0:*/ 0x07, 0x94, 0x6d, 0x9e, 0x1b, 0xa5, 0x7d, 0xb4, 0x6c, 0x16, 0x8a, 0x08, 0xed, 0x54, 0xf8, 0xf7, +/*4f00:*/ 0xd7, 0xdc, 0xe3, 0x5d, 0xdb, 0xb6, 0x20, 0x02, 0xc2, 0x83, 0x36, 0x7f, 0x5d, 0x8a, 0xa1, 0xa7, +/*4f10:*/ 0xd0, 0x4e, 0xe7, 0x48, 0xb6, 0x91, 0xb6, 0x41, 0x87, 0x0d, 0xf2, 0x89, 0x1c, 0xde, 0x1b, 0xc0, +/*4f20:*/ 0x30, 0x79, 0xf1, 0xb8, 0xf0, 0x4e, 0xdc, 0xaf, 0x6d, 0xe6, 0x81, 0x59, 0x6f, 0xdf, 0x87, 0x86, +/*4f30:*/ 0x77, 0x9b, 0xf2, 0xe3, 0x96, 0xa8, 0xdd, 0x16, 0xc5, 0x56, 0x1d, 0x38, 0x4e, 0xc5, 0x1f, 0xac, +/*4f40:*/ 0x51, 0xf2, 0xaf, 0xce, 0x8c, 0xce, 0x59, 0x77, 0x48, 0x32, 0xff, 0xff, 0xa4, 0xd2, 0x45, 0xf0, +/*4f50:*/ 0x40, 0x33, 0xd7, 0x40, 0x27, 0x7d, 0x02, 0x44, 0x53, 0x0e, 0xcd, 0xf5, 0x45, 0xaa, 0xd5, 0xd2, +/*4f60:*/ 0x32, 0xfd, 0xea, 0xf1, 0xe9, 0x97, 0x79, 0x3c, 0x8d, 0xc6, 0x8c, 0x86, 0x81, 0x06, 0x58, 0xfc, +/*4f70:*/ 0xcc, 0x85, 0x38, 0x73, 0x4e, 0x53, 0xf7, 0x00, 0xac, 0x26, 0xcc, 0xce, 0x33, 0x22, 0x4e, 0x32, +/*4f80:*/ 0x26, 0xf3, 0xcb, 0x38, 0x67, 0x96, 0x14, 0x79, 0xc0, 0x3f, 0x6b, 0x3b, 0x70, 0x7d, 0x8e, 0x4a, +/*4f90:*/ 0x54, 0x36, 0x1d, 0xdd, 0xbe, 0xa3, 0x63, 0x74, 0x3e, 0xe9, 0xd3, 0x7d, 0x42, 0xb7, 0xc1, 0x68, +/*4fa0:*/ 0x67, 0xcd, 0xcb, 0x94, 0x60, 0x8b, 0xa5, 0x75, 0x76, 0x1c, 0x8c, 0x90, 0x28, 0x49, 0x8c, 0x0f, +/*4fb0:*/ 0x5b, 0xb3, 0xec, 0x2d, 0x87, 0xb9, 0x67, 0x3f, 0xea, 0xff, 0xf4, 0x72, 0x0e, 0x41, 0xc3, 0xa1, +/*4fc0:*/ 0xd0, 0x55, 0xa4, 0x5d, 0xe2, 0x6b, 0xdf, 0xa8, 0xc6, 0x6e, 0x06, 0x90, 0x73, 0xc2, 0xf6, 0x7a, +/*4fd0:*/ 0xbf, 0xc6, 0x5b, 0xb6, 0xe2, 0x1f, 0xca, 0x66, 0x99, 0xac, 0xa4, 0x96, 0x49, 0xec, 0xdf, 0x3c, +/*4fe0:*/ 0x18, 0x5b, 0x88, 0xad, 0x26, 0x30, 0xe0, 0x24, 0x82, 0x13, 0x5f, 0xcc, 0xcd, 0xb7, 0xf9, 0xcf, +/*4ff0:*/ 0x9b, 0xf6, 0x9f, 0x1e, 0x21, 0x3a, 0x33, 0x95, 0xe5, 0xf9, 0x1f, 0xf3, 0x35, 0xdf, 0x57, 0x49, +/*5000:*/ 0xbd, 0xf8, 0xb6, 0x34, 0xc8, 0x79, 0x94, 0x36, 0x9c, 0xec, 0x0d, 0xab, 0xe7, 0x43, 0x76, 0x07, +/*5010:*/ 0x9d, 0xd7, 0x0f, 0x69, 0xeb, 0x28, 0x76, 0x0c, 0x60, 0x9f, 0xd2, 0x21, 0x77, 0xce, 0x1c, 0xc3, +/*5020:*/ 0x8e, 0x62, 0x7e, 0xce, 0x1a, 0x4d, 0xf3, 0xda, 0x8a, 0xcf, 0xd2, 0x6d, 0x8b, 0x63, 0x54, 0x44, +/*5030:*/ 0x2d, 0x97, 0x4e, 0xed, 0x84, 0x16, 0xc8, 0x2e, 0x37, 0x3a, 0x3e, 0x77, 0x88, 0x3f, 0xb3, 0x81, +/*5040:*/ 0x25, 0x28, 0x14, 0x48, 0xc0, 0x17, 0x45, 0x04, 0x3c, 0x27, 0x16, 0x6b, 0x7f, 0x4a, 0xd7, 0xab, +/*5050:*/ 0x60, 0x54, 0x8d, 0x94, 0x90, 0x30, 0x6c, 0x5c, 0x20, 0x14, 0x52, 0x3c, 0x73, 0x7e, 0x6e, 0xe2, +/*5060:*/ 0x99, 0x0a, 0x22, 0xba, 0xdf, 0x56, 0x7d, 0x0d, 0x53, 0x85, 0x71, 0xe1, 0x80, 0x36, 0x11, 0x82, +/*5070:*/ 0xd0, 0xc4, 0x07, 0xca, 0xf1, 0xb3, 0x9a, 0x07, 0xea, 0x1f, 0xf8, 0xe5, 0x4d, 0xd7, 0x2f, 0x53, +/*5080:*/ 0xd4, 0x4a, 0x9f, 0x43, 0xce, 0x31, 0x9f, 0x00, 0x02, 0xbe, 0x1a, 0xc0, 0x7c, 0xd4, 0xa8, 0x8a, +/*5090:*/ 0x6d, 0xcf, 0x15, 0x71, 0xf6, 0x82, 0xe7, 0xea, 0x6f, 0x3c, 0xe4, 0x8b, 0xc2, 0x5d, 0x19, 0x17, +/*50a0:*/ 0xa1, 0xc6, 0x52, 0x20, 0xe7, 0x8e, 0x88, 0x4a, 0x6e, 0x59, 0xda, 0xd9, 0x7e, 0x93, 0xa4, 0xcc, +/*50b0:*/ 0x98, 0x93, 0xad, 0x6e, 0x87, 0x62, 0xd2, 0x36, 0x0e, 0x33, 0x23, 0x67, 0xdd, 0x42, 0xf7, 0x92, +/*50c0:*/ 0x6f, 0xea, 0x5b, 0x6d, 0x22, 0x6f, 0xe8, 0xe4, 0xbd, 0xf6, 0xe5, 0x28, 0xda, 0x4e, 0x90, 0x93, +/*50d0:*/ 0x8e, 0x9e, 0x5c, 0xbf, 0x00, 0x47, 0x35, 0x93, 0x11, 0x68, 0x06, 0x44, 0x78, 0xdd, 0x40, 0xf9, +/*50e0:*/ 0x6c, 0xb0, 0x48, 0xf4, 0x15, 0x4e, 0x7e, 0x0e, 0x5d, 0x22, 0x33, 0x6f, 0xd2, 0xd7, 0x9b, 0xaf, +/*50f0:*/ 0xad, 0xf4, 0x9b, 0x4f, 0x27, 0x59, 0x40, 0x4f, 0x2d, 0xc0, 0xfd, 0x6f, 0x53, 0xcb, 0xf8, 0x45, +/*5100:*/ 0x96, 0x4b, 0xc2, 0xe0, 0x02, 0xbf, 0x81, 0x1b, 0xa3, 0xfa, 0xa2, 0xad, 0x95, 0x84, 0xcf, 0xa1, +/*5110:*/ 0xfd, 0xf4, 0x48, 0x13, 0xc1, 0x6e, 0x6f, 0xd0, 0xd6, 0x97, 0x6c, 0xa3, 0x69, 0x1b, 0xd9, 0x1b, +/*5120:*/ 0x57, 0xba, 0x9b, 0xda, 0xe9, 0xf8, 0x84, 0x16, 0x2d, 0x5c, 0x4e, 0x71, 0x40, 0xf6, 0x51, 0x2d, +/*5130:*/ 0x6f, 0xaa, 0x29, 0xee, 0xfe, 0xd2, 0xb7, 0xa8, 0xce, 0x8b, 0xad, 0x63, 0x5d, 0x1c, 0x9c, 0xc3, +/*5140:*/ 0x1b, 0xad, 0x12, 0xa4, 0xb3, 0xe9, 0xf0, 0xbd, 0xe7, 0x05, 0x38, 0x97, 0x41, 0x57, 0xa5, 0xa5, +/*5150:*/ 0xe3, 0xab, 0x69, 0x17, 0x71, 0x47, 0x74, 0x9d, 0x1b, 0x9c, 0x48, 0xf8, 0x63, 0x2e, 0xbe, 0xbf, +/*5160:*/ 0xd4, 0xa1, 0x87, 0x2a, 0xed, 0xcd, 0x84, 0x7e, 0xdb, 0x45, 0xcd, 0x35, 0x43, 0x0f, 0x8d, 0x19, +/*5170:*/ 0xdf, 0x5f, 0x36, 0x5b, 0x73, 0x82, 0x74, 0x8f, 0x1a, 0xae, 0x3f, 0x96, 0xd7, 0xa7, 0x46, 0x46, +/*5180:*/ 0x42, 0x08, 0xd2, 0xb1, 0x98, 0x0a, 0x6a, 0x41, 0xb3, 0xcc, 0x93, 0x1c, 0x22, 0x3b, 0xa5, 0x4a, +/*5190:*/ 0xd7, 0x6a, 0x64, 0x92, 0x5e, 0x23, 0xb3, 0x90, 0x3c, 0x53, 0x54, 0x05, 0x6f, 0x2f, 0xac, 0x9e, +/*51a0:*/ 0x4d, 0xba, 0xb2, 0x3d, 0x89, 0x90, 0x2d, 0xcd, 0x68, 0xaf, 0x5d, 0x6b, 0x9e, 0x90, 0xa5, 0xb1, +/*51b0:*/ 0xc7, 0x3d, 0x38, 0x40, 0xeb, 0x75, 0xbb, 0xb9, 0xbc, 0xcf, 0xbc, 0x50, 0xf9, 0x4c, 0xae, 0x4c, +/*51c0:*/ 0x9d, 0xd4, 0xe9, 0xe6, 0xcd, 0xdb, 0xb9, 0xaa, 0x81, 0x8f, 0xd7, 0x80, 0x9b, 0x61, 0x11, 0xe2, +/*51d0:*/ 0xb7, 0x47, 0xd3, 0x4d, 0x3c, 0xce, 0x27, 0xb0, 0x8b, 0xc4, 0x5c, 0x4a, 0x41, 0xb8, 0x21, 0x5d, +/*51e0:*/ 0x07, 0x6b, 0xa5, 0xee, 0x71, 0x6e, 0x19, 0x8e, 0x78, 0x85, 0x54, 0xf0, 0xe3, 0x01, 0xa9, 0x4d, +/*51f0:*/ 0x61, 0xd3, 0xbb, 0x55, 0x2b, 0x0c, 0xba, 0x7a, 0x35, 0xf6, 0x89, 0xe2, 0x3f, 0x73, 0xf6, 0x15, +/*5200:*/ 0x52, 0xb0, 0x6f, 0x00, 0x20, 0xba, 0xbc, 0xf8, 0xc5, 0x05, 0xa4, 0x91, 0xeb, 0x46, 0x41, 0xe0, +/*5210:*/ 0xec, 0x95, 0x80, 0x2e, 0xb0, 0x4c, 0xfb, 0xb5, 0x9b, 0x68, 0xab, 0x17, 0xca, 0xe8, 0xc7, 0xe9, +/*5220:*/ 0x84, 0xf2, 0xd5, 0x4e, 0xb3, 0xc3, 0x29, 0x8a, 0xec, 0xb6, 0x3d, 0xb1, 0xd5, 0xb8, 0x8f, 0xeb, +/*5230:*/ 0x7d, 0x16, 0x3c, 0xba, 0x8b, 0xbc, 0xe3, 0x3c, 0x41, 0xf2, 0xf2, 0x3f, 0xc8, 0x78, 0xdf, 0xae, +/*5240:*/ 0xb7, 0xe2, 0x3f, 0x12, 0x0d, 0x64, 0xb0, 0xf5, 0x8c, 0xd7, 0xd5, 0x3a, 0x3a, 0x09, 0xb9, 0xd6, +/*5250:*/ 0x61, 0xa1, 0x94, 0x24, 0x62, 0xb5, 0x17, 0x93, 0x92, 0x0b, 0x51, 0xa5, 0xec, 0xa5, 0x95, 0x5c, +/*5260:*/ 0xd0, 0xfe, 0x73, 0x08, 0xb1, 0x5a, 0xdc, 0x16, 0x25, 0x51, 0x84, 0x76, 0x78, 0x54, 0x59, 0x38, +/*5270:*/ 0xd8, 0xfb, 0xa2, 0xcd, 0xa5, 0xb1, 0xb2, 0xc4, 0x15, 0x05, 0x2e, 0xda, 0x02, 0xda, 0xc1, 0xb3, +/*5280:*/ 0x77, 0x09, 0xa3, 0x31, 0x11, 0x19, 0xda, 0xbd, 0x16, 0x93, 0x0e, 0x22, 0x82, 0xd8, 0xf5, 0x5f, +/*5290:*/ 0xc7, 0x33, 0xf6, 0xe4, 0x44, 0x5f, 0x1a, 0x39, 0xb3, 0x32, 0xfc, 0x6b, 0xd5, 0x6f, 0x2c, 0x2b, +/*52a0:*/ 0xdd, 0x80, 0x7e, 0x31, 0x31, 0xcb, 0x96, 0xe2, 0x02, 0x0a, 0x60, 0x66, 0x08, 0x45, 0xe0, 0xce, +/*52b0:*/ 0xc6, 0xb0, 0x4a, 0x64, 0xcb, 0xd5, 0x1b, 0x5a, 0xad, 0xb9, 0x33, 0x32, 0xf5, 0xf6, 0x0d, 0xd6, +/*52c0:*/ 0x09, 0x8a, 0x62, 0xf8, 0xf2, 0x11, 0xb9, 0x65, 0x1a, 0x84, 0x20, 0xda, 0xf1, 0xf4, 0x73, 0x1c, +/*52d0:*/ 0x46, 0xd2, 0x13, 0xc1, 0x79, 0x5f, 0x2c, 0x44, 0xc6, 0x93, 0xf3, 0x4a, 0x62, 0x69, 0x9b, 0x8e, +/*52e0:*/ 0xc6, 0x4e, 0x99, 0x94, 0x95, 0x47, 0x06, 0xa3, 0x2c, 0x41, 0x34, 0x30, 0x9a, 0xa5, 0x91, 0x76, +/*52f0:*/ 0xde, 0x8e, 0xf5, 0x41, 0x65, 0x3b, 0x8a, 0xd6, 0x08, 0x47, 0x26, 0x85, 0xc2, 0x0a, 0x58, 0x30, +/*5300:*/ 0x17, 0x8b, 0x93, 0x1c, 0xda, 0x25, 0x5c, 0x27, 0x66, 0x2d, 0x9f, 0xe6, 0x4a, 0x0a, 0x81, 0x2a, +/*5310:*/ 0x0e, 0x33, 0xe3, 0xb9, 0x3a, 0x02, 0x42, 0xb9, 0x36, 0xf8, 0x8d, 0x0d, 0x69, 0x2b, 0xbe, 0x89, +/*5320:*/ 0x4f, 0x31, 0xce, 0x1e, 0x92, 0xfe, 0xda, 0x63, 0x96, 0x5b, 0x03, 0xf9, 0x34, 0x36, 0xe2, 0xc2, +/*5330:*/ 0x49, 0xa3, 0x3f, 0xc6, 0xf2, 0xe7, 0xa4, 0xa8, 0xa3, 0x38, 0xee, 0xbc, 0x29, 0xe0, 0x11, 0xe9, +/*5340:*/ 0x0d, 0x34, 0x3f, 0x99, 0x8e, 0xe8, 0x47, 0xc6, 0xb9, 0x27, 0xc8, 0x27, 0x44, 0xd8, 0x3e, 0x10, +/*5350:*/ 0x11, 0x86, 0xde, 0xcc, 0xfe, 0x76, 0x56, 0xb6, 0x8b, 0x50, 0xac, 0x9e, 0x39, 0xb5, 0x7b, 0x33, +/*5360:*/ 0xf0, 0x74, 0xc8, 0x3b, 0x47, 0xaf, 0xff, 0x4a, 0x5a, 0x51, 0x0b, 0xcc, 0x06, 0xf2, 0x40, 0x98, +/*5370:*/ 0xde, 0xab, 0xe5, 0x68, 0x8c, 0xa1, 0xa5, 0x52, 0x79, 0x2d, 0x61, 0xb6, 0x7b, 0xb9, 0xf6, 0xc3, +/*5380:*/ 0xb5, 0x71, 0xc7, 0x25, 0xbe, 0x71, 0x2a, 0xa5, 0xbe, 0x11, 0x62, 0x09, 0x62, 0xd7, 0x91, 0xd5, +/*5390:*/ 0xa9, 0x80, 0x1c, 0x84, 0x0c, 0xcb, 0x4b, 0x22, 0xdc, 0xd5, 0x48, 0x76, 0x25, 0xd2, 0xd6, 0x07, +/*53a0:*/ 0x20, 0x70, 0x39, 0xac, 0x20, 0x0f, 0xed, 0x2e, 0x15, 0x2c, 0x67, 0xf7, 0xb4, 0x09, 0x76, 0x03, +/*53b0:*/ 0xda, 0xd2, 0x43, 0x87, 0xd5, 0xf4, 0x7e, 0xa6, 0x46, 0x9b, 0x62, 0x4d, 0xdb, 0xdb, 0xdc, 0x6a, +/*53c0:*/ 0x71, 0x77, 0xf9, 0x49, 0xb6, 0xe5, 0x8a, 0x53, 0xe2, 0x78, 0x8e, 0x88, 0x2b, 0x1f, 0x6e, 0x3e, +/*53d0:*/ 0x1f, 0xa7, 0x94, 0xef, 0x6d, 0x20, 0xf1, 0x54, 0x9c, 0xe8, 0xb6, 0xd6, 0x08, 0x70, 0x15, 0xf3, +/*53e0:*/ 0x8e, 0xf8, 0x59, 0x7d, 0xbe, 0x62, 0x3b, 0xd0, 0xad, 0xbc, 0xbc, 0xe7, 0x19, 0x72, 0x74, 0xf9, +/*53f0:*/ 0x52, 0x88, 0x79, 0xa1, 0x37, 0xfa, 0x9c, 0x48, 0x36, 0xe0, 0x46, 0x2c, 0x58, 0x76, 0x3f, 0x0a, +/*5400:*/ 0x08, 0xd1, 0x87, 0x00, 0x0f, 0xb9, 0x19, 0xe9, 0xce, 0x71, 0x80, 0xf4, 0x2d, 0x92, 0x6b, 0x72, +/*5410:*/ 0x2f, 0xe5, 0x9d, 0x11, 0x96, 0xce, 0x5d, 0xca, 0x60, 0x75, 0xdf, 0x45, 0xdd, 0xf8, 0xdc, 0xca, +/*5420:*/ 0x3e, 0xc1, 0x7c, 0xd3, 0xd3, 0xbe, 0xce, 0x0c, 0xd2, 0x22, 0x31, 0x3f, 0x68, 0x9b, 0x9c, 0xc0, +/*5430:*/ 0x6c, 0x98, 0x04, 0xd5, 0x12, 0x67, 0xd9, 0x1c, 0x63, 0x68, 0x3a, 0x6d, 0xdb, 0xa0, 0x23, 0x22, +/*5440:*/ 0x0b, 0xb6, 0xde, 0xab, 0x09, 0xde, 0xe2, 0xeb, 0x98, 0x8f, 0xf4, 0xb5, 0x26, 0xc6, 0x25, 0x6f, +/*5450:*/ 0x34, 0x78, 0x35, 0xe6, 0x5e, 0x56, 0x6f, 0xd3, 0x96, 0x3a, 0xaa, 0x63, 0xdb, 0x23, 0x8d, 0x26, +/*5460:*/ 0xd5, 0x1a, 0x70, 0x05, 0x00, 0xbc, 0x37, 0xc9, 0x86, 0x0b, 0x37, 0x78, 0xb7, 0xed, 0xd5, 0x35, +/*5470:*/ 0x71, 0xd2, 0x79, 0xf0, 0x95, 0x0b, 0x35, 0x92, 0x45, 0x1b, 0xc8, 0xc9, 0xa8, 0x5f, 0x28, 0x8c, +/*5480:*/ 0xe5, 0xd9, 0x2d, 0xdd, 0x59, 0xd5, 0xa1, 0x7e, 0x96, 0x63, 0x40, 0x47, 0x2c, 0x2d, 0xe7, 0xd6, +/*5490:*/ 0xb7, 0x02, 0x0d, 0x82, 0x8e, 0xd2, 0xd3, 0x18, 0xea, 0xa7, 0x8c, 0xb2, 0x06, 0x73, 0x39, 0xa6, +/*54a0:*/ 0x66, 0x29, 0x52, 0xab, 0x34, 0x8b, 0xec, 0x81, 0x60, 0xf8, 0x9c, 0x6f, 0x07, 0x4d, 0xa2, 0x07, +/*54b0:*/ 0x24, 0x81, 0x93, 0xb0, 0x64, 0xab, 0x5e, 0x78, 0x87, 0x00, 0xc5, 0x72, 0x98, 0x6a, 0x57, 0x3b, +/*54c0:*/ 0xa9, 0x39, 0xf6, 0x58, 0x1b, 0xcd, 0x63, 0x12, 0x7f, 0xb1, 0xc9, 0x82, 0x9e, 0xf2, 0x33, 0xab, +/*54d0:*/ 0xbb, 0x13, 0x66, 0x7e, 0xbe, 0xb7, 0x0f, 0x5b, 0x7d, 0xdd, 0xdb, 0xc9, 0xb8, 0x49, 0x27, 0xe3, +/*54e0:*/ 0x10, 0xec, 0x33, 0x7d, 0x72, 0xa9, 0x66, 0xd3, 0x06, 0x42, 0x00, 0xa3, 0x5a, 0x86, 0x1f, 0x87, +/*54f0:*/ 0x5a, 0xb3, 0x6c, 0x2f, 0xbd, 0xc1, 0x9e, 0x66, 0x4a, 0xda, 0xed, 0x1f, 0xcd, 0x31, 0xe3, 0xa7, +/*5500:*/ 0xde, 0x08, 0xf0, 0x0c, 0xd4, 0x28, 0x66, 0x0e, 0x03, 0x5e, 0xd9, 0x70, 0xfb, 0xbb, 0x0b, 0x5e, +/*5510:*/ 0x70, 0x24, 0x8d, 0x69, 0xfb, 0xc2, 0x77, 0x9f, 0xbd, 0x7e, 0x2d, 0x1e, 0x43, 0xf4, 0x95, 0x0e, +/*5520:*/ 0xd7, 0x3d, 0x2d, 0x8c, 0x8b, 0x99, 0xf8, 0x1c, 0xa7, 0xe8, 0x30, 0x5f, 0x83, 0x7d, 0xc7, 0x99, +/*5530:*/ 0x5e, 0xd8, 0xf0, 0x2f, 0xae, 0x92, 0x60, 0x0b, 0x94, 0x73, 0xe6, 0x6f, 0x26, 0x65, 0xf6, 0x3c, +/*5540:*/ 0xb4, 0x44, 0xbd, 0xcc, 0x9c, 0x57, 0xd5, 0xe6, 0x0c, 0xf7, 0x10, 0xeb, 0xc0, 0x67, 0x14, 0xf5, +/*5550:*/ 0x7d, 0x71, 0xbd, 0x74, 0xf3, 0x3f, 0x21, 0xaa, 0xaa, 0xea, 0x4f, 0xe6, 0x2d, 0x37, 0xbe, 0xb9, +/*5560:*/ 0x5f, 0x81, 0xc3, 0x18, 0x38, 0xb3, 0xbb, 0x5d, 0x51, 0x12, 0x2c, 0x1d, 0xcb, 0xdb, 0xfd, 0xbd, +/*5570:*/ 0xd8, 0x38, 0xe3, 0xdb, 0x8e, 0xc2, 0xb9, 0x98, 0x8b, 0x66, 0xc5, 0x76, 0x39, 0x7a, 0x2e, 0x38, +/*5580:*/ 0xb5, 0x6f, 0xe1, 0x17, 0x14, 0xc6, 0x2e, 0x02, 0xc2, 0xa7, 0x1b, 0xab, 0x92, 0xe2, 0x7b, 0x69, +/*5590:*/ 0xa1, 0x97, 0xc1, 0x3c, 0x87, 0x8f, 0x7d, 0xe1, 0x37, 0xf2, 0x36, 0x41, 0x4c, 0x9c, 0xdb, 0x0f, +/*55a0:*/ 0x4d, 0x5b, 0x1e, 0xe6, 0xa0, 0x41, 0x9e, 0x0f, 0x96, 0xdd, 0x67, 0x52, 0x7e, 0xe4, 0x00, 0xde, +/*55b0:*/ 0x42, 0xa5, 0x8d, 0xda, 0x7a, 0x92, 0x7e, 0xc7, 0xf0, 0x29, 0x4e, 0xf1, 0x6f, 0x10, 0x17, 0x12, +/*55c0:*/ 0x1d, 0x8e, 0x53, 0x76, 0x0e, 0x86, 0xbc, 0x5c, 0xb7, 0x98, 0xae, 0xb6, 0x94, 0x90, 0x0d, 0x21, +/*55d0:*/ 0x51, 0xa6, 0x43, 0x24, 0x68, 0xd0, 0xf1, 0xde, 0xa5, 0x4d, 0xa4, 0xf0, 0xd6, 0xc1, 0x4d, 0x46, +/*55e0:*/ 0xd0, 0xaf, 0x24, 0xa8, 0xf7, 0xc8, 0xb1, 0xa3, 0xaf, 0xdd, 0x5e, 0x03, 0x68, 0x56, 0x6e, 0xb5, +/*55f0:*/ 0xa3, 0x7d, 0x94, 0x3d, 0x66, 0xe2, 0xac, 0xb4, 0x1a, 0xc3, 0xa2, 0xae, 0xed, 0xd0, 0x02, 0xb0, +/*5600:*/ 0x2a, 0xe3, 0x95, 0x01, 0x24, 0x08, 0x73, 0xb7, 0xfc, 0x3e, 0x42, 0x23, 0x15, 0x97, 0xde, 0xa2, +/*5610:*/ 0x13, 0x3b, 0x9b, 0x53, 0xd1, 0x18, 0x69, 0x89, 0xa3, 0xf9, 0xf2, 0xd5, 0x90, 0x2c, 0xdd, 0xb3, +/*5620:*/ 0xd7, 0x20, 0x24, 0x2e, 0x2c, 0x11, 0x0d, 0xac, 0x96, 0x38, 0x4d, 0x65, 0xe5, 0x68, 0x2f, 0xf7, +/*5630:*/ 0xd1, 0x21, 0x55, 0xc2, 0x9f, 0x90, 0x52, 0x34, 0xb9, 0x77, 0x32, 0x6d, 0x66, 0x73, 0x1e, 0x01, +/*5640:*/ 0x66, 0x53, 0x13, 0xaf, 0xfb, 0xa9, 0x8a, 0x5a, 0x25, 0xb9, 0xa7, 0x5f, 0x5a, 0x99, 0xe3, 0xef, +/*5650:*/ 0x6c, 0x1c, 0x3c, 0xf3, 0xcb, 0x08, 0xfe, 0xd7, 0x83, 0xd9, 0x71, 0xcd, 0x0a, 0x7c, 0x43, 0xf8, +/*5660:*/ 0x3b, 0xbf, 0x33, 0x13, 0x9a, 0xe3, 0x4d, 0x00, 0x7a, 0x0f, 0xca, 0x94, 0xde, 0x8a, 0xb6, 0xbc, +/*5670:*/ 0x22, 0x18, 0xaa, 0xe1, 0x8b, 0xe7, 0x39, 0x5f, 0xbc, 0x7f, 0xeb, 0xa7, 0x73, 0x9a, 0x9b, 0xb9, +/*5680:*/ 0xc2, 0x44, 0x7d, 0xe1, 0x2c, 0xcc, 0x6a, 0xb6, 0x76, 0xa0, 0x04, 0x5b, 0x94, 0x9c, 0xea, 0x3f, +/*5690:*/ 0x3e, 0xcc, 0xce, 0x6a, 0xde, 0x08, 0xeb, 0x5f, 0xe0, 0xff, 0xaf, 0x27, 0x55, 0x54, 0x59, 0xf7, +/*56a0:*/ 0xcf, 0xef, 0xa7, 0x98, 0xa8, 0xaf, 0x03, 0xbc, 0x8e, 0xb5, 0xfa, 0x3e, 0x95, 0x4a, 0xf5, 0x26, +/*56b0:*/ 0xdf, 0xcf, 0x89, 0x1c, 0xbd, 0xb7, 0xd7, 0xcb, 0x46, 0x9f, 0x83, 0x1a, 0x48, 0xe0, 0xc1, 0xd0, +/*56c0:*/ 0x89, 0xcb, 0xd2, 0xb5, 0xf8, 0x06, 0xdb, 0x48, 0xf0, 0x4a, 0xe1, 0x03, 0x98, 0x70, 0x16, 0xe4, +/*56d0:*/ 0xa6, 0xab, 0xd2, 0xac, 0xda, 0xea, 0x35, 0x35, 0x3e, 0x78, 0x89, 0xce, 0x9a, 0xfe, 0x13, 0x0d, +/*56e0:*/ 0xf1, 0x8b, 0xc7, 0x6f, 0x14, 0x0b, 0x92, 0xb9, 0x2a, 0x70, 0x54, 0x70, 0x18, 0x93, 0x41, 0x2a, +/*56f0:*/ 0x3e, 0x97, 0x9b, 0x5a, 0x18, 0x55, 0x6a, 0xc1, 0x08, 0x18, 0xca, 0xce, 0x46, 0x89, 0xa8, 0x2a, +/*5700:*/ 0x7d, 0x3e, 0xc0, 0xcc, 0x4d, 0x79, 0xab, 0x20, 0xb7, 0x89, 0x98, 0xea, 0xa9, 0x10, 0x2a, 0xab, +/*5710:*/ 0xb1, 0xcd, 0x7a, 0x48, 0xa9, 0xda, 0x6b, 0x63, 0xa5, 0x35, 0x72, 0xdc, 0x36, 0x53, 0x1f, 0xac, +/*5720:*/ 0x87, 0x1c, 0x6a, 0xc6, 0x93, 0xc6, 0x5b, 0x2f, 0x64, 0xfa, 0x47, 0x6d, 0x7b, 0xb1, 0x37, 0xc0, +/*5730:*/ 0xca, 0xfd, 0xde, 0x2c, 0xbb, 0x15, 0x48, 0x4e, 0x73, 0x97, 0x48, 0x82, 0x3b, 0xb4, 0x1f, 0xcb, +/*5740:*/ 0x23, 0xc7, 0x2e, 0xbd, 0x2b, 0x06, 0x28, 0xc5, 0x17, 0xc6, 0x05, 0x34, 0x92, 0x1b, 0x8f, 0x51, +/*5750:*/ 0x49, 0x3c, 0x0c, 0x2b, 0x06, 0x75, 0xc7, 0xd8, 0xb9, 0xb7, 0xa6, 0xf8, 0xd4, 0x65, 0x65, 0x2f, +/*5760:*/ 0x4f, 0xc6, 0x33, 0xbb, 0x83, 0x08, 0xe9, 0x91, 0xb5, 0x4e, 0x74, 0xd4, 0xd4, 0x41, 0xd7, 0x1e, +/*5770:*/ 0x09, 0x67, 0xc2, 0x0c, 0x23, 0x69, 0x2e, 0x28, 0x51, 0x40, 0x63, 0x1c, 0x2e, 0xba, 0x35, 0x39, +/*5780:*/ 0x77, 0x81, 0x39, 0x53, 0x72, 0x54, 0x28, 0x26, 0x5a, 0xd9, 0x4e, 0x9f, 0x32, 0x4e, 0xe1, 0x52, +/*5790:*/ 0x77, 0xdd, 0x43, 0x47, 0x55, 0xf9, 0xe2, 0x5b, 0x8d, 0x36, 0x90, 0xe1, 0xa7, 0x06, 0xde, 0x6d, +/*57a0:*/ 0xa2, 0x16, 0x0e, 0xf6, 0xb2, 0x4e, 0xd8, 0x1e, 0x4a, 0x5d, 0xd7, 0xc4, 0xaf, 0x5c, 0x01, 0xb4, +/*57b0:*/ 0x2c, 0x22, 0x2d, 0xdb, 0x9a, 0x5a, 0xff, 0x06, 0x28, 0xfa, 0xd5, 0x14, 0x6b, 0xdc, 0x34, 0x41, +/*57c0:*/ 0x62, 0xae, 0xa7, 0x8f, 0x52, 0xb3, 0x22, 0x31, 0xe5, 0x10, 0xb4, 0xa3, 0x07, 0x61, 0x87, 0x7f, +/*57d0:*/ 0xd4, 0xf9, 0x30, 0xcf, 0x87, 0x82, 0x7d, 0x8d, 0xa6, 0x0f, 0xd0, 0xc2, 0x89, 0x42, 0x4d, 0x94, +/*57e0:*/ 0xca, 0x83, 0x70, 0x20, 0xd7, 0xc4, 0x76, 0xe3, 0x64, 0x1c, 0xe9, 0x93, 0x23, 0x47, 0x5c, 0xe9, +/*57f0:*/ 0xd0, 0xc8, 0x3c, 0xd1, 0xd5, 0x16, 0x04, 0x8b, 0x30, 0xb9, 0x1a, 0x61, 0x62, 0x07, 0x83, 0x23, +/*5800:*/ 0xa9, 0x1f, 0x53, 0x76, 0x2d, 0x80, 0xae, 0xbc, 0x7b, 0x55, 0xfe, 0x7f, 0x61, 0xe6, 0xa6, 0x88, +/*5810:*/ 0xf9, 0x02, 0xe5, 0x41, 0x70, 0xaf, 0x99, 0x27, 0xb1, 0x2d, 0xcf, 0x0b, 0xf4, 0x4c, 0xb4, 0x7e, +/*5820:*/ 0x4b, 0x0e, 0x8c, 0x9a, 0xbb, 0x30, 0x89, 0x8f, 0x3d, 0x76, 0x1d, 0xdf, 0x4a, 0xba, 0x4a, 0x24, +/*5830:*/ 0x91, 0x2a, 0xeb, 0x28, 0x55, 0x49, 0xa6, 0x39, 0x42, 0xf5, 0xc5, 0x12, 0x5e, 0x9d, 0xc3, 0xbc, +/*5840:*/ 0xda, 0x03, 0x01, 0x18, 0x5e, 0x74, 0xd1, 0x48, 0x22, 0xb6, 0xb5, 0x2f, 0xc3, 0x51, 0x11, 0xa0, +/*5850:*/ 0xac, 0x74, 0x0e, 0x86, 0x2c, 0xea, 0xac, 0xf3, 0xed, 0x43, 0x20, 0xc9, 0xe2, 0x42, 0x15, 0x2e, +/*5860:*/ 0x59, 0xf9, 0x24, 0x7f, 0x1d, 0x84, 0x58, 0x08, 0xe3, 0xea, 0x43, 0x76, 0x9c, 0xf0, 0xe5, 0x32, +/*5870:*/ 0xa7, 0x70, 0xa3, 0xb2, 0x74, 0xb8, 0x71, 0x70, 0x80, 0x1b, 0x07, 0x84, 0x1c, 0x84, 0x5e, 0xa7, +/*5880:*/ 0xdf, 0x11, 0x39, 0x13, 0x4f, 0xbe, 0xe6, 0xd1, 0xd4, 0xe3, 0x56, 0x64, 0x46, 0x9f, 0x4c, 0xe3, +/*5890:*/ 0x47, 0x6f, 0xbb, 0x25, 0xf7, 0x5c, 0xa4, 0x9a, 0x97, 0xf3, 0x9d, 0xba, 0xd4, 0x50, 0x0d, 0x42, +/*58a0:*/ 0x04, 0x76, 0xc8, 0x01, 0x99, 0xb1, 0xe1, 0xa8, 0x2d, 0x52, 0x12, 0xfd, 0x99, 0xfc, 0xc3, 0x50, +/*58b0:*/ 0xe9, 0xe8, 0xd6, 0xfb, 0xcf, 0xf6, 0x43, 0xc0, 0x85, 0xb7, 0xe5, 0x68, 0x35, 0xa7, 0x8d, 0x9b, +/*58c0:*/ 0xe5, 0x8e, 0x8a, 0xdc, 0x5b, 0xff, 0x9b, 0xcd, 0x10, 0xd6, 0x39, 0x6d, 0x91, 0x80, 0xe3, 0x15, +/*58d0:*/ 0xc6, 0xcb, 0xeb, 0xc7, 0xdf, 0xce, 0x39, 0xf1, 0x76, 0x08, 0x9f, 0x01, 0xbc, 0x7a, 0xee, 0xa1, +/*58e0:*/ 0x77, 0x16, 0xf4, 0xa5, 0xbe, 0x8d, 0x5b, 0x63, 0x9a, 0xaf, 0x07, 0x71, 0x1e, 0x33, 0x6c, 0xf0, +/*58f0:*/ 0xb3, 0xe2, 0x2e, 0xe8, 0xd3, 0xd7, 0xb1, 0x00, 0x19, 0x48, 0x65, 0xcd, 0x73, 0xf1, 0xfc, 0x20, +/*5900:*/ 0x94, 0x72, 0x6f, 0x56, 0x51, 0x94, 0x4e, 0xcf, 0xfb, 0x47, 0xb4, 0xb2, 0x26, 0x5c, 0x42, 0x34, +/*5910:*/ 0x23, 0x91, 0x8c, 0xc5, 0x93, 0xaf, 0x91, 0x25, 0xa5, 0xd9, 0x9a, 0xe0, 0x36, 0x2b, 0x72, 0x86, +/*5920:*/ 0x5b, 0xb6, 0x11, 0xda, 0xe3, 0x26, 0xd5, 0xcb, 0x4d, 0x29, 0xf8, 0x3f, 0xbf, 0x20, 0x1b, 0xf2, +/*5930:*/ 0xe5, 0xa0, 0x3b, 0xc1, 0xf7, 0x57, 0x4f, 0xcb, 0x45, 0xf5, 0xea, 0x6a, 0xe2, 0x70, 0x1d, 0x56, +/*5940:*/ 0x32, 0x11, 0x59, 0xc9, 0xaa, 0xb8, 0x7f, 0x82, 0x29, 0xfb, 0x2c, 0x1d, 0xdd, 0x67, 0x74, 0x67, +/*5950:*/ 0x3c, 0xe7, 0xcb, 0x07, 0xf4, 0xaa, 0x27, 0x1b, 0xb6, 0xd3, 0xdf, 0xcb, 0xda, 0xfb, 0x08, 0x7d, +/*5960:*/ 0x3a, 0x27, 0x09, 0x75, 0x8f, 0xa6, 0x15, 0x1f, 0x8e, 0x33, 0x8d, 0x23, 0x88, 0x7b, 0x83, 0xf7, +/*5970:*/ 0x83, 0x30, 0xac, 0x6d, 0xb5, 0x50, 0x5b, 0x7d, 0x93, 0x2c, 0x42, 0x7d, 0xce, 0x32, 0x3c, 0xe6, +/*5980:*/ 0x00, 0x4f, 0xf6, 0x98, 0xae, 0x12, 0xfc, 0x05, 0x12, 0xbd, 0xdb, 0x66, 0x44, 0x47, 0x01, 0x40, +/*5990:*/ 0x52, 0xf3, 0x16, 0x80, 0xa8, 0x0a, 0xb9, 0x97, 0x18, 0x0e, 0x46, 0x79, 0x0c, 0x22, 0x5f, 0x79, +/*59a0:*/ 0x38, 0x8e, 0x50, 0x10, 0x71, 0x5c, 0x8e, 0x6e, 0xc1, 0x47, 0x4c, 0x9d, 0x2e, 0x80, 0x1c, 0x90, +/*59b0:*/ 0x76, 0x9e, 0x70, 0x70, 0x87, 0x18, 0xc7, 0x8c, 0xee, 0x7a, 0x60, 0x25, 0xf3, 0x29, 0x6c, 0xb0, +/*59c0:*/ 0x2c, 0xf0, 0xd5, 0x0c, 0xcd, 0x6a, 0xfc, 0xdb, 0x8b, 0x85, 0x2f, 0xa0, 0xcf, 0xe3, 0x35, 0xa9, +/*59d0:*/ 0x35, 0x58, 0x1d, 0x6c, 0xa7, 0x13, 0xc7, 0x08, 0xc2, 0xec, 0x6c, 0x4e, 0x96, 0x1c, 0xb5, 0xfe, +/*59e0:*/ 0x0f, 0x95, 0xbb, 0xef, 0x67, 0xff, 0x7a, 0xc6, 0xa3, 0x11, 0x69, 0x94, 0x19, 0xe3, 0x89, 0xed, +/*59f0:*/ 0x57, 0xc0, 0x03, 0x42, 0xba, 0x74, 0xdb, 0x6f, 0xed, 0x3b, 0x81, 0xab, 0x3c, 0x5d, 0x59, 0xef, +/*5a00:*/ 0x5c, 0x96, 0xb8, 0xd0, 0xe4, 0x3b, 0xbd, 0x49, 0x93, 0x63, 0xaf, 0x51, 0x39, 0xfd, 0xae, 0x32, +/*5a10:*/ 0xb2, 0xc9, 0x74, 0xe4, 0x73, 0x89, 0xe5, 0x06, 0x72, 0xae, 0x09, 0x3d, 0xec, 0x10, 0x8e, 0x5a, +/*5a20:*/ 0x07, 0x61, 0xc7, 0xfd, 0xec, 0x72, 0x7b, 0x59, 0x1e, 0x8b, 0xad, 0x34, 0xfc, 0xc5, 0x98, 0xb2, +/*5a30:*/ 0xe1, 0x01, 0xfd, 0x13, 0xce, 0xc9, 0xcb, 0xee, 0xdb, 0xb1, 0xfe, 0xe5, 0x70, 0x25, 0x01, 0x67, +/*5a40:*/ 0x7d, 0xcc, 0x94, 0x68, 0x3e, 0x6a, 0x8b, 0xe6, 0x60, 0x22, 0x2f, 0x14, 0xd5, 0x0f, 0x4d, 0x8f, +/*5a50:*/ 0xfd, 0xcc, 0xb5, 0xff, 0x0d, 0xc0, 0xb0, 0x95, 0x29, 0xb2, 0x64, 0x77, 0x1d, 0x48, 0x70, 0xa2, +/*5a60:*/ 0xea, 0x4c, 0x72, 0x4e, 0xce, 0x55, 0x19, 0x19, 0x92, 0x53, 0x33, 0xbf, 0x5f, 0x48, 0x70, 0xce, +/*5a70:*/ 0x5e, 0x7b, 0xcd, 0xb5, 0xbe, 0x4b, 0x7c, 0xb8, 0xaf, 0x02, 0x4a, 0x9d, 0xf5, 0x29, 0xf1, 0xa1, +/*5a80:*/ 0x4d, 0x87, 0x6f, 0x8b, 0x5b, 0x96, 0x21, 0xed, 0xa4, 0xac, 0xbb, 0x89, 0xbc, 0xac, 0x87, 0xd7, +/*5a90:*/ 0x69, 0x3f, 0x6c, 0x6f, 0x40, 0x7b, 0x0f, 0x51, 0xf1, 0xa8, 0x11, 0xb9, 0x52, 0xac, 0x5c, 0x94, +/*5aa0:*/ 0xdb, 0x9d, 0x1e, 0xbb, 0x4f, 0xaa, 0x23, 0x6f, 0x8b, 0xb5, 0x80, 0x9a, 0x5d, 0xb8, 0x6f, 0xae, +/*5ab0:*/ 0x00, 0xba, 0x8a, 0x53, 0x37, 0xf1, 0xa5, 0x8a, 0x87, 0xdc, 0xf0, 0x91, 0x06, 0xcf, 0x9e, 0x7e, +/*5ac0:*/ 0x32, 0xc8, 0x56, 0x10, 0x46, 0x68, 0x88, 0xdb, 0x51, 0xe1, 0x93, 0x32, 0x4b, 0xfa, 0x91, 0x6a, +/*5ad0:*/ 0xed, 0xdb, 0xd0, 0x9b, 0x7e, 0xb8, 0xdc, 0x53, 0x19, 0xf9, 0x1b, 0x44, 0x0d, 0x51, 0xca, 0x13, +/*5ae0:*/ 0x66, 0x83, 0x74, 0xe2, 0x1d, 0x8a, 0xa8, 0x1c, 0xe2, 0x3a, 0xa1, 0x2d, 0xea, 0xbd, 0xfd, 0x64, +/*5af0:*/ 0x54, 0xba, 0x8a, 0x2f, 0x3e, 0x4a, 0x72, 0xb7, 0xde, 0x43, 0x0b, 0xa5, 0xc0, 0xd9, 0xb6, 0x87, +/*5b00:*/ 0x0c, 0xbd, 0xe5, 0xc2, 0x47, 0x77, 0x13, 0x03, 0xd3, 0xa9, 0x9c, 0x6b, 0x92, 0x8d, 0xe3, 0x51, +/*5b10:*/ 0x87, 0x9f, 0x83, 0xa6, 0x4f, 0x4a, 0xf7, 0xb8, 0x96, 0xac, 0xe8, 0x01, 0xb2, 0x3e, 0x0e, 0xa8, +/*5b20:*/ 0x0a, 0xd8, 0xde, 0x3a, 0x2d, 0x1c, 0xc3, 0x21, 0x40, 0x5d, 0xd5, 0x2e, 0x2b, 0xbb, 0x2f, 0x86, +/*5b30:*/ 0x1d, 0x50, 0xbc, 0xa7, 0xf7, 0xc6, 0x4c, 0xc1, 0x90, 0xd8, 0x9e, 0x18, 0x6e, 0x2f, 0x61, 0x78, +/*5b40:*/ 0xb1, 0xb5, 0x9f, 0x33, 0xbd, 0x47, 0x32, 0xc6, 0x55, 0xbb, 0x7a, 0x08, 0x82, 0x5e, 0xb4, 0x9f, +/*5b50:*/ 0xec, 0x86, 0x54, 0x02, 0xbe, 0xb5, 0x75, 0x0d, 0x7a, 0x52, 0x58, 0xaa, 0x17, 0xf6, 0x8a, 0x6e, +/*5b60:*/ 0x38, 0xcf, 0x43, 0x6a, 0xf3, 0xef, 0x06, 0x0e, 0xbd, 0x81, 0x03, 0x80, 0x85, 0xba, 0xb2, 0x52, +/*5b70:*/ 0xef, 0x39, 0x09, 0x1f, 0x39, 0xab, 0xd9, 0xb5, 0x04, 0x86, 0x7d, 0x0e, 0x3a, 0xe4, 0x16, 0x09, +/*5b80:*/ 0x6e, 0x0f, 0xe9, 0xd5, 0x57, 0xea, 0xbf, 0x28, 0xae, 0xbb, 0x60, 0x4b, 0xd5, 0x31, 0x7b, 0xd1, +/*5b90:*/ 0x8d, 0xd3, 0xa5, 0x06, 0x53, 0xf1, 0xc1, 0x91, 0xf2, 0x91, 0xd1, 0xf8, 0x5e, 0x11, 0x03, 0xa1, +/*5ba0:*/ 0x35, 0xea, 0x82, 0x57, 0x74, 0xe8, 0x57, 0x43, 0x73, 0x6d, 0xbf, 0xee, 0x79, 0x2b, 0xfc, 0x76, +/*5bb0:*/ 0x9c, 0x45, 0x7b, 0x88, 0x74, 0xf9, 0x2e, 0x1a, 0xad, 0x7b, 0xfe, 0x77, 0x9c, 0x1c, 0xa3, 0x37, +/*5bc0:*/ 0x71, 0x52, 0x5c, 0x05, 0x39, 0x40, 0xed, 0x85, 0x7f, 0x5a, 0x51, 0x19, 0xde, 0x4d, 0x77, 0xf1, +/*5bd0:*/ 0x6a, 0x9e, 0x99, 0xb3, 0x97, 0x22, 0x47, 0x7f, 0xf5, 0xec, 0x4f, 0xa1, 0x4e, 0xb0, 0x1c, 0xb1, +/*5be0:*/ 0x3f, 0xad, 0x4b, 0xc0, 0xa4, 0x4b, 0xf8, 0x67, 0x60, 0x93, 0x98, 0xd4, 0xcf, 0x3f, 0x43, 0xe9, +/*5bf0:*/ 0x30, 0x69, 0x1e, 0x5f, 0xcc, 0xef, 0xb9, 0xc2, 0x3c, 0x76, 0x4a, 0xa7, 0x4d, 0x46, 0x9b, 0x17, +/*5c00:*/ 0xa2, 0x97, 0x63, 0x5c, 0xca, 0x62, 0x91, 0x30, 0x70, 0x02, 0x94, 0x9f, 0xd8, 0x16, 0xc8, 0xca, +/*5c10:*/ 0x3f, 0x18, 0x0c, 0x72, 0xb0, 0x36, 0x40, 0x47, 0xc7, 0xac, 0x98, 0xfa, 0xe8, 0x46, 0x4f, 0xf9, +/*5c20:*/ 0x1a, 0x6d, 0xf7, 0x03, 0x8b, 0x1d, 0xe8, 0x34, 0x19, 0x30, 0x8a, 0x9c, 0x3b, 0x5c, 0x30, 0x06, +/*5c30:*/ 0x4c, 0xf0, 0x2f, 0x01, 0x8b, 0xea, 0x96, 0xa6, 0xb1, 0x91, 0x47, 0x14, 0x3c, 0xdb, 0x1d, 0x1a, +/*5c40:*/ 0x97, 0x74, 0x7c, 0x13, 0xb1, 0x84, 0xd6, 0x5c, 0x9c, 0x46, 0xa9, 0x0a, 0xc2, 0x64, 0x27, 0x15, +/*5c50:*/ 0xb8, 0xe7, 0xd3, 0x06, 0x7a, 0x32, 0xb5, 0x32, 0xf9, 0xb5, 0x1d, 0xbf, 0xe9, 0xa2, 0x79, 0x8e, +/*5c60:*/ 0x43, 0xb8, 0x6e, 0x58, 0x15, 0x68, 0xe1, 0x61, 0xe7, 0xbf, 0xb3, 0x08, 0x51, 0x35, 0xdf, 0xf2, +/*5c70:*/ 0xd8, 0xf2, 0xe4, 0x19, 0x12, 0x96, 0x94, 0xe9, 0xfa, 0x57, 0xd6, 0x3b, 0x1f, 0x9d, 0xce, 0x0b, +/*5c80:*/ 0x39, 0xb9, 0xc6, 0xcf, 0x40, 0xda, 0x43, 0x60, 0x3c, 0xef, 0xb4, 0x70, 0xf4, 0x70, 0x57, 0xc4, +/*5c90:*/ 0x5f, 0xae, 0xb2, 0xc2, 0x1d, 0x77, 0x2c, 0x04, 0x09, 0x24, 0xa0, 0xdf, 0x8c, 0x08, 0xe8, 0x2b, +/*5ca0:*/ 0xba, 0xd0, 0x6f, 0x42, 0x21, 0xe5, 0x7f, 0xff, 0xfc, 0xb8, 0xe3, 0x5c, 0x9f, 0xde, 0x0a, 0x4e, +/*5cb0:*/ 0x8a, 0x5d, 0x2d, 0xe5, 0xb3, 0xce, 0x63, 0x6d, 0xd0, 0xac, 0x5e, 0xd2, 0x53, 0x2d, 0xe9, 0x9a, +/*5cc0:*/ 0x10, 0xb2, 0x10, 0xbf, 0x3c, 0x8d, 0x64, 0x25, 0x02, 0x4e, 0xc5, 0x54, 0x3e, 0xdf, 0xd3, 0xbf, +/*5cd0:*/ 0x2e, 0xfc, 0x48, 0x24, 0xbb, 0x2f, 0xb4, 0x84, 0xe8, 0x34, 0xbc, 0x1c, 0x7f, 0xaa, 0xfc, 0x98, +/*5ce0:*/ 0x32, 0xaf, 0x00, 0xcc, 0xef, 0xb7, 0x84, 0x0f, 0xfc, 0xd9, 0xa1, 0xa6, 0x65, 0x07, 0xe3, 0xb4, +/*5cf0:*/ 0xd9, 0xb9, 0x41, 0x0a, 0xed, 0x4d, 0xa1, 0x4a, 0x8b, 0x2f, 0xc8, 0x8c, 0xb3, 0x52, 0x29, 0x0b, +/*5d00:*/ 0xb3, 0xb7, 0x47, 0xc5, 0xea, 0x56, 0x46, 0x96, 0x8a, 0x24, 0xfa, 0xcd, 0x88, 0xcf, 0xdf, 0x7a, +/*5d10:*/ 0x64, 0xb5, 0x34, 0xdc, 0xce, 0xaf, 0x5e, 0x35, 0x15, 0x12, 0x18, 0x13, 0x5b, 0x5e, 0x77, 0x7f, +/*5d20:*/ 0x43, 0x14, 0x4a, 0xf4, 0xfc, 0x7d, 0x8f, 0x5d, 0xc4, 0xf8, 0x08, 0xf7, 0xcf, 0xbf, 0xc2, 0xf5, +/*5d30:*/ 0x8e, 0x5b, 0xc0, 0x4d, 0x89, 0x22, 0x7c, 0x27, 0xfe, 0x1c, 0xb2, 0x6b, 0xb8, 0x84, 0xbf, 0x80, +/*5d40:*/ 0x55, 0x0f, 0x56, 0x92, 0xc6, 0x41, 0xf8, 0xa2, 0xd9, 0x22, 0xe1, 0xb3, 0x35, 0x10, 0xcd, 0xd3, +/*5d50:*/ 0x42, 0xb4, 0x21, 0xf9, 0x9c, 0x11, 0xb2, 0x67, 0x30, 0x2c, 0x11, 0x73, 0xd4, 0xcd, 0x6e, 0xb3, +/*5d60:*/ 0x99, 0x11, 0x35, 0xd5, 0xfd, 0x8d, 0x0c, 0xb4, 0x22, 0x21, 0x25, 0x84, 0x68, 0x4f, 0x4a, 0x07, +/*5d70:*/ 0x56, 0x13, 0x8f, 0x9e, 0x1a, 0xed, 0x98, 0xca, 0xeb, 0x09, 0xc1, 0xf7, 0xcf, 0x4a, 0x28, 0x93, +/*5d80:*/ 0x6a, 0xe5, 0x6b, 0xaf, 0x7a, 0xbe, 0x5c, 0xab, 0xfb, 0xda, 0x6b, 0x06, 0x52, 0x02, 0xd1, 0xf0, +/*5d90:*/ 0x5f, 0x05, 0xc0, 0xd8, 0xc3, 0xeb, 0x7d, 0xee, 0xf0, 0x36, 0xa2, 0xd5, 0x32, 0xb7, 0xe8, 0xcf, +/*5da0:*/ 0xcd, 0x76, 0x62, 0xb2, 0x89, 0x7a, 0x76, 0x2b, 0x36, 0x6c, 0x3f, 0x14, 0x51, 0x55, 0xb7, 0xc4, +/*5db0:*/ 0x73, 0x75, 0xd5, 0x99, 0xb4, 0xb5, 0xfd, 0xb0, 0x46, 0x6f, 0x3f, 0x28, 0x17, 0xbc, 0x32, 0xee, +/*5dc0:*/ 0x96, 0x11, 0xf8, 0xcd, 0xee, 0xed, 0xcf, 0x15, 0x91, 0xc0, 0x5a, 0x6d, 0x3a, 0xf6, 0x43, 0x00, +/*5dd0:*/ 0x3a, 0xdd, 0xb8, 0x8f, 0x60, 0x85, 0x11, 0xe4, 0x86, 0xed, 0x2d, 0x6d, 0x96, 0xdb, 0x1d, 0xc3, +/*5de0:*/ 0x9b, 0x32, 0xa3, 0xd0, 0x79, 0xe7, 0xf1, 0xf3, 0x9e, 0x9c, 0xc6, 0x80, 0x12, 0x51, 0x32, 0x99, +/*5df0:*/ 0x17, 0xa5, 0x7e, 0x78, 0xee, 0x1a, 0x5b, 0x22, 0xab, 0x48, 0xe5, 0xb2, 0xbd, 0x82, 0x5f, 0x06, +/*5e00:*/ 0x03, 0x24, 0x68, 0x86, 0xe0, 0x42, 0x71, 0x02, 0xe2, 0x7a, 0x54, 0x12, 0x1e, 0xcc, 0x88, 0x59, +/*5e10:*/ 0x79, 0x62, 0x27, 0x33, 0x22, 0x73, 0xef, 0x71, 0xf6, 0x22, 0xed, 0xca, 0x26, 0xcd, 0x53, 0xf8, +/*5e20:*/ 0x4f, 0xcd, 0x4a, 0x43, 0x10, 0xab, 0xfd, 0x85, 0xe5, 0x0c, 0x07, 0xaa, 0x19, 0x0a, 0x63, 0x35, +/*5e30:*/ 0x93, 0x64, 0x3a, 0x30, 0xc3, 0xf8, 0xd8, 0xef, 0x12, 0x77, 0xdf, 0x37, 0x01, 0xf1, 0xc2, 0xa1, +/*5e40:*/ 0x10, 0x44, 0xa1, 0x89, 0xc7, 0xe6, 0x9d, 0x17, 0x42, 0x20, 0xe0, 0x05, 0xd7, 0xb4, 0x41, 0xef, +/*5e50:*/ 0x64, 0x4c, 0x1e, 0xdf, 0x1e, 0x2f, 0xa4, 0xd7, 0x19, 0xce, 0x2a, 0xb6, 0xa6, 0x9a, 0x3f, 0x9d, +/*5e60:*/ 0xb6, 0x07, 0xd5, 0x7a, 0xf5, 0x86, 0x45, 0x17, 0x8c, 0x62, 0xfe, 0x7e, 0x5e, 0xc9, 0x0c, 0xd2, +/*5e70:*/ 0x93, 0x0f, 0xdc, 0x36, 0xb5, 0xff, 0xff, 0x9a, 0xe9, 0x67, 0x35, 0x9a, 0x6c, 0x15, 0xca, 0xb0, +/*5e80:*/ 0x4e, 0xdf, 0x8d, 0xf0, 0x6d, 0xa4, 0xba, 0xda, 0x5e, 0x4e, 0x8a, 0xb0, 0x23, 0x15, 0x31, 0x36, +/*5e90:*/ 0xd7, 0xbc, 0xb3, 0x0b, 0x58, 0x6d, 0xbf, 0x5d, 0x98, 0xb9, 0x6b, 0xfb, 0x0e, 0xe9, 0x99, 0x8b, +/*5ea0:*/ 0x10, 0x52, 0x47, 0x3a, 0x9b, 0x05, 0xdf, 0x4d, 0x86, 0x8b, 0x0c, 0x3d, 0xfb, 0x1f, 0xd5, 0x47, +/*5eb0:*/ 0x1b, 0x8d, 0xd0, 0x83, 0x2b, 0xef, 0xe8, 0x46, 0x27, 0xdf, 0xe0, 0xa4, 0x1b, 0xf3, 0x2f, 0x17, +/*5ec0:*/ 0x0d, 0xee, 0xfb, 0x6c, 0x77, 0xb3, 0x37, 0xb1, 0x5d, 0x34, 0xf8, 0x8f, 0x75, 0xdc, 0x17, 0x0f, +/*5ed0:*/ 0x4e, 0x57, 0xca, 0xd2, 0x69, 0xd4, 0xfa, 0x50, 0x2f, 0x4e, 0x34, 0x6a, 0xb3, 0x90, 0xe8, 0x2e, +/*5ee0:*/ 0x53, 0x25, 0x91, 0x22, 0xa2, 0x61, 0x8d, 0x6d, 0x7e, 0x19, 0x32, 0x54, 0xd0, 0xf4, 0xd8, 0x0e, +/*5ef0:*/ 0x3e, 0x38, 0xc5, 0xfc, 0x5e, 0x70, 0x43, 0x02, 0x9e, 0xe1, 0x19, 0xd4, 0x95, 0xa0, 0x91, 0x23, +/*5f00:*/ 0xa3, 0xa9, 0x1a, 0x38, 0xda, 0x78, 0x25, 0x58, 0xb1, 0xa6, 0x51, 0x1f, 0x2c, 0x43, 0x37, 0x0b, +/*5f10:*/ 0xfb, 0x1b, 0x1b, 0x6d, 0x57, 0xe3, 0xad, 0x55, 0x8a, 0xdc, 0xfa, 0x59, 0x04, 0x4e, 0xa5, 0x5e, +/*5f20:*/ 0x30, 0xfa, 0x4f, 0xff, 0xbe, 0x8c, 0x1f, 0x9f, 0xd9, 0x84, 0xb8, 0x49, 0xbf, 0x04, 0xd2, 0x6e, +/*5f30:*/ 0xf8, 0x05, 0x3c, 0x72, 0xbc, 0x87, 0x7f, 0x15, 0x81, 0x53, 0x0b, 0xb8, 0xab, 0x45, 0xe4, 0x58, +/*5f40:*/ 0x4e, 0x1c, 0x7f, 0xbe, 0x03, 0x65, 0x17, 0x82, 0xce, 0x1d, 0xce, 0x57, 0x30, 0x60, 0xfb, 0x88, +/*5f50:*/ 0x68, 0xb7, 0x3a, 0x76, 0x59, 0x05, 0x12, 0xe5, 0x3c, 0x4d, 0xaf, 0x0e, 0xfc, 0x9c, 0x66, 0x3c, +/*5f60:*/ 0x73, 0x5c, 0x24, 0x21, 0x2a, 0x8b, 0x50, 0xef, 0x12, 0xa1, 0xfb, 0x14, 0x91, 0x5c, 0x9c, 0x59, +/*5f70:*/ 0x4e, 0x81, 0x20, 0xf6, 0xb6, 0xca, 0x2d, 0x1f, 0x72, 0xcb, 0x8b, 0x6e, 0x90, 0x2e, 0xcc, 0x63, +/*5f80:*/ 0x5a, 0xde, 0xd6, 0x39, 0x52, 0x36, 0xaa, 0xa1, 0x0b, 0xa6, 0xaa, 0x44, 0xda, 0x7f, 0x86, 0x22, +/*5f90:*/ 0x12, 0x64, 0x62, 0x1e, 0xf4, 0x6b, 0xd1, 0x2d, 0x40, 0xef, 0x0a, 0xa4, 0x69, 0x88, 0x47, 0x3a, +/*5fa0:*/ 0xa4, 0x45, 0x06, 0x1d, 0xea, 0x46, 0xdb, 0xc6, 0xbe, 0xcb, 0xe0, 0xe6, 0x25, 0xfa, 0x26, 0x97, +/*5fb0:*/ 0x55, 0x32, 0xa6, 0x45, 0xfd, 0x36, 0xc5, 0x84, 0x6a, 0x4b, 0x99, 0x99, 0x35, 0xc9, 0xd7, 0x8b, +/*5fc0:*/ 0x29, 0x61, 0xf0, 0x55, 0x8c, 0x26, 0x99, 0x1c, 0xdb, 0x5a, 0x58, 0x5d, 0xfe, 0x34, 0xb9, 0x75, +/*5fd0:*/ 0x73, 0xce, 0x15, 0x43, 0x06, 0x48, 0x9d, 0xec, 0xba, 0xce, 0x7e, 0x0d, 0x33, 0x19, 0x90, 0x25, +/*5fe0:*/ 0x74, 0x1a, 0xa3, 0x0f, 0xb2, 0x6e, 0xeb, 0xef, 0x96, 0xa8, 0x17, 0x54, 0xa9, 0x02, 0x44, 0xc1, +/*5ff0:*/ 0x25, 0x93, 0x39, 0x05, 0x37, 0x28, 0xe7, 0x88, 0x97, 0xae, 0xfd, 0x51, 0xcd, 0x2d, 0xf0, 0xff, +/*6000:*/ 0x76, 0xcd, 0x3d, 0x05, 0xa7, 0x5e, 0xb3, 0x2b, 0x07, 0xd8, 0x4b, 0x0d, 0xce, 0x1b, 0x12, 0x19, +/*6010:*/ 0x92, 0x4e, 0x8d, 0x7a, 0xe5, 0x52, 0xad, 0x75, 0xed, 0x18, 0x09, 0x10, 0x3b, 0x16, 0x2a, 0x75, +/*6020:*/ 0xb7, 0xcc, 0xb2, 0xe7, 0xfe, 0x18, 0x0b, 0x11, 0xf0, 0xea, 0x75, 0xa4, 0x79, 0x89, 0x82, 0x87, +/*6030:*/ 0x9d, 0x26, 0x24, 0x03, 0x8c, 0xc5, 0xba, 0xe5, 0x7f, 0x4a, 0xd9, 0xf6, 0xbe, 0x9c, 0xaa, 0xf2, +/*6040:*/ 0xd3, 0x87, 0x9c, 0xf0, 0xba, 0xcb, 0x73, 0x31, 0xd8, 0x14, 0x55, 0x1b, 0xcc, 0x90, 0x2e, 0xae, +/*6050:*/ 0xde, 0xd1, 0x85, 0x8b, 0x0e, 0x0f, 0x74, 0xd1, 0x20, 0xeb, 0x55, 0x42, 0xba, 0x1b, 0x40, 0x87, +/*6060:*/ 0xa4, 0x83, 0xa1, 0x2a, 0x13, 0x3b, 0x0c, 0xf8, 0xe7, 0xf5, 0x52, 0xac, 0xe7, 0x5f, 0xee, 0xf4, +/*6070:*/ 0xb5, 0xa1, 0xd4, 0xa7, 0x38, 0x7b, 0x09, 0x78, 0xdc, 0x28, 0x08, 0x06, 0x83, 0x7d, 0x2c, 0x0d, +/*6080:*/ 0x36, 0xaf, 0xef, 0x4f, 0x5f, 0x74, 0xd2, 0x1b, 0xb8, 0xb1, 0x81, 0x74, 0x93, 0x75, 0xda, 0x12, +/*6090:*/ 0xd3, 0x62, 0xcd, 0x19, 0xfe, 0xd5, 0xd2, 0xdb, 0x0d, 0xad, 0x1b, 0xeb, 0x28, 0x41, 0x4c, 0xdd, +/*60a0:*/ 0xa0, 0xee, 0x0f, 0xfa, 0x88, 0xe8, 0xbe, 0x3c, 0xe8, 0x31, 0x2a, 0xf0, 0x09, 0xa2, 0x09, 0xa1, +/*60b0:*/ 0xb8, 0xaa, 0x73, 0x24, 0xc2, 0x5a, 0x83, 0x83, 0x04, 0x31, 0xea, 0x71, 0x0a, 0x08, 0x6d, 0x5f, +/*60c0:*/ 0x21, 0xc9, 0xfd, 0xdc, 0x03, 0x21, 0x11, 0x82, 0x24, 0xa1, 0x5e, 0xc7, 0x1e, 0x3b, 0x19, 0x8f, +/*60d0:*/ 0xfa, 0xcd, 0x90, 0x71, 0xab, 0xb1, 0xdd, 0x85, 0x2a, 0x68, 0xa8, 0xbe, 0x7b, 0xcf, 0x19, 0xb7, +/*60e0:*/ 0x35, 0xe4, 0x49, 0x31, 0xe3, 0x7a, 0x7d, 0x90, 0xd9, 0x1f, 0x55, 0xee, 0xb3, 0x7e, 0xc4, 0x79, +/*60f0:*/ 0x42, 0x1b, 0xa7, 0x5d, 0x1e, 0x11, 0x88, 0x1b, 0x4d, 0x7e, 0xe3, 0xc3, 0xe3, 0xc3, 0x80, 0xdd, +/*6100:*/ 0x33, 0x15, 0x46, 0x78, 0x6a, 0x3e, 0x61, 0x6e, 0x86, 0x50, 0x29, 0x19, 0x13, 0xe4, 0x0e, 0xab, +/*6110:*/ 0x7b, 0x08, 0xcf, 0x41, 0x77, 0x79, 0x81, 0x02, 0x6f, 0xee, 0x40, 0x66, 0x51, 0xc2, 0x16, 0x59, +/*6120:*/ 0x59, 0xe5, 0x50, 0x13, 0x52, 0x70, 0xd9, 0x27, 0x3a, 0x81, 0xf1, 0x1b, 0xc0, 0x76, 0x49, 0x04, +/*6130:*/ 0x53, 0x60, 0x86, 0xed, 0x1f, 0xc1, 0x21, 0x99, 0x99, 0x13, 0xe1, 0x1c, 0x31, 0x38, 0xdd, 0xbd, +/*6140:*/ 0x95, 0xf3, 0x71, 0x8a, 0xc7, 0x00, 0x92, 0xd9, 0xa2, 0x4f, 0x14, 0xcc, 0xdb, 0x8d, 0xf0, 0x69, +/*6150:*/ 0x7a, 0xdb, 0xda, 0xd2, 0xc4, 0x87, 0x6c, 0xa6, 0xf0, 0xf1, 0xb7, 0xcb, 0x9d, 0x21, 0x33, 0x69, +/*6160:*/ 0x28, 0xe2, 0xcb, 0x8a, 0x6c, 0xdb, 0xcb, 0x88, 0xfb, 0x35, 0x43, 0xaf, 0x61, 0xb7, 0x6d, 0x21, +/*6170:*/ 0x98, 0x75, 0x92, 0x02, 0x52, 0xa5, 0x16, 0xe5, 0xdd, 0xa8, 0xcc, 0xfd, 0x3b, 0x35, 0x4d, 0x32, +/*6180:*/ 0x80, 0xe5, 0x51, 0x57, 0xa9, 0x38, 0xcc, 0xde, 0xaf, 0x48, 0x3f, 0xe9, 0x96, 0xdc, 0xe2, 0x9e, +/*6190:*/ 0xbe, 0xab, 0xce, 0x00, 0x59, 0x67, 0xe7, 0x54, 0x66, 0x40, 0xff, 0x03, 0x9a, 0xe5, 0x27, 0xeb, +/*61a0:*/ 0x0f, 0xb6, 0x92, 0x34, 0xe8, 0xd0, 0xca, 0x03, 0x1c, 0x16, 0x5a, 0x18, 0x3d, 0x12, 0x19, 0x03, +/*61b0:*/ 0xfd, 0xf7, 0xd6, 0x61, 0x58, 0xfc, 0x5d, 0x07, 0x88, 0xfe, 0x47, 0x0f, 0x85, 0x9e, 0x81, 0x80, +/*61c0:*/ 0xef, 0x22, 0x4b, 0x2a, 0xd2, 0x52, 0xc4, 0xf4, 0x74, 0x36, 0x5c, 0x6d, 0xc7, 0xa0, 0xdd, 0x74, +/*61d0:*/ 0xf8, 0x08, 0x63, 0x3c, 0x6e, 0xbe, 0xc6, 0x75, 0x3b, 0x62, 0xaa, 0xd1, 0xa3, 0x3f, 0x78, 0x70, +/*61e0:*/ 0xee, 0xec, 0x57, 0x29, 0x28, 0x1a, 0x56, 0x07, 0xc1, 0x56, 0x45, 0x17, 0xa7, 0x45, 0x0a, 0x11, +/*61f0:*/ 0xd3, 0x70, 0xa2, 0x9e, 0xbb, 0x2f, 0x09, 0x5e, 0x40, 0xa9, 0x0f, 0x89, 0x1c, 0xaf, 0x06, 0xb0, +/*6200:*/ 0xb8, 0x57, 0x6e, 0x4e, 0x80, 0xc8, 0x08, 0xe9, 0xb3, 0x33, 0xfb, 0xdd, 0x19, 0x00, 0xfe, 0x88, +/*6210:*/ 0xb4, 0xef, 0xd2, 0x7c, 0x4e, 0xe2, 0xe2, 0xa9, 0xe7, 0x71, 0x34, 0xa0, 0xe2, 0x36, 0x77, 0xef, +/*6220:*/ 0x82, 0x85, 0xc8, 0x5b, 0x47, 0xb3, 0x21, 0xf2, 0x93, 0x92, 0x04, 0xa1, 0xb6, 0x6d, 0xb2, 0x9f, +/*6230:*/ 0x7b, 0xb9, 0xa1, 0xa9, 0xc3, 0x0c, 0x4f, 0x37, 0x0e, 0xd8, 0x68, 0x6b, 0xc7, 0x2c, 0x8d, 0xb5, +/*6240:*/ 0xe9, 0x2d, 0xe1, 0xfe, 0x3a, 0xd1, 0x7a, 0x71, 0xf2, 0x6f, 0xcc, 0xbc, 0x84, 0xd1, 0xf8, 0xce, +/*6250:*/ 0xad, 0x86, 0x79, 0x44, 0x3c, 0x20, 0x0b, 0x40, 0xab, 0x33, 0x84, 0x1b, 0x96, 0x04, 0x62, 0xc1, +/*6260:*/ 0x1b, 0x62, 0x62, 0x35, 0x16, 0x0b, 0x5e, 0x45, 0x9f, 0x7c, 0xbb, 0xb9, 0x9f, 0x1e, 0xaa, 0x03, +/*6270:*/ 0x76, 0x8b, 0x1e, 0xd3, 0xe9, 0x7a, 0x9a, 0xa6, 0xab, 0xbc, 0x17, 0x27, 0x0f, 0x8a, 0xc3, 0xf5, +/*6280:*/ 0x33, 0xe3, 0x06, 0x12, 0xdf, 0xed, 0x9c, 0xbd, 0x3a, 0xf6, 0xa5, 0x9a, 0xa1, 0x64, 0x10, 0x10, +/*6290:*/ 0xae, 0x11, 0x25, 0x7d, 0x12, 0x9c, 0xd8, 0x9f, 0xdd, 0x46, 0xec, 0xe2, 0x36, 0xc2, 0x14, 0x8a, +/*62a0:*/ 0xe3, 0x76, 0x0c, 0x51, 0x43, 0x09, 0xc6, 0xad, 0xd5, 0x5a, 0x43, 0x3b, 0x1e, 0x97, 0x16, 0x69, +/*62b0:*/ 0x56, 0x32, 0x2c, 0x71, 0x1b, 0x32, 0x33, 0xe8, 0x8f, 0xa7, 0xf9, 0x92, 0xfe, 0x3d, 0x19, 0x2d, +/*62c0:*/ 0xac, 0xf6, 0xeb, 0xa8, 0xe9, 0x7c, 0x20, 0xef, 0xe9, 0x64, 0x21, 0xd4, 0x76, 0xec, 0xe4, 0x7d, +/*62d0:*/ 0x88, 0x07, 0xc4, 0xf3, 0x90, 0xc7, 0x3a, 0x58, 0xfa, 0xb0, 0x0c, 0x64, 0x49, 0x76, 0x83, 0x4a, +/*62e0:*/ 0x65, 0xd7, 0x1a, 0x36, 0xfc, 0x27, 0xff, 0xc9, 0xc9, 0xff, 0x2a, 0x79, 0xf1, 0x72, 0x58, 0x1a, +/*62f0:*/ 0x5a, 0x14, 0xae, 0xc3, 0x37, 0x81, 0xf8, 0xd2, 0x0a, 0x70, 0x32, 0x79, 0x38, 0x0e, 0x53, 0xe7, +/*6300:*/ 0x70, 0xf8, 0x5d, 0xad, 0x65, 0xc0, 0x82, 0x59, 0x54, 0x33, 0xb6, 0xa3, 0x9c, 0xf4, 0x67, 0xc3, +/*6310:*/ 0x38, 0xef, 0xa5, 0xb1, 0xe3, 0x62, 0x77, 0x76, 0x7d, 0x04, 0xad, 0x5a, 0xad, 0x47, 0xd8, 0x3a, +/*6320:*/ 0xa7, 0x11, 0x66, 0x9c, 0xfd, 0xb8, 0xec, 0x43, 0x39, 0x9d, 0x4b, 0x01, 0x46, 0x5a, 0x1c, 0x99, +/*6330:*/ 0x39, 0x1e, 0x8a, 0xfc, 0x55, 0x7f, 0x63, 0x36, 0xae, 0x62, 0xa0, 0x6f, 0xeb, 0x31, 0x04, 0x76, +/*6340:*/ 0xdc, 0x64, 0xee, 0x8c, 0xe6, 0x20, 0x5e, 0x28, 0xcc, 0x37, 0x38, 0x76, 0x7c, 0x54, 0x96, 0x08, +/*6350:*/ 0xa8, 0x8b, 0x40, 0xfd, 0x8c, 0xa5, 0x15, 0x58, 0x57, 0x31, 0x6d, 0x61, 0x72, 0xec, 0x37, 0xf9, +/*6360:*/ 0x9f, 0x87, 0xdb, 0xd1, 0x56, 0x75, 0x58, 0xaa, 0x14, 0x7f, 0x79, 0x36, 0xed, 0xa3, 0xd4, 0xd7, +/*6370:*/ 0xf3, 0x1d, 0xb2, 0x4c, 0x73, 0x31, 0x66, 0x98, 0x97, 0x70, 0x4c, 0xd2, 0x0e, 0x1d, 0x82, 0xf3, +/*6380:*/ 0xa1, 0xb0, 0xbb, 0xab, 0x60, 0x04, 0x2d, 0x03, 0x4e, 0x3a, 0xe1, 0x40, 0x53, 0x45, 0x3d, 0xf7, +/*6390:*/ 0xb8, 0xb2, 0x1f, 0x3e, 0xcb, 0x28, 0x2c, 0xe0, 0xb4, 0xab, 0x24, 0xec, 0xfa, 0xf6, 0x47, 0x79, +/*63a0:*/ 0xf4, 0x3d, 0x01, 0x1d, 0xc5, 0x46, 0x67, 0x05, 0xc9, 0x64, 0x93, 0x62, 0x8d, 0x10, 0xf8, 0xa7, +/*63b0:*/ 0x5c, 0x05, 0x46, 0x8f, 0xef, 0x12, 0x5c, 0x72, 0x96, 0xab, 0x1e, 0xb5, 0xd7, 0xd1, 0x1f, 0x1b, +/*63c0:*/ 0x20, 0x15, 0xc6, 0xca, 0x20, 0xfa, 0xfa, 0x7a, 0x47, 0x8d, 0xc2, 0x88, 0xab, 0x52, 0xc3, 0x18, +/*63d0:*/ 0x9c, 0x3a, 0xe4, 0x73, 0x3e, 0x40, 0x73, 0xa5, 0x08, 0xb0, 0xa2, 0xa9, 0x56, 0x22, 0xcb, 0xb5, +/*63e0:*/ 0x68, 0xf2, 0x1a, 0x69, 0xbf, 0x9e, 0x54, 0x56, 0x71, 0x62, 0x11, 0xd9, 0x33, 0xb3, 0xea, 0x7e, +/*63f0:*/ 0xd1, 0x46, 0x36, 0x76, 0xd9, 0x01, 0xa4, 0xb9, 0x5d, 0xf7, 0x4b, 0xd3, 0xcf, 0x41, 0xaa, 0x4c, +/*6400:*/ 0x6a, 0x49, 0xc0, 0xb4, 0xa6, 0x38, 0xb0, 0x8c, 0x71, 0xf1, 0x24, 0x6f, 0x9b, 0x8a, 0xfd, 0x61, +/*6410:*/ 0xaa, 0x8b, 0x2c, 0x9b, 0x3d, 0x9a, 0x1b, 0x94, 0xeb, 0xf4, 0xc9, 0x39, 0x74, 0x14, 0x5b, 0xf6, +/*6420:*/ 0x50, 0x7e, 0xca, 0x2c, 0xde, 0xb8, 0x50, 0x42, 0xcc, 0x64, 0x0f, 0xa4, 0x02, 0xf6, 0x09, 0x33, +/*6430:*/ 0x50, 0x4a, 0xc4, 0x49, 0xe6, 0xf9, 0x39, 0x22, 0x28, 0x12, 0x3b, 0x1b, 0xf0, 0x95, 0xac, 0xde, +/*6440:*/ 0x76, 0xea, 0x77, 0x7d, 0xf8, 0xa1, 0x86, 0xf3, 0xae, 0xd2, 0x86, 0x68, 0xd7, 0xee, 0x9d, 0x72, +/*6450:*/ 0x19, 0x14, 0x8f, 0x24, 0xe6, 0xeb, 0x4d, 0x0f, 0x1e, 0x10, 0x33, 0xa3, 0x35, 0xda, 0xb1, 0x10, +/*6460:*/ 0x19, 0xdb, 0x0e, 0x58, 0xea, 0xc2, 0xcd, 0xb6, 0x2b, 0xb8, 0x83, 0x29, 0xe4, 0x7b, 0xee, 0xdc, +/*6470:*/ 0x6e, 0x02, 0xc4, 0x7b, 0x7f, 0x11, 0x64, 0x06, 0x98, 0x0a, 0x01, 0xb5, 0x94, 0x3f, 0xaf, 0x78, +/*6480:*/ 0xb5, 0x09, 0xcc, 0x3a, 0xd2, 0xc3, 0x66, 0x30, 0xed, 0x8b, 0x0e, 0x53, 0xb6, 0xe8, 0x8c, 0x0a, +/*6490:*/ 0x7b, 0x38, 0x32, 0x27, 0xb4, 0x6d, 0x99, 0x9f, 0x2e, 0xd9, 0xbe, 0x57, 0x2b, 0xda, 0x0f, 0xaa, +/*64a0:*/ 0xd0, 0xf7, 0x46, 0xb1, 0xb8, 0x01, 0x86, 0xd8, 0xa3, 0x96, 0xdd, 0xef, 0xe8, 0x80, 0x17, 0x42, +/*64b0:*/ 0xfd, 0xe5, 0xde, 0xe3, 0x12, 0xa6, 0xb3, 0x27, 0xcc, 0xc2, 0xae, 0xc2, 0x4a, 0x46, 0xa1, 0xb4, +/*64c0:*/ 0xcd, 0xba, 0x56, 0x47, 0xc5, 0x96, 0x8a, 0x67, 0x8f, 0x8a, 0x80, 0x5b, 0xe5, 0xfa, 0xe7, 0x3e, +/*64d0:*/ 0x5e, 0xf5, 0xb6, 0x6c, 0x4e, 0x11, 0x8a, 0x95, 0x58, 0x30, 0x14, 0x35, 0x35, 0x6c, 0x49, 0xed, +/*64e0:*/ 0x4a, 0x14, 0x09, 0xf1, 0x11, 0xb7, 0x03, 0x82, 0x24, 0xb8, 0x66, 0x17, 0x7a, 0xcc, 0x04, 0x62, +/*64f0:*/ 0x5e, 0xd4, 0x79, 0xf5, 0x93, 0xc9, 0x79, 0x4c, 0x94, 0xf4, 0x2f, 0xea, 0x82, 0x21, 0xaa, 0xa4, +/*6500:*/ 0x5f, 0x7a, 0x70, 0xb2, 0xe8, 0x13, 0xfd, 0xa6, 0x64, 0x06, 0x3e, 0x57, 0x64, 0x5c, 0x9b, 0x95, +/*6510:*/ 0x2b, 0x8a, 0xc3, 0x88, 0x3b, 0x92, 0xcc, 0xe6, 0x5c, 0x45, 0xbd, 0x93, 0xac, 0x80, 0x32, 0xac, +/*6520:*/ 0xed, 0xe0, 0x91, 0x1e, 0xc4, 0x62, 0x9f, 0x42, 0x4d, 0xad, 0xf2, 0x4e, 0xb0, 0x8d, 0xb3, 0xd8, +/*6530:*/ 0x6c, 0x9f, 0xdc, 0xa2, 0x4c, 0xf5, 0xd9, 0x22, 0xdc, 0x14, 0xcf, 0xa7, 0x4c, 0xe4, 0xb0, 0x7f, +/*6540:*/ 0xec, 0xd4, 0xef, 0x44, 0xcb, 0x78, 0x34, 0x6a, 0x67, 0xdc, 0x7e, 0x30, 0xc5, 0x0b, 0xa4, 0x84, +/*6550:*/ 0x64, 0x5a, 0x3c, 0xf7, 0xa8, 0xf8, 0x63, 0xd4, 0xc1, 0xca, 0xcb, 0x49, 0x3f, 0xbc, 0x35, 0x59, +/*6560:*/ 0xbb, 0x13, 0xd7, 0x6e, 0x67, 0x9f, 0xc0, 0x7d, 0x9d, 0x0a, 0x82, 0x01, 0xa7, 0xb3, 0x6c, 0x3d, +/*6570:*/ 0x5e, 0xf9, 0x0c, 0x77, 0xde, 0xe7, 0xdb, 0x16, 0xb2, 0x8e, 0x8e, 0x19, 0xf7, 0xd2, 0xd7, 0xc6, +/*6580:*/ 0xda, 0xb6, 0x4b, 0x25, 0xb6, 0xf4, 0xec, 0x19, 0xbe, 0xe6, 0x74, 0x3b, 0xdf, 0x1b, 0x10, 0x07, +/*6590:*/ 0xc7, 0x8e, 0x6f, 0x63, 0x5b, 0x8d, 0x60, 0xc2, 0xf6, 0xeb, 0xf4, 0x7d, 0x2b, 0x30, 0x2b, 0x5f, +/*65a0:*/ 0x71, 0xde, 0x58, 0xb5, 0x25, 0xba, 0x4f, 0x38, 0xa7, 0xd0, 0x1c, 0x8f, 0x6a, 0x08, 0x6b, 0x38, +/*65b0:*/ 0x75, 0xed, 0x78, 0x13, 0x25, 0x7b, 0xb7, 0xd2, 0xcd, 0xca, 0x1c, 0x99, 0x45, 0x0a, 0x22, 0x00, +/*65c0:*/ 0x5b, 0x57, 0xfe, 0xbb, 0x62, 0xd4, 0x66, 0xcf, 0xde, 0xfb, 0xce, 0x30, 0x4f, 0xce, 0xb9, 0xe0, +/*65d0:*/ 0x6d, 0x16, 0xce, 0xbe, 0xe5, 0xde, 0xf2, 0x1e, 0x24, 0x19, 0xa0, 0xda, 0x84, 0x1f, 0xc5, 0x38, +/*65e0:*/ 0x10, 0x46, 0xbe, 0x29, 0xa7, 0x35, 0x0e, 0xb3, 0x09, 0x8d, 0xee, 0x3d, 0xd3, 0x76, 0x8c, 0x6b, +/*65f0:*/ 0x2c, 0xcc, 0x99, 0x53, 0x44, 0x48, 0x55, 0x73, 0x02, 0xfc, 0xe9, 0x3d, 0x44, 0xf1, 0x30, 0xfc, +/*6600:*/ 0xc4, 0xad, 0xf8, 0x2d, 0x3c, 0xb6, 0x0f, 0x01, 0x7a, 0x11, 0x8c, 0xcf, 0x82, 0x78, 0x8f, 0xea, +/*6610:*/ 0x74, 0xe5, 0x11, 0x13, 0xc6, 0xf8, 0xaf, 0xc8, 0x95, 0xf2, 0xee, 0x34, 0xc7, 0x0b, 0x1b, 0xe0, +/*6620:*/ 0x5c, 0x17, 0x71, 0x53, 0x74, 0xbb, 0x60, 0xc7, 0x55, 0x33, 0xfa, 0x08, 0xbb, 0xa2, 0x94, 0x0b, +/*6630:*/ 0x06, 0x41, 0xfa, 0xb4, 0x86, 0x42, 0xdb, 0x6d, 0x76, 0xe1, 0xe3, 0x06, 0x16, 0xbb, 0x20, 0x84, +/*6640:*/ 0x8d, 0x2a, 0xa7, 0xb3, 0xa9, 0xdf, 0xbc, 0x81, 0x7e, 0xef, 0x34, 0x14, 0xb6, 0xe9, 0x45, 0x14, +/*6650:*/ 0x50, 0x19, 0xa9, 0xa3, 0xa4, 0x6d, 0x01, 0x3e, 0x74, 0xd3, 0x78, 0x13, 0x05, 0x1d, 0x21, 0x9c, +/*6660:*/ 0xd0, 0xc0, 0x1c, 0x8a, 0xa0, 0xe0, 0x82, 0xfa, 0x23, 0xda, 0xfb, 0x0a, 0x63, 0xdb, 0x92, 0xb7, +/*6670:*/ 0x02, 0x28, 0x00, 0x48, 0xfd, 0xf7, 0xf8, 0x67, 0x4f, 0x39, 0xf5, 0xdf, 0xcb, 0x14, 0x07, 0xe2, +/*6680:*/ 0xea, 0x18, 0x7a, 0x6d, 0x8b, 0x53, 0x7c, 0x06, 0x81, 0x90, 0x01, 0xac, 0xdf, 0x8c, 0x01, 0xa9, +/*6690:*/ 0x0a, 0x94, 0x56, 0xe5, 0x6d, 0x16, 0xc1, 0x19, 0xd0, 0x08, 0xf2, 0xe2, 0x6a, 0x1e, 0xa9, 0xcc, +/*66a0:*/ 0x92, 0xe7, 0xf7, 0xb4, 0x0d, 0xbd, 0xd6, 0xfb, 0xa8, 0x9a, 0xf9, 0x1a, 0xb7, 0x8b, 0x03, 0xee, +/*66b0:*/ 0x60, 0x01, 0x8a, 0x9d, 0xa3, 0x41, 0xd5, 0x2f, 0xb1, 0xc2, 0x1b, 0x22, 0xd1, 0x43, 0xe6, 0xe5, +/*66c0:*/ 0x00, 0x42, 0xb9, 0x69, 0xce, 0xf7, 0x75, 0xbb, 0xf0, 0xa9, 0xbc, 0x9a, 0x39, 0x55, 0x1f, 0x99, +/*66d0:*/ 0x33, 0x13, 0x5b, 0x1e, 0xdc, 0x7d, 0x64, 0xda, 0x7f, 0xaf, 0x3e, 0x26, 0xef, 0xcc, 0x31, 0xca, +/*66e0:*/ 0x1a, 0x3f, 0x4d, 0xc1, 0x79, 0x5f, 0x9e, 0x9b, 0x82, 0xf7, 0x28, 0xc5, 0x21, 0xce, 0xe2, 0x2f, +/*66f0:*/ 0xdf, 0x2e, 0xa4, 0xab, 0x2c, 0xf1, 0xd7, 0xc4, 0x0a, 0x01, 0xdd, 0x44, 0x07, 0x3d, 0x05, 0x41, +/*6700:*/ 0xc4, 0xad, 0x2a, 0x00, 0xca, 0x8e, 0x12, 0x89, 0x29, 0xde, 0xd2, 0x03, 0x50, 0x85, 0xf9, 0xff, +/*6710:*/ 0x8b, 0x52, 0x17, 0x40, 0x49, 0x13, 0xa9, 0x5d, 0xc1, 0xc8, 0x55, 0x89, 0x40, 0xe4, 0x7d, 0xd9, +/*6720:*/ 0x52, 0xef, 0xaf, 0x14, 0xbb, 0x78, 0x8c, 0x7c, 0x95, 0x48, 0x97, 0x49, 0x4c, 0x75, 0x0d, 0xf8, +/*6730:*/ 0x72, 0xe8, 0x85, 0xe0, 0xe4, 0x4b, 0x9a, 0xcd, 0x1f, 0x5c, 0x6d, 0x1e, 0x45, 0x80, 0x98, 0xe9, +/*6740:*/ 0x7b, 0xda, 0x47, 0x80, 0xcc, 0xd0, 0xd0, 0x65, 0x03, 0x30, 0xd3, 0xbb, 0x3d, 0xe3, 0xa1, 0x93, +/*6750:*/ 0xf3, 0x6f, 0xc2, 0x75, 0xb4, 0x74, 0x95, 0x54, 0x34, 0x80, 0xea, 0x15, 0x11, 0xf9, 0xb1, 0xfa, +/*6760:*/ 0x19, 0x8e, 0x66, 0x42, 0xdc, 0xdc, 0x99, 0x47, 0xb2, 0xc7, 0x3a, 0x68, 0x2c, 0x75, 0xc3, 0x8f, +/*6770:*/ 0x92, 0xc5, 0x22, 0xe5, 0xf7, 0xdc, 0x67, 0x4f, 0xb0, 0x5c, 0x05, 0x6d, 0x51, 0xed, 0xec, 0x2d, +/*6780:*/ 0xe0, 0x1a, 0x51, 0x11, 0xad, 0x7f, 0x14, 0x02, 0x39, 0xaf, 0x6b, 0x69, 0x46, 0xe2, 0x8f, 0xc1, +/*6790:*/ 0x69, 0x0e, 0xa0, 0x68, 0xb5, 0xbb, 0x35, 0x08, 0xfe, 0xf7, 0x47, 0xe0, 0x37, 0x83, 0x69, 0x4f, +/*67a0:*/ 0xc2, 0x4d, 0x6d, 0xb7, 0x63, 0x86, 0x3a, 0x32, 0xb6, 0x34, 0xd6, 0x08, 0x6b, 0xd1, 0x0d, 0xfa, +/*67b0:*/ 0xc5, 0xd9, 0x10, 0x05, 0xa5, 0x41, 0x51, 0x03, 0xca, 0x94, 0xf0, 0x9f, 0xa1, 0x50, 0xec, 0x69, +/*67c0:*/ 0x07, 0x34, 0x69, 0x37, 0xbb, 0x3a, 0xed, 0x43, 0x1e, 0x39, 0xc9, 0x17, 0x55, 0x2d, 0x34, 0x4f, +/*67d0:*/ 0x3a, 0x3d, 0x27, 0x9b, 0x87, 0xdc, 0xba, 0x4d, 0xf0, 0x2b, 0x1b, 0x16, 0x29, 0x31, 0x78, 0xaf, +/*67e0:*/ 0x5e, 0xcc, 0x62, 0x6b, 0xaf, 0xe2, 0xf9, 0xec, 0x06, 0x01, 0x0f, 0x63, 0xf1, 0xa6, 0xd3, 0xbc, +/*67f0:*/ 0x9d, 0xed, 0x80, 0x02, 0xbe, 0x7a, 0x5b, 0xb0, 0x01, 0x7a, 0x94, 0x71, 0xe5, 0x42, 0x61, 0x52, +/*6800:*/ 0x71, 0xe0, 0xee, 0x93, 0xe5, 0x9a, 0x63, 0x45, 0x11, 0xf0, 0x3a, 0x15, 0x2d, 0x29, 0x0a, 0x29, +/*6810:*/ 0xc6, 0x56, 0xc4, 0x5b, 0xe1, 0xe8, 0xf9, 0x80, 0xcb, 0xb8, 0xec, 0x6a, 0x5a, 0x34, 0xea, 0xe5, +/*6820:*/ 0xac, 0x12, 0x6c, 0xc7, 0x09, 0xf6, 0xbb, 0x41, 0x21, 0xb9, 0x1d, 0x38, 0x9f, 0x9d, 0x83, 0x8e, +/*6830:*/ 0x21, 0x14, 0xa4, 0x38, 0x42, 0x06, 0xb8, 0x73, 0xb9, 0xcb, 0x4c, 0xa2, 0x72, 0x72, 0x12, 0xf0, +/*6840:*/ 0x94, 0xa7, 0x8a, 0xde, 0x38, 0x26, 0x7d, 0x57, 0x31, 0x22, 0xe7, 0xcb, 0xfa, 0x3e, 0xb2, 0x4d, +/*6850:*/ 0x25, 0x55, 0x48, 0x66, 0x6d, 0x57, 0x7c, 0x04, 0x32, 0xb6, 0x37, 0x8c, 0x5b, 0x7c, 0x1b, 0xb3, +/*6860:*/ 0xd6, 0x57, 0xd1, 0x22, 0x1a, 0xc8, 0x8c, 0x40, 0x23, 0x95, 0x24, 0x64, 0xcc, 0xa7, 0x58, 0xf8, +/*6870:*/ 0x4f, 0x4a, 0x5f, 0x7a, 0x85, 0xbd, 0x2b, 0x20, 0x53, 0xe7, 0xe2, 0x68, 0x94, 0xab, 0x4f, 0xe7, +/*6880:*/ 0x00, 0xe5, 0xe5, 0x59, 0xfe, 0xdc, 0x3e, 0x84, 0x19, 0x67, 0xa1, 0x70, 0x1a, 0x8f, 0x7e, 0x67, +/*6890:*/ 0x7c, 0x63, 0x71, 0x15, 0x98, 0x5e, 0x15, 0x39, 0x61, 0x3c, 0x7f, 0xbc, 0x5b, 0x5b, 0xba, 0x8f, +/*68a0:*/ 0x4d, 0xd9, 0x7a, 0xa5, 0x8f, 0xd4, 0x25, 0xc0, 0x6d, 0xa2, 0x92, 0x2f, 0xdd, 0x93, 0x46, 0x14, +/*68b0:*/ 0x24, 0xf6, 0x5b, 0x73, 0xae, 0xce, 0x77, 0x7d, 0xde, 0xcd, 0xcf, 0x52, 0xba, 0x5f, 0x3b, 0xd6, +/*68c0:*/ 0x3f, 0xd1, 0x9e, 0x19, 0x91, 0x1e, 0x24, 0xac, 0x83, 0x75, 0x17, 0xaa, 0x1b, 0x5f, 0xa6, 0x5d, +/*68d0:*/ 0x25, 0x26, 0xca, 0xa0, 0x98, 0x53, 0x97, 0x68, 0xf2, 0x93, 0x50, 0xef, 0x93, 0x9e, 0xf3, 0x38, +/*68e0:*/ 0x35, 0x77, 0x7e, 0x98, 0xe6, 0x6c, 0x77, 0xea, 0xc1, 0x94, 0x93, 0xef, 0x77, 0xdf, 0x33, 0xd7, +/*68f0:*/ 0x48, 0x7b, 0x43, 0x0a, 0xfd, 0x0a, 0x0b, 0x19, 0xce, 0xf7, 0x0f, 0xd7, 0x18, 0xde, 0xf1, 0xef, +/*6900:*/ 0x32, 0x00, 0xe4, 0xe6, 0x49, 0x9a, 0x58, 0xa2, 0x95, 0x9f, 0x22, 0x44, 0x33, 0x6f, 0x29, 0xef, +/*6910:*/ 0x90, 0xbd, 0xb6, 0x48, 0x38, 0xa1, 0x37, 0xcf, 0x5e, 0x50, 0xb6, 0x2d, 0x7b, 0x1c, 0x78, 0x16, +/*6920:*/ 0xcf, 0xcf, 0x72, 0xd4, 0x50, 0x8d, 0xab, 0x3a, 0x70, 0xe1, 0x13, 0x9b, 0xf9, 0x87, 0x0f, 0x34, +/*6930:*/ 0x50, 0x6d, 0x77, 0xeb, 0xc3, 0x2e, 0xae, 0x58, 0x1b, 0x90, 0x17, 0x70, 0x5f, 0xd0, 0xa2, 0x93, +/*6940:*/ 0x7e, 0xc4, 0x79, 0xcd, 0x93, 0xa6, 0x9c, 0x98, 0xb0, 0xb4, 0x43, 0xcd, 0x1d, 0x58, 0xec, 0x1b, +/*6950:*/ 0xe0, 0xff, 0x40, 0x6e, 0x0d, 0x83, 0x30, 0x61, 0x05, 0x3f, 0x84, 0x04, 0x99, 0xbf, 0x6b, 0x8c, +/*6960:*/ 0x68, 0xb9, 0xac, 0x5e, 0x35, 0xc3, 0x5d, 0xb1, 0x2a, 0x34, 0x39, 0xb6, 0x6a, 0x67, 0x0f, 0x8a, +/*6970:*/ 0x07, 0x08, 0xa0, 0xbb, 0x05, 0x86, 0x93, 0x78, 0xfe, 0xe4, 0x22, 0x89, 0xdb, 0xe4, 0x7b, 0x8b, +/*6980:*/ 0x5e, 0x76, 0x1e, 0x36, 0x98, 0x70, 0x64, 0x90, 0xb8, 0x98, 0xd4, 0xcd, 0xd1, 0xb2, 0xe6, 0x3f, +/*6990:*/ 0x26, 0xd6, 0x79, 0x96, 0x3c, 0xf7, 0x17, 0x86, 0x18, 0x56, 0x83, 0xcc, 0xe8, 0xb4, 0xba, 0x57, +/*69a0:*/ 0x90, 0x17, 0x49, 0xfd, 0x43, 0xfc, 0xd7, 0x68, 0x56, 0xdd, 0x1f, 0xee, 0x14, 0xdc, 0x1c, 0x6d, +/*69b0:*/ 0xea, 0xdd, 0xaa, 0x28, 0xf1, 0xa2, 0x54, 0xad, 0x33, 0xf4, 0xc5, 0xa3, 0x58, 0x47, 0x40, 0xc6, +/*69c0:*/ 0x49, 0xb6, 0x94, 0x0c, 0x26, 0x8a, 0x80, 0x4d, 0x3e, 0x2d, 0x3d, 0xff, 0x03, 0x0d, 0x9d, 0x15, +/*69d0:*/ 0x5e, 0x01, 0xfd, 0xfb, 0x35, 0xf5, 0x90, 0x80, 0x97, 0xe5, 0x0b, 0x4a, 0xb9, 0x39, 0x09, 0x25, +/*69e0:*/ 0x69, 0x87, 0xe9, 0x6c, 0x70, 0x69, 0x65, 0x8d, 0x46, 0x49, 0x1f, 0xe1, 0xc6, 0x26, 0x86, 0x87, +/*69f0:*/ 0x0e, 0x08, 0x64, 0x2c, 0x02, 0xb3, 0xc6, 0x2b, 0x69, 0xa0, 0x96, 0x59, 0x6f, 0x38, 0x8a, 0xe9, +/*6a00:*/ 0x69, 0x48, 0xee, 0x5d, 0x5d, 0x64, 0x22, 0xf2, 0x38, 0xd9, 0x6c, 0x61, 0xfb, 0x88, 0xad, 0x68, +/*6a10:*/ 0xdd, 0xf9, 0x72, 0xc8, 0x58, 0xb7, 0x16, 0xac, 0x5e, 0xfe, 0xac, 0xff, 0x1e, 0x57, 0xe8, 0x44, +/*6a20:*/ 0x39, 0xf6, 0xfd, 0x2c, 0xa1, 0x3c, 0xa8, 0x40, 0x1e, 0xda, 0x7c, 0xc3, 0x7d, 0xe5, 0x12, 0x8a, +/*6a30:*/ 0x58, 0xef, 0x1a, 0x4d, 0x62, 0x24, 0x46, 0x7f, 0xed, 0x6a, 0xf3, 0xe3, 0x91, 0x8c, 0x6f, 0xbe, +/*6a40:*/ 0x52, 0xdc, 0x18, 0xc8, 0xae, 0x75, 0xfe, 0x7a, 0x33, 0x7b, 0x16, 0x04, 0xb9, 0x9b, 0xf6, 0xc0, +/*6a50:*/ 0x49, 0x04, 0xff, 0x80, 0x9b, 0x07, 0x2c, 0x82, 0x61, 0xc6, 0xc8, 0xc0, 0x7a, 0x56, 0x1c, 0xfd, +/*6a60:*/ 0xed, 0x95, 0xa2, 0x76, 0xac, 0xb2, 0xc7, 0xdd, 0x05, 0x71, 0xe5, 0x05, 0x0b, 0x6e, 0x46, 0x60, +/*6a70:*/ 0x93, 0xc1, 0xe4, 0xf1, 0x66, 0x15, 0x2d, 0xec, 0x41, 0x22, 0x43, 0x48, 0xf7, 0x68, 0x17, 0xb8, +/*6a80:*/ 0x45, 0x04, 0x17, 0x5f, 0x4f, 0x61, 0x2f, 0x7b, 0xc0, 0x5f, 0x8b, 0x56, 0xbf, 0xf1, 0xb0, 0xf6, +/*6a90:*/ 0xea, 0x9a, 0x69, 0xf8, 0xd6, 0x23, 0xaa, 0xbd, 0xcd, 0x74, 0x33, 0x96, 0x46, 0xf2, 0x44, 0x8a, +/*6aa0:*/ 0x86, 0x40, 0x81, 0xd1, 0xef, 0xa2, 0x81, 0x5b, 0x0d, 0x30, 0x42, 0xd9, 0x40, 0x48, 0x4a, 0x12, +/*6ab0:*/ 0x89, 0xd7, 0x53, 0xc4, 0x20, 0xf4, 0x5f, 0x0b, 0x58, 0x8d, 0x85, 0x9a, 0xc3, 0x77, 0x8e, 0xe0, +/*6ac0:*/ 0xfc, 0x7a, 0xd5, 0xe3, 0xec, 0x92, 0xd3, 0x7b, 0x8e, 0x8e, 0x6a, 0x1a, 0x74, 0x9c, 0x62, 0x96, +/*6ad0:*/ 0xf9, 0xf8, 0xb8, 0x7c, 0x90, 0x72, 0x59, 0x16, 0x5f, 0xb4, 0x5b, 0x32, 0xaa, 0x3f, 0x58, 0x33, +/*6ae0:*/ 0x3d, 0xbd, 0xbf, 0xcc, 0xe3, 0x51, 0xf0, 0x42, 0xaf, 0x50, 0xe5, 0x02, 0xa9, 0x8d, 0x16, 0x68, +/*6af0:*/ 0xb8, 0x14, 0xf3, 0x9e, 0x97, 0x39, 0x14, 0xac, 0x38, 0xa3, 0xeb, 0xa7, 0x3a, 0x4b, 0x87, 0x8d, +/*6b00:*/ 0x23, 0xb6, 0x4e, 0x13, 0x21, 0x1d, 0xb3, 0xcb, 0x41, 0x55, 0x53, 0x41, 0xc2, 0x3c, 0xdf, 0xc9, +/*6b10:*/ 0xa4, 0x49, 0x23, 0x7a, 0xd5, 0xa8, 0xe3, 0x9c, 0xaa, 0xab, 0xcf, 0x69, 0x03, 0x85, 0x67, 0xe0, +/*6b20:*/ 0x0f, 0x1a, 0xb1, 0x65, 0x28, 0x81, 0xd0, 0x41, 0x98, 0x71, 0x6f, 0xc5, 0x77, 0x27, 0x12, 0x89, +/*6b30:*/ 0xc3, 0x94, 0x9e, 0x90, 0x03, 0x01, 0xc3, 0x50, 0xa0, 0x2e, 0xd6, 0xa6, 0xf7, 0xfa, 0x4d, 0xe6, +/*6b40:*/ 0xd9, 0x8a, 0x84, 0x04, 0x8a, 0xb5, 0x41, 0x97, 0x99, 0xea, 0x34, 0x7d, 0x14, 0x17, 0xd0, 0x1f, +/*6b50:*/ 0x46, 0xc2, 0xe3, 0x8e, 0x68, 0xce, 0x66, 0xe8, 0x33, 0xfa, 0x73, 0x94, 0x58, 0xc5, 0x96, 0xd5, +/*6b60:*/ 0x2e, 0xca, 0x91, 0xa4, 0xb4, 0x1b, 0x44, 0xd5, 0xcb, 0x99, 0xaa, 0xb7, 0x4f, 0x97, 0xd7, 0x78, +/*6b70:*/ 0x01, 0xc1, 0x3c, 0xc6, 0xdc, 0xeb, 0x58, 0x91, 0xe2, 0xee, 0xea, 0x72, 0x64, 0x2d, 0xde, 0xd1, +/*6b80:*/ 0x2f, 0x2c, 0x5a, 0xdf, 0x98, 0xcc, 0x56, 0x11, 0x6b, 0xc8, 0x03, 0x4d, 0x60, 0x13, 0x87, 0xd8, +/*6b90:*/ 0x6a, 0x0c, 0x3a, 0x46, 0x1d, 0x49, 0x40, 0xb0, 0xce, 0xf0, 0xbc, 0xeb, 0x2b, 0xf5, 0xbf, 0x39, +/*6ba0:*/ 0x43, 0xf8, 0xf7, 0x97, 0x85, 0x47, 0x43, 0xd5, 0x77, 0x75, 0x3d, 0xb0, 0xde, 0xed, 0xa6, 0xca, +/*6bb0:*/ 0x76, 0x27, 0x65, 0x60, 0x2d, 0xbe, 0x38, 0xc5, 0xc0, 0x8a, 0x23, 0x9c, 0xe5, 0xfb, 0x19, 0x5c, +/*6bc0:*/ 0x27, 0x5b, 0x35, 0xd1, 0x19, 0x95, 0xd7, 0xe8, 0x4f, 0xea, 0x3f, 0x71, 0x50, 0x65, 0xca, 0x8a, +/*6bd0:*/ 0x2a, 0x84, 0x20, 0x27, 0x2d, 0x9c, 0x20, 0xf2, 0x97, 0x4c, 0x46, 0xe4, 0x30, 0x95, 0xa2, 0x45, +/*6be0:*/ 0x35, 0x4f, 0xb0, 0xe3, 0x84, 0xd3, 0x87, 0xe1, 0x9e, 0xe7, 0x68, 0x17, 0x6b, 0xd0, 0xa9, 0x4e, +/*6bf0:*/ 0x39, 0x53, 0x13, 0xf2, 0x5d, 0x58, 0xc3, 0xd6, 0xdd, 0x19, 0x08, 0xd9, 0x8d, 0x45, 0xe6, 0x27, +/*6c00:*/ 0x5e, 0xdb, 0x97, 0xfd, 0x2a, 0x1c, 0x0b, 0xe1, 0xea, 0x46, 0x43, 0x62, 0x13, 0xc8, 0x1f, 0x0d, +/*6c10:*/ 0x70, 0x91, 0x68, 0x64, 0x34, 0x4d, 0xc4, 0xa2, 0x5b, 0x3e, 0x32, 0xb9, 0xf6, 0xfe, 0xae, 0x43, +/*6c20:*/ 0x79, 0x9a, 0x26, 0x9a, 0xca, 0x31, 0x06, 0x60, 0xf5, 0x50, 0x29, 0xeb, 0x2d, 0x9a, 0x84, 0x87, +/*6c30:*/ 0xec, 0xa5, 0x00, 0x3a, 0xaf, 0x7c, 0x2b, 0xdc, 0x8c, 0x81, 0x07, 0xdf, 0xc4, 0xfb, 0xf3, 0x94, +/*6c40:*/ 0xa8, 0xa0, 0xa3, 0x09, 0xd0, 0x46, 0x24, 0x1b, 0x87, 0x4f, 0xc5, 0x49, 0xe0, 0xd4, 0xc8, 0x17, +/*6c50:*/ 0x92, 0x27, 0xef, 0xdb, 0xec, 0x6e, 0xb9, 0x11, 0x91, 0x44, 0x02, 0xae, 0x05, 0xba, 0xe8, 0x63, +/*6c60:*/ 0x15, 0x4a, 0x68, 0x67, 0x00, 0xd3, 0xed, 0xa5, 0x93, 0x68, 0x8a, 0x73, 0xf0, 0x51, 0xc6, 0x1b, +/*6c70:*/ 0x72, 0x5b, 0xb9, 0x6e, 0xc9, 0xcc, 0x8d, 0x23, 0x5d, 0xe0, 0x92, 0x7e, 0x49, 0x80, 0xae, 0x2b, +/*6c80:*/ 0x84, 0xc8, 0xc8, 0xfe, 0x28, 0x8e, 0x15, 0xcf, 0x99, 0xd3, 0xc6, 0x60, 0x06, 0x7f, 0x28, 0xf4, +/*6c90:*/ 0x58, 0xca, 0x6c, 0x0f, 0xf9, 0x38, 0x45, 0x10, 0x89, 0xb9, 0x46, 0x41, 0xc9, 0x2f, 0xf9, 0xb6, +/*6ca0:*/ 0xfa, 0x30, 0xdc, 0xa3, 0x66, 0xe8, 0x1b, 0xda, 0x97, 0x25, 0x7b, 0xc3, 0x1d, 0x1e, 0x88, 0x83, +/*6cb0:*/ 0x8f, 0x89, 0xa5, 0x01, 0x23, 0xf6, 0xe4, 0xc1, 0x0d, 0xc2, 0xd2, 0xca, 0x30, 0x34, 0x32, 0x38, +/*6cc0:*/ 0x3f, 0x48, 0xad, 0xdc, 0xef, 0x88, 0x4e, 0xae, 0xcb, 0x64, 0xf9, 0xc0, 0xfa, 0x60, 0x64, 0x62, +/*6cd0:*/ 0xc0, 0xba, 0xf2, 0xe6, 0xad, 0x4c, 0xe2, 0xf2, 0x0e, 0x47, 0x65, 0x8e, 0x0f, 0x1f, 0xdf, 0x8f, +/*6ce0:*/ 0xf5, 0x5c, 0xdc, 0xc5, 0x57, 0xcc, 0xbe, 0x67, 0xc1, 0xa6, 0x06, 0x0c, 0xae, 0x8e, 0xf0, 0xcd, +/*6cf0:*/ 0x6e, 0x05, 0x24, 0x79, 0x28, 0xdf, 0x39, 0x60, 0xf2, 0x66, 0xc5, 0xff, 0x64, 0x57, 0x32, 0xe0, +/*6d00:*/ 0x54, 0xd8, 0x5a, 0xd2, 0x05, 0x7c, 0x2c, 0x0d, 0xf0, 0xc9, 0xbd, 0x28, 0xc8, 0xf1, 0xb8, 0x2a, +/*6d10:*/ 0x47, 0x73, 0x44, 0x35, 0x25, 0x4f, 0xd1, 0x66, 0x07, 0x50, 0x26, 0x80, 0xde, 0xed, 0xd0, 0x99, +/*6d20:*/ 0xe8, 0x9c, 0xc4, 0x52, 0xd2, 0x19, 0x09, 0xa9, 0x64, 0x7e, 0x8a, 0xd7, 0x6d, 0x04, 0x1f, 0xc4, +/*6d30:*/ 0x17, 0x2e, 0x70, 0xb9, 0x2a, 0x00, 0xfa, 0xe4, 0x96, 0xda, 0x1f, 0x0b, 0xc4, 0xbe, 0xdd, 0xcb, +/*6d40:*/ 0x77, 0x3e, 0x73, 0x9a, 0x89, 0xda, 0xa7, 0xc2, 0x3d, 0x69, 0x33, 0xe0, 0x9d, 0x07, 0x47, 0xb8, +/*6d50:*/ 0x1b, 0x3c, 0xab, 0x47, 0x05, 0x0f, 0x4c, 0x5e, 0x93, 0x82, 0x5d, 0x0f, 0x41, 0x2b, 0xec, 0x42, +/*6d60:*/ 0xbf, 0xc2, 0x1c, 0x36, 0xc4, 0x4a, 0x00, 0x5d, 0x9e, 0x02, 0x3c, 0x1a, 0x61, 0x06, 0xbb, 0x68, +/*6d70:*/ 0x07, 0x16, 0x78, 0xdd, 0x44, 0x05, 0xc0, 0x72, 0xba, 0x0c, 0x44, 0x1d, 0x38, 0x0a, 0x85, 0x6f, +/*6d80:*/ 0x4b, 0xaa, 0x74, 0x59, 0xcb, 0x69, 0xf9, 0x4c, 0x1c, 0x0d, 0xb5, 0x5b, 0x86, 0xfc, 0xa7, 0x5b, +/*6d90:*/ 0x16, 0x57, 0x1c, 0x1b, 0x4d, 0xa5, 0x65, 0x2c, 0xce, 0x87, 0x1c, 0xf6, 0x08, 0x6e, 0xc7, 0xb9, +/*6da0:*/ 0xea, 0x90, 0xaf, 0xd9, 0x8d, 0x33, 0x63, 0x28, 0x45, 0x1f, 0xe0, 0xdb, 0x14, 0xa9, 0xea, 0x82, +/*6db0:*/ 0x37, 0x50, 0x57, 0x6a, 0x5b, 0x8d, 0x0e, 0x48, 0x0d, 0xec, 0x16, 0x6f, 0x80, 0x11, 0x4b, 0x9f, +/*6dc0:*/ 0x93, 0x90, 0xbe, 0x03, 0x23, 0x89, 0x9d, 0x8e, 0xa1, 0x79, 0x52, 0x9c, 0xf5, 0x75, 0x65, 0x12, +/*6dd0:*/ 0x5d, 0x7a, 0x8a, 0xac, 0xb8, 0xa0, 0x32, 0x32, 0xa8, 0xfb, 0xb0, 0x6b, 0x74, 0x66, 0x08, 0x2f, +/*6de0:*/ 0x64, 0xf6, 0x8f, 0xa7, 0x53, 0xc8, 0x9d, 0x54, 0xc6, 0x9b, 0x64, 0xc6, 0xc1, 0x20, 0xc1, 0xee, +/*6df0:*/ 0x5b, 0x55, 0x4f, 0xec, 0x04, 0xdf, 0xbc, 0xed, 0x98, 0x33, 0xb2, 0xf9, 0xf2, 0xec, 0xd6, 0x80, +/*6e00:*/ 0x6c, 0xbe, 0xa6, 0xd8, 0x15, 0x23, 0xc8, 0x02, 0xb0, 0x31, 0xcc, 0x55, 0x63, 0xc3, 0x45, 0x9b, +/*6e10:*/ 0xe0, 0x7d, 0xb2, 0x4a, 0x2c, 0x86, 0x4c, 0x16, 0x91, 0xbb, 0x97, 0xfe, 0xbc, 0x47, 0xfa, 0xc8, +/*6e20:*/ 0x69, 0x92, 0x03, 0x60, 0x20, 0xd9, 0x6d, 0xd7, 0xa3, 0xde, 0x60, 0xae, 0x70, 0xf2, 0xd5, 0x4d, +/*6e30:*/ 0x1c, 0xab, 0xb8, 0x96, 0xe0, 0x14, 0x94, 0x3b, 0xb3, 0x71, 0xa9, 0xb1, 0x4c, 0xe7, 0x8a, 0x3a, +/*6e40:*/ 0xc7, 0x9e, 0x29, 0xba, 0x01, 0x33, 0xe0, 0x3c, 0xf0, 0x56, 0x3c, 0x6c, 0x4d, 0x5a, 0x6c, 0x77, +/*6e50:*/ 0xc6, 0xe9, 0xdc, 0xe9, 0xa6, 0xd3, 0x42, 0x31, 0x3e, 0x21, 0x7b, 0x96, 0x39, 0xff, 0xe7, 0xea, +/*6e60:*/ 0x8f, 0xb5, 0x9c, 0xfc, 0xac, 0x41, 0x80, 0x6b, 0xb3, 0x0b, 0xd4, 0xa9, 0xb8, 0xef, 0xae, 0x46, +/*6e70:*/ 0x9b, 0x56, 0x4a, 0xec, 0x8e, 0xdd, 0x63, 0x4f, 0xc7, 0x5d, 0x2f, 0x35, 0x66, 0x7a, 0xee, 0x5c, +/*6e80:*/ 0xf7, 0xbe, 0x8f, 0x0f, 0xf1, 0x15, 0x53, 0x58, 0x96, 0xfa, 0x1a, 0x17, 0x5e, 0x7e, 0xe7, 0xe9, +/*6e90:*/ 0x7a, 0xc8, 0x58, 0x46, 0xa7, 0x79, 0x8d, 0x2e, 0x32, 0xfe, 0x80, 0x3e, 0x09, 0xa9, 0x94, 0x8a, +/*6ea0:*/ 0xcd, 0x24, 0x22, 0x56, 0x65, 0xf8, 0x29, 0xe3, 0x51, 0x35, 0xa6, 0x64, 0x9a, 0xd6, 0x4d, 0x6e, +/*6eb0:*/ 0x86, 0x9b, 0xca, 0xfc, 0xf2, 0xb9, 0x0d, 0xec, 0xd7, 0xcd, 0x86, 0xde, 0x9c, 0xc0, 0x54, 0xe8, +/*6ec0:*/ 0xde, 0x62, 0xce, 0xf1, 0x87, 0x6f, 0x3e, 0xb6, 0x25, 0x14, 0x9d, 0xd8, 0xca, 0x1e, 0x5b, 0xfc, +/*6ed0:*/ 0xe8, 0xdd, 0xae, 0x60, 0x06, 0xb5, 0x14, 0x1e, 0x3a, 0x42, 0x2a, 0x5f, 0x24, 0xf2, 0xa6, 0x3f, +/*6ee0:*/ 0x04, 0x35, 0xc6, 0x83, 0x98, 0xaa, 0xdc, 0xe4, 0x51, 0x72, 0xcb, 0xb5, 0xa1, 0xd0, 0x7d, 0xac, +/*6ef0:*/ 0x13, 0xd0, 0xba, 0xc4, 0x88, 0xf9, 0x16, 0x0b, 0x4c, 0x98, 0xcf, 0xad, 0xd1, 0x65, 0xef, 0x43, +/*6f00:*/ 0x00, 0x0f, 0x01, 0x00, 0x14, 0x14, 0x00, 0x00, 0x9b, 0x03, 0xf8, 0x05, 0x80, 0x81, 0x82, 0x83, +/*6f10:*/ 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x0f, 0x10, 0x11, 0x12, 0x13, +/*6f20:*/ 0x14, 0x15, 0x16, 0x17, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, +/*6f30:*/ 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0x00, 0x00, 0x00, 0x00, +/*6f40:*/ 0x00, 0x00, 0x00, 0x44, 0x40, 0x00, 0x1e, 0x19, 0x05, 0xfc, 0xfc, 0x3d, 0x08, 0x00, 0x00, 0x02, +/*6f50:*/ 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*6f60:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*6f70:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*6f80:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*6f90:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*6fa0:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*6fb0:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*6fc0:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*6fd0:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*6fe0:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*6ff0:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*7000:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*7010:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*7020:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*7030:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*7040:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*7050:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*7060:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*7070:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*7080:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*7090:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*70a0:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*70b0:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*70c0:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*70d0:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*70e0:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/*70f0:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x62, 0x20, 0xee, +/*7100:*/ 0xFF }; + #endif + #endif \ No newline at end of file diff --git a/include/linux/input/synaptics_i2c_rmi.h b/include/linux/input/synaptics_i2c_rmi.h index 2c54814c..ea3c4709 100644 --- a/include/linux/input/synaptics_i2c_rmi.h +++ b/include/linux/input/synaptics_i2c_rmi.h @@ -72,6 +72,7 @@ struct rmi4_function_info { __u8 intr_offset; __u8 intr_mask; __u8 ctrl_base; + __u8 query_base; __u8 data_offset; __u8 data_len; }; diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h index 91b49e73..4cc41cf1 100644 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h @@ -226,7 +226,7 @@ struct mmc_host { } embedded_sdio_data; #endif #ifdef CONFIG_ATH_WIFI - int last_suspend_error; + int suspend_keep_power; #endif #ifdef CONFIG_MMC_PERF_PROFILING struct { diff --git a/include/linux/pn544.h b/include/linux/pn544.h new file mode 100644 index 00000000..6a4965e0 --- /dev/null +++ b/include/linux/pn544.h @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2010 Trusted Logic S.A. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#define PN544_MAGIC 0xE9 + +/* + * PN544 power control via ioctl + * PN544_SET_PWR(0): power off + * PN544_SET_PWR(1): power on + * PN544_SET_PWR(2): reset and power on with firmware download enabled + */ +#define PN544_SET_PWR _IOW(PN544_MAGIC, 0x01, unsigned int) + +struct pn544_i2c_platform_data{ + unsigned int irq_gpio; + unsigned int ven_gpio; + unsigned int firm_gpio; + unsigned int dcdc_gpio; + unsigned int clock_gpio; + unsigned int int_active_low; +}; diff --git a/kernel/power/Makefile b/kernel/power/Makefile index a388aef6..71f1143e 100644 --- a/kernel/power/Makefile +++ b/kernel/power/Makefile @@ -17,4 +17,5 @@ obj-$(CONFIG_EARLYSUSPEND) += earlysuspend.o obj-$(CONFIG_CONSOLE_EARLYSUSPEND) += consoleearlysuspend.o obj-$(CONFIG_FB_EARLYSUSPEND) += fbearlysuspend.o -obj-$(CONFIG_MAGIC_SYSRQ) += poweroff.o \ No newline at end of file +obj-$(CONFIG_MAGIC_SYSRQ) += poweroff.o +obj-$(CONFIG_ZTE_SUSPEND_WAKEUP_MONITOR) += pm_monitor.o \ No newline at end of file diff --git a/kernel/power/pm_monitor.c b/kernel/power/pm_monitor.c new file mode 100644 index 00000000..4f4511f9 --- /dev/null +++ b/kernel/power/pm_monitor.c @@ -0,0 +1,777 @@ +/*when who what, where, why +-------- ---- --------------------------------------------------- +2011.03.09 lianghouxing LHX_PM_20110309_01 FOR CRDB00622074 modify some RPC ID for WakeupReason +2010.09.16 zhengchao add addtional wakeup info,//ZTE_ZHENFCHAO_20100916 +2010.04.02 huangyanjun add notification user when sleep or wakeup . flag:ZTE_HYJ_ADD_NOTIFY_USER_WHEN_SUSPEND +2010.01.26 huangyanjun add map prog id to name . flag:ZTE_HYJ_ADD_MAP_PROG_ID_TO_NAME +2010.01.26 huangyanjun parse wakeup information. flag:ZTE_HYJ_PARSE_WAKEUP_INFO +2010.01.22 huangyanjun add wakeup information to log_kernel. flag:HYJ_ADD_WAKEUP_INFO_TO_LOG +-------- ---- --------------------------------------------------- +*/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#define PM_MINOR_DEV 150 +#define RESUME_STATE (0x0) +#define SUSPEND_STATE (0x1) +#define WAKE_INFO_RECORD_NR 20 +#define DEM_MAX_PORT_NAME_LEN (20) + +#define PMDPRINTK(fmt, args...) \ + printk(KERN_INFO "WAKEUP INFO" fmt "", ## args) +struct msm_pm_smem_t { + uint32_t sleep_time; + uint32_t irq_mask; + uint32_t resources_used; + uint32_t reserved1; + uint32_t wakeup_reason; + uint32_t pending_irqs; + uint32_t rpc_prog; + uint32_t rpc_proc; + char smd_port_name[DEM_MAX_PORT_NAME_LEN]; + uint32_t reserved2; +}; + +struct pm_monitor { + int pm_state_changed; + int pm_state; + int info_index; + char wakeup_info[WAKE_INFO_RECORD_NR][200]; + struct semaphore sem; + wait_queue_head_t rqueue; +}; +/*huangyanjun 2010-04-02 begin ZTE_HYJ_ADD_NOTIFY_USER_WHEN_SUSPEND*/ +static int pm_monitor_open(struct inode *inodp, struct file *filp); +static ssize_t pm_monitor_read(struct file *filp, char __user *buff, size_t count, loff_t *f_pos); +//static ssize_t pm_monitor_write(struct file *filp, const char __user *buff, size_t count, loff_t *f_pos); +static unsigned int pm_monitor_poll(struct file *filp, struct poll_table_struct *p); +static int pm_monitor_release(struct inode *inodp, struct file *filp); + +static struct file_operations pm_monitor_fops = { + .open = pm_monitor_open, + .read = pm_monitor_read, + .write = NULL, + .poll = pm_monitor_poll, + .release = pm_monitor_release, +}; +static struct miscdevice pm_monitor_device = { + .minor = PM_MINOR_DEV, + .name = "pm_monitor", + .fops = &pm_monitor_fops, +}; +/*huangyanjun 2010-04-02 end ZTE_HYJ_ADD_NOTIFY_USER_WHEN_SUSPEND*/ +static struct pm_monitor *dev = NULL; +extern struct msm_pm_smem_t * get_msm_pm_smem_data(void); + +/* + * pm_monitor_state_show + */ +static ssize_t pm_monitor_state_show(struct device *devp, struct device_attribute *attr, char *buf) +{ + char * echo = dev->pm_state?"Suspend\n":"Resume\n"; + return sprintf(buf, "%s\n", echo); +} +static DEVICE_ATTR(pm_state, S_IRUGO, pm_monitor_state_show, NULL); + +/* + * pm_monitor_wakeup_info_show + */ +static ssize_t pm_monitor_wakeup_info_show(struct device *devp, struct device_attribute *attr, char *buf) +{ + char * echo = buf; + int i ; + + for (i = 0; i < WAKE_INFO_RECORD_NR; i++) { + if (strlen(&(dev->wakeup_info[i][0])) >0) { + echo += sprintf(echo, "%s\n", dev->wakeup_info[i]); + } + } + + return echo-buf; +} +static DEVICE_ATTR(wakeup_info, S_IRUGO, pm_monitor_wakeup_info_show, NULL); + +#define ZTE_GET_AMSS_SLEEP_TIME +//ZTE_POWER_ZENGHUIPENG_20110212 add +#ifdef ZTE_GET_AMSS_SLEEP_TIME +#include "../../arch/arm/mach-msm/proc_comm.h" +#define ZTE_PROC_COMM_CMD3_RECORD_GET_AMSS_SLEEPTIME 8 +static ssize_t pm_monitor_amss_sleep_time_show(struct device *devp, struct device_attribute *attr, char *buf) +{ + char * echo = buf; + unsigned msleeptimeinsecs=0; + unsigned subcmd=ZTE_PROC_COMM_CMD3_RECORD_GET_AMSS_SLEEPTIME; + msm_proc_comm(PCOM_CUSTOMER_CMD3, &msleeptimeinsecs, &subcmd); + + echo += sprintf(echo, "%d", msleeptimeinsecs); + + return echo-buf; +} +static DEVICE_ATTR(amss_sleep_time, S_IRUGO, pm_monitor_amss_sleep_time_show, NULL); +#endif +//ZTE_POWER_ZENGHUIPENG_20110212 add end + + +#define ZTE_FEATURE_GET_CHIP_VERSION_APP //LHX_PM_20110525_01 add code to get chip version for APP +#ifdef ZTE_FEATURE_GET_CHIP_VERSION_APP +#include "../../arch/arm/mach-msm/proc_comm.h" +#define ZTE_PROC_COMM_CMD3_GET_CHIP_VERSION 10 +#define ZTE_PROC_COMM_CMD3_GET_HW_MSM_VERSION 11 +static ssize_t pm_monitor_chip_version_show(struct device *devp, struct device_attribute *attr, char *buf) +{ + char * echo = buf; + unsigned chip_version=0; + unsigned subcmd=ZTE_PROC_COMM_CMD3_GET_CHIP_VERSION; + msm_proc_comm(PCOM_CUSTOMER_CMD3, &chip_version, &subcmd); + + echo += sprintf(echo, "%d", chip_version); + + return echo-buf; +} +static DEVICE_ATTR(chip_version, S_IRUGO, pm_monitor_chip_version_show, NULL); + +static ssize_t pm_monitor_hw_msm_version_show(struct device *devp, struct device_attribute *attr, char *buf) +{ + char * echo = buf; + unsigned hw_msm_version=0; + unsigned subcmd=ZTE_PROC_COMM_CMD3_GET_HW_MSM_VERSION; + msm_proc_comm(PCOM_CUSTOMER_CMD3, &hw_msm_version, &subcmd); + + echo += sprintf(echo, "%x", hw_msm_version); + + return echo-buf; +} +static DEVICE_ATTR(hw_msm_version, S_IRUGO, pm_monitor_hw_msm_version_show, NULL); +#endif //end ZTE_FEATURE_GET_CHIP_VERSION_APP + + + + +/*BEGIN LHX_PM_20110328_01 add code to record how long modem keeps awake while app sleep*/ +unsigned pm_modem_sleep_time_get(void) +{ + unsigned msleeptimeinsecs = 0; + #ifdef ZTE_GET_AMSS_SLEEP_TIME + unsigned subcmd=ZTE_PROC_COMM_CMD3_RECORD_GET_AMSS_SLEEPTIME; + msm_proc_comm(PCOM_CUSTOMER_CMD3, &msleeptimeinsecs, &subcmd); + #endif + return msleeptimeinsecs; +} +/*END LHX_PM_20110328_01 add code to record how long modem keeps awake while app sleep*/ + + + +/*ZTE_HYJ_PARSE_WAKEUP_INFO 2010.0126 begin*/ + +#define ID_WAKEUP_REASON 0 +#define ID_WAKEUP_PROG 1 +#define ID_PM_MONITOR_MAX 2 + +struct map_id_to_name { + uint32_t val; + char *str; +}; + +struct map_id_to_name_tbl { + struct map_id_to_name *map; + int size; +}; + +static struct map_id_to_name pm_monitor_wakeup_reason[] = { + { 0x00000040, "OTHER" }, + { 0x00000020, "RESET" }, + { 0x00000010, "ALARM" }, + { 0x00000008, "TIMER" }, + { 0x00000004, "GPIO" }, + { 0x00000002, "INT" }, + { 0x00000001, "RPC" }, + { 0x00000000, "NONE" }, +}; + + +static struct map_id_to_name pm_monitor_oncrpc_prog[] = { + { 0x30000000, "CM" }, + { 0x30000001, "DB" }, + { 0x30000002, "SND" }, + { 0x30000003, "WMS" }, + { 0x30000004, "PDSM" }, + { 0x30000005, "MISC_MODEM_APIS" }, + { 0x30000006, "MISC_APPS_APIS" }, + { 0x30000007, "JOYST" }, + { 0x30000008, "VJOY" }, + { 0x30000009, "JOYSTC" }, + { 0x3000000a, "ADSPRTOSATOM" }, + { 0x3000000b, "ADSPRTOSMTOA" }, + { 0x3000000c, "I2C" }, + { 0x3000000d, "TIME_REMOTE" }, + { 0x3000000e, "NV" }, + { 0x3000000f, "CLKRGM_SEC" }, + { 0x30000010, "RDEVMAP" }, + { 0x30000011, "FS_RAPI" }, + { 0x30000012, "PBMLIB" }, + { 0x30000013, "AUDMGR" }, + { 0x30000014, "MVS" }, + { 0x30000015, "DOG_KEEPALIVE" }, + { 0x30000016, "GSDI_EXP" }, + { 0x30000017, "AUTH" }, + { 0x30000018, "NVRUIMI" }, + { 0x30000019, "MMGSDILIB" }, + { 0x3000001a, "CHARGER" }, + { 0x3000001b, "UIM" }, + { 0x3000001C, "ONCRPCTEST" }, + { 0x3000001d, "PDSM_ATL" }, + { 0x3000001e, "FS_XMOUNT" }, + { 0x3000001f, "SECUTIL " }, + { 0x30000020, "MCCMEID" }, + { 0x30000021, "PM_STROBE_FLASH" }, + { 0x30000022, "DS707_EXTIF" }, + { 0x30000023, "SMD BRIDGE_MODEM" }, + { 0x30000024, "SMD PORT_MGR" }, + { 0x30000025, "BUS_PERF" }, + { 0x30000026, "BUS_MON" }, + { 0x30000027, "MC" }, + { 0x30000028, "MCCAP" }, + { 0x30000029, "MCCDMA" }, + { 0x3000002a, "MCCDS" }, + { 0x3000002b, "MCCSCH" }, + { 0x3000002c, "MCCSRID" }, + { 0x3000002d, "SNM" }, + { 0x3000002e, "MCCSYOBJ" }, + { 0x3000002f, "DS707_APIS" }, + { 0x30000030, "DS_MP_SHIM_APPS_ASYNC" }, + { 0x30000031, "DSRLP_APIS" }, + { 0x30000032, "RLP_APIS" }, + { 0x30000033, "DS_MP_SHIM_MODEM" }, + { 0x30000034, "DSHDR_APIS" }, + { 0x30000035, "DSHDR_MDM_APIS" }, + { 0x30000036, "DS_MP_SHIM_APPS" }, + { 0x30000037, "HDRMC_APIS" }, + { 0x30000038, "SMD_BRIDGE_MTOA" }, + { 0x30000039, "SMD_BRIDGE_ATOM" }, + { 0x3000003a, "DPMAPP_OTG" }, + { 0x3000003b, "DIAG" }, + { 0x3000003c, "GSTK_EXP" }, + { 0x3000003d, "DSBC_MDM_APIS" }, + { 0x3000003e, "HDRMRLP_MDM_APIS" }, + { 0x3000003f, "HDRMRLP_APPS_APIS" }, + { 0x30000040, "HDRMC_MRLP_APIS" }, + { 0x30000041, "PDCOMM_APP_API" }, + { 0x30000042, "DSAT_APIS" }, + { 0x30000043, "MISC_RF_APIS" }, + { 0x30000044, "CMIPAPP" }, + { 0x30000045, "DSMP_UMTS_MODEM_APIS" }, + { 0x30000046, "DSMP_UMTS_APPS_APIS" }, + { 0x30000047, "DSUCSDMPSHIM" }, + { 0x30000048, "TIME_REMOTE_ATOM" }, + { 0x3000004a, "SD" }, + { 0x3000004b, "MMOC" }, + { 0x3000004c, "WLAN_ADP_FTM" }, + { 0x3000004d, "WLAN_CP_CM" }, + { 0x3000004e, "FTM_WLAN" }, + { 0x3000004f, "SDCC_CPRM" }, + { 0x30000050, "CPRMINTERFACE" }, + { 0x30000051, "DATA_ON_MODEM_MTOA_APIS" }, + { 0x30000052, "DATA_ON_APPS_ATOM_APIS" }, + { 0x30000053, "MISC_MODEM_APIS_NONWINMOB" }, + { 0x30000054, "MISC_APPS_APIS_NONWINMOB" }, + { 0x30000055, "PMEM_REMOTE" }, + { 0x30000056, "TCXOMGR" }, + { 0x30000057, "DSUCSDAPPIF_APIS" }, + { 0x30000058, "BT" }, + { 0x30000059, "PD_COMMS_API" }, + { 0x3000005a, "PD_COMMS_CLIENT_API" }, + { 0x3000005b, "PDAPI" }, + { 0x3000005c, "LSA_SUPL_DSM" }, + { 0x3000005d, "TIME_REMOTE_MTOA" }, + { 0x3000005e, "FTM_BT" }, + { 0X3000005f, "DSUCSDAPPIF_APIS" }, + { 0X30000060, "PMAPP_GEN" }, + { 0X30000061, "PM_LIB" }, + { 0X30000062, "KEYPAD" }, + { 0X30000063, "HSU_APP_APIS" }, + { 0X30000064, "HSU_MDM_APIS" }, + { 0X30000065, "ADIE_ADC_REMOTE_ATOM " }, + { 0X30000066, "TLMM_REMOTE_ATOM" }, + { 0X30000067, "UI_CALLCTRL" }, + { 0X30000068, "UIUTILS" }, + { 0X30000069, "PRL" }, + { 0X3000006a, "HW" }, + { 0X3000006b, "OEM_RAPI" }, + { 0X3000006c, "WMSPM" }, + { 0X3000006d, "BTPF" }, + { 0X3000006e, "CLKRGM_SYNC_EVENT" }, + { 0X3000006f, "USB_APPS_RPC" }, + { 0X30000070, "USB_MODEM_RPC" }, + { 0X30000071, "ADC" }, + { 0X30000072, "CAMERAREMOTED" }, + { 0X30000073, "SECAPIREMOTED" }, + { 0X30000074, "DSATAPI" }, + { 0X30000075, "CLKCTL_RPC" }, + { 0X30000076, "BREWAPPCOORD" }, + { 0X30000077, "ALTENVSHELL" }, + { 0X30000078, "WLAN_TRP_UTILS" }, + { 0X30000079, "GPIO_RPC" }, + { 0X3000007a, "PING_RPC" }, + { 0X3000007b, "DSC_DCM_API" }, + { 0X3000007c, "L1_DS" }, + { 0X3000007d, "QCHATPK_APIS" }, + { 0X3000007e, "GPS_API" }, + { 0X3000007f, "OSS_RRCASN_REMOTE" }, + { 0X30000080, "PMAPP_OTG_REMOTE" }, + { 0X30000081, "PING_MDM_RPC" }, + { 0X30000082, "PING_KERNEL_RPC" }, + { 0X30000083, "TIMETICK" }, + { 0X30000084, "WM_BTHCI_FTM " }, + { 0X30000085, "WM_BT_PF" }, + { 0X30000086, "IPA_IPC_APIS" }, + { 0X30000087, "UKCC_IPC_APIS" }, + { 0X30000088, "CMIPSMS " }, + { 0X30000089, "VBATT_REMOTE" }, + { 0X3000008a, "MFPAL" }, + { 0X3000008b, "DSUMTSPDPREG" }, + { 0X3000008c, "LOC_API GPS CB" },//LHX_PM_20110309_01 add for GB CRDB00622074 form loc_api_rpc.h according svc_register_auto_apiversions + { 0X30000091, "HS_REM" },//LHX_PM_20110309_01 add for GB form hs_rem_rpc.h according svc_register_auto_apiversions + { 0X3000fe00, "RESTART_DAEMON NUMBER 0" }, + { 0X3000fe01, "RESTART_DAEMON NUMBER 1" }, + { 0X3000feff, "RESTART_DAEMON NUMBER 255" }, + { 0X3000fffe, "BACKWARDS_COMPATIBILITY_IN_RPC_CLNT_LOOKUP" }, + { 0X3000ffff, "RPC_ROUTER_SERVER_PROGRAM" }, + /*ZTE_HYJ_ADD_MAP_PROG_ID_TO_NAME 02/02/2001 begin*/ + { 0x31000000, "CM CB" }, + { 0x31000001, "DB CB" }, + { 0x31000002, "SND CB" }, + { 0x31000003, "WMS CB" }, + { 0x31000004, "PDSM CB" }, + { 0x31000005, "MISC_MODEM_APIS CB" }, + { 0x31000006, "MISC_APPS_APIS CB" }, + { 0x31000007, "JOYST CB" }, + { 0x31000008, "VJOY CB" }, + { 0x31000009, "JOYSTC CB" }, + { 0x3100000a, "ADSPRTOSATOM CB" }, + { 0x3100000b, "ADSPRTOSMTOA CB" }, + { 0x3100000c, "I2C CB" }, + { 0x3100000d, "TIME_REMOTE CB" }, + { 0x3100000e, "NV CB" }, + { 0x3100000f, "CLKRGM_SEC CB" }, + { 0x31000010, "RDEVMAP CB" }, + { 0x31000011, "FS_RAPI CB" }, + { 0x31000012, "PBMLIB CB" }, + { 0x31000013, "AUDMGR CB" }, + { 0x31000014, "MVS CB" }, + { 0x31000015, "DOG_KEEPALIVE CB" }, + { 0x31000016, "GSDI_EXP CB" }, + { 0x31000017, "AUTH CB" }, + { 0x31000018, "NVRUIMI CB" }, + { 0x31000019, "MMGSDILIB CB" }, + { 0x3100001a, "CHARGER CB" }, + { 0x3100001b, "UIM CB" }, + { 0x3100001C, "ONCRPCTEST CB" }, + { 0x3100001d, "PDSM_ATL CB" }, + { 0x3100001e, "FS_XMOUNT CB" }, + { 0x3100001f, "SECUTIL CB" }, + { 0x31000020, "MCCMEID" }, + { 0x31000021, "PM_STROBE_FLASH CB" }, + { 0x31000022, "DS707_EXTIF CB" }, + { 0x31000023, "SMD BRIDGE_MODEM CB" }, + { 0x31000024, "SMD PORT_MGR CB" }, + { 0x31000025, "BUS_PERF CB" }, + { 0x31000026, "BUS_MON CB" }, + { 0x31000027, "MC CB" }, + { 0x31000028, "MCCAP CB" }, + { 0x31000029, "MCCDMA CB" }, + { 0x3100002a, "MCCDS CB" }, + { 0x3100002b, "MCCSCH CB" }, + { 0x3100002c, "MCCSRID CB" }, + { 0x3100002d, "SNM CB" }, + { 0x3100002e, "MCCSYOBJ CB" }, + { 0x3100002f, "DS707_APIS CB" }, + { 0x31000030, "DS_MP_SHIM_APPS_ASYNC CB" }, + { 0x31000031, "DSRLP_APIS CB" }, + { 0x31000032, "RLP_APIS CB" }, + { 0x31000033, "DS_MP_SHIM_MODEM CB" }, + { 0x31000034, "DSHDR_APIS CB" }, + { 0x31000035, "DSHDR_MDM_APIS CB" }, + { 0x31000036, "DS_MP_SHIM_APPS CB" }, + { 0x31000037, "HDRMC_APIS CB" }, + { 0x31000038, "SMD_BRIDGE_MTOA CB" }, + { 0x31000039, "SMD_BRIDGE_ATOM CB" }, + { 0x3100003a, "DPMAPP_OTG CB" }, + { 0x3100003b, "DIAG CB" }, + { 0x3100003c, "GSTK_EXP CB" }, + { 0x3100003d, "DSBC_MDM_APIS CB" }, + { 0x3100003e, "HDRMRLP_MDM_APIS CB" }, + { 0x3100003f, "HDRMRLP_APPS_APIS CB" }, + { 0x31000040, "HDRMC_MRLP_APIS CB" }, + { 0x31000041, "PDCOMM_APP_API CB" }, + { 0x31000042, "DSAT_APIS CB" }, + { 0x31000043, "MISC_RF_APIS CB" }, + { 0x31000044, "CMIPAPP CB" }, + { 0x31000045, "DSMP_UMTS_MODEM_APIS CB" }, + { 0x31000046, "DSMP_UMTS_APPS_APIS CB" }, + { 0x31000047, "DSUCSDMPSHIM CB" }, + { 0x31000048, "TIME_REMOTE_ATOM CB" }, + { 0x3100004a, "SD CB" }, + { 0x3100004b, "MMOC CB" }, + { 0x3100004c, "WLAN_ADP_FTM CB" }, + { 0x3100004d, "WLAN_CP_CM CB" }, + { 0x3100004e, "FTM_WLAN CB" }, + { 0x3100004f, "SDCC_CPRM CB" }, + { 0x31000050, "CPRMINTERFACE CB" }, + { 0x31000051, "DATA_ON_MODEM_MTOA_APIS CB" }, + { 0x31000052, "DATA_ON_APPS_ATOM_APIS CB" }, + { 0x31000053, "MISC_APIS_NONWINMOB CB" }, + { 0x31000054, "MISC_APPS_APIS_NONWINMOB CB" }, + { 0x31000055, "PMEM_REMOTE CB" }, + { 0x31000056, "TCXOMGR CB" }, + { 0x31000057, "DSUCSDAPPIF_APIS CB" }, + { 0x31000058, "BT CB" }, + { 0x31000059, "PD_COMMS_API CB" }, + { 0x3100005a, "PD_COMMS_CLIENT_API CB" }, + { 0x3100005b, "PDAPI CB" }, + { 0x3100005c, "LSA_SUPL_DSM CB" }, + { 0x3100005d, "TIME_REMOTE_MTOA CB" }, + { 0x3100005e, "FTM_BT CB" }, + { 0X3100005f, "DSUCSDAPPIF_APIS CB" }, + { 0X31000060, "PMAPP_GEN CB" }, + { 0X31000061, "PM_LIB CB" }, + { 0X31000062, "KEYPAD CB" }, + { 0X31000063, "HSU_APP_APIS CB" }, + { 0X31000064, "HSU_MDM_APIS CB" }, + { 0X31000065, "ADIE_ADC_REMOTE_ATOM CB" }, + { 0X31000066, "TLMM_REMOTE_ATOM CB" }, + { 0X31000067, "UI_CALLCTRL CB" }, + { 0X31000068, "UIUTILS CB" }, + { 0X31000069, "PRL CB" }, + { 0X3100006a, "HW CB" }, + { 0X3100006b, "OEM_RAPI CB" }, + { 0X3100006c, "WMSPM CB" }, + { 0X3100006d, "BTPF CB" }, + { 0X3100006e, "CLKRGM_SYNC_EVENT CB" }, + { 0X3100006f, "USB_APPS_RPC CB" }, + { 0X31000070, "USB_MODEM_RPC CB" }, + { 0X31000071, "ADC CB" }, + { 0X31000072, "CAMERAREMOTED CB" }, + { 0X31000073, "SECAPIREMOTED CB" }, + { 0X31000074, "DSATAPI CB" }, + { 0X31000075, "CLKCTL_RPC CB" }, + { 0X31000076, "BREWAPPCOORD CB" }, + { 0X31000077, "ALTENVSHELL CB" }, + { 0X31000078, "WLAN_TRP_UTILS CB" }, + { 0X31000079, "GPIO_RPC CB" }, + { 0X3100007a, "PING_RPC CB" }, + { 0X3100007b, "DSC_DCM_API CB" }, + { 0X3100007c, "L1_DS CB" }, + { 0X3100007d, "QCHATPK_APIS CB" }, + { 0X3100007e, "GPS_API CB" }, + { 0X3100007f, "OSS_RRCASN_REMOTE CB" }, + { 0X31000080, "PMAPP_OTG_REMOTE CB" }, + { 0X31000081, "PING_MDM_RPC CB" }, + { 0X31000082, "PING_KERNEL_RPC CB" }, + { 0X31000083, "TIMETICK CB" }, + { 0X31000084, "WM_BTHCI_FTM CB" }, + { 0X31000085, "WM_BT_PF CB" }, + { 0X31000086, "IPA_IPC_APIS CB" }, + { 0X31000087, "UKCC_IPC_APIS CB" }, + { 0X31000088, "CMIPSMS CB" }, + { 0X31000089, "VBATT_REMOTE CB" }, + { 0X3100008a, "MFPAL CB" }, + { 0X31000091, "HS_REM CB" },//LHX_PM_20110309_01 add for GB form hs_rem_rpc.h according svc_register_auto + { 0X3100008b, "DSUMTSPDPREG CB" }, + { 0X3100fe00, "RESTART_DAEMON NUMBER 0 CB" }, + { 0X3100fe01, "RESTART_DAEMON NUMBER 1 CB" }, + { 0X3100feff, "RESTART_DAEMON NUMBER 255 CB" }, + { 0X3100fffe, "BACKWARDS_COMPATIBILITY_IN_RPC_CLNT_LOOKUP CB" }, + { 0X3100ffff, "RPC_ROUTER_SERVER_PROGRAM CB" }, + /*ZTE_HYJ_ADD_MAP_PROG_ID_TO_NAME 02/02/2001 end*/ +}; + + +static struct map_id_to_name_tbl pm_monitor_tbl[] = { + { pm_monitor_wakeup_reason, ARRAY_SIZE(pm_monitor_wakeup_reason) }, + { pm_monitor_oncrpc_prog, ARRAY_SIZE(pm_monitor_oncrpc_prog) }, +}; + + /* + * pm_monitor_find_name + */ + char *pm_parse_wakeup_reason(uint32_t id, uint32_t val) +{ + int ii; + int size; + struct map_id_to_name_tbl *tbl_item; + + if(id >= ID_PM_MONITOR_MAX ) + return 0; + + tbl_item = &pm_monitor_tbl[id]; + size = tbl_item->size; + for(ii = 0; ii < size; ii++) { + if (tbl_item->map[ii].val == val) { + return tbl_item->map[ii].str; + } + } + return 0; +} +/*ZTE_HYJ_PARSE_WAKEUP_INFO 2010.0126 end*/ + + /* + * get_current_time + */ +static int get_current_time(char *str_time) +{ + struct timespec ts; + struct rtc_time tm; + int len = 0; + + getnstimeofday(&ts); + rtc_time_to_tm(ts.tv_sec, &tm); + len = sprintf(str_time, "%d-%02d-%02d %02d:%02d:%02d ", + tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, + tm.tm_hour, tm.tm_min, tm.tm_sec); + + return len; +} + +/* + * pm_monitor_save_info + */ +static int pm_monitor_save_info(int pm_state,char *buf) +{ + char *p_buf = buf; + int len = 0; + + if (pm_state) { + p_buf += get_current_time(p_buf); + p_buf+= sprintf(p_buf, "%s","suspend"); + *p_buf = '\0'; + len = p_buf - buf; + return len; + } else { + //ZTE_ZHENFCHAO_20100916 + printk("[PM] additional wakeup info:\n"); + printk("\twakeupreason:0x%x\n\trpc_prog:0x%x\n\trpc_proc:0x%x\n",get_msm_pm_smem_data()->wakeup_reason, + get_msm_pm_smem_data()->rpc_prog, + get_msm_pm_smem_data()->rpc_proc + ); + p_buf += get_current_time(p_buf); + p_buf+= sprintf(p_buf, "%s\n","resume"); + p_buf+= sprintf(p_buf, "WakeupReason:%s\tRpcProg:%s\tRpcProc:0x%x\tSmdPortName:%s\t GpioInfo:0x%x\n", + /*ZTE_HYJ_PARSE_WAKEUP_INFO 2010.0126 begin*/ + pm_parse_wakeup_reason(ID_WAKEUP_REASON,get_msm_pm_smem_data()->wakeup_reason), + pm_parse_wakeup_reason(ID_WAKEUP_PROG,get_msm_pm_smem_data()->rpc_prog), + /*ZTE_HYJ_PARSE_WAKEUP_INFO 2010.0126 end*/ + get_msm_pm_smem_data()->rpc_proc, + get_msm_pm_smem_data()->smd_port_name, + get_msm_pm_smem_data()->reserved2); + *p_buf = '\0'; + len = p_buf - buf; + return len; + } + +} + +/* + * pm_state_changed + */ +static void pm_state_changed(struct pm_monitor *sdev, int state) +{ + char event_string[17]; + if (sdev->pm_state != state) { + if (down_interruptible(&dev->sem)) + goto err; + + sdev->pm_state_changed = 1; + sdev->pm_state = state; + wake_up_interruptible(&dev->rqueue); + if(sdev->info_index >= WAKE_INFO_RECORD_NR) { + sdev->info_index = 0; + } + up(&dev->sem); + + pm_monitor_save_info(state,&sdev->wakeup_info[sdev->info_index++][0]); + + /*ZTE_HYJ_ADD_WAKEUP_INFO_TO_LOG 01/22/10 begin*/ + if(sdev->pm_state == RESUME_STATE) { + PMDPRINTK("%s\n",&sdev->wakeup_info[sdev->info_index - 1][0]); + sprintf(event_string, "pm_state=resume"); + //kobject_uevent_env(&(pm_monitor_device.this_device->kobj), KOBJ_CHANGE,envp); + } else if(sdev->pm_state == SUSPEND_STATE) { + sprintf(event_string, "pm_state=suspend"); + //kobject_uevent_env(&(pm_monitor_device.this_device->kobj), KOBJ_CHANGE,envp); + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(HZ/20); + } + /*ZTE_HYJ_ADD_WAKEUP_INFO_TO_LOG 01/22/10 end*/ + +err: + return ; + } +} + +/* + * pm_suspend_notifier + */ +static int pm_suspend_notifier(struct notifier_block *nb, + unsigned long event, + void *dummy) +{ + switch (event) { + case PM_SUSPEND_PREPARE: + printk("PM_SUSPEND_PREPARE\n"); + pm_state_changed(dev,SUSPEND_STATE); + return NOTIFY_OK; + case PM_POST_SUSPEND: + printk("PM_POST_SUSPEND\n"); + pm_state_changed(dev,RESUME_STATE); + return NOTIFY_OK; + default: + return NOTIFY_DONE; + } +} + +static struct notifier_block pm_monitor_suspend_notifier = { + .notifier_call = pm_suspend_notifier, +}; + +/*huangyanjun 2010-04-02 begin ZTE_HYJ_ADD_NOTIFY_USER_WHEN_SUSPEND*/ +static int pm_monitor_open(struct inode *inodp, struct file *filp) +{ + printk("%s exit\n",__FUNCTION__); + return 0; +} + +static ssize_t pm_monitor_read(struct file *filp, char __user *buff, size_t count, loff_t *f_pos) +{ + int ret = 0; + + printk("%s enter\n",__FUNCTION__); + + if (wait_event_interruptible(dev->rqueue, dev->pm_state_changed)) + goto err; + + if (down_interruptible(&dev->sem)) + goto err; + + if (copy_to_user(buff, &dev->pm_state, sizeof(dev->pm_state))) { + ret = -EFAULT; + } else { + ret = sizeof(dev->pm_state); + } + dev->pm_state_changed = 0; + up(&dev->sem); + printk("%s exit\n",__FUNCTION__); + return ret; + +err: + return -ERESTARTSYS; +} + + +static unsigned int pm_monitor_poll(struct file *filp, struct poll_table_struct *p) +{ + unsigned int mask = 0; + + if (down_interruptible(&dev->sem)) + goto err; + + poll_wait(filp, &dev->rqueue, p); + + if(dev->pm_state_changed) { + mask |= POLLIN | POLLRDNORM; + } + up(&dev->sem); + return mask; + +err: + return -ERESTARTSYS; +} + +static int pm_monitor_release(struct inode *inodp, struct file *filp) +{ + printk("%s enter\n",__FUNCTION__); + return 0; +} +/*huangyanjun 2010-04-02 end ZTE_HYJ_ADD_NOTIFY_USER_WHEN_SUSPEND*/ +/* + * pm_monitor_init + */ +static int __init pm_monitor_init(void) +{ + int ret = -1; + + printk("%s enter\n",__FUNCTION__); + + dev = kmalloc(sizeof(struct pm_monitor), GFP_KERNEL); + if (!dev) { + ret = -ENOMEM; + goto out; + } + + memset(dev, '\0', sizeof(struct pm_monitor)); + init_MUTEX(&dev->sem); + init_waitqueue_head(&dev->rqueue); + + ret = misc_register(&pm_monitor_device); + if (ret) + goto err; + + ret = register_pm_notifier(&pm_monitor_suspend_notifier); + if (ret) + goto out_unregister; + + ret = device_create_file(pm_monitor_device.this_device,&dev_attr_pm_state); + ret += device_create_file(pm_monitor_device.this_device, &dev_attr_wakeup_info); + ret += device_create_file(pm_monitor_device.this_device, &dev_attr_amss_sleep_time);//ZTE_POWER_ZENGHUIPENG_20110212 add + +#ifdef ZTE_FEATURE_GET_CHIP_VERSION_APP //LHX_PM_20110525_01 add code to get chip version for APP + ret += device_create_file(pm_monitor_device.this_device, &dev_attr_chip_version); + ret += device_create_file(pm_monitor_device.this_device, &dev_attr_hw_msm_version); +#endif + if (ret) + goto out_unregister; + + return 0; + +out_unregister: + misc_deregister(&pm_monitor_device); + err: + kfree(dev); +out: + printk("%s exit\n",__FUNCTION__); + return ret; +} + + +/* + *pm_monitor_exit + */ +static void __exit pm_monitor_exit(void) +{ + printk("%s enter\n",__FUNCTION__); + + unregister_pm_notifier(&pm_monitor_suspend_notifier); + misc_deregister(&pm_monitor_device); + kfree(dev); + + printk("%s exit\n",__FUNCTION__); +} + +MODULE_LICENSE("GPL"); + +module_init(pm_monitor_init); +module_exit(pm_monitor_exit);