From: Ziggy Date: Sat, 20 Apr 2013 18:51:20 +0000 (-0400) Subject: Samsung VZW MB1 update X-Git-Url: https://projects.ziggy471.com/git/gitweb.cgi?p=ziggy471-sgs3-jb.git;a=commitdiff;h=6935d551c289c531e62a2fc0cc51e6cac9fe283f Samsung VZW MB1 update Signed-off-by: Ziggy --- --- a/arch/arm/configs/m2_att_defconfig +++ b/arch/arm/configs/m2_att_defconfig @@ -553,6 +553,7 @@ CONFIG_SEC_DEBUG=y CONFIG_SEC_DEBUG_SCHED_LOG=y # CONFIG_SEC_DEBUG_IRQ_EXIT_LOG is not set CONFIG_SEC_DEBUG_SUBSYS=y +CONFIG_SEC_DEBUG_DOUBLE_FREE=y CONFIG_CRYPTO_SHA256=y CONFIG_CRYPTO_TWOFISH=y CONFIG_CRYPTO_DEV_QCRYPTO=m --- a/arch/arm/configs/m2_att_eng_defconfig +++ b/arch/arm/configs/m2_att_eng_defconfig @@ -558,6 +558,7 @@ CONFIG_SEC_SSR_DUMP=y CONFIG_SEC_DEBUG_SCHED_LOG=y CONFIG_SEC_DEBUG_IRQ_EXIT_LOG=y CONFIG_SEC_DEBUG_SUBSYS=y +CONFIG_SEC_DEBUG_DOUBLE_FREE=y CONFIG_CRYPTO_SHA256=y CONFIG_CRYPTO_TWOFISH=y CONFIG_CRYPTO_DEV_QCRYPTO=m --- a/arch/arm/configs/m2_dcm_defconfig +++ b/arch/arm/configs/m2_dcm_defconfig @@ -51,6 +51,7 @@ CONFIG_MSM_IPC_ROUTER_SMD_XPRT=y CONFIG_MSM_PIL_QDSP6V4=y CONFIG_MSM_PIL_RIVA=y CONFIG_MSM_PIL_TZAPPS=y +CONFIG_MSM_PIL_VIDC=y CONFIG_MSM_SUBSYSTEM_RESTART=y CONFIG_MSM_MODEM_8960=y CONFIG_MSM_LPASS_8960=y @@ -341,6 +342,7 @@ CONFIG_MFD_PM8XXX_BATT_ALARM=y CONFIG_WCD9310_CODEC=y CONFIG_REGULATOR_PM8XXX=y CONFIG_REGULATOR_GPIO=y +CONFIG_REGULATOR_MAX8952=y CONFIG_MEDIA_SUPPORT=y CONFIG_VIDEO_DEV=y # CONFIG_MEDIA_TUNER_CUSTOMISE is not set @@ -474,6 +476,7 @@ CONFIG_USB_DUN_SUPPORT=y CONFIG_USB_ANDROID_SAMSUNG_COMPOSITE=y # CONFIG_USB_G_ANDROID_SAMSUNG_DTF is not set CONFIG_MMC=y +CONFIG_MMC_CPRM=y # CONFIG_MMC_PERF_PROFILING is not set CONFIG_MMC_UNSAFE_RESUME=y CONFIG_MMC_CLKGATE=y @@ -530,7 +533,6 @@ CONFIG_MAGIC_SYSRQ=y CONFIG_DEBUG_KERNEL=y CONFIG_LOCKUP_DETECTOR=y CONFIG_DEBUG_FS=y -# CONFIG_FTRACE is not set # CONFIG_BINARY_PRINTF is not set # CONFIG_SCHED_DEBUG is not set CONFIG_TIMER_STATS=y @@ -541,6 +543,7 @@ CONFIG_DEBUG_SPINLOCK_SLEEP=y CONFIG_DEBUG_INFO=y # CONFIG_DEBUG_MEMORY_INIT is not set CONFIG_DEBUG_LIST=y +CONFIG_SCHED_TRACER=y # CONFIG_DEBUG_PAGEALLOC is not set CONFIG_ENABLE_DEFAULT_TRACERS=y # CONFIG_DYNAMIC_DEBUG is not set --- a/arch/arm/configs/m2_dcm_eng_defconfig +++ b/arch/arm/configs/m2_dcm_eng_defconfig @@ -50,6 +50,7 @@ CONFIG_MSM_IPC_ROUTER_SMD_XPRT=y CONFIG_MSM_PIL_QDSP6V4=y CONFIG_MSM_PIL_RIVA=y CONFIG_MSM_PIL_TZAPPS=y +CONFIG_MSM_PIL_VIDC=y CONFIG_MSM_SUBSYSTEM_RESTART=y CONFIG_MSM_MODEM_8960=y CONFIG_MSM_LPASS_8960=y @@ -340,6 +341,7 @@ CONFIG_MFD_PM8XXX_BATT_ALARM=y CONFIG_WCD9310_CODEC=y CONFIG_REGULATOR_PM8XXX=y CONFIG_REGULATOR_GPIO=y +CONFIG_REGULATOR_MAX8952=y CONFIG_MEDIA_SUPPORT=y CONFIG_VIDEO_DEV=y # CONFIG_MEDIA_TUNER_CUSTOMISE is not set @@ -473,6 +475,7 @@ CONFIG_USB_DUN_SUPPORT=y CONFIG_USB_ANDROID_SAMSUNG_COMPOSITE=y # CONFIG_USB_G_ANDROID_SAMSUNG_DTF is not set CONFIG_MMC=y +CONFIG_MMC_CPRM=y CONFIG_MMC_PERF_PROFILING=y CONFIG_MMC_UNSAFE_RESUME=y CONFIG_MMC_CLKGATE=y @@ -539,6 +542,7 @@ CONFIG_DEBUG_SPINLOCK_SLEEP=y CONFIG_DEBUG_INFO=y CONFIG_DEBUG_MEMORY_INIT=y CONFIG_DEBUG_LIST=y +CONFIG_SCHED_TRACER=y CONFIG_FAULT_INJECTION=y CONFIG_FAILSLAB=y CONFIG_FAIL_PAGE_ALLOC=y @@ -559,6 +563,7 @@ CONFIG_SEC_SSR_DUMP=y CONFIG_SEC_DEBUG_SCHED_LOG=y CONFIG_SEC_DEBUG_IRQ_EXIT_LOG=y CONFIG_SEC_DEBUG_SUBSYS=y +CONFIG_SEC_DEBUG_DOUBLE_FREE=y CONFIG_CRYPTO_SHA256=y CONFIG_CRYPTO_TWOFISH=y CONFIG_CRYPTO_DEV_QCRYPTO=m --- a/arch/arm/configs/msm7627a-perf_defconfig +++ b/arch/arm/configs/msm7627a-perf_defconfig @@ -191,6 +191,7 @@ CONFIG_MD=y CONFIG_BLK_DEV_DM=y CONFIG_DM_CRYPT=y CONFIG_NETDEVICES=y +CONFIG_TUN=y CONFIG_NET_ETHERNET=y CONFIG_SMC91X=y CONFIG_SMSC911X=y @@ -282,6 +283,7 @@ CONFIG_USB_STORAGE_KARMA=y CONFIG_USB_STORAGE_CYPRESS_ATACB=y CONFIG_USB_EHSET_TEST_FIXTURE=y CONFIG_USB_GADGET=y +CONFIG_USB_GADGET_VBUS_DRAW=500 CONFIG_USB_GADGET_MSM_72K=y CONFIG_USB_G_ANDROID=y CONFIG_RMNET_SMD_CTL_CHANNEL="DATA40_CNTL" --- a/arch/arm/configs/msm7627a_defconfig +++ b/arch/arm/configs/msm7627a_defconfig @@ -191,6 +191,7 @@ CONFIG_MD=y CONFIG_BLK_DEV_DM=y CONFIG_DM_CRYPT=y CONFIG_NETDEVICES=y +CONFIG_TUN=y CONFIG_NET_ETHERNET=y CONFIG_SMC91X=y CONFIG_SMSC911X=y @@ -284,6 +285,7 @@ CONFIG_USB_STORAGE_KARMA=y CONFIG_USB_STORAGE_CYPRESS_ATACB=y CONFIG_USB_EHSET_TEST_FIXTURE=y CONFIG_USB_GADGET=y +CONFIG_USB_GADGET_VBUS_DRAW=500 CONFIG_USB_GADGET_MSM_72K=y CONFIG_USB_G_ANDROID=y CONFIG_RMNET_SMD_CTL_CHANNEL="DATA40_CNTL" --- a/arch/arm/configs/msm7630-perf_defconfig +++ b/arch/arm/configs/msm7630-perf_defconfig @@ -42,6 +42,7 @@ CONFIG_MSM_MEMORY_LOW_POWER_MODE_SUSPEND CONFIG_MSM_IDLE_WAIT_ON_MODEM=2000 # CONFIG_MSM_JTAG_V7 is not set CONFIG_MSM_STANDALONE_POWER_COLLAPSE=y +CONFIG_MSM_MULTIMEDIA_USE_ION=y CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_PREEMPT=y @@ -207,6 +208,7 @@ CONFIG_MD=y CONFIG_BLK_DEV_DM=y CONFIG_DM_CRYPT=y CONFIG_NETDEVICES=y +CONFIG_TUN=y CONFIG_DUMMY=y CONFIG_NET_ETHERNET=y CONFIG_SMC91X=y @@ -268,6 +270,8 @@ CONFIG_WEBCAM_OV9726=y CONFIG_MT9E013=y CONFIG_MSM_GEMINI=y CONFIG_RADIO_TAVARUA=y +CONFIG_ION=y +CONFIG_ION_MSM=y CONFIG_MSM_KGSL=y CONFIG_VIDEO_OUTPUT_CONTROL=y CONFIG_FB=y @@ -279,6 +283,7 @@ CONFIG_FB_MSM_LOGO=y CONFIG_FB_MSM_TRIPLE_BUFFER=y CONFIG_FB_MSM_MDP40=y CONFIG_FB_MSM_OVERLAY=y +CONFIG_FB_MSM_NO_MDP_PIPE_CTRL=y CONFIG_FB_MSM_TRY_MDDI_CATCH_LCDC_PRISM=y CONFIG_FB_MSM_HDMI_ADV7520_PANEL=y CONFIG_BACKLIGHT_LCD_SUPPORT=y @@ -316,6 +321,7 @@ CONFIG_USB_STORAGE_KARMA=y CONFIG_USB_STORAGE_CYPRESS_ATACB=y CONFIG_USB_EHSET_TEST_FIXTURE=y CONFIG_USB_GADGET=y +CONFIG_USB_GADGET_VBUS_DRAW=500 CONFIG_USB_GADGET_MSM_72K=y CONFIG_USB_G_ANDROID=y CONFIG_RMNET_SMD_CTL_CHANNEL="DATA40_CNTL" --- a/arch/arm/configs/msm7630_defconfig +++ b/arch/arm/configs/msm7630_defconfig @@ -42,6 +42,7 @@ CONFIG_MSM_MEMORY_LOW_POWER_MODE_SUSPEND CONFIG_MSM_IDLE_WAIT_ON_MODEM=2000 # CONFIG_MSM_JTAG_V7 is not set CONFIG_MSM_STANDALONE_POWER_COLLAPSE=y +CONFIG_MSM_MULTIMEDIA_USE_ION=y CONFIG_STRICT_MEMORY_RWX=y CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y @@ -208,6 +209,7 @@ CONFIG_MD=y CONFIG_BLK_DEV_DM=y CONFIG_DM_CRYPT=y CONFIG_NETDEVICES=y +CONFIG_TUN=y CONFIG_DUMMY=y CONFIG_NET_ETHERNET=y CONFIG_SMC91X=y @@ -270,6 +272,8 @@ CONFIG_WEBCAM_OV9726=y CONFIG_MT9E013=y CONFIG_MSM_GEMINI=y CONFIG_RADIO_TAVARUA=y +CONFIG_ION=y +CONFIG_ION_MSM=y CONFIG_MSM_KGSL=y CONFIG_VIDEO_OUTPUT_CONTROL=y CONFIG_FB=y @@ -318,6 +322,7 @@ CONFIG_USB_STORAGE_KARMA=y CONFIG_USB_STORAGE_CYPRESS_ATACB=y CONFIG_USB_EHSET_TEST_FIXTURE=y CONFIG_USB_GADGET=y +CONFIG_USB_GADGET_VBUS_DRAW=500 CONFIG_USB_GADGET_MSM_72K=y CONFIG_USB_G_ANDROID=y CONFIG_RMNET_SMD_CTL_CHANNEL="DATA40_CNTL" --- a/arch/arm/configs/msm8660-perf_defconfig +++ b/arch/arm/configs/msm8660-perf_defconfig @@ -84,6 +84,7 @@ CONFIG_PREEMPT=y CONFIG_AEABI=y CONFIG_HIGHMEM=y CONFIG_VMALLOC_RESERVE=0x19000000 +CONFIG_COMPACTION=y CONFIG_CP_ACCESS=y CONFIG_CPU_FREQ=y CONFIG_CPU_FREQ_GOV_POWERSAVE=y @@ -251,6 +252,7 @@ CONFIG_DM_CRYPT=y CONFIG_DM_UEVENT=y CONFIG_NETDEVICES=y CONFIG_DUMMY=y +CONFIG_TUN=y CONFIG_NET_ETHERNET=y CONFIG_SMC91X=y CONFIG_SMC911X=y --- a/arch/arm/configs/msm8660_defconfig +++ b/arch/arm/configs/msm8660_defconfig @@ -82,6 +82,7 @@ CONFIG_PREEMPT=y CONFIG_AEABI=y CONFIG_HIGHMEM=y CONFIG_VMALLOC_RESERVE=0x19000000 +CONFIG_COMPACTION=y CONFIG_CP_ACCESS=y CONFIG_CPU_FREQ=y CONFIG_CPU_FREQ_GOV_POWERSAVE=y @@ -250,6 +251,7 @@ CONFIG_DM_CRYPT=y CONFIG_DM_UEVENT=y CONFIG_NETDEVICES=y CONFIG_DUMMY=y +CONFIG_TUN=y CONFIG_NET_ETHERNET=y CONFIG_SMC91X=y CONFIG_SMC911X=y --- a/arch/arm/configs/msm8960-perf_defconfig +++ b/arch/arm/configs/msm8960-perf_defconfig @@ -246,6 +246,7 @@ CONFIG_BLK_DEV_DM=y CONFIG_DM_CRYPT=y CONFIG_NETDEVICES=y CONFIG_DUMMY=y +CONFIG_TUN=y CONFIG_NET_ETHERNET=y CONFIG_SMC91X=y CONFIG_SMC911X=y @@ -456,3 +457,4 @@ CONFIG_CRYPTO_DEV_QCRYPTO=m CONFIG_CRYPTO_DEV_QCE=m CONFIG_CRYPTO_DEV_QCEDEV=m CONFIG_CRC_CCITT=y +CONFIG_WCNSS_MEM_PRE_ALLOC=y --- a/arch/arm/configs/msm8960_defconfig +++ b/arch/arm/configs/msm8960_defconfig @@ -250,6 +250,7 @@ CONFIG_BLK_DEV_DM=y CONFIG_DM_CRYPT=y CONFIG_NETDEVICES=y CONFIG_DUMMY=y +CONFIG_TUN=y CONFIG_NET_ETHERNET=y CONFIG_SMC91X=y CONFIG_SMC911X=y @@ -471,3 +472,4 @@ CONFIG_CRYPTO_DEV_QCRYPTO=m CONFIG_CRYPTO_DEV_QCE=m CONFIG_CRYPTO_DEV_QCEDEV=m CONFIG_CRC_CCITT=y +CONFIG_WCNSS_MEM_PRE_ALLOC=y --- a/arch/arm/include/asm/spinlock.h +++ b/arch/arm/include/asm/spinlock.h @@ -37,11 +37,11 @@ extern int msm_krait_need_wfe_fixup; #endif /* - * The fixup involves disabling FIQs during execution of the WFE instruction. - * This could potentially lead to deadlock if a thread is trying to acquire a - * spinlock which is being released from an FIQ. This should not be a problem - * because FIQs are handled by the secure environment and do not directly - * manipulate spinlocks. + * The fixup involves disabling FIQs during execution of the WFE instruction. + * This could potentially lead to deadlock if a thread is trying to acquire a + * spinlock which is being released from an FIQ. This should not be a problem + * because FIQs are handled by the secure environment and do not directly + * manipulate spinlocks. */ #ifdef CONFIG_MSM_KRAIT_WFE_FIXUP #define WFE_SAFE(fixup, tmp) \ @@ -49,7 +49,7 @@ extern int msm_krait_need_wfe_fixup; " cmp " fixup ", #0\n" \ " wfeeq\n" \ " beq 10f\n" \ -" cpsid f\n" \ +" cpsid f\n" \ " mrc p15, 7, " fixup ", c15, c0, 5\n" \ " bic " fixup ", " fixup ", #0x10000\n" \ " mcr p15, 7, " fixup ", c15, c0, 5\n" \ --- a/arch/arm/kernel/entry-armv.S +++ b/arch/arm/kernel/entry-armv.S @@ -1044,7 +1044,7 @@ __kuser_helper_end: * SP points to a minimal amount of processor-private memory, the address * of which is copied into r0 for the mode specific abort handler. */ - .macro vector_stub, name, mode, fixup, correction=0 + .macro vector_stub, name, mode, fixup, correction=0 .align 5 vector_\name: @@ -1073,18 +1073,18 @@ vector_\name: and lr, lr, #0x0f THUMB( adr r0, 1f ) THUMB( ldr lr, [r0, lr, lsl #2] ) - .if \fixup + .if \fixup #ifdef CONFIG_MSM_KRAIT_WFE_FIXUP - ldr r0, .krait_fixup - ldr r0, [r0] - cmp r0, #0 - beq 10f - mrc p15, 7, r0, c15, c0, 5 - orr r0, r0, #0x10000 - mcr p15, 7, r0, c15, c0, 5 -10: isb + ldr r0, .krait_fixup + ldr r0, [r0] + cmp r0, #0 + beq 10f + mrc p15, 7, r0, c15, c0, 5 + orr r0, r0, #0x10000 + mcr p15, 7, r0, c15, c0, 5 +10: isb #endif - .endif + .endif mov r0, sp ARM( ldr lr, [pc, lr, lsl #2] ) movs pc, lr @ branch to handler in SVC mode @@ -1100,7 +1100,7 @@ __stubs_start: /* * Interrupt dispatcher */ - vector_stub irq, IRQ_MODE, 1, 4 + vector_stub irq, IRQ_MODE, 1, 4 .long __irq_usr @ 0 (USR_26 / USR_32) .long __irq_invalid @ 1 (FIQ_26 / FIQ_32) @@ -1123,7 +1123,7 @@ __stubs_start: * Data abort dispatcher * Enter in ABT mode, spsr = USR CPSR, lr = USR PC */ - vector_stub dabt, ABT_MODE, 0, 8 + vector_stub dabt, ABT_MODE, 0, 8 .long __dabt_usr @ 0 (USR_26 / USR_32) .long __dabt_invalid @ 1 (FIQ_26 / FIQ_32) @@ -1146,7 +1146,7 @@ __stubs_start: * Prefetch abort dispatcher * Enter in ABT mode, spsr = USR CPSR, lr = USR PC */ - vector_stub pabt, ABT_MODE, 0, 4 + vector_stub pabt, ABT_MODE, 0, 4 .long __pabt_usr @ 0 (USR_26 / USR_32) .long __pabt_invalid @ 1 (FIQ_26 / FIQ_32) @@ -1169,7 +1169,7 @@ __stubs_start: * Undef instr entry dispatcher * Enter in UND mode, spsr = SVC/USR CPSR, lr = SVC/USR PC */ - vector_stub und, UND_MODE, 0 + vector_stub und, UND_MODE, 0 .long __und_usr @ 0 (USR_26 / USR_32) .long __und_invalid @ 1 (FIQ_26 / FIQ_32) @@ -1223,7 +1223,7 @@ vector_addrexcptn: .LCvswi: .word vector_swi .krait_fixup: - .word msm_krait_need_wfe_fixup + .word msm_krait_need_wfe_fixup .globl __stubs_end __stubs_end: --- a/arch/arm/mach-msm/board-8960-camera.c +++ b/arch/arm/mach-msm/board-8960-camera.c @@ -167,6 +167,15 @@ static struct msm_gpiomux_config msm8960 }, }, #endif +#if defined(CONFIG_MACH_INFINITE)/* >=REV04 */ + { + .gpio = GPIO_MSM_FLASH_CNTL_EN2, + .settings = { + [GPIOMUX_ACTIVE] = &cam_settings[2], + [GPIOMUX_SUSPENDED] = &cam_settings[0], + }, + }, +#endif { .gpio = GPIO_MSM_FLASH_NOW, .settings = { @@ -222,7 +231,7 @@ static struct msm_gpiomux_config msm8960 [GPIOMUX_SUSPENDED] = &cam_settings[0], }, }, -#if defined(CONFIG_MACH_STRETTO) +#if defined(CONFIG_MACH_STRETTO) || defined(CONFIG_MACH_INFINITE) { .gpio = GPIO_CAM_MCLK2, .settings = { @@ -637,7 +646,7 @@ static struct msm_camera_gpio_conf msm_8 }; #endif -static struct regulator *l11, *l12, *l18, *l29, *l28, *isp_core; +static struct regulator *l8,*l11, *l12,*l16, *l18, *l29,*l30, *l28, *isp_core; /* CAM power CAM_SENSOR_A_2.8 : GPIO_CAM_A_EN(GPIO 46) CAM_SENSOR_IO_1.8 : VREG_L29 : l29 @@ -803,12 +812,12 @@ static void cam_ldo_power_off(int mode) gpio_set_value_cansleep(GPIO_CAM_CORE_EN, 0); } -#elif defined(CONFIG_ISX012) && defined(CONFIG_SR030PC50) /* ApexQ*/ +#elif defined(CONFIG_ISX012) && defined(CONFIG_SR030PC50) /* KonaLTE*/ static void cam_ldo_power_on(int mode) { int ret = 0; - printk(KERN_DEBUG "[%s : %d] %s CAMERA POWER ON!!\n", + printk(KERN_DEBUG "[%s : %d] %s KONA CAMERA POWER ON!!\n", __func__, __LINE__, mode ? "FRONT" : "REAR"); /*5M Core 1.2V - CAM_ISP_CORE_1P2*/ @@ -821,70 +830,80 @@ static void cam_ldo_power_on(int mode) ret = regulator_enable(l29); if (ret) cam_err("error enabling regulator 8921_lvs5\n"); + + printk(KERN_DEBUG "check CAM_SENSOR_IO_1P8 : %d\n", ret); /*Sensor AVDD 2.8V - CAM_SENSOR_A2P8 */ - gpio_set_value_cansleep(GPIO_CAM_A_EN, 1); - ret = gpio_get_value(GPIO_CAM_A_EN); - printk(KERN_DEBUG "check GPIO_CAM_A_EN : %d\n", ret); - -/*VT core 1.2V - CAM_DVDD_1P2V*/ - l18 = regulator_get(NULL, "cam_vio"); - ret = regulator_set_voltage(l18, 1800000, 1800000); + l16 = regulator_get(NULL, "8921_l16"); + ret = regulator_set_voltage(l16, 2800000, 2800000); if (ret) cam_err("error setting voltage\n"); - ret = regulator_enable(l18); + ret = regulator_enable(l16); if (ret) cam_err("error enabling regulator\n"); + +/*VT core 1.5V - CAM_DVDD_1P5V*/ + l30 = regulator_get(NULL, "8921_lvs6"); + ret = regulator_enable(l30); + if (ret) + cam_err("error enabling regulator 8921_lv6\n"); usleep(20); +#if 1 /*Sensor AF 2.8V -CAM_AF_2P8 */ if (!mode) { - l11 = regulator_get(NULL, "8921_l11"); - ret = regulator_set_voltage(l11, 2800000, 2800000); + l8 = regulator_get(NULL, "8921_l8"); + ret = regulator_set_voltage(l8, 2800000, 2800000); if (ret) cam_err("error setting voltage\n"); - ret = regulator_enable(l11); + ret = regulator_enable(l8); if (ret) cam_err("error enabling regulator\n"); } - } + printk(KERN_DEBUG "check CAM_AF_2P8 : %d\n", ret); +#endif +} static void cam_ldo_power_off(int mode) { int ret = 0; - printk(KERN_DEBUG "[%s : %d] %s CAMERA POWER OFF!!\n", + printk(KERN_DEBUG "[%s : %d] %s KONA CAMERA POWER OFF!!\n", __func__, __LINE__, mode ? "FRONT" : "REAR"); - +#if 1 /*Sensor AF 2.8V -CAM_AF_2P8 */ if (!mode) { - if (l11) { - ret = regulator_disable(l11); + if (l8) { + ret = regulator_disable(l8); if (ret) cam_err("error disabling regulator\n"); } } - -/*VT core 1.2 - CAM_DVDD_1P2V*/ - if (l18) { - ret = regulator_disable(l18); +#endif +/*VT core 1.5 - CAM_DVDD_1P5V*/ + if (l30) { + ret = regulator_disable(l30); if (ret) - cam_err("error disabling regulator\n"); + cam_err(" l30 error disabling regulator\n"); } /*Sensor AVDD 2.8V - CAM_SENSOR_A2P8 */ - gpio_set_value_cansleep(GPIO_CAM_A_EN, 0); - + if (l16) { + ret = regulator_disable(l16); + if (ret) + cam_err(" l16 error disabling regulator\n"); + } /*Sensor IO 1.8V -CAM_SENSOR_IO_1P8 */ if (l29) { ret = regulator_disable(l29); if (ret) - cam_err("error disabling regulator\n"); + cam_err(" l29 error disabling regulator\n"); } /*5M Core 1.2V - CAM_ISP_CORE_1P2*/ gpio_set_value_cansleep(GPIO_CAM_CORE_EN, 0); + printk(KERN_DEBUG "OFF CAM_CORE_EN \n"); } #elif defined(CONFIG_ISX012) && defined(CONFIG_S5K8AAY) /* JAGUAR */ @@ -1164,11 +1183,13 @@ static void cam_ldo_power_on(int mode) printk(KERN_DEBUG "check FLASH_LED_UNLOCK : %d\n", ret); } #else - gpio_set_value_cansleep(PM8921_MPP_PM_TO_SYS - (PMIC_MPP_FLASH_LED_UNLOCK), 1); - ret = gpio_get_value_cansleep(PM8921_MPP_PM_TO_SYS - (PMIC_MPP_FLASH_LED_UNLOCK)); - printk(KERN_DEBUG "check FLASH_LED_UNLOCK : %d\n", ret); + if (!mode && torchonoff == 0) { + gpio_set_value_cansleep(PM8921_MPP_PM_TO_SYS + (PMIC_MPP_FLASH_LED_UNLOCK), 1); + ret = gpio_get_value_cansleep(PM8921_MPP_PM_TO_SYS + (PMIC_MPP_FLASH_LED_UNLOCK)); + printk(KERN_DEBUG "check FLASH_LED_UNLOCK : %d\n", ret); + } #endif /*5M Core 1.2V - CAM_ISP_CORE_1P2*/ @@ -1226,8 +1247,10 @@ static void cam_ldo_power_off(int mode) (PMIC_MPP_FLASH_LED_UNLOCK), 0); } #else - gpio_set_value_cansleep(PM8921_MPP_PM_TO_SYS - (PMIC_MPP_FLASH_LED_UNLOCK), 0); + if (!mode && torchonoff == 0) { + gpio_set_value_cansleep(PM8921_MPP_PM_TO_SYS + (PMIC_MPP_FLASH_LED_UNLOCK), 0); + } #endif /*Sensor AF 2.8V -CAM_AF_2P8 */ @@ -1784,7 +1807,11 @@ static void cam_ldo_power_off(int mode) } #elif defined(CONFIG_S5C73M3) && defined(CONFIG_S5K6A3YX) /* D2 */ +#if defined(CONFIG_MACH_M2_DCM) +static int vddCore = 1230000; +#else static int vddCore = 1150000; +#endif static bool isVddCoreSet; static u8 gpio_cam_flash_sw; static u8 pmic_gpio_msm_flash_cntl_en; @@ -1792,12 +1819,29 @@ static bool isFlashCntlEn; static void cam_set_isp_core(int level) { + +#if defined(CONFIG_MACH_M2_DCM) + if (level == 1000000) { + pr_err("Change core voltage\n"); + vddCore = 1060000; + } else if (level == 1050000) { + pr_err("Change core voltage\n"); + vddCore = 1110000; + } else if (level == 1100000) { + pr_err("Change core voltage\n"); + vddCore = 1170000; + } else if (level == 1150000) { + pr_err("Change core voltage\n"); + vddCore = 1230000; + } else + vddCore = level; +#else if (level == 1050000) { pr_err("Change core voltage\n"); vddCore = 1100000; } else vddCore = level; - +#endif isVddCoreSet = true; pr_err("ISP CORE = %d\n", vddCore); } @@ -1921,7 +1965,23 @@ static void cam_ldo_power_on(int mode, i cam_err("error enabling regulator."); } else gpio_set_value_cansleep(CAM_CORE_EN, 1); -#elif defined(CONFIG_MACH_M2_DCM) || defined(CONFIG_MACH_K2_KDI) +#elif defined(CONFIG_MACH_M2_DCM) + if (system_rev >= BOARD_REV03) { + printk(KERN_DEBUG "[s5c73m3] dcm check vddCore : %d\n", + vddCore); + + isp_core = regulator_get(NULL, "cam_isp_core"); + ret = regulator_set_voltage(isp_core, + vddCore, vddCore); + if (ret) + cam_err("error setting voltage\n"); + + ret = regulator_enable(isp_core); + if (ret) + cam_err("error enabling regulator."); + } else + gpio_set_value_cansleep(gpio_rev(CAM_CORE_EN), 1); +#elif defined(CONFIG_MACH_K2_KDI) gpio_set_value_cansleep(gpio_rev(CAM_CORE_EN), 1); #else gpio_set_value_cansleep(CAM_CORE_EN, 1); @@ -2066,7 +2126,16 @@ static void cam_ldo_power_off(int mode) if (ret) cam_err("error disabling regulator"); regulator_put(isp_core); -#elif defined(CONFIG_MACH_M2_DCM) || defined(CONFIG_MACH_K2_KDI) +#elif defined(CONFIG_MACH_M2_DCM) + if (system_rev >= BOARD_REV03){ + ret = regulator_disable(isp_core); + if (ret) + cam_err("error disabling regulator"); + regulator_put(isp_core); + } + else + gpio_set_value_cansleep(gpio_rev(CAM_CORE_EN), 0); +#elif defined(CONFIG_MACH_K2_KDI) gpio_set_value_cansleep(gpio_rev(CAM_CORE_EN), 0); #else gpio_set_value_cansleep(CAM_CORE_EN, 0); @@ -2247,11 +2316,15 @@ struct platform_device msm8960_camera_se #ifdef CONFIG_ISX012 static struct msm_camera_sensor_flash_data flash_isx012 = { - .flash_type = MSM_CAMERA_FLASH_LED, +#if defined(CONFIG_MACH_KONA) + .flash_type = MSM_CAMERA_FLASH_NONE, +#else + .flash_type = MSM_CAMERA_FLASH_LED, +#endif }; static struct msm_camera_sensor_platform_info sensor_board_info_isx012 = { - .mount_angle = 90, + .mount_angle = 90, .sensor_reset = GPIO_CAM1_RST_N, #ifdef CONFIG_MACH_AEGIS2 .sensor_stby = PM8921_GPIO_PM_TO_SYS(PMIC_GPIO_MAIN_CAM_STBY), @@ -2357,9 +2430,12 @@ static struct msm_camera_sensor_flash_da static struct msm_camera_sensor_platform_info sensor_board_info_s5k5ccgx = { .sensor_reset = GPIO_CAM1_RST_N, -#ifdef CONFIG_MACH_JASPER +#if defined(CONFIG_MACH_JASPER) .mount_angle = 90, .sensor_stby = PM8921_GPIO_PM_TO_SYS(PMIC_GPIO_MAIN_CAM_STBY), +#elif defined(CONFIG_MACH_ESPRESSO_VZW) + .mount_angle = 90, + .sensor_stby = GPIO_MAIN_CAM_STBY, #else .mount_angle = 0, .sensor_stby = GPIO_MAIN_CAM_STBY, @@ -2394,7 +2470,7 @@ static struct msm_camera_sensor_flash_da }; static struct msm_camera_sensor_platform_info sensor_board_info_sr030pc50 = { -#if defined(CONFIG_MACH_ESPRESSO_VZW) || defined(CONFIG_MACH_ESPRESSO_ATT) \ +#if defined(CONFIG_MACH_ESPRESSO_ATT) \ || defined(CONFIG_MACH_ESPRESSO10_VZW) \ || defined(CONFIG_MACH_ESPRESSO10_SPR) \ || defined(CONFIG_MACH_ESPRESSO10_ATT) \ @@ -2628,7 +2704,11 @@ static ssize_t front_camera_type_show(st #elif defined(CONFIG_S5K6A3YX) char cam_type[] = "SLSI_S5K6A3YX\n"; #elif defined(CONFIG_DB8131M) +#if defined(CONFIG_MACH_INFINITE) + char cam_type[] = "DB8131A\n"; +#else char cam_type[] = "DUB_DB8131M\n"; +#endif #elif defined(CONFIG_SR030PC50) char cam_type[] = "SILICON_SR030PC50\n"; #else @@ -2669,7 +2749,11 @@ static ssize_t front_camera_firmware_sho #elif defined(CONFIG_S5K6A3YX) char *cam_fw[] = {"S5K6A3", "S5K6A3"}; /*char cam_fw[] = "S5K6A3YX\n";*/ #elif defined(CONFIG_DB8131M) +#if defined(CONFIG_MACH_INFINITE) + char cam_fw[] = "DB8131A\n"; +#else char cam_fw[] = "DB8131M\n"; +#endif #elif defined(CONFIG_SR030PC50) char cam_fw[] = "SR030PC50\n"; #else @@ -2763,6 +2847,56 @@ static ssize_t cameraflash_file_cmd_stor } #endif +#if defined(CONFIG_MACH_EXPRESS) + if (system_rev >= BOARD_REV05) { + if (value == 0) { + pr_err("[Torch flash]OFF\n"); + + gpio_set_value_cansleep(gpio_flash_en, 0); + + if ((system_rev == BOARD_REV05)\ + || (system_rev == BOARD_REV06)) + gpio_set_value_cansleep( + gpio_flash_set, 0); + + torchonoff = 0; + + } else { + pr_err("[Torch flash]ON\n"); + for (i = 1; i > 0; i--) { + gpio_set_value_cansleep( + gpio_flash_en, 0); + udelay(0); + gpio_set_value_cansleep( + gpio_flash_en, 1); + udelay(1); + } + torchonoff = 1; + } + } else { + if (value == 0) { + pr_err("[Torch flash]OFF\n"); + gpio_set_value_cansleep(gpio_flash_en, 0); + gpio_set_value_cansleep(gpio_flash_set, 0); + torchonoff = 0; + } else { + pr_err("[Torch flash]ON\n"); + gpio_set_value_cansleep( + gpio_flash_en, 0); + for (i = 5; i > 1; i--) { + gpio_set_value_cansleep( + gpio_flash_set, 1); + udelay(1); + gpio_set_value_cansleep( + gpio_flash_set, 0); + udelay(1); + } + gpio_set_value_cansleep(gpio_flash_set, 1); + usleep(2*1000); + torchonoff = 1; + } + } +#else if (value == 0) { pr_err("[Torch flash]OFF\n"); gpio_set_value_cansleep(gpio_flash_en, 0); @@ -2770,6 +2904,9 @@ static ssize_t cameraflash_file_cmd_stor torchonoff = 0; } else { pr_err("[Torch flash]ON\n"); +#if defined(CONFIG_MACH_INFINITE) + mdelay(5); +#endif gpio_set_value_cansleep(gpio_flash_en, 0); for (i = 5; i > 1; i--) { @@ -2785,6 +2922,7 @@ static ssize_t cameraflash_file_cmd_stor torchonoff = 1; } #endif +#endif return size; } @@ -2925,6 +3063,8 @@ static int get_mclk_rev(void) return ((system_rev >= BOARD_REV07) ? 1 : 0); #elif defined(CONFIG_MACH_JASPER) return ((system_rev >= BOARD_REV08) ? 1 : 0); +#elif defined(CONFIG_MACH_INFINITE) + return ((system_rev >= BOARD_REV04) ? 1 : 0); #elif defined(CONFIG_MACH_STRETTO) return 1; #elif defined(CONFIG_MACH_SUPERIORLTE_SKT) @@ -3070,6 +3210,15 @@ void __init msm8960_init_cam(void) gpio_tlmm_config(GPIO_CFG(GPIO_MSM_FLASH_NOW, 0, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_16MA), GPIO_CFG_ENABLE); #endif + +#if defined(CONFIG_MACH_INFINITE) + if (system_rev >= BOARD_REV04) { + gpio_tlmm_config(GPIO_CFG(GPIO_MSM_FLASH_CNTL_EN2, 0, + GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_16MA), + GPIO_CFG_ENABLE); + } +#endif + #endif /*CAM_MCLK0*/ @@ -3124,16 +3273,36 @@ void __init msm8960_init_cam(void) s_info = &msm_camera_sensor_isx012_data; if (rev) { -#if defined(CONFIG_MACH_APEXQ) || defined(CONFIG_MACH_COMANCHE) \ - || defined(CONFIG_MACH_EXPRESS) +#if defined(CONFIG_MACH_APEXQ) || defined(CONFIG_MACH_COMANCHE) + s_info->sensor_platform_info->flash_en = pmic_gpio_msm_flash_cntl_en; #elif defined(CONFIG_MACH_AEGIS2) s_info->sensor_platform_info->flash_set = GPIO_MSM_FLASH_NOW2; +#elif defined(CONFIG_MACH_EXPRESS) + if (system_rev >= BOARD_REV07) { + s_info->sensor_platform_info->flash_en = + GPIO_MSM_FLASH_NOW; + s_info->sensor_platform_info->flash_set = + -1; + } else{ + s_info->sensor_platform_info->flash_en = + pmic_gpio_msm_flash_cntl_en; + } +#elif defined(CONFIG_MACH_INFINITE) + s_info->sensor_platform_info->flash_set = + GPIO_MSM_FLASH_NOW; + if (system_rev >= BOARD_REV04) { + s_info->sensor_platform_info->flash_en = + GPIO_MSM_FLASH_CNTL_EN2; + } else { + s_info->sensor_platform_info->flash_en = + GPIO_MSM_FLASH_CNTL_EN; + } #endif } -#if defined(CONFIG_MACH_GOGH) || defined(CONFIG_MACH_INFINITE) +#if defined(CONFIG_MACH_GOGH) else { if (system_rev <= BOARD_REV02) { s_info->sensor_platform_info->flash_en = @@ -3157,7 +3326,7 @@ void __init msm8960_init_cam(void) #if defined(CONFIG_MACH_APEXQ) || defined(CONFIG_MACH_COMANCHE) \ || defined(CONFIG_MACH_EXPRESS) || defined(CONFIG_MACH_AEGIS2) \ - || defined(CONFIG_MACH_JASPER) + || defined(CONFIG_MACH_JASPER) || defined(CONFIG_MACH_INFINITE) if (rev) { s_info->sensor_platform_info->mclk = GPIO_CAM_MCLK2; --- a/arch/arm/mach-msm/board-8960-storage.c +++ b/arch/arm/mach-msm/board-8960-storage.c @@ -373,9 +373,8 @@ static struct mmc_platform_data msm8960_ #endif .xpc_cap = 1, .uhs_caps = (MMC_CAP_UHS_SDR12 | MMC_CAP_UHS_SDR25 | - MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_DDR50 | - MMC_CAP_UHS_SDR104 | MMC_CAP_MAX_CURRENT_600 | MMC_CAP_1_8V_DDR), - .msm_bus_voting_data = &sps_to_ddr_bus_voting_data, + MMC_CAP_MAX_CURRENT_600), + .msm_bus_voting_data = &sps_to_ddr_bus_voting_data, }; #endif --- a/arch/arm/mach-msm/board-8960.c +++ b/arch/arm/mach-msm/board-8960.c @@ -1346,7 +1346,7 @@ static struct msm_otg_platform_data msm_ static int wr_phy_init_seq[] = { 0x44, 0x80, /* set VBUS valid threshold and disconnect valid threshold */ - 0x38, 0x81, /* update DC voltage level */ + 0x68, 0x81, /* update DC voltage level */ 0x14, 0x82, /* set preemphasis and rise/fall time */ 0x13, 0x83, /* set source impedance adjusment */ -1}; @@ -1354,7 +1354,7 @@ static int wr_phy_init_seq[] = { static int liquid_v1_phy_init_seq[] = { 0x44, 0x80,/* set VBUS valid threshold and disconnect valid threshold */ - 0x3C, 0x81,/* update DC voltage level */ + 0x6C, 0x81,/* update DC voltage level */ 0x18, 0x82,/* set preemphasis and rise/fall time */ 0x23, 0x83,/* set source impedance sdjusment */ -1}; --- a/arch/arm/mach-msm/board-9615.c +++ b/arch/arm/mach-msm/board-9615.c @@ -290,7 +290,7 @@ free_usb_5v_en: static int shelby_phy_init_seq[] = { 0x44, 0x80,/* set VBUS valid threshold and disconnect valid threshold */ - 0x38, 0x81, /* update DC voltage level */ + 0x68, 0x81, /* update DC voltage level */ 0x14, 0x82,/* set preemphasis and rise/fall time */ 0x13, 0x83,/* set source impedance adjustment */ -1}; --- a/arch/arm/mach-msm/board-infinite.c +++ b/arch/arm/mach-msm/board-infinite.c @@ -1528,7 +1528,7 @@ static int is_sec_battery_using(void) int check_battery_type(void) { - return BATT_TYPE_INFINITE; + return BATT_TYPE_GOGH; } static struct sec_bat_platform_data sec_bat_pdata = { @@ -1537,20 +1537,20 @@ static struct sec_bat_platform_data sec_ .get_cable_type = msm8960_get_cable_type, .sec_battery_using = is_sec_battery_using, .check_batt_type = check_battery_type, - .iterm = 100, + .iterm = 150, .charge_duration = 8 * 60 * 60, .recharge_duration = 2 * 60 * 60, .max_voltage = 4350 * 1000, - .recharge_voltage = 4280 * 1000, + .recharge_voltage = 4300 * 1000, .event_block = 620, - .high_block = 470, - .high_recovery = 440, - .low_block = -40, - .low_recovery = 0, - .lpm_high_block = 450, - .lpm_high_recovery = 445, - .lpm_low_block = -30, - .lpm_low_recovery = -15, + .high_block = 620, + .high_recovery = 430, + .low_block = -60, + .low_recovery = -10, + .lpm_high_block = 455, + .lpm_high_recovery = 440, + .lpm_low_block = -60, + .lpm_low_recovery = -30, }; static struct platform_device sec_device_battery = { --- a/arch/arm/mach-msm/board-m2_dcm.c +++ b/arch/arm/mach-msm/board-m2_dcm.c @@ -137,6 +137,7 @@ #include #include #include +#include #include @@ -161,6 +162,10 @@ #ifdef CONFIG_SENSORS_CM36651 #include #endif +#ifdef CONFIG_REGULATOR_MAX8952 +#include +#include +#endif #ifdef CONFIG_VIBETONZ #include #endif @@ -310,9 +315,8 @@ static struct msm_gpiomux_config msm8960 }, }; - #define MSM_PMEM_ADSP_SIZE 0x9600000 /* 150 Mbytes */ -#define MSM_PMEM_ADSP_SIZE_FOR_2GB 0x9600000 /* 150 Mbytes */ +#define MSM_PMEM_ADSP_SIZE_FOR_2GB 0xA500000 /* 165 Mbytes */ #define MSM_PMEM_AUDIO_SIZE 0x160000 /* 1.375 Mbytes */ #define MSM_PMEM_SIZE 0x2800000 /* 40 Mbytes */ #define MSM_LIQUID_PMEM_SIZE 0x4000000 /* 64 Mbytes */ @@ -320,21 +324,30 @@ static struct msm_gpiomux_config msm8960 #ifdef CONFIG_MSM_MULTIMEDIA_USE_ION #define MSM_PMEM_KERNEL_EBI1_SIZE 0x280000 /* 2.5MB */ +#ifdef CONFIG_MSM_IOMMU +#define MSM_ION_MM_SIZE 0x3800000 +#define MSM_ION_SF_SIZE 0x0 +#define MSM_ION_SF_SIZE_FOR_2GB 0x0 +#define MSM_ION_QSECOM_SIZE 0x780000 /* (7.5MB) */ +#define MSM_ION_HEAP_NUM 7 +#else +#define MSM_ION_MM_SIZE MSM_PMEM_ADSP_SIZE #define MSM_ION_SF_SIZE 0x5000000 /* 80MB */ #define MSM_ION_SF_SIZE_FOR_2GB 0x6400000 /* 100MB */ -#define MSM_ION_MM_FW_SIZE 0x200000 /* (2MB) */ -#define MSM_ION_MM_SIZE MSM_PMEM_ADSP_SIZE #define MSM_ION_QSECOM_SIZE 0x1700000 /* (24MB) */ -#define MSM_ION_MFC_SIZE SZ_8K -#define MSM_ION_AUDIO_SIZE 0x1000 /* 4KB */ #define MSM_ION_HEAP_NUM 8 +#endif +#define MSM_ION_MM_FW_SIZE 0x200000 /* (2MB) */ +#define MSM_ION_MFC_SIZE SZ_8K +#define MSM_ION_AUDIO_SIZE MSM_PMEM_AUDIO_SIZE + #define MSM_LIQUID_ION_MM_SIZE (MSM_ION_MM_SIZE + 0x600000) #define MSM_LIQUID_ION_SF_SIZE MSM_LIQUID_PMEM_SIZE #define MSM_HDMI_PRIM_ION_SF_SIZE MSM_HDMI_PRIM_PMEM_SIZE -#define MSM8960_FIXED_AREA_START 0xad000000 +#define MSM8960_FIXED_AREA_START 0xb0000000 #define MAX_FIXED_AREA_SIZE 0x10000000 -#define MSM_MM_FW_SIZE 0x280000 +#define MSM_MM_FW_SIZE 0x200000 #define MSM8960_FW_START (MSM8960_FIXED_AREA_START - MSM_MM_FW_SIZE) static unsigned msm_ion_sf_size = MSM_ION_SF_SIZE; @@ -499,7 +512,7 @@ static void __init size_pmem_devices(voi if (!pmem_param_set) { if (machine_is_msm8960_liquid()) pmem_size = MSM_LIQUID_PMEM_SIZE; - if (hdmi_is_primary) + if (msm8960_hdmi_as_primary_selected()) pmem_size = MSM_HDMI_PRIM_PMEM_SIZE; } @@ -537,10 +550,12 @@ static int msm8960_paddr_to_memtype(unsi #ifdef CONFIG_MSM_MULTIMEDIA_USE_ION static struct ion_cp_heap_pdata cp_mm_ion_pdata = { .permission_type = IPT_TYPE_MM_CARVEOUT, - .align = PAGE_SIZE, + .align = SZ_64K, .reusable = FMEM_ENABLED, .mem_is_fmem = FMEM_ENABLED, .fixed_position = FIXED_MIDDLE, + .iommu_map_all = 1, + .iommu_2x_map_domain = VIDEO_DOMAIN, }; static struct ion_cp_heap_pdata cp_mfc_ion_pdata = { @@ -609,14 +624,16 @@ static struct ion_platform_data ion_pdat .memory_type = ION_EBI_TYPE, .extra_data = (void *) &cp_mfc_ion_pdata, }, +#ifndef CONFIG_MSM_IOMMU { .id = ION_SF_HEAP_ID, .type = ION_HEAP_TYPE_CARVEOUT, .name = ION_SF_HEAP_NAME, - .size = MSM_ION_SF_SIZE, + .size = MSM_ION_SF_SIZE_FOR_2GB, .memory_type = ION_EBI_TYPE, .extra_data = (void *) &co_ion_pdata, }, +#endif { .id = ION_IOMMU_HEAP_ID, .type = ION_HEAP_TYPE_IOMMU, @@ -663,10 +680,11 @@ static void __init adjust_mem_for_liquid if (machine_is_msm8960_liquid()) msm_ion_sf_size = MSM_LIQUID_ION_SF_SIZE; - if (hdmi_is_primary) + if (msm8960_hdmi_as_primary_selected()) msm_ion_sf_size = MSM_HDMI_PRIM_ION_SF_SIZE; - if (machine_is_msm8960_liquid() || hdmi_is_primary) { + if (machine_is_msm8960_liquid() || + msm8960_hdmi_as_primary_selected()) { for (i = 0; i < ion_pdata.nr; i++) { if (ion_pdata.heaps[i].id == ION_SF_HEAP_ID) { ion_pdata.heaps[i].size = @@ -730,6 +748,7 @@ static void __init reserve_ion_memory(vo fmem_pdata.size = 0; fmem_pdata.reserved_size_low = 0; fmem_pdata.reserved_size_high = 0; + fmem_pdata.align = PAGE_SIZE; fixed_low_size = 0; fixed_middle_size = 0; fixed_high_size = 0; @@ -755,7 +774,11 @@ static void __init reserve_ion_memory(vo } for (i = 0; i < ion_pdata.nr; ++i) { - struct ion_platform_heap *heap = &(ion_pdata.heaps[i]); + struct ion_platform_heap *heap = + &(ion_pdata.heaps[i]); + int align = SZ_4K; + int iommu_map_all = 0; + int adjacent_mem_id = INVALID_HEAP_ID; if (heap->extra_data) { int fixed_position = NOT_FIXED; @@ -774,17 +797,35 @@ static void __init reserve_ion_memory(vo heap->extra_data)->mem_is_fmem; fixed_position = ((struct ion_cp_heap_pdata *) heap->extra_data)->fixed_position; + align = ((struct ion_cp_heap_pdata *) + heap->extra_data)->align; + iommu_map_all = + ((struct ion_cp_heap_pdata *) + heap->extra_data)->iommu_map_all; break; case ION_HEAP_TYPE_CARVEOUT: mem_is_fmem = ((struct ion_co_heap_pdata *) heap->extra_data)->mem_is_fmem; fixed_position = ((struct ion_co_heap_pdata *) heap->extra_data)->fixed_position; + adjacent_mem_id = ((struct ion_co_heap_pdata *) + heap->extra_data)->adjacent_mem_id; break; default: break; } + if (iommu_map_all) { + if (heap->size & (SZ_64K-1)) { + heap->size = ALIGN(heap->size, SZ_64K); + pr_info("Heap %s not aligned to 64K. Adjusting size to %x\n", + heap->name, heap->size); + } + } + + if (mem_is_fmem && adjacent_mem_id != INVALID_HEAP_ID) + fmem_pdata.align = align; + if (fixed_position != NOT_FIXED) fixed_size += heap->size; else @@ -1005,7 +1046,7 @@ static void __init msm8960_reserve(void) pr_info("fmem start %lx (fixed) size %lx\n", fmem_pdata.phys, fmem_pdata.size); #else - fmem_pdata.phys = reserve_memory_for_fmem(fmem_pdata.size); + fmem_pdata.phys = reserve_memory_for_fmem(fmem_pdata.size, fmem_pdata.align); #endif } @@ -1467,6 +1508,13 @@ static void fsa9485_smartdock_cb(bool at msm_otg_set_smartdock_state(attached); } +static void fsa9485_audio_dock_cb(bool attached) +{ + pr_info("fsa9485_audio_dock_cb attached %d\n", attached); + + msm_otg_set_smartdock_state(attached); +} + static int fsa9485_dock_init(void) { int ret; @@ -1555,6 +1603,7 @@ static struct fsa9485_platform_data fsa9 .dock_init = fsa9485_dock_init, .usb_cdp_cb = fsa9485_usb_cdp_cb, .smartdock_cb = fsa9485_smartdock_cb, + .audio_dock_cb = fsa9485_audio_dock_cb, }; static struct i2c_board_info micro_usb_i2c_devices_info[] __initdata = { @@ -1783,14 +1832,12 @@ static void smb347_wireless_cb(void) void smb347_hw_init(void) { - struct pm_gpio batt_int_param = { .direction = PM_GPIO_DIR_IN, .pull = PM_GPIO_PULL_NO, .vin_sel = PM_GPIO_VIN_S4, .function = PM_GPIO_FUNC_NORMAL, }; - int rc = 0; gpio_tlmm_config(GPIO_CFG(GPIO_INOK_INT, 0, GPIO_CFG_INPUT, @@ -2499,6 +2546,7 @@ static void cm36651_led_onoff(int onoff) if (rc) pr_err("%s: error reg_8921_leda setting ret=%d\n", __func__, rc); + return; } if (onoff) { @@ -2566,7 +2614,6 @@ err_alloc_data_failed: static struct a2220_platform_data a2220_data = { .a2220_hw_init = a2220_hw_init, .gpio_reset = MSM_AUD_A2220_RESET, - .gpio_wakeup = MSM_AUD_A2220_WAKEUP, }; static struct i2c_board_info a2220_device[] __initdata = { @@ -2577,8 +2624,6 @@ static struct i2c_board_info a2220_devic }; static struct i2c_gpio_platform_data a2220_i2c_gpio_data = { - .sda_pin = GPIO_A2220_I2C_SDA, - .scl_pin = GPIO_A2220_I2C_SCL, .udelay = 1, }; @@ -3954,7 +3999,7 @@ static struct i2c_board_info sii_device_ }; static struct msm_i2c_platform_data msm8960_i2c_qup_gsbi4_pdata = { - .clk_freq = 100000, + .clk_freq = 400000, .src_clk_rate = 24000000, }; @@ -4024,6 +4069,7 @@ static struct spi_board_info spi_board_i }, }; #endif + static struct msm_pm_sleep_status_data msm_pm_slp_sts_data = { .base_addr = MSM_ACC0_BASE + 0x08, .cpu_offset = MSM_ACC1_BASE - MSM_ACC0_BASE, @@ -4455,6 +4501,7 @@ static struct platform_device *m2_dcm_de &msm_8960_q6_mss_sw, &msm_8960_riva, &msm_pil_tzapps, + &msm_pil_vidc, &msm8960_device_otg, &msm8960_device_gadget_peripheral, &msm_device_hsusb_host, @@ -4583,17 +4630,11 @@ static struct msm_cpuidle_state msm_csta {0, 0, "C0", "WFI", MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT}, - {0, 1, "C1", "STANDALONE_POWER_COLLAPSE", - MSM_PM_SLEEP_MODE_POWER_COLLAPSE_STANDALONE}, - - {0, 2, "C2", "POWER_COLLAPSE", + {0, 1, "C2", "POWER_COLLAPSE", MSM_PM_SLEEP_MODE_POWER_COLLAPSE}, {1, 0, "C0", "WFI", MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT}, - - {1, 1, "C1", "STANDALONE_POWER_COLLAPSE", - MSM_PM_SLEEP_MODE_POWER_COLLAPSE_STANDALONE}, }; static struct msm_pm_platform_data msm_pm_data[MSM_PM_SLEEP_MODE_NR * 2] = { @@ -4604,13 +4645,6 @@ static struct msm_pm_platform_data msm_p .suspend_enabled = 0, }, - [MSM_PM_MODE(0, MSM_PM_SLEEP_MODE_POWER_COLLAPSE_STANDALONE)] = { - .idle_supported = 1, - .suspend_supported = 1, - .idle_enabled = 0, - .suspend_enabled = 0, - }, - [MSM_PM_MODE(0, MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT)] = { .idle_supported = 1, .suspend_supported = 1, @@ -4625,13 +4659,6 @@ static struct msm_pm_platform_data msm_p .suspend_enabled = 0, }, - [MSM_PM_MODE(1, MSM_PM_SLEEP_MODE_POWER_COLLAPSE_STANDALONE)] = { - .idle_supported = 1, - .suspend_supported = 1, - .idle_enabled = 0, - .suspend_enabled = 0, - }, - [MSM_PM_MODE(1, MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT)] = { .idle_supported = 1, .suspend_supported = 0, @@ -4649,10 +4676,10 @@ static struct msm_rpmrs_level msm_rpmrs_ }, { - MSM_PM_SLEEP_MODE_POWER_COLLAPSE_STANDALONE, - MSM_RPMRS_LIMITS(ON, ACTIVE, MAX, ACTIVE), - true, - 2000, 200, 576000, 2000, + MSM_PM_SLEEP_MODE_POWER_COLLAPSE, + MSM_RPMRS_LIMITS(ON, GDHS, MAX, ACTIVE), + false, + 8500, 51, 1122000, 8500, }, { @@ -4661,7 +4688,6 @@ static struct msm_rpmrs_level msm_rpmrs_ false, 9000, 51, 1130300, 9000, }, - { MSM_PM_SLEEP_MODE_POWER_COLLAPSE, MSM_RPMRS_LIMITS(ON, HSFS_OPEN, ACTIVE, RET_HIGH), @@ -4671,6 +4697,13 @@ static struct msm_rpmrs_level msm_rpmrs_ { MSM_PM_SLEEP_MODE_POWER_COLLAPSE, + MSM_RPMRS_LIMITS(OFF, GDHS, MAX, ACTIVE), + false, + 12000, 14, 2205900, 12000, + }, + + { + MSM_PM_SLEEP_MODE_POWER_COLLAPSE, MSM_RPMRS_LIMITS(OFF, HSFS_OPEN, MAX, ACTIVE), false, 18000, 12, 2364250, 18000, @@ -4768,6 +4801,43 @@ static struct i2c_board_info msm_camera_ }; #endif +/*Gopal: add for D2_DCM CAM_ISP_CORE power setting by MAX8952*/ +#ifdef CONFIG_REGULATOR_MAX8952 +static int max8952_is_used(void) +{ + if (system_rev >= 0x3) + return 1; + else + return 0; +} + +static struct regulator_consumer_supply max8952_consumer = + REGULATOR_SUPPLY("cam_isp_core", NULL); + +static struct max8952_platform_data m2_dcm_max8952_pdata = { + .gpio_vid0 = -1, /* NOT controlled by GPIO, HW default high*/ + .gpio_vid1 = -1, /* NOT controlled by GPIO, HW default high*/ + .gpio_en = CAM_CORE_EN, /*Controlled by GPIO, High enable */ + .default_mode = 3, /* vid0 = 1, vid1 = 1 */ + .dvs_mode = { 33, 33, 33, 43 }, /* 1.1V, 1.1V, 1.1V, 1.2V*/ + .sync_freq = 0, /* default: fastest */ + .ramp_speed = 0, /* default: fastest */ + .reg_data = { + .constraints = { + .name = "CAM_ISP_CORE", + .min_uV = 770000, + .max_uV = 1400000, + .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | + REGULATOR_CHANGE_STATUS, + .always_on = 0, + .boot_on = 0, + }, + .num_consumer_supplies = 1, + .consumer_supplies = &max8952_consumer, + }, +}; +#endif /*CONFIG_REGULATOR_MAX8952*/ + #ifdef CONFIG_SAMSUNG_CMC624 static struct i2c_board_info cmc624_i2c_borad_info[] = { { @@ -4776,6 +4846,19 @@ static struct i2c_board_info cmc624_i2c_ }; #endif +#ifdef CONFIG_REGULATOR_MAX8952 +static struct i2c_board_info cmc624_max8952_i2c_borad_info[] = { + { + I2C_BOARD_INFO("cmc624", 0x38), + }, + + { + I2C_BOARD_INFO("max8952", 0xC0>>1), + .platform_data = &m2_dcm_max8952_pdata, + }, +}; +#endif /*CONFIG_REGULATOR_MAX8952*/ + /* Sensors DSPS platform data */ #ifdef CONFIG_MSM_DSPS #define DSPS_PIL_GENERIC_NAME "dsps" @@ -4973,6 +5056,15 @@ static void __init register_i2c_devices( u8 mach_mask = 0; int i; +#ifdef CONFIG_REGULATOR_MAX8952 +struct i2c_registry cmc624_max8952_i2c_devices = { + I2C_SURF | I2C_FFA | I2C_FLUID , + MSM_CMC624_I2C_BUS_ID, + cmc624_max8952_i2c_borad_info, + ARRAY_SIZE(cmc624_max8952_i2c_borad_info), + }; +#endif /*CONFIG_REGULATOR_MAX8952*/ + #ifdef CONFIG_BATTERY_MAX17040 struct i2c_registry msm8960_fg_i2c_devices = { I2C_SURF | I2C_FFA | I2C_FLUID, @@ -5016,6 +5108,17 @@ static void __init register_i2c_devices( msm8960_i2c_devices[i].len); } +#ifdef CONFIG_SAMSUNG_CMC624 +#ifdef CONFIG_REGULATOR_MAX8952 + if (max8952_is_used()) { + m2_dcm_max8952_pdata.gpio_en = gpio_rev(CAM_CORE_EN); + i2c_register_board_info(cmc624_max8952_i2c_devices.bus, + cmc624_max8952_i2c_devices.info, + cmc624_max8952_i2c_devices.len); + } +#endif /*CONFIG_REGULATOR_MAX8952*/ +#endif /*CONFIG_SAMSUNG_CMC624*/ + #if defined(CONFIG_BATTERY_MAX17040) if (!is_smb347_using()) { i2c_register_board_info(msm8960_fg_i2c_devices.bus, @@ -5127,12 +5230,23 @@ static int secjack_gpio_init() pr_err("%s PMIC_GPIO_SHORT_SENDEND config failed\n", __func__); return rc; } + rc = gpio_request( + PM8921_GPIO_PM_TO_SYS(PMIC_GPIO_EAR_MICBIAS_EN), + "EAR_MICBIAS"); + if (rc) { + pr_err("failed to request ear micbias gpio\n"); + gpio_free(PM8921_GPIO_PM_TO_SYS(PMIC_GPIO_EAR_MICBIAS_EN)); + return rc; + } rc = pm8xxx_gpio_config( PM8921_GPIO_PM_TO_SYS(PMIC_GPIO_EAR_MICBIAS_EN), &ear_micbiase); if (rc) { pr_err("%s PMIC_GPIO_EAR_MICBIAS_EN config failed\n", __func__); return rc; + } else { + gpio_direction_output(PM8921_GPIO_PM_TO_SYS( + PMIC_GPIO_EAR_MICBIAS_EN), 0); } return rc; --- a/arch/arm/mach-msm/board-m2_spr.c +++ b/arch/arm/mach-msm/board-m2_spr.c @@ -1785,10 +1785,23 @@ static struct sec_bat_platform_data sec_ .get_cable_type = msm8960_get_cable_type, .sec_battery_using = is_sec_battery_using, .check_batt_type = check_battery_type, - .iterm = 100, .charge_duration = 8 * 60 * 60, .recharge_duration = 2 * 60 * 60, .max_voltage = 4350 * 1000, +#if defined(_d2spi_) + .iterm = 150, + .recharge_voltage = 4300 * 1000, + .event_block = 580, + .high_block = 580, + .high_recovery = 440, + .low_block = -40, + .low_recovery = -5, + .lpm_high_block = 580, + .lpm_high_recovery = 440, + .lpm_low_block = -40, + .lpm_low_recovery = -5, +#else + .iterm = 100, .recharge_voltage = 4280 * 1000, .event_block = 600, .high_block = 450, @@ -1799,6 +1812,7 @@ static struct sec_bat_platform_data sec_ .lpm_high_recovery = 435, .lpm_low_block = 0, .lpm_low_recovery = 15, +#endif .wpc_charging_current = 500, }; --- a/arch/arm/mach-msm/board-m2_vzw.c +++ b/arch/arm/mach-msm/board-m2_vzw.c @@ -1813,26 +1813,49 @@ static struct sec_bat_platform_data sec_ .get_cable_type = msm8960_get_cable_type, .sec_battery_using = is_sec_battery_using, .check_batt_type = check_battery_type, - .iterm = 100, .charge_duration = 8 * 60 * 60, .recharge_duration = 2 * 60 * 60, .max_voltage = 4350 * 1000, +#if defined(_d2mtr_) || defined(_d2cri_) + .iterm = 150, + .recharge_voltage = 4300 * 1000, +#else + .iterm = 100, .recharge_voltage = 4280 * 1000, - .event_block = 600, +#endif + #if defined(_d2usc_) + .event_block = 600, .high_block = 600, + .high_recovery = 440, + .low_block = -50, + .low_recovery = -10, .lpm_high_block = 600, -#else + .lpm_high_recovery = 440, + .lpm_low_block = -40, + .lpm_low_recovery = -10, +#elif defined(_d2mtr_) || defined(_d2cri_) + .event_block = 610, + .high_block = 610, + .high_recovery = 440, + .low_block = -40, + .low_recovery = -5, + .lpm_high_block = 610, + .lpm_high_recovery = 440, + .lpm_low_block = -40, + .lpm_low_recovery = -5, +#else /* _d2vzw_ */ + .event_block = 600, .high_block = 510, - .lpm_high_block = 470, -#endif .high_recovery = 440, .high_recovery_wpc = 490, .low_block = -50, .low_recovery = -10, + .lpm_high_block = 470, .lpm_high_recovery = 440, .lpm_low_block = -40, .lpm_low_recovery = -10, +#endif .wpc_charging_current = 700, }; --- a/arch/arm/mach-msm/board-mms-tsp.c +++ b/arch/arm/mach-msm/board-mms-tsp.c @@ -337,7 +337,7 @@ static struct mms_ts_platform_data mms_t .max_x = 720, .max_y = 1280, .gpio_lcd_type = GPIO_LCD_TYPE, - .config_fw_version = "I747_Me_0507", + .config_fw_version = "I747_Me_0924", .register_cb = melfas_register_callback, #endif .mux_fw_flash = melfas_mux_fw_flash, --- a/arch/arm/mach-msm/board-msm7x30.c +++ b/arch/arm/mach-msm/board-msm7x30.c @@ -104,11 +104,18 @@ * res V4L2 video overlay - i.e. 1280x720x1.5x2 */ #define MSM_V4L2_VIDEO_OVERLAY_BUF_SIZE 2764800 -#define MSM_PMEM_ADSP_SIZE 0x1E00000 +#define MSM_PMEM_ADSP_SIZE 0x2184000 #define MSM_FLUID_PMEM_ADSP_SIZE 0x2800000 #define PMEM_KERNEL_EBI0_SIZE 0x600000 #define MSM_PMEM_AUDIO_SIZE 0x200000 +#ifdef CONFIG_ION_MSM +static struct platform_device ion_dev; +#define MSM_ION_AUDIO_SIZE (MSM_PMEM_AUDIO_SIZE + PMEM_KERNEL_EBI0_SIZE) +#define MSM_ION_SF_SIZE MSM_PMEM_SF_SIZE +#define MSM_ION_HEAP_NUM 4 +#endif + #define PMIC_GPIO_INT 27 #define PMIC_VREG_WLAN_LEVEL 2900 #define PMIC_GPIO_SD_DET 36 @@ -1204,7 +1211,7 @@ static struct platform_device msm_camera #ifdef CONFIG_VX6953 static struct msm_camera_sensor_platform_info vx6953_sensor_7630_info = { - .mount_angle = 0 + .mount_angle = 180 }; static struct msm_camera_sensor_flash_data flash_vx6953 = { @@ -4507,6 +4514,7 @@ static int lcdc_panel_power(int on) if (unlikely(!lcdc_power_initialized)) { quickvx_mddi_client = 0; + regulator_put(mddi_ldo20); display_common_init(); lcdc_power_initialized = 1; } @@ -4999,7 +5007,7 @@ static int bluetooth_power(int on) int bahama_not_marimba = bahama_present(); - if (bahama_not_marimba == -1) { + if (bahama_not_marimba < 0) { printk(KERN_WARNING "%s: bahama_present: %d\n", __func__, bahama_not_marimba); return -ENODEV; @@ -5286,7 +5294,10 @@ static struct platform_device *devices[] &msm_batt_device, &msm_adc_device, &msm_ebi0_thermal, - &msm_ebi1_thermal + &msm_ebi1_thermal, +#ifdef CONFIG_ION_MSM + &ion_dev, +#endif }; static struct msm_gpio msm_i2c_gpios_hw[] = { @@ -6960,6 +6971,65 @@ static int __init pmem_kernel_ebi0_size_ } early_param("pmem_kernel_ebi0_size", pmem_kernel_ebi0_size_setup); +#ifdef CONFIG_ION_MSM +#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION +static struct ion_co_heap_pdata co_ion_pdata = { + .adjacent_mem_id = INVALID_HEAP_ID, + .align = PAGE_SIZE, +}; +#endif + +/** + * These heaps are listed in the order they will be allocated. + * Don't swap the order unless you know what you are doing! + */ +static struct ion_platform_data ion_pdata = { + .nr = MSM_ION_HEAP_NUM, + .heaps = { + { + .id = ION_SYSTEM_HEAP_ID, + .type = ION_HEAP_TYPE_SYSTEM, + .name = ION_VMALLOC_HEAP_NAME, + }, +#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION + /* PMEM_ADSP = CAMERA */ + { + .id = ION_CAMERA_HEAP_ID, + .type = ION_HEAP_TYPE_CARVEOUT, + .name = ION_CAMERA_HEAP_NAME, + .memory_type = ION_EBI_TYPE, + .has_outer_cache = 1, + .extra_data = (void *)&co_ion_pdata, + }, + /* PMEM_AUDIO */ + { + .id = ION_AUDIO_HEAP_ID, + .type = ION_HEAP_TYPE_CARVEOUT, + .name = ION_AUDIO_HEAP_NAME, + .memory_type = ION_EBI_TYPE, + .has_outer_cache = 1, + .extra_data = (void *)&co_ion_pdata, + }, + /* PMEM_MDP = SF */ + { + .id = ION_SF_HEAP_ID, + .type = ION_HEAP_TYPE_CARVEOUT, + .name = ION_SF_HEAP_NAME, + .memory_type = ION_EBI_TYPE, + .has_outer_cache = 1, + .extra_data = (void *)&co_ion_pdata, + }, +#endif + } +}; + +static struct platform_device ion_dev = { + .name = "ion-msm", + .id = 1, + .dev = { .platform_data = &ion_pdata }, +}; +#endif + static struct memtype_reserve msm7x30_reserve_table[] __initdata = { [MEMTYPE_SMI] = { }, @@ -6971,40 +7041,79 @@ static struct memtype_reserve msm7x30_re }, }; -static void __init size_pmem_devices(void) -{ -#ifdef CONFIG_ANDROID_PMEM - unsigned long size; +unsigned long size; +unsigned long msm_ion_camera_size; +static void fix_sizes(void) +{ if machine_is_msm7x30_fluid() size = fluid_pmem_adsp_size; else size = pmem_adsp_size; + +#ifdef CONFIG_ION_MSM + msm_ion_camera_size = size; +#endif +} + +static void __init size_pmem_devices(void) +{ +#ifdef CONFIG_ANDROID_PMEM +#ifndef CONFIG_MSM_MULTIMEDIA_USE_ION + android_pmem_adsp_pdata.size = size; android_pmem_audio_pdata.size = pmem_audio_size; android_pmem_pdata.size = pmem_sf_size; #endif +#endif } +#ifdef CONFIG_ANDROID_PMEM +#ifndef CONFIG_MSM_MULTIMEDIA_USE_ION static void __init reserve_memory_for(struct android_pmem_platform_data *p) { msm7x30_reserve_table[p->memory_type].size += p->size; } +#endif +#endif static void __init reserve_pmem_memory(void) { #ifdef CONFIG_ANDROID_PMEM +#ifndef CONFIG_MSM_MULTIMEDIA_USE_ION reserve_memory_for(&android_pmem_adsp_pdata); reserve_memory_for(&android_pmem_audio_pdata); reserve_memory_for(&android_pmem_pdata); msm7x30_reserve_table[MEMTYPE_EBI0].size += pmem_kernel_ebi0_size; #endif +#endif +} + +static void __init size_ion_devices(void) +{ +#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION + ion_pdata.heaps[1].size = msm_ion_camera_size; + ion_pdata.heaps[2].size = MSM_ION_AUDIO_SIZE; + ion_pdata.heaps[3].size = MSM_ION_SF_SIZE; +#endif +} + +static void __init reserve_ion_memory(void) +{ +#if defined(CONFIG_ION_MSM) && defined(CONFIG_MSM_MULTIMEDIA_USE_ION) + msm7x30_reserve_table[MEMTYPE_EBI0].size += msm_ion_camera_size; + msm7x30_reserve_table[MEMTYPE_EBI0].size += MSM_ION_AUDIO_SIZE; + msm7x30_reserve_table[MEMTYPE_EBI0].size += MSM_ION_SF_SIZE; +#endif } static void __init msm7x30_calculate_reserve_sizes(void) { + fix_sizes(); size_pmem_devices(); reserve_pmem_memory(); + size_ion_devices(); + reserve_ion_memory(); } static int msm7x30_paddr_to_memtype(unsigned int paddr) --- a/arch/arm/mach-msm/devices-8960.c +++ b/arch/arm/mach-msm/devices-8960.c @@ -1692,8 +1692,13 @@ static struct resource resources_qup_spi /*test: Qualcomm, DMA SPI, start */ { .name = "spidm_channels", +#ifdef CONFIG_MACH_M2_ATT + .start = 3, + .end = 4, +#else .start = 9, .end = 10, +#endif .flags = IORESOURCE_DMA, }, { --- a/arch/arm/mach-msm/include/mach/board.h +++ b/arch/arm/mach-msm/include/mach/board.h @@ -495,6 +495,7 @@ struct msm_vidc_platform_data { struct msm_bus_scale_pdata *vidc_bus_client_pdata; #endif int disable_turbo; + int cont_mode_dpb_count; }; #if defined(CONFIG_USB_PEHCI_HCD) || defined(CONFIG_USB_PEHCI_HCD_MODULE) --- a/arch/arm/mach-msm/include/mach/camera.h +++ b/arch/arm/mach-msm/include/mach/camera.h @@ -458,6 +458,8 @@ struct msm_sync { spinlock_t abort_pict_lock; int snap_count; int thumb_count; + + uint32_t focus_state; }; #define MSM_APPS_ID_V4L2 "msm_v4l2" --- a/arch/arm/mach-msm/include/mach/qdsp5v2/codec_utils.h +++ b/arch/arm/mach-msm/include/mach/qdsp5v2/codec_utils.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2010, Code Aurora Forum. All rights reserved. +/* Copyright (c) 2010, 2012, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -122,7 +122,8 @@ struct audio { uint64_t bytecount_given; uint64_t bytecount_query; - struct list_head pmem_region_queue; /* protected by lock */ + struct list_head ion_region_queue; /* protected by lock */ + struct ion_client *client; int eq_enable; int eq_needs_commit; --- a/arch/arm/mach-msm/include/mach/sec_debug.h +++ b/arch/arm/mach-msm/include/mach/sec_debug.h @@ -524,4 +524,8 @@ extern void sec_debug_set_qc_dload_magic extern uint32_t global_pvs; #endif +#ifdef CONFIG_SEC_DEBUG_DOUBLE_FREE +extern void *kfree_hook(void *p, void *caller); +#endif + #endif /* SEC_DEBUG_H */ --- a/arch/arm/mach-msm/qdsp5/adsp.c +++ b/arch/arm/mach-msm/qdsp5/adsp.c @@ -713,11 +713,22 @@ static void handle_adsp_rtos_mtoa_app(st mutex_lock(&module->lock); switch (event) { case RPC_ADSP_RTOS_MOD_READY: - MM_INFO("module %s: READY\n", module->name); - module->state = ADSP_STATE_ENABLED; - wake_up(&module->state_wait); - adsp_set_image(module->info, image); - break; + if (module->state == ADSP_STATE_ENABLING) { + MM_INFO("module %s: READY\n", module->name); + module->state = ADSP_STATE_ENABLED; + wake_up(&module->state_wait); + adsp_set_image(module->info, image); + break; + } else { + MM_ERR("module %s got READY event in state[%d]\n", + module->name, + module->state); + rpc_send_accepted_void_reply(rpc_cb_server_client, + req->xid, + RPC_ACCEPTSTAT_GARBAGE_ARGS); + mutex_unlock(&module->lock); + return; + } case RPC_ADSP_RTOS_MOD_DISABLE: MM_INFO("module %s: DISABLED\n", module->name); module->state = ADSP_STATE_DISABLED; --- a/arch/arm/mach-msm/qdsp5/audio_mp3.c +++ b/arch/arm/mach-msm/qdsp5/audio_mp3.c @@ -2289,7 +2289,10 @@ static int audio_open(struct inode *inod if (rc) { MM_ERR("audmgr open failed, freeing instance \ 0x%08x\n", (int)audio); - goto err; + if (!(file->f_flags & O_NONBLOCK)) + goto err; + else + goto resource_err; } } @@ -2301,7 +2304,10 @@ static int audio_open(struct inode *inod audio->module_name, (int)audio); if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) audmgr_close(&audio->audmgr); - goto err; + if (!(file->f_flags & O_NONBLOCK)) + goto err; + else + goto resource_err; } rc = rmt_get_resource(audio); @@ -2311,7 +2317,10 @@ static int audio_open(struct inode *inod if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) audmgr_close(&audio->audmgr); msm_adsp_put(audio->audplay); - goto err; + if (!(file->f_flags & O_NONBLOCK)) + goto err; + else + goto resource_err; } if (file->f_flags & O_NONBLOCK) { @@ -2401,6 +2410,7 @@ output_buff_get_phys_error: output_buff_alloc_error: ion_client_destroy(client); client_create_error: +resource_err: audpp_adec_free(audio->dec_id); kfree(audio); return rc; --- a/arch/arm/mach-msm/qdsp5v2/audio_a2dp_in.c +++ b/arch/arm/mach-msm/qdsp5v2/audio_a2dp_in.c @@ -5,6 +5,7 @@ * * Copyright (C) 2008 HTC Corporation * Copyright (C) 2008 Google, Inc. + * Copyright (c) 2012 The Linux Foundation. All rights reserved. * * All source code in this file is licensed under the following license except * where indicated. @@ -34,7 +35,7 @@ #include #include #include -#include +#include #include #include @@ -116,6 +117,8 @@ struct audio_a2dp_in { int stopped; /* set when stopped, cleared on flush */ int abort; /* set when error, like sample rate mismatch */ char *build_id; + struct ion_client *client; + struct ion_handle *output_buff_handle; }; static struct audio_a2dp_in the_audio_a2dp_in; @@ -849,10 +852,11 @@ static int auda2dp_in_release(struct ino audio->audrec = NULL; audio->opened = 0; if (audio->data) { - msm_subsystem_unmap_buffer(audio->msm_map); - free_contiguous_memory_by_paddr(audio->phys); + ion_unmap_kernel(audio->client, audio->output_buff_handle); + ion_free(audio->client, audio->output_buff_handle); audio->data = NULL; } + ion_client_destroy(audio->client); mutex_unlock(&audio->lock); return 0; } @@ -862,6 +866,11 @@ static int auda2dp_in_open(struct inode struct audio_a2dp_in *audio = &the_audio_a2dp_in; int rc; int encid; + int len = 0; + unsigned long ionflag = 0; + ion_phys_addr_t addr = 0; + struct ion_handle *handle = NULL; + struct ion_client *client = NULL; mutex_lock(&audio->lock); if (audio->opened) { @@ -869,24 +878,56 @@ static int auda2dp_in_open(struct inode goto done; } - audio->phys = allocate_contiguous_ebi_nomap(DMASZ, SZ_4K); - if (audio->phys) { - audio->msm_map = msm_subsystem_map_buffer( - audio->phys, DMASZ, - MSM_SUBSYSTEM_MAP_KADDR, NULL, 0); - if (IS_ERR(audio->msm_map)) { - MM_ERR("could not map the phys address to kernel" - "space\n"); - rc = -ENOMEM; - free_contiguous_memory_by_paddr(audio->phys); - goto done; - } - audio->data = (u8 *)audio->msm_map->vaddr; + client = msm_ion_client_create(UINT_MAX, "Audio_a2dp_in_client"); + if (IS_ERR_OR_NULL(client)) { + MM_ERR("Unable to create ION client\n"); + rc = -ENOMEM; + goto client_create_error; + } + audio->client = client; + + MM_DBG("allocating mem sz = %d\n", DMASZ); + handle = ion_alloc(client, DMASZ, SZ_4K, + ION_HEAP(ION_AUDIO_HEAP_ID)); + if (IS_ERR_OR_NULL(handle)) { + MM_ERR("Unable to create allocate O/P buffers\n"); + rc = -ENOMEM; + goto output_buff_alloc_error; + } + + audio->output_buff_handle = handle; + + rc = ion_phys(client , handle, &addr, &len); + if (rc) { + MM_ERR("O/P buffers:Invalid phy: %x sz: %x\n", + (unsigned int) addr, (unsigned int) len); + rc = -ENOMEM; + goto output_buff_get_phys_error; } else { - MM_ERR("could not allocate DMA buffers\n"); + MM_INFO("O/P buffers:valid phy: %x sz: %x\n", + (unsigned int) addr, (unsigned int) len); + } + audio->phys = (int32_t)addr; + + rc = ion_handle_get_flags(client, handle, &ionflag); + if (rc) { + MM_ERR("could not get flags for the handle\n"); rc = -ENOMEM; - goto done; + goto output_buff_get_flags_error; } + + audio->msm_map = ion_map_kernel(client, handle, ionflag); + if (IS_ERR(audio->data)) { + MM_ERR("could not map read buffers,freeing instance 0x%08x\n", + (int)audio); + rc = -ENOMEM; + goto output_buff_map_error; + } + MM_DBG("read buf: phy addr 0x%08x kernel addr 0x%08x\n", + audio->phys, (int)audio->data); + + audio->data = (char *)audio->msm_map; + MM_DBG("Memory addr = 0x%8x phy addr = 0x%8x\n",\ (int) audio->data, (int) audio->phys); @@ -956,6 +997,13 @@ done: mutex_unlock(&audio->lock); return rc; evt_error: +output_buff_map_error: +output_buff_get_phys_error: +output_buff_get_flags_error: + ion_free(client, audio->output_buff_handle); +output_buff_alloc_error: + ion_client_destroy(client); +client_create_error: msm_adsp_put(audio->audrec); audpreproc_aenc_free(audio->enc_id); mutex_unlock(&audio->lock); --- a/arch/arm/mach-msm/qdsp5v2/audio_amrnb_in.c +++ b/arch/arm/mach-msm/qdsp5v2/audio_amrnb_in.c @@ -27,7 +27,7 @@ #include #include #include -#include +#include #include #include @@ -106,6 +106,8 @@ struct audio_in { int running; int stopped; /* set when stopped, cleared on flush */ char *build_id; + struct ion_client *client; + struct ion_handle *buff_handle; }; struct audio_frame { @@ -767,8 +769,9 @@ static int audamrnb_in_release(struct in audio->audrec = NULL; audio->opened = 0; if (audio->data) { - msm_subsystem_unmap_buffer(audio->map_v_read); - free_contiguous_memory_by_paddr(audio->phys); + ion_unmap_kernel(audio->client, audio->buff_handle); + ion_free(audio->client, audio->buff_handle); + ion_client_destroy(audio->client); audio->data = NULL; } mutex_unlock(&audio->lock); @@ -780,29 +783,62 @@ static int audamrnb_in_open(struct inode struct audio_in *audio = &the_audio_amrnb_in; int rc; int encid; + int len = 0; + unsigned long ionflag = 0; + ion_phys_addr_t addr = 0; + struct ion_handle *handle = NULL; + struct ion_client *client = NULL; mutex_lock(&audio->lock); if (audio->opened) { rc = -EBUSY; goto done; } - audio->phys = allocate_contiguous_ebi_nomap(DMASZ, SZ_4K); - if (audio->phys) { - audio->map_v_read = msm_subsystem_map_buffer( - audio->phys, DMASZ, - MSM_SUBSYSTEM_MAP_KADDR, NULL, 0); - if (IS_ERR(audio->map_v_read)) { - MM_ERR("could not map DMA buffers\n"); - rc = -ENOMEM; - free_contiguous_memory_by_paddr(audio->phys); - goto done; - } - audio->data = audio->map_v_read->vaddr; + + client = msm_ion_client_create(UINT_MAX, "Audio_AMR_In_Client"); + if (IS_ERR_OR_NULL(client)) { + MM_ERR("Unable to create ION client\n"); + rc = -ENOMEM; + goto client_create_error; + } + audio->client = client; + + handle = ion_alloc(client, DMASZ, SZ_4K, + ION_HEAP(ION_AUDIO_HEAP_ID)); + if (IS_ERR_OR_NULL(handle)) { + MM_ERR("Unable to create allocate O/P buffers\n"); + rc = -ENOMEM; + goto buff_alloc_error; + } + audio->buff_handle = handle; + + rc = ion_phys(client, handle, &addr, &len); + if (rc) { + MM_ERR("O/P buffers:Invalid phy: %x sz: %x\n", + (unsigned int) addr, (unsigned int) len); + goto buff_get_phys_error; } else { - MM_ERR("could not allocate DMA buffers\n"); + MM_INFO("O/P buffers:valid phy: %x sz: %x\n", + (unsigned int) addr, (unsigned int) len); + } + audio->phys = (int32_t)addr; + + rc = ion_handle_get_flags(client, handle, &ionflag); + if (rc) { + MM_ERR("could not get flags for the handle\n"); + goto buff_get_flags_error; + } + + audio->map_v_read = ion_map_kernel(client, handle, ionflag); + if (IS_ERR(audio->map_v_read)) { + MM_ERR("could not map write buffers\n"); rc = -ENOMEM; - goto done; + goto buff_map_error; } + audio->data = (char *)audio->map_v_read; + MM_DBG("write buf: phy addr 0x%08x kernel addr 0x%08x\n", + audio->phys, (int)audio->data); + MM_DBG("Memory addr = 0x%8x phy addr = 0x%8x\n",\ (int) audio->data, (int) audio->phys); if ((file->f_mode & FMODE_WRITE) && @@ -874,6 +910,14 @@ evt_error: msm_adsp_put(audio->audrec); audpreproc_aenc_free(audio->enc_id); mutex_unlock(&audio->lock); + ion_unmap_kernel(client, audio->buff_handle); +buff_map_error: +buff_get_phys_error: +buff_get_flags_error: + ion_free(client, audio->buff_handle); +buff_alloc_error: + ion_client_destroy(client); +client_create_error: return rc; } --- a/arch/arm/mach-msm/qdsp5v2/audio_evrc_in.c +++ b/arch/arm/mach-msm/qdsp5v2/audio_evrc_in.c @@ -27,7 +27,7 @@ #include #include #include -#include +#include #include #include @@ -138,6 +138,9 @@ struct audio_in { int running; int stopped; /* set when stopped, cleared on flush */ char *build_id; + struct ion_client *client; + struct ion_handle *input_buff_handle; + struct ion_handle *output_buff_handle; }; struct audio_frame { @@ -1319,15 +1322,16 @@ static int audevrc_in_release(struct ino audio->audrec = NULL; audio->opened = 0; if (audio->data) { - msm_subsystem_unmap_buffer(audio->map_v_read); - free_contiguous_memory_by_paddr(audio->phys); + ion_unmap_kernel(audio->client, audio->input_buff_handle); + ion_free(audio->client, audio->input_buff_handle); audio->data = NULL; } if (audio->out_data) { - msm_subsystem_unmap_buffer(audio->map_v_write); - free_contiguous_memory_by_paddr(audio->out_phys); + ion_unmap_kernel(audio->client, audio->output_buff_handle); + ion_free(audio->client, audio->output_buff_handle); audio->out_data = NULL; } + ion_client_destroy(audio->client); mutex_unlock(&audio->lock); return 0; } @@ -1338,30 +1342,65 @@ static int audevrc_in_open(struct inode struct audio_in *audio = &the_audio_evrc_in; int rc; int encid; + int len = 0; + unsigned long ionflag = 0; + ion_phys_addr_t addr = 0; + struct ion_handle *handle = NULL; + struct ion_client *client = NULL; mutex_lock(&audio->lock); if (audio->opened) { rc = -EBUSY; goto done; } - audio->phys = allocate_contiguous_ebi_nomap(DMASZ, SZ_4K); - if (audio->phys) { - audio->map_v_read = msm_subsystem_map_buffer( - audio->phys, DMASZ, - MSM_SUBSYSTEM_MAP_KADDR, - NULL, 0); - if (IS_ERR(audio->map_v_read)) { - MM_ERR("failed to map read physical address\n"); - rc = -ENOMEM; - free_contiguous_memory_by_paddr(audio->phys); - goto done; - } - audio->data = audio->map_v_read->vaddr; + + client = msm_ion_client_create(UINT_MAX, "Audio_EVRC_in_client"); + if (IS_ERR_OR_NULL(client)) { + MM_ERR("Unable to create ION client\n"); + rc = -ENOMEM; + goto client_create_error; + } + audio->client = client; + + MM_DBG("allocating mem sz = %d\n", DMASZ); + handle = ion_alloc(client, DMASZ, SZ_4K, + ION_HEAP(ION_AUDIO_HEAP_ID)); + if (IS_ERR_OR_NULL(handle)) { + MM_ERR("Unable to create allocate O/P buffers\n"); + rc = -ENOMEM; + goto output_buff_alloc_error; + } + + audio->output_buff_handle = handle; + + rc = ion_phys(client , handle, &addr, &len); + if (rc) { + MM_ERR("O/P buffers:Invalid phy: %x sz: %x\n", + (unsigned int) addr, (unsigned int) len); + rc = -ENOMEM; + goto output_buff_get_phys_error; } else { - MM_ERR("could not allocate DMA buffers\n"); + MM_INFO("O/P buffers:valid phy: %x sz: %x\n", + (unsigned int) addr, (unsigned int) len); + } + audio->phys = (int32_t)addr; + + rc = ion_handle_get_flags(client, handle, &ionflag); + if (rc) { + MM_ERR("could not get flags for the handle\n"); rc = -ENOMEM; - goto done; + goto output_buff_get_flags_error; } + + audio->map_v_read = ion_map_kernel(client, handle, ionflag); + if (IS_ERR(audio->map_v_read)) { + MM_ERR("could not map read buffers,freeing instance 0x%08x\n", + (int)audio); + rc = -ENOMEM; + goto output_buff_map_error; + } + audio->data = (char *)audio->map_v_read; + MM_DBG("Memory addr = 0x%8x phy addr = 0x%8x\n",\ (int) audio->data, (int) audio->phys); if ((file->f_mode & FMODE_WRITE) && @@ -1418,27 +1457,49 @@ static int audevrc_in_open(struct inode audevrc_in_flush(audio); audevrc_out_flush(audio); - audio->out_phys = allocate_contiguous_ebi_nomap(BUFFER_SIZE, - SZ_4K); - if (!audio->out_phys) { - MM_ERR("could not allocate write buffers\n"); + MM_DBG("allocating BUFFER_SIZE %d\n", BUFFER_SIZE); + handle = ion_alloc(client, BUFFER_SIZE, + SZ_4K, ION_HEAP(ION_AUDIO_HEAP_ID)); + if (IS_ERR_OR_NULL(handle)) { + MM_ERR("Unable to create allocate I/P buffers\n"); rc = -ENOMEM; - goto evt_error; + goto input_buff_alloc_error; + } + + audio->input_buff_handle = handle; + + rc = ion_phys(client , handle, &addr, &len); + if (rc) { + MM_ERR("I/P buffers:Invalid phy: %x sz: %x\n", + (unsigned int) addr, (unsigned int) len); + rc = -ENOMEM; + goto input_buff_alloc_error; } else { - audio->map_v_write = msm_subsystem_map_buffer( - audio->out_phys, BUFFER_SIZE, - MSM_SUBSYSTEM_MAP_KADDR, - NULL, 0); - if (IS_ERR(audio->map_v_write)) { - MM_ERR("could map write buffers\n"); - rc = -ENOMEM; - free_contiguous_memory_by_paddr(audio->out_phys); - goto evt_error; - } - audio->out_data = audio->map_v_write->vaddr; - MM_DBG("write buf: phy addr 0x%08x kernel addr 0x%08x\n", - audio->out_phys, (int)audio->out_data); + MM_INFO("Got valid phy: %x sz: %x\n", + (unsigned int) addr, + (unsigned int) len); + } + audio->out_phys = (int32_t)addr; + + rc = ion_handle_get_flags(client, + handle, &ionflag); + if (rc) { + MM_ERR("could not get flags for the handle\n"); + rc = -ENOMEM; + goto input_buff_alloc_error; + } + + audio->map_v_write = ion_map_kernel(client, + handle, ionflag); + if (IS_ERR(audio->map_v_write)) { + MM_ERR("could not map write buffers\n"); + rc = -ENOMEM; + goto input_buff_map_error; } + audio->out_data = (char *)audio->map_v_write; + MM_DBG("write buf: phy addr 0x%08x kernel addr 0x%08x\n", + (unsigned int)addr, + (unsigned int)audio->out_data); /* Initialize buffer */ audio->out[0].data = audio->out_data + 0; @@ -1479,6 +1540,17 @@ evt_error: msm_adsp_put(audio->audrec); audpreproc_aenc_free(audio->enc_id); mutex_unlock(&audio->lock); +input_buff_map_error: + ion_free(client, audio->input_buff_handle); +input_buff_alloc_error: + ion_unmap_kernel(client, audio->output_buff_handle); +output_buff_map_error: +output_buff_get_phys_error: +output_buff_get_flags_error: + ion_free(client, audio->output_buff_handle); +output_buff_alloc_error: + ion_client_destroy(client); +client_create_error: return rc; } --- a/arch/arm/mach-msm/qdsp5v2/audio_lpa.c +++ b/arch/arm/mach-msm/qdsp5v2/audio_lpa.c @@ -2,7 +2,7 @@ * * Copyright (C) 2008 Google, Inc. * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2009-2011, Code Aurora Forum. All rights reserved. + * Copyright (c) 2009-2011, The Linux Foundation. All rights reserved. * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and @@ -27,7 +27,7 @@ #include #include #include -#include +#include #include #include #include @@ -132,9 +132,9 @@ struct audlpa_event { union msm_audio_event_payload payload; }; -struct audlpa_pmem_region { +struct audlpa_ion_region { struct list_head list; - struct file *file; + struct ion_handle *handle; int fd; void *vaddr; unsigned long paddr; @@ -166,7 +166,7 @@ static int auddec_dsp_config(struct audi static void audio_dsp_event(void *private, unsigned id, uint16_t *msg); static void audlpa_post_event(struct audio *audio, int type, union msm_audio_event_payload payload); -static unsigned long audlpa_pmem_fixup(struct audio *audio, void *addr, +static unsigned long audlpa_ion_fixup(struct audio *audio, void *addr, unsigned long len, int ref_up); static void audlpa_async_send_data(struct audio *audio, unsigned needed, uint32_t *payload); @@ -753,7 +753,7 @@ static long audlpa_process_event_req(str if (drv_evt->event_type == AUDIO_EVENT_WRITE_DONE || drv_evt->event_type == AUDIO_EVENT_READ_DONE) { mutex_lock(&audio->lock); - audlpa_pmem_fixup(audio, drv_evt->payload.aio_buf.buf_addr, + audlpa_ion_fixup(audio, drv_evt->payload.aio_buf.buf_addr, drv_evt->payload.aio_buf.buf_len, 0); mutex_unlock(&audio->lock); } @@ -763,94 +763,118 @@ static long audlpa_process_event_req(str return rc; } -static int audlpa_pmem_check(struct audio *audio, +static int audlpa_ion_check(struct audio *audio, void *vaddr, unsigned long len) { - struct audlpa_pmem_region *region_elt; - struct audlpa_pmem_region t = { .vaddr = vaddr, .len = len }; + struct audlpa_ion_region *region_elt; + struct audlpa_ion_region t = {.vaddr = vaddr, .len = len }; - list_for_each_entry(region_elt, &audio->pmem_region_queue, list) { + list_for_each_entry(region_elt, &audio->ion_region_queue, list) { if (CONTAINS(region_elt, &t) || CONTAINS(&t, region_elt) || OVERLAPS(region_elt, &t)) { - MM_ERR("region (vaddr %p len %ld)" + MM_ERR("[%p]:region (vaddr %p len %ld)" " clashes with registered region" " (vaddr %p paddr %p len %ld)\n", - vaddr, len, + audio, vaddr, len, region_elt->vaddr, - (void *)region_elt->paddr, - region_elt->len); + (void *)region_elt->paddr, region_elt->len); return -EINVAL; } } return 0; } - -static int audlpa_pmem_add(struct audio *audio, - struct msm_audio_pmem_info *info) +static int audlpa_ion_add(struct audio *audio, + struct msm_audio_ion_info *info) { - unsigned long paddr, kvaddr, len; - struct file *file; - struct audlpa_pmem_region *region; + ion_phys_addr_t paddr; + size_t len; + unsigned long kvaddr; + struct audlpa_ion_region *region; int rc = -EINVAL; + struct ion_handle *handle; + unsigned long ionflag; - MM_DBG("\n"); /* Macro prints the file name and function */ + MM_ERR("\n"); /* Macro prints the file name and function */ region = kmalloc(sizeof(*region), GFP_KERNEL); if (!region) { rc = -ENOMEM; goto end; } - - if (get_pmem_file(info->fd, &paddr, &kvaddr, &len, &file)) { - kfree(region); - goto end; + handle = ion_import_fd(audio->client, info->fd); + if (IS_ERR_OR_NULL(handle)) { + pr_err("%s: could not get handle of the given fd\n", __func__); + goto import_error; } - - rc = audlpa_pmem_check(audio, info->vaddr, len); + rc = ion_handle_get_flags(audio->client, handle, &ionflag); + if (rc) { + pr_err("%s: could not get flags for the handle\n", __func__); + goto flag_error; + } + kvaddr = (unsigned long)ion_map_kernel(audio->client, handle, ionflag); + if (IS_ERR_OR_NULL((void *)kvaddr)) { + pr_err("%s: could not get virtual address\n", __func__); + goto map_error; + } + rc = ion_phys(audio->client, handle, &paddr, &len); + if (rc) { + pr_err("%s: could not get physical address\n", __func__); + goto ion_error; + } + rc = audlpa_ion_check(audio, info->vaddr, len); if (rc < 0) { - put_pmem_file(file); - kfree(region); - goto end; + MM_ERR("audpcm_ion_check failed\n"); + goto ion_error; } - + region->handle = handle; region->vaddr = info->vaddr; region->fd = info->fd; region->paddr = paddr; region->kvaddr = kvaddr; region->len = len; - region->file = file; region->ref_cnt = 0; - MM_DBG("add region paddr %lx vaddr %p, len %lu\n", region->paddr, - region->vaddr, region->len); - list_add_tail(®ion->list, &audio->pmem_region_queue); + MM_DBG("[%p]:add region paddr %lx vaddr %p, len %lu kvaddr %lx\n", + audio, region->paddr, region->vaddr, + region->len, region->kvaddr); + list_add_tail(®ion->list, &audio->ion_region_queue); + + return rc; + +ion_error: + ion_unmap_kernel(audio->client, handle); +map_error: +flag_error: + ion_free(audio->client, handle); +import_error: + kfree(region); end: return rc; } -static int audlpa_pmem_remove(struct audio *audio, - struct msm_audio_pmem_info *info) +static int audlpa_ion_remove(struct audio *audio, + struct msm_audio_ion_info *info) { - struct audlpa_pmem_region *region; + struct audlpa_ion_region *region; struct list_head *ptr, *next; int rc = -EINVAL; - MM_DBG("info fd %d vaddr %p\n", info->fd, info->vaddr); + list_for_each_safe(ptr, next, &audio->ion_region_queue) { + region = list_entry(ptr, struct audlpa_ion_region, list); - list_for_each_safe(ptr, next, &audio->pmem_region_queue) { - region = list_entry(ptr, struct audlpa_pmem_region, list); - - if ((region->fd == info->fd) && + if (region != NULL && (region->fd == info->fd) && (region->vaddr == info->vaddr)) { if (region->ref_cnt) { - MM_DBG("region %p in use ref_cnt %d\n", - region, region->ref_cnt); + MM_DBG("%s[%p]:region %p in use ref_cnt %d\n", + __func__, audio, region, + region->ref_cnt); break; } MM_DBG("remove region fd %d vaddr %p\n", info->fd, info->vaddr); list_del(®ion->list); - put_pmem_file(region->file); + ion_unmap_kernel(audio->client, region->handle); + ion_free(audio->client, region->handle); kfree(region); rc = 0; break; @@ -860,23 +884,20 @@ static int audlpa_pmem_remove(struct aud return rc; } -static int audlpa_pmem_lookup_vaddr(struct audio *audio, void *addr, - unsigned long len, struct audlpa_pmem_region **region) +static int audlpa_ion_lookup_vaddr(struct audio *audio, void *addr, + unsigned long len, struct audlpa_ion_region **region) { - struct audlpa_pmem_region *region_elt; - + struct audlpa_ion_region *region_elt; int match_count = 0; - *region = NULL; /* returns physical address or zero */ - list_for_each_entry(region_elt, &audio->pmem_region_queue, - list) { + list_for_each_entry(region_elt, &audio->ion_region_queue, list) { if (addr >= region_elt->vaddr && addr < region_elt->vaddr + region_elt->len && addr + len <= region_elt->vaddr + region_elt->len) { /* offset since we could pass vaddr inside a registerd - * pmem buffer + * ion buffer */ match_count++; @@ -886,13 +907,16 @@ static int audlpa_pmem_lookup_vaddr(stru } if (match_count > 1) { - MM_ERR("multiple hits for vaddr %p, len %ld\n", addr, len); - list_for_each_entry(region_elt, - &audio->pmem_region_queue, list) { + MM_ERR("%s[%p]:multiple hits for vaddr %p, len %ld\n", + __func__, audio, addr, len); + list_for_each_entry(region_elt, &audio->ion_region_queue, + list) { if (addr >= region_elt->vaddr && addr < region_elt->vaddr + region_elt->len && addr + len <= region_elt->vaddr + region_elt->len) - MM_ERR("\t%p, %ld --> %p\n", region_elt->vaddr, + MM_ERR("\t%s[%p]:%p, %ld --> %p\n", + __func__, audio, + region_elt->vaddr, region_elt->len, (void *)region_elt->paddr); } @@ -900,17 +924,17 @@ static int audlpa_pmem_lookup_vaddr(stru return *region ? 0 : -1; } - -unsigned long audlpa_pmem_fixup(struct audio *audio, void *addr, +static unsigned long audlpa_ion_fixup(struct audio *audio, void *addr, unsigned long len, int ref_up) { - struct audlpa_pmem_region *region; + struct audlpa_ion_region *region; unsigned long paddr; int ret; - ret = audlpa_pmem_lookup_vaddr(audio, addr, len, ®ion); + ret = audlpa_ion_lookup_vaddr(audio, addr, len, ®ion); if (ret) { - MM_ERR("lookup (%p, %ld) failed\n", addr, len); + MM_ERR("%s[%p]:lookup (%p, %ld) failed\n", + __func__, audio, addr, len); return 0; } if (ref_up) @@ -944,7 +968,7 @@ static int audlpa_aio_buf_add(struct aud buf_node->buf.buf_addr, buf_node->buf.buf_len, buf_node->buf.data_len); - buf_node->paddr = audlpa_pmem_fixup( + buf_node->paddr = audlpa_ion_fixup( audio, buf_node->buf.buf_addr, buf_node->buf.buf_len, 1); @@ -1232,25 +1256,26 @@ static long audio_ioctl(struct file *fil audio->drv_status &= ~ADRV_STATUS_PAUSE; break; - case AUDIO_REGISTER_PMEM: { - struct msm_audio_pmem_info info; - MM_DBG("AUDIO_REGISTER_PMEM\n"); - if (copy_from_user(&info, (void *) arg, sizeof(info))) + case AUDIO_REGISTER_ION: { + struct msm_audio_ion_info info; + MM_DBG("AUDIO_REGISTER_ION\n"); + if (copy_from_user(&info, (void *) arg, sizeof(info))) rc = -EFAULT; else - rc = audlpa_pmem_add(audio, &info); + rc = audlpa_ion_add(audio, &info); break; } - case AUDIO_DEREGISTER_PMEM: { - struct msm_audio_pmem_info info; - MM_DBG("AUDIO_DEREGISTER_PMEM\n"); - if (copy_from_user(&info, (void *) arg, sizeof(info))) + case AUDIO_DEREGISTER_ION: { + struct msm_audio_ion_info info; + MM_DBG("AUDIO_DEREGISTER_ION\n"); + if (copy_from_user(&info, (void *) arg, sizeof(info))) rc = -EFAULT; else - rc = audlpa_pmem_remove(audio, &info); + rc = audlpa_ion_remove(audio, &info); break; } + case AUDIO_ASYNC_WRITE: if (audio->drv_status & ADRV_STATUS_FSYNC) rc = -EBUSY; @@ -1336,15 +1361,16 @@ int audlpa_fsync(struct file *file, int return audlpa_async_fsync(audio); } -static void audlpa_reset_pmem_region(struct audio *audio) +static void audpcm_reset_ion_region(struct audio *audio) { - struct audlpa_pmem_region *region; + struct audlpa_ion_region *region; struct list_head *ptr, *next; - list_for_each_safe(ptr, next, &audio->pmem_region_queue) { - region = list_entry(ptr, struct audlpa_pmem_region, list); + list_for_each_safe(ptr, next, &audio->ion_region_queue) { + region = list_entry(ptr, struct audlpa_ion_region, list); list_del(®ion->list); - put_pmem_file(region->file); + ion_unmap_kernel(audio->client, region->handle); + ion_free(audio->client, region->handle); kfree(region); } @@ -1362,7 +1388,7 @@ static int audio_release(struct inode *i auddev_unregister_evt_listner(AUDDEV_CLNT_DEC, audio->dec_id); audio_disable(audio); audlpa_async_flush(audio); - audlpa_reset_pmem_region(audio); + audpcm_reset_ion_region(audio); msm_adsp_put(audio->audplay); audpp_adec_free(audio->dec_id); @@ -1373,13 +1399,12 @@ static int audio_release(struct inode *i audio->event_abort = 1; wake_up(&audio->event_wait); audlpa_reset_event_queue(audio); - iounmap(audio->data); - pmem_kfree(audio->phys); mutex_unlock(&audio->lock); #ifdef CONFIG_DEBUG_FS if (audio->dentry) debugfs_remove(audio->dentry); #endif + ion_client_destroy(audio->client); kfree(audio); return 0; } @@ -1550,7 +1575,7 @@ static int audio_open(struct inode *inod spin_lock_init(&audio->dsp_lock); init_waitqueue_head(&audio->write_wait); INIT_LIST_HEAD(&audio->out_queue); - INIT_LIST_HEAD(&audio->pmem_region_queue); + INIT_LIST_HEAD(&audio->ion_region_queue); INIT_LIST_HEAD(&audio->free_event_queue); INIT_LIST_HEAD(&audio->event_queue); init_waitqueue_head(&audio->wait); @@ -1611,13 +1636,19 @@ static int audio_open(struct inode *inod break; } } + + audio->client = msm_ion_client_create(UINT_MAX, "Audio_LPA_Client"); + if (IS_ERR_OR_NULL(audio->client)) { + pr_err("Unable to create ION client\n"); + goto err; + } + MM_DBG("Ion client created\n"); + done: return rc; event_err: msm_adsp_put(audio->audplay); err: - iounmap(audio->data); - pmem_kfree(audio->phys); audpp_adec_free(audio->dec_id); MM_INFO("audio instance 0x%08x freeing\n", (int)audio); kfree(audio); --- a/arch/arm/mach-msm/qdsp5v2/audio_mvs.c +++ b/arch/arm/mach-msm/qdsp5v2/audio_mvs.c @@ -319,6 +319,7 @@ struct audio_mvs_info_type { wait_queue_head_t wait; wait_queue_head_t mode_wait; + wait_queue_head_t in_wait; wait_queue_head_t out_wait; struct mutex lock; @@ -1146,6 +1147,7 @@ static void audio_mvs_process_rpc_reques mutex_unlock(&audio->in_lock); + wake_up(&audio->in_wait); dl_reply.valid_frame_info_ptr = cpu_to_be32(0x00000001); dl_reply.frame_mode = cpu_to_be32(audio->frame_mode); @@ -1489,40 +1491,52 @@ static ssize_t audio_mvs_write(struct fi pr_debug("%s:\n", __func__); - mutex_lock(&audio->in_lock); - if (audio->state == AUDIO_MVS_STARTED) { - if (count <= sizeof(struct msm_audio_mvs_frame)) { - if (!list_empty(&audio->free_in_queue)) { - buf_node = - list_first_entry(&audio->free_in_queue, + rc = wait_event_interruptible_timeout(audio->in_wait, + (!list_empty(&audio->free_in_queue) || + audio->state == AUDIO_MVS_STOPPED), 1 * HZ); + if (rc > 0) { + mutex_lock(&audio->in_lock); + if (audio->state == AUDIO_MVS_STARTED) { + if (count <= sizeof(struct msm_audio_mvs_frame)) { + if (!list_empty(&audio->free_in_queue)) { + buf_node = list_first_entry( + &audio->free_in_queue, struct audio_mvs_buf_node, list); - list_del(&buf_node->list); + list_del(&buf_node->list); - rc = copy_from_user(&buf_node->frame, - buf, - count); + rc = copy_from_user(&buf_node->frame, + buf, + count); - list_add_tail(&buf_node->list, - &audio->in_queue); + list_add_tail(&buf_node->list, + &audio->in_queue); + } else { + pr_err("%s: No free DL buffs\n", __func__); + } } else { - pr_err("%s: No free DL buffs\n", __func__); + pr_err("%s: Write count %d < sizeof(frame) %d", + __func__, count, + sizeof(struct msm_audio_mvs_frame)); + + rc = -ENOMEM; } } else { - pr_err("%s: Write count %d < sizeof(frame) %d", - __func__, count, - sizeof(struct msm_audio_mvs_frame)); + pr_err("%s: Write performed in invalid state %d\n", + __func__, audio->state); - rc = -ENOMEM; + rc = -EPERM; } + mutex_unlock(&audio->in_lock); + } else if (rc == 0) { + pr_err("%s: No free DL buffs\n", __func__); + + rc = -ETIMEDOUT; } else { - pr_err("%s: Write performed in invalid state %d\n", - __func__, audio->state); + pr_err("%s: write was interrupted\n", __func__); - rc = -EPERM; + rc = -ERESTARTSYS; } - mutex_unlock(&audio->in_lock); - return rc; } @@ -1661,6 +1675,7 @@ static int __init audio_mvs_init(void) init_waitqueue_head(&audio_mvs_info.wait); init_waitqueue_head(&audio_mvs_info.mode_wait); + init_waitqueue_head(&audio_mvs_info.in_wait); init_waitqueue_head(&audio_mvs_info.out_wait); INIT_LIST_HEAD(&audio_mvs_info.in_queue); --- a/arch/arm/mach-msm/qdsp5v2/audio_out.c +++ b/arch/arm/mach-msm/qdsp5v2/audio_out.c @@ -3,7 +3,7 @@ * * Copyright (C) 2008 Google, Inc. * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2009-2011, Code Aurora Forum. All rights reserved. + * Copyright (c) 2009-2012, The Linux Foundation. All rights reserved. * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and @@ -43,7 +43,7 @@ #include #include #include - +#include #include #include @@ -99,6 +99,8 @@ struct audio { struct wake_lock idlelock; struct audpp_cmd_cfg_object_params_volume vol_pan; + struct ion_client *client; + struct ion_handle *buff_handle; }; static void audio_out_listener(u32 evt_id, union auddev_evt_data *evt_payload, @@ -702,22 +704,53 @@ struct miscdevice audio_misc = { static int __init audio_init(void) { - the_audio.phys = allocate_contiguous_ebi_nomap(DMASZ, SZ_4K); - if (the_audio.phys) { - the_audio.map_v_write = msm_subsystem_map_buffer( - the_audio.phys, DMASZ, - MSM_SUBSYSTEM_MAP_KADDR, - NULL, 0); - if (IS_ERR(the_audio.map_v_write)) { - MM_ERR("could not map physical buffers\n"); - free_contiguous_memory_by_paddr(the_audio.phys); - return -ENOMEM; - } - the_audio.data = the_audio.map_v_write->vaddr; - } else { - MM_ERR("could not allocate physical buffers\n"); - return -ENOMEM; + unsigned long ionflag = 0; + ion_phys_addr_t addr = 0; + int rc; + int len = 0; + struct ion_handle *handle = NULL; + struct ion_client *client = NULL; + + client = msm_ion_client_create(UINT_MAX, "HostPCM"); + if (IS_ERR_OR_NULL(client)) { + MM_ERR("Unable to create ION client\n"); + rc = -ENOMEM; + goto client_create_error; + } + the_audio.client = client; + + handle = ion_alloc(client, DMASZ, SZ_4K, + ION_HEAP(ION_AUDIO_HEAP_ID)); + if (IS_ERR_OR_NULL(handle)) { + MM_ERR("Unable to create allocate O/P buffers\n"); + rc = -ENOMEM; + goto buff_alloc_error; } + the_audio.buff_handle = handle; + + rc = ion_phys(client, handle, &addr, &len); + if (rc) { + MM_ERR("O/P buffers:Invalid phy: %x sz: %x\n", + (unsigned int) addr, (unsigned int) len); + goto buff_get_phys_error; + } else + MM_INFO("O/P buffers:valid phy: %x sz: %x\n", + (unsigned int) addr, (unsigned int) len); + the_audio.phys = (int32_t)addr; + + rc = ion_handle_get_flags(client, handle, &ionflag); + if (rc) { + MM_ERR("could not get flags for the handle\n"); + goto buff_get_flags_error; + } + + the_audio.map_v_write = ion_map_kernel(client, handle, ionflag); + if (IS_ERR(the_audio.map_v_write)) { + MM_ERR("could not map write buffers\n"); + rc = -ENOMEM; + goto buff_map_error; + } + the_audio.data = (char *)the_audio.map_v_write; MM_DBG("Memory addr = 0x%8x phy addr = 0x%8x\n",\ (int) the_audio.data, (int) the_audio.phys); mutex_init(&the_audio.lock); @@ -727,6 +760,15 @@ static int __init audio_init(void) wake_lock_init(&the_audio.wakelock, WAKE_LOCK_SUSPEND, "audio_pcm"); wake_lock_init(&the_audio.idlelock, WAKE_LOCK_IDLE, "audio_pcm_idle"); return misc_register(&audio_misc); +buff_map_error: +buff_get_phys_error: +buff_get_flags_error: + ion_free(client, the_audio.buff_handle); +buff_alloc_error: + ion_client_destroy(client); +client_create_error: + return rc; + } late_initcall(audio_init); --- a/arch/arm/mach-msm/qdsp5v2/audio_pcm_in.c +++ b/arch/arm/mach-msm/qdsp5v2/audio_pcm_in.c @@ -3,7 +3,7 @@ * * Copyright (C) 2008 Google, Inc. * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2009-2011, Code Aurora Forum. All rights reserved. + * Copyright (c) 2009-2012, The Linux Foundation. All rights reserved. * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and @@ -27,7 +27,7 @@ #include #include #include -#include +#include #include #include @@ -122,6 +122,8 @@ struct audio_in { int abort; /* set when error, like sample rate mismatch */ int dual_mic_config; char *build_id; + struct ion_client *client; + struct ion_handle *output_buff_handle; }; static struct audio_in the_audio_in; @@ -843,10 +845,11 @@ static int audpcm_in_release(struct inod audio->audrec = NULL; audio->opened = 0; if (audio->data) { - msm_subsystem_unmap_buffer(audio->map_v_read); - free_contiguous_memory_by_paddr(audio->phys); + ion_unmap_kernel(audio->client, audio->output_buff_handle); + ion_free(audio->client, audio->output_buff_handle); audio->data = NULL; } + ion_client_destroy(audio->client); mutex_unlock(&audio->lock); return 0; } @@ -856,29 +859,68 @@ static int audpcm_in_open(struct inode * struct audio_in *audio = &the_audio_in; int rc; int encid; + int len = 0; + unsigned long ionflag = 0; + ion_phys_addr_t addr = 0; + struct ion_handle *handle = NULL; + struct ion_client *client = NULL; mutex_lock(&audio->lock); if (audio->opened) { rc = -EBUSY; goto done; } - audio->phys = allocate_contiguous_ebi_nomap(DMASZ, SZ_4K); - if (audio->phys) { - audio->map_v_read = msm_subsystem_map_buffer( - audio->phys, DMASZ, - MSM_SUBSYSTEM_MAP_KADDR, NULL, 0); - if (IS_ERR(audio->map_v_read)) { - MM_ERR("could not map read phys buffers\n"); - rc = -ENOMEM; - free_contiguous_memory_by_paddr(audio->phys); - goto done; - } - audio->data = audio->map_v_read->vaddr; + + client = msm_ion_client_create(UINT_MAX, "Audio_PCM_in_client"); + if (IS_ERR_OR_NULL(client)) { + MM_ERR("Unable to create ION client\n"); + rc = -ENOMEM; + goto client_create_error; + } + audio->client = client; + + MM_DBG("allocating mem sz = %d\n", DMASZ); + handle = ion_alloc(client, DMASZ, SZ_4K, + ION_HEAP(ION_AUDIO_HEAP_ID)); + if (IS_ERR_OR_NULL(handle)) { + MM_ERR("Unable to create allocate O/P buffers\n"); + rc = -ENOMEM; + goto output_buff_alloc_error; + } + + audio->output_buff_handle = handle; + + rc = ion_phys(client , handle, &addr, &len); + if (rc) { + MM_ERR("O/P buffers:Invalid phy: %x sz: %x\n", + (unsigned int) addr, (unsigned int) len); + rc = -ENOMEM; + goto output_buff_get_phys_error; } else { - MM_ERR("could not allocate read buffers\n"); + MM_INFO("O/P buffers:valid phy: %x sz: %x\n", + (unsigned int) addr, (unsigned int) len); + } + audio->phys = (int32_t)addr; + + rc = ion_handle_get_flags(client, handle, &ionflag); + if (rc) { + MM_ERR("could not get flags for the handle\n"); rc = -ENOMEM; - goto done; + goto output_buff_get_flags_error; } + + audio->map_v_read = ion_map_kernel(client, handle, ionflag); + if (IS_ERR(audio->data)) { + MM_ERR("could not map read buffers,freeing instance 0x%08x\n", + (int)audio); + rc = -ENOMEM; + goto output_buff_map_error; + } + MM_DBG("read buf: phy addr 0x%08x kernel addr 0x%08x\n", + audio->phys, (int)audio->data); + + audio->data = (char *)audio->map_v_read; + MM_DBG("Memory addr = 0x%8x phy addr = 0x%8x\n",\ (int) audio->data, (int) audio->phys); if ((file->f_mode & FMODE_WRITE) && @@ -944,6 +986,13 @@ done: mutex_unlock(&audio->lock); return rc; evt_error: +output_buff_map_error: +output_buff_get_phys_error: +output_buff_get_flags_error: + ion_free(client, audio->output_buff_handle); +output_buff_alloc_error: + ion_client_destroy(client); +client_create_error: msm_adsp_put(audio->audrec); audpreproc_aenc_free(audio->enc_id); mutex_unlock(&audio->lock); --- a/arch/arm/mach-msm/qdsp5v2/audio_qcelp_in.c +++ b/arch/arm/mach-msm/qdsp5v2/audio_qcelp_in.c @@ -27,7 +27,7 @@ #include #include #include -#include +#include #include #include @@ -141,6 +141,9 @@ struct audio_in { int running; int stopped; /* set when stopped, cleared on flush */ char *build_id; + struct ion_client *client; + struct ion_handle *input_buff_handle; + struct ion_handle *output_buff_handle; }; struct audio_frame { @@ -1325,15 +1328,16 @@ static int audqcelp_in_release(struct in audio->audrec = NULL; audio->opened = 0; if (audio->data) { - msm_subsystem_unmap_buffer(audio->map_v_read); - free_contiguous_memory_by_paddr(audio->phys); + ion_unmap_kernel(audio->client, audio->input_buff_handle); + ion_free(audio->client, audio->input_buff_handle); audio->data = NULL; } if (audio->out_data) { - msm_subsystem_unmap_buffer(audio->map_v_write); - free_contiguous_memory_by_paddr(audio->out_phys); + ion_unmap_kernel(audio->client, audio->output_buff_handle); + ion_free(audio->client, audio->output_buff_handle); audio->out_data = NULL; } + ion_client_destroy(audio->client); mutex_unlock(&audio->lock); return 0; } @@ -1344,29 +1348,64 @@ static int audqcelp_in_open(struct inode struct audio_in *audio = &the_audio_qcelp_in; int rc; int encid; + int len = 0; + unsigned long ionflag = 0; + ion_phys_addr_t addr = 0; + struct ion_handle *handle = NULL; + struct ion_client *client = NULL; mutex_lock(&audio->lock); if (audio->opened) { rc = -EBUSY; goto done; } - audio->phys = allocate_contiguous_ebi_nomap(DMASZ, SZ_4K); - if (audio->phys) { - audio->map_v_read = msm_subsystem_map_buffer( - audio->phys, DMASZ, - MSM_SUBSYSTEM_MAP_KADDR, NULL, 0); - if (IS_ERR(audio->map_v_read)) { - MM_ERR("could not map DMA buffers\n"); - rc = -ENOMEM; - free_contiguous_memory_by_paddr(audio->phys); - goto done; - } - audio->data = audio->map_v_read->vaddr; + client = msm_ion_client_create(UINT_MAX, "Audio_EVRC_in_client"); + if (IS_ERR_OR_NULL(client)) { + MM_ERR("Unable to create ION client\n"); + rc = -ENOMEM; + goto client_create_error; + } + audio->client = client; + + MM_DBG("allocating mem sz = %d\n", DMASZ); + handle = ion_alloc(client, DMASZ, SZ_4K, + ION_HEAP(ION_AUDIO_HEAP_ID)); + if (IS_ERR_OR_NULL(handle)) { + MM_ERR("Unable to create allocate O/P buffers\n"); + rc = -ENOMEM; + goto output_buff_alloc_error; + } + + audio->output_buff_handle = handle; + + rc = ion_phys(client , handle, &addr, &len); + if (rc) { + MM_ERR("O/P buffers:Invalid phy: %x sz: %x\n", + (unsigned int) addr, (unsigned int) len); + rc = -ENOMEM; + goto output_buff_get_phys_error; } else { - MM_ERR("could not allocate DMA buffers\n"); + MM_INFO("O/P buffers:valid phy: %x sz: %x\n", + (unsigned int) addr, (unsigned int) len); + } + audio->phys = (int32_t)addr; + + rc = ion_handle_get_flags(client, handle, &ionflag); + if (rc) { + MM_ERR("could not get flags for the handle\n"); rc = -ENOMEM; - goto done; + goto output_buff_get_flags_error; } + + audio->map_v_read = ion_map_kernel(client, handle, ionflag); + if (IS_ERR(audio->map_v_read)) { + MM_ERR("could not map read buffers,freeing instance 0x%08x\n", + (int)audio); + rc = -ENOMEM; + goto output_buff_map_error; + } + audio->data = (char *)audio->map_v_read; + MM_DBG("Memory addr = 0x%8x phy addr = 0x%8x\n",\ (int) audio->data, (int) audio->phys); if ((file->f_mode & FMODE_WRITE) && @@ -1425,25 +1464,49 @@ static int audqcelp_in_open(struct inode audqcelp_in_flush(audio); audqcelp_out_flush(audio); - audio->out_phys = allocate_contiguous_ebi_nomap(BUFFER_SIZE, SZ_4K); - if (!audio->out_phys) { - MM_ERR("could not allocate write buffers\n"); + MM_DBG("allocating BUFFER_SIZE %d\n", BUFFER_SIZE); + handle = ion_alloc(client, BUFFER_SIZE, + SZ_4K, ION_HEAP(ION_AUDIO_HEAP_ID)); + if (IS_ERR_OR_NULL(handle)) { + MM_ERR("Unable to create allocate I/P buffers\n"); rc = -ENOMEM; - goto evt_error; + goto input_buff_alloc_error; + } + + audio->input_buff_handle = handle; + + rc = ion_phys(client , handle, &addr, &len); + if (rc) { + MM_ERR("I/P buffers:Invalid phy: %x sz: %x\n", + (unsigned int) addr, (unsigned int) len); + rc = -ENOMEM; + goto input_buff_alloc_error; } else { - audio->map_v_write = msm_subsystem_map_buffer( - audio->out_phys, BUFFER_SIZE, - MSM_SUBSYSTEM_MAP_KADDR, NULL, 0); - if (IS_ERR(audio->map_v_write)) { - MM_ERR("could not map write buffers\n"); - rc = -ENOMEM; - free_contiguous_memory_by_paddr(audio->out_phys); - goto evt_error; - } - audio->out_data = audio->map_v_write->vaddr; - MM_DBG("write buf: phy addr 0x%08x kernel addr 0x%08x\n", - audio->out_phys, (int)audio->out_data); + MM_INFO("Got valid phy: %x sz: %x\n", + (unsigned int) addr, + (unsigned int) len); + } + audio->out_phys = (int32_t)addr; + + rc = ion_handle_get_flags(client, + handle, &ionflag); + if (rc) { + MM_ERR("could not get flags for the handle\n"); + rc = -ENOMEM; + goto input_buff_alloc_error; + } + + audio->map_v_write = ion_map_kernel(client, + handle, ionflag); + if (IS_ERR(audio->map_v_write)) { + MM_ERR("could not map write buffers\n"); + rc = -ENOMEM; + goto input_buff_map_error; } + audio->out_data = (char *)audio->map_v_write; + MM_DBG("write buf: phy addr 0x%08x kernel addr 0x%08x\n", + (unsigned int)addr, + (unsigned int)audio->out_data); /* Initialize buffer */ audio->out[0].data = audio->out_data + 0; @@ -1483,6 +1546,17 @@ evt_error: msm_adsp_put(audio->audrec); audpreproc_aenc_free(audio->enc_id); mutex_unlock(&audio->lock); +input_buff_map_error: + ion_free(client, audio->input_buff_handle); +input_buff_alloc_error: + ion_unmap_kernel(client, audio->output_buff_handle); +output_buff_map_error: +output_buff_get_phys_error: +output_buff_get_flags_error: + ion_free(client, audio->output_buff_handle); +output_buff_alloc_error: + ion_client_destroy(client); +client_create_error: return rc; } --- a/arch/arm/mach-msm/qdsp5v2/audio_wma.c +++ b/arch/arm/mach-msm/qdsp5v2/audio_wma.c @@ -35,12 +35,11 @@ #include #include #include -#include #include #include #include #include -#include +#include #include #include @@ -191,6 +190,9 @@ struct audio { int eq_needs_commit; struct audpp_cmd_cfg_object_params_eqalizer eq; struct audpp_cmd_cfg_object_params_volume vol_pan; + struct ion_client *client; + struct ion_handle *input_buff_handle; + struct ion_handle *output_buff_handle; }; static int auddec_dsp_config(struct audio *audio, int enable); @@ -814,6 +816,10 @@ static long audio_ioctl(struct file *fil uint16_t enable_mask; int enable; int prev_state; + unsigned long ionflag = 0; + ion_phys_addr_t addr = 0; + struct ion_handle *handle = NULL; + int len = 0; MM_DBG("cmd = %d\n", cmd); @@ -1052,31 +1058,59 @@ static long audio_ioctl(struct file *fil MM_DBG("allocate PCM buffer %d\n", config.buffer_count * config.buffer_size); - audio->read_phys = - allocate_contiguous_ebi_nomap( - config.buffer_size * - config.buffer_count, - SZ_4K); - if (!audio->read_phys) { + handle = ion_alloc(audio->client, + (config.buffer_size * + config.buffer_count), + SZ_4K, ION_HEAP(ION_AUDIO_HEAP_ID)); + if (IS_ERR_OR_NULL(handle)) { + MM_ERR("Unable to alloc I/P buffs\n"); + audio->input_buff_handle = NULL; + rc = -ENOMEM; + break; + } + + audio->input_buff_handle = handle; + + rc = ion_phys(audio->client , + handle, &addr, &len); + if (rc) { + MM_ERR("Invalid phy: %x sz: %x\n", + (unsigned int) addr, + (unsigned int) len); + ion_free(audio->client, handle); + audio->input_buff_handle = NULL; + rc = -ENOMEM; + break; + } else { + MM_INFO("Got valid phy: %x sz: %x\n", + (unsigned int) audio->read_phys, + (unsigned int) len); + } + audio->read_phys = (int32_t)addr; + + rc = ion_handle_get_flags(audio->client, + handle, &ionflag); + if (rc) { + MM_ERR("could not get flags\n"); + ion_free(audio->client, handle); + audio->input_buff_handle = NULL; rc = -ENOMEM; break; } - audio->map_v_read = msm_subsystem_map_buffer( - audio->read_phys, - config.buffer_size * - config.buffer_count, - MSM_SUBSYSTEM_MAP_KADDR - , NULL, 0); + + audio->map_v_read = ion_map_kernel( + audio->client, + handle, ionflag); if (IS_ERR(audio->map_v_read)) { - MM_ERR("read buf alloc fail\n"); + MM_ERR("map of read buf failed\n"); + ion_free(audio->client, handle); + audio->input_buff_handle = NULL; rc = -ENOMEM; - free_contiguous_memory_by_paddr( - audio->read_phys); } else { uint8_t index; uint32_t offset = 0; audio->read_data = - audio->map_v_read->vaddr; + (char *)audio->map_v_read; audio->buf_refresh = 0; audio->pcm_buf_count = config.buffer_count; @@ -1457,12 +1491,13 @@ static int audio_release(struct inode *i audio->event_abort = 1; wake_up(&audio->event_wait); audwma_reset_event_queue(audio); - msm_subsystem_unmap_buffer(audio->map_v_write); - free_contiguous_memory_by_paddr(audio->phys); - if (audio->read_data) { - msm_subsystem_unmap_buffer(audio->map_v_read); - free_contiguous_memory_by_paddr(audio->read_phys); + ion_unmap_kernel(audio->client, audio->output_buff_handle); + ion_free(audio->client, audio->output_buff_handle); + if (audio->input_buff_handle != NULL) { + ion_unmap_kernel(audio->client, audio->input_buff_handle); + ion_free(audio->client, audio->input_buff_handle); } + ion_client_destroy(audio->client); mutex_unlock(&audio->lock); #ifdef CONFIG_DEBUG_FS if (audio->dentry) @@ -1603,8 +1638,13 @@ static int audio_open(struct inode *inod { struct audio *audio = NULL; int rc, dec_attrb, decid, i; - unsigned pmem_sz = DMASZ_MAX; + unsigned mem_sz = DMASZ_MAX; struct audwma_event *e_node = NULL; + unsigned long ionflag = 0; + ion_phys_addr_t addr = 0; + struct ion_handle *handle = NULL; + struct ion_client *client = NULL; + int len = 0; #ifdef CONFIG_DEBUG_FS /* 4 bytes represents decoder number, 1 byte for terminate string */ char name[sizeof "msm_wma_" + 5]; @@ -1647,39 +1687,52 @@ static int audio_open(struct inode *inod } audio->dec_id = decid & MSM_AUD_DECODER_MASK; - while (pmem_sz >= DMASZ_MIN) { - MM_DBG("pmemsz = %d\n", pmem_sz); - audio->phys = allocate_contiguous_ebi_nomap(pmem_sz, SZ_4K); - if (audio->phys) { - audio->map_v_write = msm_subsystem_map_buffer( - audio->phys, pmem_sz, - MSM_SUBSYSTEM_MAP_KADDR, - NULL, 0); - if (IS_ERR(audio->map_v_write)) { - MM_ERR("could not allocate write buffers, \ - freeing instance 0x%08x\n", - (int)audio); - rc = -ENOMEM; - free_contiguous_memory_by_paddr(audio->phys); - audpp_adec_free(audio->dec_id); - kfree(audio); - goto done; - } - audio->data = audio->map_v_write->vaddr; - MM_DBG("write buf: phy addr 0x%08x kernel addr \ - 0x%08x\n", audio->phys, (int)audio->data); - break; - } else if (pmem_sz == DMASZ_MIN) { - MM_ERR("could not allocate write buffers, freeing \ - instance 0x%08x\n", (int)audio); - rc = -ENOMEM; - audpp_adec_free(audio->dec_id); - kfree(audio); - goto done; - } else - pmem_sz >>= 1; + client = msm_ion_client_create(UINT_MAX, "Audio_WMA_Client"); + if (IS_ERR_OR_NULL(client)) { + pr_err("Unable to create ION client\n"); + rc = -ENOMEM; + goto client_create_error; + } + audio->client = client; + + handle = ion_alloc(client, mem_sz, SZ_4K, + ION_HEAP(ION_AUDIO_HEAP_ID)); + if (IS_ERR_OR_NULL(handle)) { + MM_ERR("Unable to create allocate O/P buffers\n"); + rc = -ENOMEM; + goto output_buff_alloc_error; + } + audio->output_buff_handle = handle; + + rc = ion_phys(client, handle, &addr, &len); + if (rc) { + MM_ERR("O/P buffers:Invalid phy: %x sz: %x\n", + (unsigned int) addr, (unsigned int) len); + goto output_buff_get_phys_error; + } else { + MM_INFO("O/P buffers:valid phy: %x sz: %x\n", + (unsigned int) addr, (unsigned int) len); } - audio->out_dma_sz = pmem_sz; + audio->phys = (int32_t)addr; + + + rc = ion_handle_get_flags(client, handle, &ionflag); + if (rc) { + MM_ERR("could not get flags for the handle\n"); + goto output_buff_get_flags_error; + } + + audio->map_v_write = ion_map_kernel(client, handle, ionflag); + if (IS_ERR(audio->map_v_write)) { + MM_ERR("could not map write buffers\n"); + rc = -ENOMEM; + goto output_buff_map_error; + } + audio->data = (char *)audio->map_v_write; + MM_DBG("write buf: phy addr 0x%08x kernel addr 0x%08x\n", + audio->phys, (int)audio->data); + + audio->out_dma_sz = mem_sz; rc = msm_adsp_get(audio->module_name, &audio->audplay, &audplay_adsp_ops_wma, audio); @@ -1771,8 +1824,14 @@ done: event_err: msm_adsp_put(audio->audplay); err: - msm_subsystem_unmap_buffer(audio->map_v_write); - free_contiguous_memory_by_paddr(audio->phys); + ion_unmap_kernel(client, audio->output_buff_handle); +output_buff_map_error: +output_buff_get_phys_error: +output_buff_get_flags_error: + ion_free(client, audio->output_buff_handle); +output_buff_alloc_error: + ion_client_destroy(client); +client_create_error: audpp_adec_free(audio->dec_id); kfree(audio); return rc; --- a/arch/arm/mach-msm/qdsp6v2/audio_lpa.c +++ b/arch/arm/mach-msm/qdsp6v2/audio_lpa.c @@ -1084,8 +1084,8 @@ static int audio_release(struct inode *i if (audio->out_enabled) audlpa_async_flush(audio); audio->wflush = 0; - audlpa_unmap_pmem_region(audio); audio_disable(audio); + audlpa_unmap_pmem_region(audio); msm_clear_session_id(audio->ac->session); auddev_unregister_evt_listner(AUDDEV_CLNT_DEC, audio->ac->session); q6asm_audio_client_free(audio->ac); --- a/arch/arm/mach-msm/qdsp6v2/audio_utils_aio.c +++ b/arch/arm/mach-msm/qdsp6v2/audio_utils_aio.c @@ -201,7 +201,7 @@ static unsigned long audio_aio_pmem_fixu static int audio_aio_pause(struct q6audio_aio *audio) { - int rc = 0; + int rc = -EINVAL; pr_debug("%s[%p], enabled = %d\n", __func__, audio, audio->enabled); @@ -424,6 +424,27 @@ void audio_aio_async_in_flush(struct q6a } } +static void audio_aio_unmap_pmem_region(struct q6audio_aio *audio) +{ + struct audio_aio_pmem_region *region; + struct list_head *ptr, *next; + int rc = -EINVAL; + + pr_debug("%s[%p]:\n", __func__, audio); + list_for_each_safe(ptr, next, &audio->pmem_region_queue) { + region = list_entry(ptr, struct audio_aio_pmem_region, list); + pr_debug("%s[%p]: phy_address = 0x%lx\n", + __func__, audio, region->paddr); + if (region != NULL) { + rc = q6asm_memory_unmap(audio->ac, + (uint32_t)region->paddr, IN); + if (rc < 0) + pr_err("%s[%p]: memory unmap failed\n", + __func__, audio); + } + } +} + void audio_aio_cb(uint32_t opcode, uint32_t token, uint32_t *payload, struct q6audio_aio *audio) { @@ -558,27 +579,6 @@ void audio_aio_reset_event_queue(struct return; } -static void audio_aio_unmap_pmem_region(struct q6audio_aio *audio) -{ - struct audio_aio_pmem_region *region; - struct list_head *ptr, *next; - int rc = -EINVAL; - - pr_debug("%s[%p]:\n", __func__, audio); - list_for_each_safe(ptr, next, &audio->pmem_region_queue) { - region = list_entry(ptr, struct audio_aio_pmem_region, list); - pr_debug("%s[%p]: phy_address = 0x%lx\n", - __func__, audio, region->paddr); - if (region != NULL) { - rc = q6asm_memory_unmap(audio->ac, - (uint32_t)region->paddr, IN); - if (rc < 0) - pr_err("%s[%p]: memory unmap failed\n", - __func__, audio); - } - } -} - int audio_aio_release(struct inode *inode, struct file *file) { struct q6audio_aio *audio = file->private_data; @@ -590,8 +590,8 @@ int audio_aio_release(struct inode *inod audio->wflush = 0; audio->drv_ops.out_flush(audio); audio->drv_ops.in_flush(audio); - audio_aio_unmap_pmem_region(audio); audio_aio_disable(audio); + audio_aio_unmap_pmem_region(audio); audio_aio_reset_pmem_region(audio); audio->event_abort = 1; wake_up(&audio->event_wait); @@ -1237,9 +1237,12 @@ long audio_aio_ioctl(struct file *file, mutex_lock(&audio->lock); if (arg == 1) { rc = audio_aio_pause(audio); - if (rc < 0) + if (rc < 0) { pr_err("%s[%p]: pause FAILED rc=%d\n", __func__, audio, rc); + mutex_unlock(&audio->lock); + break; + } audio->drv_status |= ADRV_STATUS_PAUSE; } else if (arg == 0) { if (audio->drv_status & ADRV_STATUS_PAUSE) { --- a/arch/arm/mach-msm/sec_debug.c +++ b/arch/arm/mach-msm/sec_debug.c @@ -46,6 +46,9 @@ #include #include #endif +#ifdef CONFIG_SEC_DEBUG_DOUBLE_FREE +#include +#endif enum sec_debug_upload_cause_t { UPLOAD_CAUSE_INIT = 0xCAFEBABE, @@ -230,6 +233,125 @@ static int rwsem_debug_init; static spinlock_t rwsem_debug_lock; #endif /* CONFIG_SEC_DEBUG_SEMAPHORE_LOG */ +#ifdef CONFIG_SEC_DEBUG_DOUBLE_FREE +#define KFREE_HOOK_BYPASS_MASK 0x1 +#define KFREE_CIRC_BUF_SIZE (1<<15) +#define KFREE_FREE_MAGIC 0xf4eef4ee +static DEFINE_SPINLOCK(circ_buf_lock); +struct kfree_info_entry { + void *addr; + void *caller; +}; + +struct kfree_circ_buf { + int head; + int tail; + struct kfree_info_entry entry[KFREE_CIRC_BUF_SIZE]; +}; + +struct kfree_circ_buf kfree_circ_buf; + +static void *circ_buf_lookup(struct kfree_circ_buf *circ_buf, void *addr) +{ + int i; + for (i = circ_buf->tail; i != circ_buf->head ; + i = (i + 1) & (KFREE_CIRC_BUF_SIZE - 1)) { + if (circ_buf->entry[i].addr == addr) + return &circ_buf->entry[i]; + } + + return NULL; + } + +static void *circ_buf_get(struct kfree_circ_buf *circ_buf) +{ + void *entry; + entry = &circ_buf->entry[circ_buf->tail]; + smp_rmb(); + circ_buf->tail = (circ_buf->tail + 1) & + (KFREE_CIRC_BUF_SIZE - 1); + return entry; +} + +static void *circ_buf_put(struct kfree_circ_buf *circ_buf, + struct kfree_info_entry *entry) +{ + memcpy(&circ_buf->entry[circ_buf->head], entry, sizeof(*entry)); + smp_wmb(); + circ_buf->head = (circ_buf->head + 1) & + (KFREE_CIRC_BUF_SIZE - 1); + return entry; +} + +void *kfree_hook(void *p, void *caller) +{ + unsigned int flags; + struct kfree_info_entry *match = NULL; + void *tofree = NULL; + unsigned int addr = (unsigned int)p; + + if (!virt_addr_valid(addr)) { + /* there are too many NULL pointers so don't print for NULL */ + if (addr) + pr_debug("%s: trying to free an invalid addr %x from %pS\n", + __func__, addr, caller); + return NULL; + } + if (addr&0x1) { + /* return original address to free */ + return (void *)(addr&~(KFREE_HOOK_BYPASS_MASK)); + } + + spin_lock_irqsave(&circ_buf_lock, flags); + + if (kfree_circ_buf.head == 0) + pr_debug("%s: circular buffer head rounded to zero.", __func__); + + if (*(unsigned int *)p == KFREE_FREE_MAGIC) { + /* memory that is to be freed may originally have had magic + * value, so search the whole circ buf for an actual match */ + match = circ_buf_lookup(&kfree_circ_buf, p); + } + + if (match) { + pr_err("%s: 0x%08x was already freed by %pS()\n", + __func__, p, match->caller); + spin_unlock_irqrestore(&circ_buf_lock, flags); + panic("double free detected!"); + return NULL; + } else { + struct kfree_info_entry entry; + + /* mark free magic on the freeing node */ + *(unsigned int *)p = KFREE_FREE_MAGIC; + + /* do an actual kfree for the oldest entry + * if the circular buffer is full */ + if (CIRC_SPACE(kfree_circ_buf.head, kfree_circ_buf.tail, + KFREE_CIRC_BUF_SIZE) == 0) { + struct kfree_info_entry *pentry; + pentry = circ_buf_get(&kfree_circ_buf); + if (pentry) + tofree = pentry->addr; + } + + /* add the new entry to the circular buffer */ + entry.addr = p; + entry.caller = caller; + circ_buf_put(&kfree_circ_buf, &entry); + if (tofree) { + spin_unlock_irqrestore(&circ_buf_lock, flags); + kfree((void *)((unsigned int)tofree | + KFREE_HOOK_BYPASS_MASK)); + return NULL; + } + } + + spin_unlock_irqrestore(&circ_buf_lock, flags); + return NULL; +} +#endif + /* onlyjazz.ed26 : make the restart_reason global to enable it early in sec_debug_init and share with restart functions */ void *restart_reason; @@ -270,6 +392,17 @@ static int force_error(const char *val, mb(); pr_info("*p = %x\n", *(unsigned int *)p); pr_emerg("Clk may be enabled.Try again if it reaches here!\n"); + } else if (!strncmp(val, "dblfree", 7)) { + void *p = kmalloc(sizeof(int), GFP_KERNEL); + kfree(p); + msleep(1000); + kfree(p); + } else if (!strncmp(val, "lowmem", 6)) { + int i = 0; + pr_emerg("Allocating memory until failure!\n"); + while (kmalloc(128*1024, GFP_KERNEL)) + i++; + pr_emerg("Allocated %d KB!\n", i*128); } else { pr_emerg("No such error defined for now!\n"); } --- a/arch/arm/mm/copypage-v6.c +++ b/arch/arm/mm/copypage-v6.c @@ -41,7 +41,6 @@ static void v6_copy_user_highpage_nonali kfrom = kmap_atomic(from, KM_USER0); kto = kmap_atomic(to, KM_USER1); copy_page(kto, kfrom); - __cpuc_flush_dcache_area(kto, PAGE_SIZE); kunmap_atomic(kto, KM_USER1); kunmap_atomic(kfrom, KM_USER0); } --- a/arch/arm/mm/mmu.c +++ b/arch/arm/mm/mmu.c @@ -32,6 +32,12 @@ #include "mm.h" +//Siso - Added for DCM booting - Nov 17th +#if defined(CONFIG_MACH_M2_DCM) + #include +#endif +// + /* * empty_zero_page is a special page that is used for * zero-initialized data and COW. @@ -796,8 +802,17 @@ void __init sanity_check_meminfo(void) int i, j, highmem = 0; #ifdef CONFIG_DONT_MAP_HOLE_AFTER_MEMBANK0 +#if defined(CONFIG_MACH_M2_DCM) //Siso - Added for DCM booting - Nov 17th + + if(system_rev > BOARD_REV07) + { + find_membank0_hole(); + } + +#else find_membank0_hole(); #endif +#endif #if (defined CONFIG_HIGHMEM) && (defined CONFIG_FIX_MOVABLE_ZONE) if (movable_reserved_size && __pa(vmalloc_min) > movable_reserved_start) --- a/crypto/authenc.c +++ b/crypto/authenc.c @@ -336,7 +336,7 @@ static int crypto_authenc_genicv(struct cryptlen += ivsize; } - if (sg_is_last(assoc)) { + if (req->assoclen && sg_is_last(assoc)) { authenc_ahash_fn = crypto_authenc_ahash; sg_init_table(asg, 2); sg_set_page(asg, sg_page(assoc), assoc->length, assoc->offset); @@ -490,7 +490,7 @@ static int crypto_authenc_iverify(struct cryptlen += ivsize; } - if (sg_is_last(assoc)) { + if (req->assoclen && sg_is_last(assoc)) { authenc_ahash_fn = crypto_authenc_ahash; sg_init_table(asg, 2); sg_set_page(asg, sg_page(assoc), assoc->length, assoc->offset); --- a/drivers/char/diag/diagchar.h +++ b/drivers/char/diag/diagchar.h @@ -27,6 +27,7 @@ #define IN_BUF_SIZE 16384 #define MAX_IN_BUF_SIZE 32768 #define MAX_SYNC_OBJ_NAME_SIZE 32 +#define UINT32_MAX UINT_MAX /* Size of the buffer used for deframing a packet reveived from the PC tool*/ #define HDLC_MAX 4096 --- a/drivers/char/diag/diagchar_core.c +++ b/drivers/char/diag/diagchar_core.c @@ -269,7 +269,7 @@ void diag_clear_reg(int proc_num) } void diag_add_reg(int j, struct bindpkt_params *params, - int *success, int *count_entries) + int *success, unsigned int *count_entries) { *success = 1; driver->table[j].cmd_code = params->cmd_code; @@ -289,75 +289,158 @@ void diag_add_reg(int j, struct bindpkt_ long diagchar_ioctl(struct file *filp, unsigned int iocmd, unsigned long ioarg) { - int i, j, count_entries = 0, temp; - int success = -1; + + int i, j, temp, success = -1; + unsigned int count_entries = 0, interim_count = 0; void *temp_buf; if (iocmd == DIAG_IOCTL_COMMAND_REG) { - struct bindpkt_params_per_process *pkt_params = - (struct bindpkt_params_per_process *) ioarg; + struct bindpkt_params_per_process pkt_params; + struct bindpkt_params *params; + struct bindpkt_params *head_params; + if (copy_from_user(&pkt_params, (void *)ioarg, + sizeof(struct bindpkt_params_per_process))) { + return -EFAULT; + } + if ((UINT32_MAX/sizeof(struct bindpkt_params)) < + pkt_params.count) { + pr_alert("diag: integer overflow while multiply\n"); + return -EFAULT; + } + params = kzalloc(pkt_params.count*sizeof( + struct bindpkt_params), GFP_KERNEL); + if (!params) { + pr_alert("diag: unable to alloc memory\n"); + return -ENOMEM; + } else + head_params = params; + + if (copy_from_user(params, pkt_params.params, + pkt_params.count*sizeof(struct bindpkt_params))) { + kfree(head_params); + return -EFAULT; + } + mutex_lock(&driver->diagchar_mutex); for (i = 0; i < diag_max_reg; i++) { if (driver->table[i].process_id == 0) { - diag_add_reg(i, pkt_params->params, - &success, &count_entries); - if (pkt_params->count > count_entries) { - pkt_params->params++; - } else { + diag_add_reg(i, params, &success, + &count_entries); + if (pkt_params.count > count_entries) { + params++; + } else { mutex_unlock(&driver->diagchar_mutex); + kfree(head_params); return success; } } } if (i < diag_threshold_reg) { - /* Increase table size by amount required */ - diag_max_reg += pkt_params->count - - count_entries; + /* Increase table size by amount required */ + if (pkt_params.count >= count_entries) { + interim_count = pkt_params.count - + count_entries; + } else { + pr_alert("diag: error in params count\n"); + kfree(head_params); + mutex_unlock(&driver->diagchar_mutex); + return -EFAULT; + } + if (UINT32_MAX - diag_max_reg >= + interim_count) { + diag_max_reg += interim_count; + } else { + pr_alert("diag: Integer overflow\n"); + kfree(head_params); + mutex_unlock(&driver->diagchar_mutex); + return -EFAULT; + } + /* Make sure size doesnt go beyond threshold */ if (diag_max_reg > diag_threshold_reg) { diag_max_reg = diag_threshold_reg; pr_info("diag: best case memory allocation\n"); } + if (UINT32_MAX/sizeof(struct diag_master_table) < + diag_max_reg) { + pr_alert("diag: integer overflow\n"); + kfree(head_params); + mutex_unlock(&driver->diagchar_mutex); + return -EFAULT; + } + temp_buf = krealloc(driver->table, diag_max_reg*sizeof(struct diag_master_table), GFP_KERNEL); if (!temp_buf) { - diag_max_reg -= pkt_params->count - - count_entries; - pr_alert("diag: Insufficient memory for reg."); + pr_alert("diag: Insufficient memory for reg.\n"); mutex_unlock(&driver->diagchar_mutex); + + if (pkt_params.count >= count_entries) { + interim_count = pkt_params.count - + count_entries; + } else { + pr_alert("diag: params count error\n"); + mutex_unlock(&driver->diagchar_mutex); + kfree(head_params); + return -EFAULT; + } + if (diag_max_reg >= interim_count) { + diag_max_reg -= interim_count; + } else { + pr_alert("diag: Integer underflow\n"); + mutex_unlock(&driver->diagchar_mutex); + kfree(head_params); + return -EFAULT; + } + kfree(head_params); + return 0; } else { driver->table = temp_buf; } for (j = i; j < diag_max_reg; j++) { - diag_add_reg(j, pkt_params->params, - &success, &count_entries); - if (pkt_params->count > count_entries) { - pkt_params->params++; + diag_add_reg(j, params, &success, + &count_entries); + if (pkt_params.count > count_entries) { + params++; + } else { mutex_unlock(&driver->diagchar_mutex); + kfree(head_params); return success; } } + kfree(head_params); mutex_unlock(&driver->diagchar_mutex); } else { mutex_unlock(&driver->diagchar_mutex); + kfree(head_params); pr_err("Max size reached, Pkt Registration failed for" " Process %d", current->tgid); } success = 0; } else if (iocmd == DIAG_IOCTL_GET_DELAYED_RSP_ID) { - struct diagpkt_delay_params *delay_params = - (struct diagpkt_delay_params *) ioarg; + struct diagpkt_delay_params delay_params; + uint16_t interim_rsp_id; + int interim_size; + if (copy_from_user(&delay_params, (void *)ioarg, + sizeof(struct diagpkt_delay_params))) + return -EFAULT; + if ((delay_params.rsp_ptr) && + (delay_params.size == sizeof(delayed_rsp_id)) && + (delay_params.num_bytes_ptr)) { + interim_rsp_id = DIAGPKT_NEXT_DELAYED_RSP_ID( + delayed_rsp_id); + if (copy_to_user((void *)delay_params.rsp_ptr, + &interim_rsp_id, sizeof(uint16_t))) + return -EFAULT; + interim_size = sizeof(delayed_rsp_id); + if (copy_to_user((void *)delay_params.num_bytes_ptr, + &interim_size, sizeof(int))) + return -EFAULT; - if ((delay_params->rsp_ptr) && - (delay_params->size == sizeof(delayed_rsp_id)) && - (delay_params->num_bytes_ptr)) { - *((uint16_t *)delay_params->rsp_ptr) = - DIAGPKT_NEXT_DELAYED_RSP_ID(delayed_rsp_id); - *(delay_params->num_bytes_ptr) = sizeof(delayed_rsp_id); - success = 0; + success = 0; } } else if (iocmd == DIAG_IOCTL_LSM_DEINIT) { for (i = 0; i < driver->num_clients; i++) @@ -683,7 +766,7 @@ static int diagchar_write(struct file *f struct diag_send_desc_type send = { NULL, NULL, DIAG_STATE_START, 0 }; struct diag_hdlc_dest_type enc = { NULL, NULL, 0 }; void *buf_copy = NULL; - int payload_size; + unsigned int payload_size; #ifdef CONFIG_DIAG_OVER_USB if (((driver->logging_mode == USB_MODE) && (!driver->usb_connected)) || (driver->logging_mode == NO_LOGGING_MODE)) { @@ -694,21 +777,24 @@ static int diagchar_write(struct file *f /* Get the packet type F3/log/event/Pkt response */ err = copy_from_user((&pkt_type), buf, 4); /* First 4 bytes indicate the type of payload - ignore these */ + if (count < 4) { + pr_alert("diag: Client sending short data\n"); + return -EBADMSG; + } + payload_size = count - 4; + if (payload_size > USER_SPACE_DATA) { + pr_err("diag: Dropping packet, packet payload size crosses 8KB limit. Current payload size %d\n", + payload_size); + driver->dropped_count++; + return -EBADMSG; + } + if (pkt_type == USER_SPACE_LOG_TYPE) { err = copy_from_user(driver->user_space_data, buf + 4, payload_size); -#if 0 /* SAMSUNG Changes for UART DIAG.(problem on QC Release merge) */ - /* Check masks for On-Device logging */ - if (driver->mask_check) { - if (!mask_request_validate(driver->user_space_data)) { - pr_alert("diag: mask request Invalid\n"); - return -EFAULT; - } - } -#endif buf = buf + 4; /* To removed "0x7E", when received only "0x7E" */ --- a/drivers/char/diag/diagfwd.c +++ b/drivers/char/diag/diagfwd.c @@ -153,6 +153,39 @@ int chk_apps_master(void) return 0; } +/* + * This function should be called if you feel that the logging process may + * need to be woken up. For instance, if the logging mode is MEMORY_DEVICE MODE + * and while trying to read data from a SMD data channel there are no buffers + * available to read the data into, then this function should be called to + * determine if the logging process needs to be woken up. + */ +void chk_logging_wakeup(void) +{ + int i; + + /* Find the index of the logging process */ + for (i = 0; i < driver->num_clients; i++) + if (driver->client_map[i].pid == + driver->logging_process_id) + break; + + if (i < driver->num_clients) { + /* At very high logging rates a race condition can + * occur where the buffers containing the data from + * an smd channel are all in use, but the data_ready + * flag is cleared. In this case, the buffers never + * have their data read/logged. Detect and remedy this + * situation. + */ + if ((driver->data_ready[i] & USER_SPACE_LOG_TYPE) == 0) { + driver->data_ready[i] |= USER_SPACE_LOG_TYPE; + pr_debug("diag: Force wakeup of logging process\n"); + wake_up_interruptible(&driver->wait_q); + } + } +} + void __diag_smd_send_req(void) { void *buf = NULL; @@ -196,6 +229,9 @@ void __diag_smd_send_req(void) write_ptr_modem); } } + } else if (driver->ch && !buf && + (driver->logging_mode == MEMORY_DEVICE_MODE)) { + chk_logging_wakeup(); } } @@ -340,6 +376,9 @@ void __diag_smd_wcnss_send_req(void) write_ptr_wcnss); } } + } else if (driver->ch_wcnss && !buf && + (driver->logging_mode == MEMORY_DEVICE_MODE)) { + chk_logging_wakeup(); } } @@ -386,6 +425,9 @@ void __diag_smd_qdsp_send_req(void) write_ptr_qdsp); } } + } else if (driver->chqdsp && !buf && + (driver->logging_mode == MEMORY_DEVICE_MODE)) { + chk_logging_wakeup(); } } @@ -800,9 +842,6 @@ void diag_send_msg_mask_update(smd_chann int first, last, size = -ENOMEM, retry_count = 0, timer; int header_size = sizeof(struct diag_ctrl_msg_mask); uint8_t *ptr = driver->msg_masks; - unsigned long flags = 0; - int mask_pkt_size, kk; - void *temp_buf; mutex_lock(&driver->diag_cntl_mutex); while (*(uint32_t *)(ptr + 4)) { --- a/drivers/felica/felica.c +++ b/drivers/felica/felica.c @@ -20,6 +20,11 @@ #include #include #include +#define F_WAKE_LOCK +#ifdef F_WAKE_LOCK +#include +#endif +#include #include /****************************************************************************** * log @@ -36,6 +41,11 @@ * global variable ******************************************************************************/ +#ifdef F_WAKE_LOCK +struct wake_lock felica_wake_1; +struct wake_lock felica_wake_2; +#endif + static struct class *felica_class; /* storages for communicate to netlink */ @@ -96,6 +106,10 @@ static struct i2c_msg gwrite_msgs[] = { .buf = NULL, }, }; +#ifdef F_WAKE_LOCK +static int tmout_1 = 3*1000; +#endif + /****************************************************************************** * /dev/felica @@ -191,6 +205,7 @@ static void felica_uart_exit(void) static int felica_uart_open(struct inode *inode, struct file *file) { uid_t uid; + int ret; FELICA_LOG_DEBUG("[MFDD] %s START", __func__); uid = __task_cred(current)->uid; @@ -212,13 +227,25 @@ static int felica_uart_open(struct inode memset(gfa_send_str, 0, FELICA_NL_MSG_SIZE); memset(gfa_rcv_str, 0, FELICA_NL_MSG_SIZE); gfa_send_str[0] = FELICA_NL_REQ_OPEN; - felica_nl_send_msg(1); - felica_nl_wait_ret_msg(); - if (gfa_rcv_str[1] == FELICA_NL_EFAILED) { - FELICA_LOG_ERR("[MFDD] %s Open Fail", __func__); + + ret = felica_nl_send_msg(1); + if (ret == 0) { + felica_nl_wait_ret_msg(); + if (gfa_rcv_str[1] == FELICA_NL_EFAILED) { + FELICA_LOG_ERR("[MFDD] %s Open Fail", __func__); + up(&dev_sem->felica_sem); + return -EFAULT; + } + } else { + FELICA_LOG_ERR("[MFDD] %s felica_nl_send_msg Fail", \ + __func__); up(&dev_sem->felica_sem); return -EFAULT; } +#ifdef F_WAKE_LOCK + wake_lock(&felica_wake_2); + FELICA_LOG_DEBUG("[MFDD] %s Wake Lock(2)", __func__); +#endif } gfa_open_cnt++; @@ -233,6 +260,7 @@ static int felica_uart_open(struct inode */ static int felica_uart_close(struct inode *inode, struct file *file) { + int ret; FELICA_LOG_DEBUG("[MFDD] %s START", __func__); if (down_interruptible(&dev_sem->felica_sem)) { @@ -246,14 +274,27 @@ static int felica_uart_close(struct inod memset(gfa_send_str, 0, FELICA_NL_MSG_SIZE); memset(gfa_rcv_str, 0, FELICA_NL_MSG_SIZE); gfa_send_str[0] = FELICA_NL_REQ_CLOSE; - felica_nl_send_msg(1); - felica_nl_wait_ret_msg(); - if (gfa_rcv_str[1] == FELICA_NL_EFAILED) { - FELICA_LOG_ERR("[MFDD] %s Close Fail", __func__); + ret = felica_nl_send_msg(1); + if (ret == 0) { + felica_nl_wait_ret_msg(); + if (gfa_rcv_str[1] == FELICA_NL_EFAILED) { + FELICA_LOG_ERR("[MFDD] %s Close Fail",\ + __func__); + gfa_open_cnt++; + up(&dev_sem->felica_sem); + return -EFAULT; + } + } else { + FELICA_LOG_ERR("[MFDD] %s felica_nl_send_msg Fail", \ + __func__); gfa_open_cnt++; up(&dev_sem->felica_sem); return -EFAULT; } +#ifdef F_WAKE_LOCK + wake_unlock(&felica_wake_2); + FELICA_LOG_DEBUG("[MFDD] %s Wake UnLock(2)", __func__); +#endif } up(&dev_sem->felica_sem); @@ -269,7 +310,9 @@ static ssize_t felica_uart_read(struct f size_t len, loff_t *ppos) { int ret = 0; + int nlret; size_t wk_len = 0; + FELICA_LOG_DEBUG("[MFDD] %s START", __func__); if (down_interruptible(&dev_sem->felica_sem)) { @@ -290,9 +333,10 @@ static ssize_t felica_uart_read(struct f gfa_send_str[0] = FELICA_NL_REQ_READ; gfa_send_str[1] = (char)(wk_len >> 8); gfa_send_str[2] = (char)wk_len; - felica_nl_send_msg(3); + nlret = felica_nl_send_msg(3); wk_len = 0; + if (nlret == 0) { felica_nl_wait_ret_msg(); if (gfa_rcv_str[1] == FELICA_NL_SUCCESS) { wk_len = @@ -302,10 +346,15 @@ static ssize_t felica_uart_read(struct f FELICA_LOG_ERR ("[MFDD] %s ERROR(copy_from_user), ret=[%d]", __func__, ret); + up(&dev_sem->felica_sem); + return -EFAULT; + } + *ppos = *ppos + wk_len; + } else { + FELICA_LOG_DEBUG(" %s FAIL", __func__); up(&dev_sem->felica_sem); return -EFAULT; } - *ppos = *ppos + wk_len; } else { FELICA_LOG_DEBUG(" %s FAIL", __func__); up(&dev_sem->felica_sem); @@ -325,7 +374,9 @@ static ssize_t felica_uart_write(struct size_t len, loff_t *ppos) { int ret = 0; + int nlret; size_t wk_len = 0; + FELICA_LOG_DEBUG("[MFDD] %s START", __func__); if (down_interruptible(&dev_sem->felica_sem)) { @@ -353,17 +404,21 @@ static ssize_t felica_uart_write(struct up(&dev_sem->felica_sem); return -EFAULT; } - felica_nl_send_msg(3 + len); - + nlret = felica_nl_send_msg(3 + len); + if (nlret == 0) { wk_len = 0; felica_nl_wait_ret_msg(); wk_len = (((int)gfa_rcv_str[2] << 8) & 0xFF00) | (int)gfa_rcv_str[3]; if (gfa_rcv_str[1] == FELICA_NL_EFAILED) { FELICA_LOG_ERR("[MFDD] %s Write Fail", __func__); up(&dev_sem->felica_sem); + return -EINVAL; + } + } else { + FELICA_LOG_ERR("[MFDD] %s felica_nl_send_msg Fail", __func__); + up(&dev_sem->felica_sem); return -EINVAL; } - up(&dev_sem->felica_sem); FELICA_LOG_DEBUG("[MFDD] %s END", __func__); @@ -387,6 +442,7 @@ static long felica_uart_ioctl(struct fil unsigned long arg) { unsigned int ret_str = 0; + int ret; FELICA_LOG_DEBUG("[MFDD] %s START", __func__); if (down_interruptible(&dev_sem->felica_sem)) { @@ -399,20 +455,24 @@ static long felica_uart_ioctl(struct fil memset(gfa_rcv_str, 0, FELICA_NL_MSG_SIZE); gfa_send_str[0] = FELICA_NL_REQ_AVAIABLE; - felica_nl_send_msg(1); + ret = felica_nl_send_msg(1); + if (ret == 0) { felica_nl_wait_ret_msg(); if (gfa_rcv_str[1] == FELICA_NL_SUCCESS) { /* create response data */ ret_str = - (((unsigned int)gfa_rcv_str[2] << 8) & 0xFF00) | (unsigned - int) - gfa_rcv_str[3]; + (((unsigned int)gfa_rcv_str[2] << 8) & 0xFF00) | (unsigned int)gfa_rcv_str[3]; FELICA_LOG_DEBUG("Available Success data size [%d]", ret_str); } else { FELICA_LOG_ERR("[MFDD] %s Available Fail", __func__); up(&dev_sem->felica_sem); return -EINVAL; + } + } else { + FELICA_LOG_ERR("[MFDD] %s felica_nl_send_msg Fail", __func__); + up(&dev_sem->felica_sem); + return -EINVAL; } up(&dev_sem->felica_sem); @@ -459,7 +519,7 @@ static void felica_nl_exit(void) /* * send message to FeliCa-Serial-Connector */ -static void felica_nl_send_msg(int len) +static int felica_nl_send_msg(int len) { struct nlmsghdr *nlh; struct sk_buff *skb_out; @@ -469,12 +529,12 @@ static void felica_nl_send_msg(int len) if (!gfanl_sk) { FELICA_LOG_ERR("[MFDD]Error Not creating socket. %s\n", __func__); - return; + return 1; } if (gfa_pid == 0) { FELICA_LOG_ERR("[MFDD]Error Not Rcv Connect Msg %s\n", __func__); - return; + return 1; } msg_size = len; @@ -482,7 +542,7 @@ static void felica_nl_send_msg(int len) if (!skb_out) { FELICA_LOG_ERR("Failed to allocate new skb_out %s\n", __func__); - return; + return 1; } nlh = nlmsg_put(skb_out, 0, 0, NLMSG_DONE, msg_size, 0); NETLINK_CB(skb_out).dst_group = 0; @@ -492,6 +552,7 @@ static void felica_nl_send_msg(int len) nlmsg_unicast(gfanl_sk, skb_out, gfa_pid); FELICA_LOG_DEBUG("[MFDD] %s END", __func__); + return 0; } /* @@ -1008,6 +1069,10 @@ static ssize_t felica_cen_read(struct fi gread_msgs[1].buf = &read_buff; FELICA_LOG_DEBUG("[MFDD] %s START", __func__); + if (felica_i2c_client == NULL) { + FELICA_LOG_DEBUG("felica_i2c_client is NULL"); + return -EIO; + } ret = i2c_transfer(felica_i2c_client->adapter, &gread_msgs[0], 1); if (ret < 0) { @@ -1049,6 +1114,11 @@ static ssize_t felica_cen_write(struct f unsigned char write_buff[2]; FELICA_LOG_DEBUG("[MFDD] %s START", __func__); + if (felica_i2c_client == NULL) { + FELICA_LOG_DEBUG("felica_i2c_client is NULL"); + return -EIO; + } + gwrite_msgs[0].buf = &write_buff[0]; gwrite_msgs[0].addr = gi2c_address; write_buff[0] = gi2c_lockaddress; @@ -1072,7 +1142,6 @@ static ssize_t felica_cen_write(struct f __func__, cen); return -EINVAL; } - ret = i2c_transfer(felica_i2c_client->adapter, gwrite_msgs, 1); if (ret < 0) { FELICA_LOG_ERR("[MFDD] %s ERROR(i2c_transfer), ret=[%d]", @@ -1446,6 +1515,11 @@ static void felica_int_irq_work(struct w enable_irq(gpio_to_irq(GPIO_PINID_FELICA_INT)); pgint_irq->irq_done = 1; + +#ifdef F_WAKE_LOCK + wake_lock_timeout(&felica_wake_1, msecs_to_jiffies(tmout_1)); + FELICA_LOG_DEBUG("[MFDD] %s Wake Lock(1)[%d]", __func__, tmout_1); +#endif wake_up_interruptible(&pgint_irq->read_wait); FELICA_LOG_DEBUG("[MFDD] %s END", __func__); @@ -1726,7 +1800,7 @@ static int felica_uid_open(struct inode cmdline[leng] = '\0'; if (strncmp(cmdline, gdiag_name, leng) != 0) { - FELICA_LOG_DEBUG("[MFDD] %s ERROR, %s", __func__, cmdline); + FELICA_LOG_DEBUG("[MFDD] %s ERROR, %s gdiag %s", __func__, cmdline,gdiag_name); return -EACCES; } @@ -1887,6 +1961,11 @@ static ssize_t felica_ant_read(struct fi gread_msgs[1].buf = &read_buff; FELICA_LOG_DEBUG("[MFDD] %s START", __func__); + if (felica_i2c_client == NULL) { + FELICA_LOG_DEBUG("[MFDD] %s felica_i2c_client is NULL", \ + __func__); + return -EIO; + } ret = i2c_transfer(felica_i2c_client->adapter, &gread_msgs[0], 1); if (ret < 0) { @@ -1925,10 +2004,17 @@ static ssize_t felica_ant_write(struct f unsigned char write_buff[2]; FELICA_LOG_DEBUG("[MFDD] %s START", __func__); + if (felica_i2c_client == NULL) { + FELICA_LOG_DEBUG("[MFDD] %s felica_i2c_client is NULL", \ + __func__); + return -EIO; + } + gwrite_msgs[0].buf = &write_buff[0]; gwrite_msgs[0].addr = gi2c_address; write_buff[0] = gi2c_antaddress; + ret = copy_from_user(&ant, data, FELICA_ANT_DATA_LEN); if (ret != 0) { FELICA_LOG_ERR("[MFDD] %s ERROR(copy_from_user), ret=[%d]", @@ -2022,6 +2108,10 @@ static int __init felica_init(void) FELICA_LOG_ERR("[MFDD] %s ERROR(class_create)", __func__); return PTR_ERR(felica_class); } +#ifdef F_WAKE_LOCK + wake_lock_init(&felica_wake_1, WAKE_LOCK_SUSPEND, "felica-int-1"); + wake_lock_init(&felica_wake_2, WAKE_LOCK_SUSPEND, "felica-int-2"); +#endif felica_initialize_pin(); felica_register_device(); felica_nl_init(); @@ -2040,6 +2130,10 @@ static void __exit felica_exit(void) { FELICA_LOG_DEBUG("[MFDD] %s START", __func__); +#ifdef F_WAKE_LOCK + wake_lock_destroy(&felica_wake_1); + wake_lock_destroy(&felica_wake_2); +#endif felica_i2c_exit(); felica_nl_exit(); felica_deregister_device(); --- a/drivers/felica/felica.h +++ b/drivers/felica/felica.h @@ -91,7 +91,7 @@ static void __exit felica_exit(void); #define FELICA_NL_REQ_SYNC 0x06 #define FELICA_NL_RESPONCE 0xFE #define FELICA_NL_CONNECT_MSG 0xFF -#define FELICA_NL_MSG_DATA_SIZE 4096 +#define FELICA_NL_MSG_DATA_SIZE 4096*4 #define FELICA_NL_MSG_SIZE (FELICA_NL_MSG_DATA_SIZE+4) #define MSG_READ1_FLAGS_OFFSET 1 @@ -134,7 +134,7 @@ static long felica_uart_ioctl(struct fil unsigned long arg); static void felica_nl_init(void); static void felica_nl_exit(void); -static void felica_nl_send_msg(int len); +static int felica_nl_send_msg(int len); static void felica_nl_recv_msg(struct sk_buff *skb); static void felica_nl_wait_ret_msg(void); static void felica_set_felica_info(void); --- a/drivers/gpu/ion/ion.c +++ b/drivers/gpu/ion/ion.c @@ -925,7 +925,6 @@ static int check_vaddr_bounds(unsigned l if (end < start) goto out; - down_read(&mm->mmap_sem); vma = find_vma(mm, start); if (vma && vma->vm_start < end) { if (start < vma->vm_start) @@ -936,7 +935,6 @@ static int check_vaddr_bounds(unsigned l } out_up: - up_read(&mm->mmap_sem); out: return ret; } @@ -1543,7 +1541,7 @@ static long ion_ioctl(struct file *filp, unsigned long start, end; struct ion_handle *handle = NULL; int ret; - + struct mm_struct *mm = current->active_mm; if (copy_from_user(&data, (void __user *)arg, sizeof(struct ion_flush_data))) return -EFAULT; @@ -1551,12 +1549,6 @@ static long ion_ioctl(struct file *filp, start = (unsigned long) data.vaddr; end = (unsigned long) data.vaddr + data.length; - if (check_vaddr_bounds(start, end)) { - pr_err("%s: virtual address %p is out of bounds\n", - __func__, data.vaddr); - return -EINVAL; - } - if (!data.handle) { handle = ion_import_fd(client, data.fd); if (IS_ERR_OR_NULL(handle)) { @@ -1565,12 +1557,21 @@ static long ion_ioctl(struct file *filp, return -EINVAL; } } + down_read(&mm->mmap_sem); + if (check_vaddr_bounds(start, end)) { + up_read(&mm->mmap_sem); + pr_err("%s: virtual address %p is out of bounds\n", + __func__, data.vaddr); + if (!data.handle) + ion_free(client, handle); + return -EINVAL; + } ret = ion_do_cache_op(client, data.handle ? data.handle : handle, data.vaddr, data.offset, data.length, cmd); - + up_read(&mm->mmap_sem); if (!data.handle) ion_free(client, handle); --- a/drivers/gpu/ion/ion_cp_heap.c +++ b/drivers/gpu/ion/ion_cp_heap.c @@ -93,6 +93,7 @@ struct ion_cp_heap { int iommu_map_all; int iommu_2x_map_domain; unsigned int has_outer_cache; + atomic_t protect_cnt; }; enum { @@ -127,7 +128,7 @@ static int ion_cp_protect(struct ion_hea container_of(heap, struct ion_cp_heap, heap); int ret_value = 0; - if (cp_heap->heap_protected == HEAP_NOT_PROTECTED) { + if (atomic_inc_return(&cp_heap->protect_cnt) == 1) { /* Make sure we are in C state when the heap is protected. */ if (cp_heap->reusable && !cp_heap->allocated_bytes) { ret_value = fmem_set_state(FMEM_C_STATE); @@ -146,6 +147,7 @@ static int ion_cp_protect(struct ion_hea pr_err("%s: unable to transition heap to T-state\n", __func__); } + atomic_dec(&cp_heap->protect_cnt); } else { cp_heap->heap_protected = HEAP_PROTECTED; pr_debug("Protected heap %s @ 0x%lx\n", @@ -153,6 +155,9 @@ static int ion_cp_protect(struct ion_hea } } out: + pr_debug("%s: protect count is %d\n", __func__, + atomic_read(&cp_heap->protect_cnt)); + BUG_ON(atomic_read(&cp_heap->protect_cnt) < 0); return ret_value; } @@ -166,7 +171,7 @@ static void ion_cp_unprotect(struct ion_ struct ion_cp_heap *cp_heap = container_of(heap, struct ion_cp_heap, heap); - if (cp_heap->heap_protected == HEAP_PROTECTED) { + if (atomic_dec_and_test(&cp_heap->protect_cnt)) { int error_code = ion_cp_unprotect_mem( cp_heap->secure_base, cp_heap->secure_size, cp_heap->permission_type); @@ -185,6 +190,9 @@ static void ion_cp_unprotect(struct ion_ } } } + pr_debug("%s: protect count is %d\n", __func__, + atomic_read(&cp_heap->protect_cnt)); + BUG_ON(atomic_read(&cp_heap->protect_cnt) < 0); } ion_phys_addr_t ion_cp_allocate(struct ion_heap *heap, @@ -886,6 +894,7 @@ struct ion_heap *ion_cp_heap_create(stru cp_heap->secure_base = cp_heap->base; cp_heap->secure_size = heap_data->size; cp_heap->has_outer_cache = heap_data->has_outer_cache; + atomic_set(&cp_heap->protect_cnt, 0); if (heap_data->extra_data) { struct ion_cp_heap_pdata *extra_data = heap_data->extra_data; --- a/drivers/gpu/msm/kgsl.c +++ b/drivers/gpu/msm/kgsl.c @@ -756,6 +756,9 @@ kgsl_sharedmem_find_region(struct kgsl_p { struct rb_node *node = private->mem_rb.rb_node; + if (!kgsl_mmu_gpuaddr_in_range(gpuaddr)) + return NULL; + while (node != NULL) { struct kgsl_mem_entry *entry; @@ -1899,7 +1902,7 @@ static const struct { static long kgsl_ioctl(struct file *filep, unsigned int cmd, unsigned long arg) { struct kgsl_device_private *dev_priv = filep->private_data; - unsigned int nr = _IOC_NR(cmd); + unsigned int nr; kgsl_ioctl_func_t func; int lock, ret; char ustack[64]; @@ -1915,6 +1918,8 @@ static long kgsl_ioctl(struct file *file else if (cmd == IOCTL_KGSL_CMDSTREAM_READTIMESTAMP_OLD) cmd = IOCTL_KGSL_CMDSTREAM_READTIMESTAMP; + nr = _IOC_NR(cmd); + if (cmd & (IOC_IN | IOC_OUT)) { if (_IOC_SIZE(cmd) < sizeof(ustack)) uptr = ustack; @@ -1939,7 +1944,20 @@ static long kgsl_ioctl(struct file *file } if (nr < ARRAY_SIZE(kgsl_ioctl_funcs) && - kgsl_ioctl_funcs[nr].func != NULL) { + kgsl_ioctl_funcs[nr].func != NULL) { + + /* + * Make sure that nobody tried to send us a malformed ioctl code + * with a valid NR but bogus flags + */ + + if (kgsl_ioctl_funcs[nr].cmd != cmd) { + KGSL_DRV_ERR(dev_priv->device, + "Malformed ioctl code %08x\n", cmd); + ret = -ENOIOCTLCMD; + goto done; + } + func = kgsl_ioctl_funcs[nr].func; lock = kgsl_ioctl_funcs[nr].lock; } else { --- a/drivers/gpu/msm/kgsl_mmu.h +++ b/drivers/gpu/msm/kgsl_mmu.h @@ -186,4 +186,12 @@ void kgsl_mmu_set_mmutype(char *mmutype) unsigned int kgsl_mmu_get_current_ptbase(struct kgsl_device *device); enum kgsl_mmutype kgsl_mmu_get_mmutype(void); unsigned int kgsl_mmu_get_ptsize(void); + +static inline int kgsl_mmu_gpuaddr_in_range(unsigned int gpuaddr) +{ + return ((gpuaddr >= KGSL_PAGETABLE_BASE) && + (gpuaddr < + (KGSL_PAGETABLE_BASE + CONFIG_MSM_KGSL_PAGE_TABLE_SIZE))); +} + #endif /* __KGSL_MMU_H */ --- a/drivers/input/touchscreen/d2_fw.h +++ b/drivers/input/touchscreen/d2_fw.h @@ -13,2652 +13,1989 @@ const size_t MELFAS_binary_nLength = 0x7C00; const u8 MELFAS_binary[] = { -0x00, 0x20, 0x00, 0x20, 0x79, 0x02, 0x00, 0x00, 0x39, 0x02, 0x00, 0x00, -0x3D, 0x02, 0x00, 0x00, 0x41, 0x02, 0x00, 0x00, 0x45, 0x02, 0x00, 0x00, -0x49, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x02, 0x00, 0x00, -0x51, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x02, 0x00, 0x00, -0x59, 0x02, 0x00, 0x00, 0x39, 0x01, 0x00, 0x00, 0x61, 0x01, 0x00, 0x00, -0x25, 0x01, 0x00, 0x00, 0x21, 0x02, 0x00, 0x00, 0x35, 0x02, 0x00, 0x00, -0x71, 0x02, 0x00, 0x00, 0x75, 0x02, 0x00, 0x00, 0x75, 0x02, 0x00, 0x00, -0x75, 0x02, 0x00, 0x00, 0x75, 0x02, 0x00, 0x00, 0x75, 0x02, 0x00, 0x00, -0x75, 0x02, 0x00, 0x00, 0x75, 0x02, 0x00, 0x00, 0x75, 0x02, 0x00, 0x00, -0x75, 0x02, 0x00, 0x00, 0x75, 0x02, 0x00, 0x00, 0x75, 0x02, 0x00, 0x00, -0x75, 0x02, 0x00, 0x00, 0x75, 0x02, 0x00, 0x00, 0x75, 0x02, 0x00, 0x00, -0x75, 0x02, 0x00, 0x00, 0x75, 0x02, 0x00, 0x00, 0x75, 0x02, 0x00, 0x00, -0x75, 0x02, 0x00, 0x00, 0x75, 0x02, 0x00, 0x00, 0x75, 0x02, 0x00, 0x00, -0x75, 0x02, 0x00, 0x00, 0x75, 0x02, 0x00, 0x00, 0x75, 0x02, 0x00, 0x00, -0x75, 0x02, 0x00, 0x00, 0x75, 0x02, 0x00, 0x00, 0x75, 0x02, 0x00, 0x00, -0x30, 0xB5, 0x11, 0x4B, 0x11, 0x4A, 0x1B, 0x88, 0x12, 0x78, 0xD3, 0x18, -0xDB, 0xB2, 0xE1, 0x2B, 0x02, 0xD0, 0xE5, 0x2B, 0x17, 0xD1, 0x09, 0xE0, -0x0D, 0x49, 0x0E, 0x4A, 0x04, 0x23, 0x01, 0x3B, 0xDB, 0xB2, 0xC8, 0x5C, -0x98, 0x54, 0x00, 0x2B, 0xF9, 0xD1, 0x0C, 0xE0, 0x0A, 0x4C, 0x09, 0x48, -0x0A, 0x49, 0x0B, 0x4A, 0x04, 0x23, 0x01, 0x3B, 0xDB, 0xB2, 0xE5, 0x5C, -0x1D, 0x54, 0xCD, 0x5C, 0x9D, 0x54, 0x00, 0x2B, 0xF7, 0xD1, 0x30, 0xBD, -0x28, 0x00, 0x00, 0x20, 0x2A, 0x00, 0x00, 0x20, 0x2D, 0x00, 0x00, 0x20, -0x0C, 0x00, 0x00, 0x50, 0x35, 0x00, 0x00, 0x20, 0x31, 0x00, 0x00, 0x20, -0x10, 0x00, 0x00, 0x50, 0x03, 0x4A, 0x00, 0x23, 0x13, 0x70, 0x80, 0x22, -0xD2, 0x05, 0x13, 0x70, 0x70, 0x47, 0xC0, 0x46, 0x00, 0x00, 0x00, 0x20, -0x06, 0x4B, 0x00, 0x22, 0x5A, 0x70, 0x80, 0x23, 0xDB, 0x05, 0x59, 0x69, -0x04, 0x4A, 0x0A, 0x40, 0x5A, 0x61, 0x59, 0x69, 0x03, 0x4A, 0x0A, 0x40, -0x5A, 0x61, 0x70, 0x47, 0x00, 0x00, 0x00, 0x20, 0xFF, 0xFF, 0xFF, 0xFE, -0xFF, 0xFF, 0xFF, 0xEF, 0x70, 0xB5, 0xA0, 0x23, 0xDB, 0x05, 0x1C, 0x7A, -0x24, 0x4D, 0x0F, 0x22, 0x14, 0x40, 0x2A, 0x78, 0x23, 0x4E, 0x00, 0x2A, -0x06, 0xD0, 0x23, 0x4B, 0x1B, 0x68, 0x98, 0x47, 0x00, 0x23, 0x2B, 0x70, -0x34, 0x70, 0x3A, 0xE0, 0x9B, 0x7A, 0x32, 0x78, 0xE1, 0x07, 0x02, 0xD5, -0x1E, 0x4A, 0x13, 0x80, 0x07, 0xE0, 0x08, 0x21, 0x0C, 0x42, 0x0A, 0xD0, -0x1C, 0x4B, 0x1A, 0x78, 0x52, 0x18, 0xD2, 0xB2, 0x1A, 0x70, 0xFF, 0xF7, -0x8D, 0xFF, 0x1A, 0x4B, 0x1B, 0x68, 0x98, 0x47, 0x19, 0xE0, 0xA1, 0x07, -0x0D, 0xD5, 0x08, 0x2A, 0x01, 0xD0, 0x01, 0x2A, 0x01, 0xD1, 0x16, 0x4B, -0x02, 0xE0, 0x12, 0x4A, 0x13, 0x80, 0x15, 0x4B, 0x1B, 0x68, 0x98, 0x47, -0x00, 0x22, 0x10, 0x4B, 0x08, 0xE0, 0x63, 0x07, 0x07, 0xD5, 0x11, 0x4B, -0x1B, 0x68, 0x98, 0x47, 0x0C, 0x4B, 0x1A, 0x78, 0x08, 0x32, 0xD2, 0xB2, -0x1A, 0x70, 0x07, 0x4B, 0x01, 0x22, 0x1C, 0x70, 0xA0, 0x23, 0xDB, 0x05, -0x1A, 0x72, 0x0B, 0x49, 0x10, 0x22, 0x1A, 0x72, 0x00, 0x22, 0x0A, 0x70, -0x1A, 0x72, 0x70, 0xBD, 0x2C, 0x00, 0x00, 0x20, 0x2B, 0x00, 0x00, 0x20, -0x24, 0x00, 0x00, 0x20, 0x28, 0x00, 0x00, 0x20, 0x2A, 0x00, 0x00, 0x20, -0x1C, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x20, 0x18, 0x00, 0x00, 0x20, -0x0C, 0x00, 0x00, 0x20, 0x03, 0x4A, 0x00, 0x23, 0x93, 0x70, 0x80, 0x22, -0xD2, 0x05, 0x53, 0x70, 0x70, 0x47, 0xC0, 0x46, 0x00, 0x00, 0x00, 0x20, -0x70, 0x47, 0xC0, 0x46, 0x00, 0xB5, 0xFE, 0xE7, 0x00, 0xB5, 0xFE, 0xE7, -0x00, 0xB5, 0xFE, 0xE7, 0x00, 0xB5, 0xFE, 0xE7, 0x00, 0xB5, 0xFE, 0xE7, -0x00, 0xB5, 0xFE, 0xE7, 0x00, 0xB5, 0xFE, 0xE7, 0x00, 0xB5, 0xFE, 0xE7, -0x00, 0xB5, 0xFE, 0xE7, 0x00, 0xB5, 0xFE, 0xE7, 0x00, 0xB5, 0xFE, 0xE7, -0x00, 0xB5, 0xFE, 0xE7, 0x00, 0xB5, 0xFE, 0xE7, 0x00, 0xB5, 0xFE, 0xE7, -0x00, 0xB5, 0xFE, 0xE7, 0x00, 0xB5, 0xFE, 0xE7, 0x38, 0xB5, 0x80, 0x23, -0xDB, 0x05, 0xFB, 0x21, 0x5A, 0x68, 0x59, 0x60, 0x99, 0x68, 0x08, 0x21, -0x99, 0x60, 0x00, 0x22, 0xD9, 0x68, 0xDA, 0x60, 0x19, 0x6C, 0x80, 0x21, -0xC9, 0x01, 0x19, 0x64, 0x19, 0x69, 0x44, 0x49, 0x19, 0x61, 0x44, 0x4B, -0x44, 0x49, 0x00, 0xE0, 0x04, 0xC3, 0x8B, 0x42, 0xFC, 0xD3, 0x43, 0x4B, -0x43, 0x4A, 0x9B, 0x0A, 0xDB, 0xB2, 0x13, 0x70, 0x42, 0x4B, 0x43, 0x49, -0x1B, 0x68, 0x9B, 0x0A, 0xDB, 0xB2, 0x53, 0x70, 0x41, 0x4B, 0x1B, 0x68, -0x9B, 0x0A, 0xDB, 0xB2, 0x93, 0x70, 0x40, 0x4B, 0x1B, 0x68, 0x9B, 0x0A, -0xDB, 0xB2, 0xD3, 0x70, 0x00, 0x23, 0x0B, 0x70, 0x03, 0x23, 0x08, 0xE0, -0x58, 0x1C, 0x15, 0x5C, 0xD4, 0x5C, 0xA5, 0x42, 0x07, 0xD9, 0xD4, 0x5C, -0x01, 0x34, 0xE4, 0xB2, 0x0C, 0x54, 0x01, 0x3B, 0xDB, 0xB2, 0xFF, 0x2B, -0xF2, 0xD1, 0x30, 0x4A, 0x11, 0x78, 0x35, 0x4A, 0x11, 0x70, 0x11, 0x1C, -0xFF, 0x2B, 0x03, 0xD1, 0x2D, 0x4B, 0xDB, 0x78, 0x1E, 0x2B, 0x04, 0xD9, -0xFF, 0x23, 0x4B, 0x70, 0x8B, 0x70, 0xCB, 0x70, 0x0B, 0xE0, 0x2A, 0x4B, -0x1B, 0x68, 0x1B, 0x78, 0x53, 0x70, 0x2A, 0x4B, 0x1B, 0x68, 0x1B, 0x78, -0x93, 0x70, 0x29, 0x4B, 0x1B, 0x68, 0x1B, 0x78, 0xD3, 0x70, 0x28, 0x4B, -0xDA, 0x78, 0xFF, 0x2A, 0x08, 0xD0, 0x9A, 0x78, 0xFF, 0x2A, 0x05, 0xD0, -0x5B, 0x78, 0xFF, 0x2B, 0x02, 0xD0, 0x00, 0xF0, 0x67, 0xF8, 0x38, 0xBD, -0x22, 0x4B, 0x23, 0x4A, 0xC0, 0x21, 0x13, 0x60, 0x22, 0x4A, 0x49, 0x00, -0x13, 0x60, 0x22, 0x4A, 0x22, 0x48, 0x13, 0x60, 0x22, 0x4A, 0x13, 0x60, -0x22, 0x4B, 0x02, 0x22, 0x5A, 0x50, 0xC0, 0x21, 0x91, 0x40, 0x5C, 0x58, -0x20, 0x40, 0x58, 0x50, 0x1F, 0x49, 0x04, 0x24, 0x08, 0x69, 0x20, 0x43, -0x08, 0x61, 0x62, 0xB6, 0x1A, 0x60, 0x80, 0x23, 0xDB, 0x05, 0x1A, 0x6C, -0x80, 0x22, 0x12, 0x02, 0x1A, 0x64, 0x1A, 0x6C, 0x80, 0x22, 0xD2, 0x01, -0x1A, 0x64, 0x9A, 0x68, 0x80, 0x22, 0x52, 0x00, 0x9A, 0x60, 0xA0, 0x22, -0xD2, 0x05, 0x91, 0x68, 0x14, 0x49, 0x91, 0x60, 0x1A, 0x6C, 0x00, 0x22, -0x1A, 0x64, 0xFE, 0xE7, 0x10, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, -0x3C, 0x00, 0x00, 0x20, 0xFF, 0x03, 0x00, 0x00, 0x31, 0x00, 0x00, 0x20, -0x08, 0x04, 0x00, 0x00, 0x35, 0x00, 0x00, 0x20, 0x0C, 0x04, 0x00, 0x00, -0x10, 0x04, 0x00, 0x00, 0x2D, 0x00, 0x00, 0x20, 0xF9, 0x03, 0x00, 0x00, -0x24, 0x00, 0x00, 0x20, 0x18, 0x00, 0x00, 0x20, 0x1C, 0x00, 0x00, 0x20, -0xFF, 0x00, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x20, 0x00, 0xE1, 0x00, 0xE0, -0x00, 0xED, 0x00, 0xE0, 0x00, 0x00, 0xC8, 0x42, 0x70, 0x47, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x4D, 0x31, 0x48, 0x30, 0x43, 0x4F, 0x34, 0x35, -0xFF, 0x5B, 0x00, 0x00, 0xFF, 0x73, 0x00, 0x00, 0xFF, 0x7B, 0x00, 0x00, -0xF7, 0xB5, 0x03, 0xF0, 0xC3, 0xFC, 0x05, 0xF0, 0x33, 0xF8, 0x00, 0x20, -0x05, 0xF0, 0xF2, 0xFB, 0x4E, 0x4B, 0x33, 0x33, 0x1B, 0x78, 0x5E, 0x42, -0x73, 0x41, 0x10, 0x26, 0xF6, 0x1A, 0x4C, 0x4B, 0x1E, 0x70, 0x4C, 0x4B, -0x1A, 0x68, 0x01, 0x3A, 0x53, 0x42, 0x5A, 0x41, 0x4A, 0x4B, 0x1A, 0x70, -0x4A, 0x4B, 0x1C, 0x78, 0x00, 0x2C, 0x22, 0xD1, 0x49, 0x4A, 0x01, 0x25, -0x14, 0x70, 0x1D, 0x70, 0x00, 0xF0, 0x52, 0xFA, 0x47, 0x4B, 0x28, 0x1C, -0xDA, 0x78, 0x9A, 0x70, 0x5C, 0x70, 0x05, 0xF0, 0xD1, 0xFB, 0x03, 0xF0, -0x7F, 0xFB, 0x01, 0xF0, 0x17, 0xFB, 0x80, 0x23, 0xDB, 0x05, 0x1A, 0x6C, -0x7F, 0x21, 0x8A, 0x43, 0x1A, 0x64, 0x00, 0xF0, 0xF5, 0xFD, 0x02, 0xF0, -0x4B, 0xFF, 0x01, 0xF0, 0x0B, 0xFB, 0x01, 0xF0, 0xA3, 0xFA, 0x3C, 0x4B, -0x02, 0x20, 0x1B, 0x68, 0x98, 0x47, 0x3B, 0x4C, 0x23, 0x78, 0x00, 0x2B, -0x03, 0xD1, 0x3A, 0x4B, 0x1B, 0x78, 0x00, 0x2B, 0x0F, 0xD0, 0x23, 0x78, -0x00, 0xF0, 0x94, 0xFC, 0x22, 0x78, 0x2E, 0x4B, 0x00, 0x2A, 0x01, 0xD0, -0x1E, 0x70, 0x01, 0xE0, 0x0D, 0x22, 0x1A, 0x70, 0x31, 0x4A, 0x00, 0x23, -0x13, 0x70, 0x31, 0x4A, 0x13, 0x70, 0x2C, 0x4B, 0x1B, 0x78, 0x00, 0x2B, -0x2C, 0xD0, 0x2F, 0x4D, 0x2B, 0x78, 0x00, 0x2B, 0x28, 0xD0, 0x2A, 0x4C, -0x13, 0x20, 0x23, 0x68, 0x98, 0x47, 0x00, 0xF0, 0x0F, 0xFA, 0x03, 0xF0, -0x08, 0xFB, 0x03, 0xF0, 0x8B, 0xFA, 0x29, 0x4B, 0x18, 0x78, 0x01, 0xF0, -0xA1, 0xF8, 0x00, 0xF0, 0xC7, 0xFD, 0x27, 0x4A, 0x01, 0x23, 0x13, 0x70, -0x26, 0x4A, 0x13, 0x80, 0x02, 0xF0, 0xDE, 0xFF, 0x2B, 0x78, 0x00, 0x2B, -0xFC, 0xD1, 0x23, 0x68, 0x14, 0x20, 0x98, 0x47, 0x00, 0xF0, 0xF6, 0xF9, -0x03, 0xF0, 0xEF, 0xFA, 0x03, 0xF0, 0x72, 0xFA, 0x1C, 0x4B, 0x18, 0x78, -0x01, 0xF0, 0x88, 0xF8, 0x10, 0x4B, 0x1E, 0x70, 0x00, 0xF0, 0x7E, 0xFF, -0x0E, 0x4C, 0x27, 0x78, 0x78, 0xB2, 0x13, 0x28, 0x00, 0xD9, 0x8D, 0xE1, -0x05, 0xF0, 0xD4, 0xF8, 0x74, 0x00, 0x8C, 0x01, 0x78, 0x01, 0x8C, 0x01, -0x8C, 0x01, 0x8C, 0x01, 0x8C, 0x01, 0x8C, 0x01, 0x8C, 0x01, 0x8C, 0x01, -0x8C, 0x01, 0x8C, 0x01, 0x8C, 0x01, 0x68, 0x00, 0x8C, 0x01, 0x3A, 0x00, -0x30, 0x00, 0x5F, 0x00, 0x8C, 0x01, 0x89, 0x01, 0xAE, 0x09, 0x00, 0x20, -0x1D, 0x03, 0x00, 0x20, 0x50, 0x11, 0x00, 0x20, 0xEB, 0x01, 0x00, 0x20, -0xE9, 0x01, 0x00, 0x20, 0xEA, 0x01, 0x00, 0x20, 0xAA, 0x0A, 0x00, 0x20, -0xF8, 0x01, 0x00, 0x20, 0xE8, 0x01, 0x00, 0x20, 0xE7, 0x01, 0x00, 0x20, -0xE5, 0x01, 0x00, 0x20, 0x48, 0x0D, 0x00, 0x20, 0xF6, 0x03, 0x00, 0x20, -0x08, 0x03, 0x00, 0x20, 0xB1, 0x4B, 0x00, 0x22, 0x1A, 0x70, 0x00, 0xF0, -0x7D, 0xFE, 0xB0, 0x4B, 0x1B, 0x78, 0x00, 0x2B, 0x00, 0xD0, 0x55, 0xE1, -0xAE, 0x4C, 0x23, 0x78, 0x00, 0x2B, 0x03, 0xD0, 0x00, 0x20, 0xAD, 0x49, -0x03, 0xF0, 0xB8, 0xFC, 0x23, 0x78, 0x00, 0x2B, 0x06, 0xD0, 0x01, 0x21, -0x00, 0x20, 0xAA, 0x4A, 0x0B, 0x1C, 0x00, 0x90, 0x03, 0xF0, 0x56, 0xFC, -0xA8, 0x4B, 0x98, 0x78, 0x03, 0xF0, 0x78, 0xFA, 0xA7, 0x4D, 0xE8, 0x7B, -0x03, 0xF0, 0x52, 0xF8, 0xA6, 0x4C, 0x20, 0x60, 0x28, 0x7C, 0x03, 0xF0, -0x4D, 0xF8, 0x11, 0x23, 0x60, 0x60, 0xEB, 0x56, 0xEA, 0x7B, 0x53, 0x43, -0xA3, 0x60, 0x9A, 0x4B, 0x00, 0x22, 0x1A, 0x70, 0xA0, 0x4B, 0x1B, 0x78, -0xA0, 0x4B, 0x18, 0x78, 0x01, 0xF0, 0x14, 0xF8, 0x95, 0x4B, 0x9D, 0x4D, -0x00, 0x24, 0x1C, 0x70, 0x2B, 0x78, 0x00, 0xF0, 0x29, 0xFD, 0x03, 0xF0, -0x8B, 0xFF, 0x00, 0xF0, 0x25, 0xFD, 0x2C, 0x70, 0x8F, 0x4B, 0x01, 0x24, -0x1C, 0x70, 0x00, 0xF0, 0x9B, 0xFC, 0x97, 0x4B, 0x1B, 0x68, 0x9A, 0x05, -0x13, 0xD5, 0x96, 0x4A, 0x96, 0x4B, 0x04, 0x20, 0x1A, 0x60, 0x96, 0x4B, -0x19, 0x68, 0x01, 0x43, 0x19, 0x60, 0x19, 0x68, 0x02, 0x20, 0x81, 0x43, -0x19, 0x60, 0x19, 0x68, 0x0C, 0x43, 0x1C, 0x60, 0x91, 0x4B, 0x00, 0x21, -0x19, 0x60, 0x91, 0x4B, 0x1A, 0x60, 0x91, 0x4C, 0x03, 0x20, 0x23, 0x68, -0x98, 0x47, 0x03, 0xF0, 0x3F, 0xF8, 0x23, 0x68, 0x05, 0x20, 0x98, 0x47, -0x02, 0xF0, 0xE4, 0xFF, 0x8C, 0x4C, 0x8D, 0x4D, 0x01, 0x20, 0x40, 0x42, -0x21, 0x1C, 0x2A, 0x1C, 0x04, 0xF0, 0x4C, 0xFC, 0x79, 0x4B, 0x1B, 0x78, -0x00, 0x2B, 0x03, 0xD0, 0x0C, 0x20, 0x88, 0x49, 0x03, 0xF0, 0x4E, 0xFC, -0x87, 0x4A, 0x23, 0x68, 0x13, 0x80, 0x2B, 0x68, 0x53, 0x80, 0x73, 0x4B, -0x1B, 0x78, 0x00, 0x2B, 0x06, 0xD0, 0x01, 0x23, 0x02, 0x21, 0x00, 0x93, -0x0C, 0x20, 0x0B, 0x1C, 0x03, 0xF0, 0xE6, 0xFB, 0x7B, 0x4C, 0x06, 0x20, -0x23, 0x68, 0x98, 0x47, 0x03, 0xF0, 0xF4, 0xFF, 0x04, 0xF0, 0x64, 0xF9, -0x04, 0xF0, 0x98, 0xFB, 0x00, 0xF0, 0x62, 0xF9, 0x04, 0xF0, 0x06, 0xFD, -0x04, 0xF0, 0x7E, 0xFE, 0x78, 0x4B, 0x1B, 0x78, 0x00, 0x2B, 0x2A, 0xD1, -0x23, 0x68, 0x07, 0x20, 0x98, 0x47, 0x01, 0xF0, 0x51, 0xFA, 0x23, 0x68, -0x08, 0x20, 0x98, 0x47, 0x02, 0xF0, 0xB2, 0xFF, 0x02, 0xF0, 0xBA, 0xFF, -0x23, 0x68, 0x09, 0x20, 0x98, 0x47, 0x01, 0xF0, 0x69, 0xFA, 0x01, 0xF0, -0xD1, 0xFB, 0x23, 0x68, 0x0A, 0x20, 0x98, 0x47, 0x01, 0xF0, 0x6E, 0xFC, -0x02, 0xF0, 0x44, 0xFB, 0x23, 0x68, 0x0B, 0x20, 0x98, 0x47, 0x01, 0xF0, -0xB8, 0xFE, 0x01, 0xF0, 0xD7, 0xFF, 0x23, 0x68, 0x0E, 0x20, 0x98, 0x47, -0x02, 0xF0, 0x84, 0xF8, 0x02, 0xF0, 0xF2, 0xF9, 0x23, 0x68, 0x10, 0x20, -0x98, 0x47, 0x00, 0xF0, 0x81, 0xF9, 0x5B, 0x4B, 0x0F, 0x20, 0x1B, 0x68, -0x98, 0x47, 0x5E, 0x4B, 0x1B, 0x78, 0x00, 0x2B, 0x3C, 0xD1, 0x02, 0xF0, -0x4F, 0xFA, 0x5C, 0x4B, 0x1A, 0x68, 0x5C, 0x4B, 0x00, 0x2A, 0x04, 0xD1, -0x5B, 0x49, 0x09, 0x68, 0x00, 0x29, 0x00, 0xDD, 0x1A, 0x70, 0x47, 0x4A, -0x19, 0x78, 0x32, 0x32, 0x12, 0x78, 0x91, 0x42, 0x01, 0xD3, 0x00, 0x22, -0x1A, 0x70, 0x1B, 0x78, 0x00, 0x2B, 0x21, 0xD1, 0x53, 0x4B, 0x51, 0x4C, -0x1B, 0x68, 0x00, 0x2B, 0x09, 0xDD, 0x20, 0x68, 0x00, 0x28, 0x06, 0xD1, -0x39, 0x4B, 0x1B, 0x78, 0x00, 0x2B, 0x02, 0xD0, 0x4E, 0x49, 0x03, 0xF0, -0xCF, 0xFB, 0x4E, 0x4B, 0x1B, 0x68, 0x98, 0x47, 0x23, 0x68, 0x00, 0x2B, -0x0A, 0xDD, 0x49, 0x4B, 0x18, 0x68, 0x00, 0x28, 0x06, 0xD1, 0x31, 0x4B, -0x1B, 0x78, 0x00, 0x2B, 0x02, 0xD0, 0x48, 0x49, 0x03, 0xF0, 0xBE, 0xFB, -0x02, 0xF0, 0x72, 0xFA, 0x41, 0x4B, 0x1A, 0x78, 0x01, 0x32, 0x1A, 0x70, -0x32, 0x4B, 0x1B, 0x68, 0x9A, 0x05, 0x23, 0xD5, 0x34, 0x4B, 0x18, 0x68, -0x2A, 0x4B, 0x1A, 0x79, 0x19, 0x78, 0x2F, 0x4B, 0x18, 0x1A, 0x53, 0x1C, -0x98, 0x40, 0x04, 0xF0, 0x8D, 0xFF, 0x23, 0x4C, 0x2F, 0x4D, 0x23, 0x78, -0x28, 0x60, 0x00, 0x2B, 0x03, 0xD0, 0x00, 0x20, 0x39, 0x49, 0x03, 0xF0, -0x9F, 0xFB, 0x23, 0x78, 0x00, 0x2B, 0x06, 0xD0, 0x00, 0x20, 0x01, 0x21, -0x2A, 0x1C, 0x04, 0x23, 0x00, 0x90, 0x03, 0xF0, 0x3D, 0xFB, 0x24, 0x4B, -0x01, 0x21, 0x1A, 0x68, 0x8A, 0x43, 0x1A, 0x60, 0x80, 0x23, 0xDB, 0x05, -0x9A, 0x6C, 0x01, 0x21, 0x0A, 0x43, 0x9A, 0x64, 0x00, 0xF0, 0x1E, 0xFC, -0x2D, 0x4B, 0x00, 0x20, 0x18, 0x56, 0x00, 0xF0, 0x5D, 0xFE, 0x17, 0xE0, -0x0F, 0x4B, 0x1B, 0x78, 0x00, 0x2B, 0x03, 0xD0, 0x05, 0x20, 0x29, 0x49, -0x03, 0xF0, 0x7A, 0xFB, 0x01, 0x20, 0x00, 0xF0, 0xF9, 0xFE, 0x00, 0x20, -0x00, 0xF0, 0xF6, 0xFE, 0x13, 0x23, 0x23, 0x70, 0x06, 0xE0, 0x00, 0xF0, -0x0D, 0xFC, 0x03, 0xE0, 0x13, 0x4B, 0x11, 0x20, 0x1B, 0x68, 0x98, 0x47, -0x20, 0x4B, 0x1F, 0x70, 0xEB, 0xE5, 0xC0, 0x46, 0xEA, 0x01, 0x00, 0x20, -0xE0, 0x01, 0x00, 0x20, 0xEB, 0x01, 0x00, 0x20, 0x34, 0x59, 0x00, 0x00, -0xAC, 0x0A, 0x00, 0x20, 0xAA, 0x0A, 0x00, 0x20, 0xAE, 0x09, 0x00, 0x20, -0xFC, 0x02, 0x00, 0x20, 0x1D, 0x03, 0x00, 0x20, 0x48, 0x0D, 0x00, 0x20, -0x58, 0x00, 0x00, 0x20, 0xFF, 0xFF, 0xFF, 0x00, 0x14, 0xE0, 0x00, 0xE0, -0x10, 0xE0, 0x00, 0xE0, 0x18, 0xE0, 0x00, 0xE0, 0xFC, 0x01, 0x00, 0x20, -0xF8, 0x01, 0x00, 0x20, 0x34, 0x11, 0x00, 0x20, 0x38, 0x11, 0x00, 0x20, -0x38, 0x59, 0x00, 0x00, 0x54, 0x11, 0x00, 0x20, 0x48, 0x11, 0x00, 0x20, -0x20, 0x01, 0x00, 0x20, 0xCA, 0x00, 0x00, 0x20, 0x9C, 0x0D, 0x00, 0x20, -0x3E, 0x59, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x47, 0x59, 0x00, 0x00, -0x51, 0x59, 0x00, 0x00, 0xB3, 0x01, 0x00, 0x20, 0x5E, 0x59, 0x00, 0x00, -0x56, 0x00, 0x00, 0x20, 0x08, 0xB5, 0x01, 0xF0, 0x99, 0xFD, 0x01, 0xF0, -0xB3, 0xFD, 0x03, 0x4B, 0x1B, 0x68, 0x98, 0x47, 0x02, 0xF0, 0xD2, 0xF9, -0x08, 0xBD, 0xC0, 0x46, 0x00, 0x02, 0x00, 0x20, 0x10, 0xB5, 0x04, 0xF0, -0xEF, 0xFD, 0x05, 0x4C, 0x00, 0x20, 0x23, 0x68, 0x98, 0x47, 0x04, 0xF0, -0x19, 0xFE, 0x23, 0x68, 0x01, 0x20, 0x98, 0x47, 0x10, 0xBD, 0xC0, 0x46, -0xF8, 0x01, 0x00, 0x20, 0x7F, 0xB5, 0x17, 0x4D, 0x17, 0x4B, 0x5B, 0x1B, -0x03, 0x93, 0x17, 0x4B, 0x1B, 0x78, 0x00, 0x2B, 0x06, 0xD0, 0x00, 0x20, -0x01, 0x21, 0x03, 0xAA, 0x04, 0x23, 0x00, 0x90, 0x03, 0xF0, 0xA0, 0xFA, -0x12, 0x4E, 0x18, 0xE0, 0x14, 0x2C, 0x00, 0xDD, 0x14, 0x24, 0xE1, 0xB2, -0x08, 0x1C, 0x03, 0xE0, 0x01, 0x38, 0xC0, 0xB2, 0x2B, 0x5C, 0x33, 0x54, -0x00, 0x28, 0xF9, 0xD1, 0x0A, 0x4B, 0x1B, 0x78, 0x00, 0x2B, 0x04, 0xD0, -0x09, 0x4A, 0x01, 0x23, 0x00, 0x90, 0x03, 0xF0, 0x89, 0xFA, 0x03, 0x9B, -0x2D, 0x19, 0x1B, 0x1B, 0x03, 0x93, 0x03, 0x9C, 0x00, 0x2C, 0xE3, 0xD1, -0x7F, 0xBD, 0xC0, 0x46, 0x0C, 0x1E, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, -0xEB, 0x01, 0x00, 0x20, 0x54, 0x11, 0x00, 0x20, 0x13, 0xB5, 0x1E, 0x4B, -0x1B, 0x78, 0x00, 0x2B, 0x37, 0xD0, 0x1D, 0x4C, 0x00, 0x23, 0x23, 0x70, -0x1C, 0x4B, 0x04, 0x20, 0x1B, 0x68, 0x98, 0x47, 0x1B, 0x4B, 0x1C, 0x4A, -0x59, 0x68, 0x1B, 0x68, 0x11, 0x80, 0x53, 0x80, 0x1A, 0x4B, 0x1B, 0x78, -0x00, 0x2B, 0x06, 0xD0, 0x01, 0x23, 0x02, 0x21, 0x00, 0x93, 0x18, 0x20, -0x0B, 0x1C, 0x03, 0xF0, 0x5B, 0xFA, 0x23, 0x78, 0x15, 0x4C, 0x00, 0x2B, -0x1A, 0xD0, 0x13, 0x4B, 0x1B, 0x78, 0x00, 0x2B, 0x03, 0xD0, 0x00, 0x20, -0x12, 0x49, 0x03, 0xF0, 0xA7, 0xFA, 0x12, 0x4A, 0x01, 0x23, 0x13, 0x70, -0x22, 0x68, 0x02, 0x2A, 0x04, 0xDC, 0xD2, 0x18, 0x22, 0x60, 0x0F, 0x4A, -0x13, 0x70, 0x08, 0xE0, 0xFF, 0xF7, 0x74, 0xFF, 0x0D, 0x4B, 0x0D, 0x22, -0x1A, 0x70, 0x00, 0x23, 0x23, 0x60, 0x00, 0xE0, 0x23, 0x60, 0x13, 0xBD, -0x1C, 0x03, 0x00, 0x20, 0x3D, 0x11, 0x00, 0x20, 0xF8, 0x01, 0x00, 0x20, -0x70, 0x01, 0x00, 0x20, 0x54, 0x11, 0x00, 0x20, 0xEB, 0x01, 0x00, 0x20, -0x84, 0x01, 0x00, 0x20, 0xD0, 0x58, 0x00, 0x00, 0x48, 0x11, 0x00, 0x20, -0x14, 0x09, 0x00, 0x20, 0x1D, 0x03, 0x00, 0x20, 0xF0, 0xB5, 0xBA, 0x4B, -0x85, 0xB0, 0x04, 0x33, 0xDB, 0x7F, 0x00, 0x24, 0xB8, 0x49, 0x0A, 0x22, -0x09, 0xE0, 0x01, 0x3B, 0xDB, 0xB2, 0x10, 0x1C, 0x58, 0x43, 0x08, 0x18, -0x3C, 0x25, 0x40, 0x5F, 0x00, 0x28, 0x00, 0xD0, 0x01, 0x24, 0x00, 0x2B, -0xF3, 0xD1, 0xB2, 0x4B, 0xB2, 0x4A, 0x1B, 0x78, 0x07, 0xE0, 0x01, 0x3B, -0xDB, 0xB2, 0x19, 0x1D, 0x49, 0x00, 0x89, 0x5E, 0x00, 0x29, 0x00, 0xD0, -0x01, 0x24, 0x00, 0x2B, 0xF5, 0xD1, 0xAD, 0x4A, 0x00, 0x2C, 0x04, 0xD1, -0x13, 0x68, 0xAC, 0x49, 0x8B, 0x42, 0x01, 0xD0, 0x01, 0x33, 0x13, 0x60, -0xAA, 0x4B, 0x00, 0x22, 0x1A, 0x70, 0xA4, 0x4B, 0x1A, 0x68, 0xA2, 0x4B, -0x00, 0x2A, 0x7C, 0xD1, 0xA3, 0x4A, 0x12, 0x68, 0x00, 0x2A, 0x78, 0xD1, -0x1A, 0x1C, 0x34, 0x32, 0x10, 0x78, 0x00, 0x28, 0x41, 0xD1, 0xA3, 0x4A, -0x12, 0x78, 0x01, 0x2A, 0x17, 0xD1, 0xA2, 0x4B, 0x18, 0x70, 0xA2, 0x4B, -0x1A, 0x70, 0xA2, 0x4B, 0x18, 0x70, 0xA2, 0x4B, 0x1B, 0x78, 0x00, 0x2B, -0x02, 0xD0, 0xA1, 0x49, 0x03, 0xF0, 0x2E, 0xFA, 0x99, 0x4B, 0x01, 0x22, -0x1A, 0x70, 0x01, 0xF0, 0x9F, 0xFC, 0x01, 0xF0, 0xB9, 0xFC, 0x97, 0x4B, -0x00, 0x22, 0x1A, 0x70, 0x67, 0xE1, 0x9B, 0x4A, 0x3C, 0x33, 0x1B, 0x78, -0x12, 0x68, 0x9A, 0x42, 0x1F, 0xDB, 0x96, 0x4B, 0x1B, 0x78, 0x00, 0x2B, -0x02, 0xD0, 0x97, 0x49, 0x03, 0xF0, 0x16, 0xFA, 0x96, 0x4B, 0x87, 0x49, -0x1A, 0x68, 0x3D, 0x31, 0x01, 0x32, 0x1A, 0x60, 0x09, 0x78, 0x8A, 0x42, -0x0F, 0xDB, 0x00, 0x20, 0x18, 0x60, 0x8A, 0x4B, 0x18, 0x70, 0x8A, 0x4B, -0x18, 0x70, 0x8B, 0x4B, 0x1B, 0x78, 0x83, 0x42, 0x02, 0xD0, 0x8E, 0x49, -0x03, 0xF0, 0x00, 0xFA, 0x82, 0x4B, 0x02, 0x22, 0x1A, 0x70, 0x85, 0x4B, -0x8B, 0x4A, 0x00, 0x21, 0x19, 0x70, 0x10, 0x68, 0x85, 0x4B, 0x19, 0x60, -0x13, 0x1C, 0x88, 0x42, 0x0E, 0xDD, 0x01, 0x38, 0x10, 0x60, 0x8C, 0x42, -0x00, 0xD0, 0x11, 0x60, 0x1A, 0x68, 0x01, 0x2A, 0x00, 0xD0, 0x18, 0xE1, -0x00, 0x22, 0x1A, 0x60, 0x76, 0x4B, 0x03, 0x22, 0x1A, 0x70, 0x28, 0xE1, -0x80, 0x4B, 0x81, 0x49, 0x04, 0x33, 0xDB, 0x8F, 0x8B, 0x42, 0x00, 0xD1, -0x0B, 0xE1, 0x7F, 0x49, 0x09, 0x68, 0x99, 0x42, 0x00, 0xDA, 0x06, 0xE1, -0x68, 0x4B, 0x6C, 0x48, 0x19, 0x1C, 0x3E, 0x31, 0x09, 0x78, 0x00, 0x68, -0x88, 0x42, 0x00, 0xDA, 0xFD, 0xE0, 0x3F, 0x33, 0x1B, 0x78, 0x13, 0x60, -0xF9, 0xE0, 0x04, 0x33, 0xD8, 0x7F, 0x00, 0x23, 0x1A, 0x1C, 0x75, 0x49, -0x31, 0xE0, 0x01, 0x38, 0xC0, 0xB2, 0x0A, 0x24, 0x44, 0x43, 0x5E, 0x4F, -0x3D, 0x19, 0x3C, 0x26, 0xAD, 0x5F, 0x00, 0x2D, 0x27, 0xDD, 0x0C, 0x19, -0x3C, 0x27, 0xE4, 0x5F, 0x00, 0x2C, 0x22, 0xDD, 0x44, 0x00, 0x0D, 0x19, -0xAF, 0x88, 0x57, 0x4D, 0x3E, 0xB2, 0x2C, 0x19, 0xA4, 0x88, 0x25, 0xB2, -0x76, 0x1B, 0x02, 0xD4, 0x3C, 0x1B, 0xA4, 0xB2, 0x01, 0xE0, 0xE4, 0x1B, -0xA4, 0xB2, 0x05, 0x1C, 0x64, 0x4E, 0x50, 0x4F, 0x10, 0x35, 0x6D, 0x00, -0xA2, 0x18, 0xAC, 0x5B, 0xED, 0x5B, 0x27, 0xB2, 0x2E, 0xB2, 0x92, 0xB2, -0xBF, 0x1B, 0x02, 0xD4, 0x64, 0x1B, 0xA4, 0xB2, 0x01, 0xE0, 0x2C, 0x1B, -0xA4, 0xB2, 0xE3, 0x18, 0x9B, 0xB2, 0x00, 0x28, 0xCB, 0xD1, 0x56, 0x49, -0x08, 0x60, 0x4D, 0x49, 0x0C, 0x78, 0x43, 0x49, 0x00, 0x2C, 0x40, 0xD0, -0x34, 0x31, 0x0B, 0x78, 0x00, 0x2B, 0x00, 0xD0, 0xB3, 0xE0, 0x4A, 0x4B, -0x1B, 0x78, 0x00, 0x2B, 0x02, 0xD0, 0x53, 0x49, 0x03, 0xF0, 0x7E, 0xF9, -0x4F, 0x4C, 0x52, 0x4A, 0x23, 0x68, 0x13, 0x80, 0x51, 0x4B, 0x1B, 0x68, -0x53, 0x80, 0x43, 0x4B, 0x1B, 0x78, 0x00, 0x2B, 0x06, 0xD0, 0x01, 0x23, -0x02, 0x21, 0x00, 0x93, 0x00, 0x20, 0x0B, 0x1C, 0x03, 0xF0, 0x14, 0xF9, -0x32, 0x49, 0x20, 0x68, 0x4A, 0x8F, 0x3B, 0x4B, 0x90, 0x42, 0x14, 0xDA, -0x41, 0x4A, 0x47, 0x48, 0x45, 0x32, 0x12, 0x78, 0x00, 0x68, 0x90, 0x42, -0x0D, 0xDA, 0x1B, 0x78, 0x00, 0x2B, 0x00, 0xD0, 0x89, 0xE0, 0x37, 0x4B, -0x3C, 0x31, 0x1A, 0x68, 0x09, 0x78, 0x8A, 0x42, 0x00, 0xDB, 0x82, 0xE0, -0x01, 0x32, 0x1A, 0x60, 0x7F, 0xE0, 0x01, 0x22, 0x1A, 0x70, 0x31, 0x4A, -0x00, 0x23, 0x13, 0x60, 0x31, 0x4A, 0x13, 0x60, 0x77, 0xE0, 0x08, 0x1C, -0x34, 0x30, 0x00, 0x78, 0x00, 0x28, 0x72, 0xD1, 0x32, 0x48, 0x09, 0x8F, -0x00, 0x68, 0x88, 0x42, 0x09, 0xDB, 0x2E, 0x49, 0x33, 0x48, 0x45, 0x31, -0x09, 0x78, 0x00, 0x68, 0x88, 0x42, 0x02, 0xDB, 0x22, 0x49, 0x01, 0x20, -0x08, 0x70, 0x1F, 0x49, 0x09, 0x78, 0x00, 0x29, 0x08, 0xD1, 0x15, 0x49, -0x08, 0x8F, 0x27, 0x49, 0x88, 0x42, 0x5A, 0xD0, 0x1C, 0x49, 0x09, 0x78, -0x00, 0x29, 0x56, 0xD0, 0x11, 0x49, 0x09, 0x68, 0x01, 0x29, 0x05, 0xDC, -0x0E, 0x49, 0xC9, 0x8E, 0x8A, 0x42, 0x01, 0xD8, 0x8B, 0x42, 0x49, 0xD9, -0x13, 0x4B, 0x00, 0x20, 0x18, 0x70, 0x13, 0x4B, 0x01, 0x22, 0x1A, 0x70, -0x12, 0x4B, 0x18, 0x70, 0x12, 0x4B, 0x1B, 0x78, 0x83, 0x42, 0x02, 0xD0, -0x11, 0x49, 0x03, 0xF0, 0x0F, 0xF9, 0x0A, 0x4B, 0x01, 0x22, 0x1A, 0x70, -0x01, 0xF0, 0x80, 0xFB, 0x01, 0xF0, 0x9A, 0xFB, 0x35, 0xE0, 0xC0, 0x46, -0xAE, 0x09, 0x00, 0x20, 0x9C, 0x0D, 0x00, 0x20, 0x7C, 0x09, 0x00, 0x20, -0xE0, 0x00, 0x00, 0x20, 0xC8, 0x01, 0x00, 0x20, 0xFF, 0xFF, 0xFF, 0x7F, -0xB3, 0x01, 0x00, 0x20, 0xB4, 0x01, 0x00, 0x20, 0xDC, 0x01, 0x00, 0x20, -0xDD, 0x01, 0x00, 0x20, 0xD4, 0x01, 0x00, 0x20, 0xEB, 0x01, 0x00, 0x20, -0xDA, 0x58, 0x00, 0x00, 0xD8, 0x01, 0x00, 0x20, 0xE4, 0x58, 0x00, 0x00, -0xD0, 0x01, 0x00, 0x20, 0xEC, 0x58, 0x00, 0x00, 0xCC, 0x01, 0x00, 0x20, -0x48, 0x0D, 0x00, 0x20, 0xFF, 0xFF, 0x00, 0x00, 0x34, 0x11, 0x00, 0x20, -0x20, 0x03, 0x00, 0x20, 0xF5, 0x58, 0x00, 0x00, 0x54, 0x11, 0x00, 0x20, -0x38, 0x11, 0x00, 0x20, 0x0D, 0x4B, 0x01, 0x22, 0x1A, 0x70, 0x0D, 0x4B, -0x34, 0x33, 0x1B, 0x78, 0x00, 0x2B, 0x10, 0xD0, 0x0B, 0x4B, 0x1A, 0x78, -0x00, 0x2A, 0x0C, 0xD0, 0x0A, 0x4A, 0x00, 0x21, 0x51, 0x56, 0x03, 0x29, -0x07, 0xD0, 0x09, 0x49, 0x09, 0x78, 0x48, 0x42, 0x41, 0x41, 0x01, 0x31, -0x11, 0x70, 0x00, 0x22, 0x1A, 0x70, 0x05, 0xB0, 0xF0, 0xBD, 0xC0, 0x46, -0xB4, 0x01, 0x00, 0x20, 0xAE, 0x09, 0x00, 0x20, 0xDC, 0x01, 0x00, 0x20, -0xB3, 0x01, 0x00, 0x20, 0xDD, 0x01, 0x00, 0x20, 0x10, 0xB5, 0x54, 0x4B, -0x1B, 0x78, 0x00, 0x2B, 0x0A, 0xD0, 0x53, 0x4B, 0x1B, 0x68, 0x98, 0x47, -0x01, 0xF0, 0x1A, 0xFB, 0x01, 0xF0, 0x34, 0xFB, 0x01, 0xF0, 0x56, 0xFF, -0x02, 0xF0, 0x90, 0xFB, 0x4E, 0x4B, 0x02, 0x21, 0x1A, 0x68, 0x8A, 0x43, -0x1A, 0x60, 0x19, 0x68, 0x80, 0x22, 0xD2, 0x05, 0x90, 0x68, 0x91, 0x60, -0x19, 0x68, 0x08, 0x20, 0x81, 0x43, 0x19, 0x60, 0x19, 0x68, 0x90, 0x68, -0x91, 0x60, 0x19, 0x68, 0x04, 0x20, 0x81, 0x43, 0x19, 0x60, 0x1B, 0x68, -0x91, 0x68, 0x93, 0x60, 0x40, 0x4B, 0x18, 0x78, 0x42, 0x4B, 0x1B, 0x78, -0x00, 0x28, 0x32, 0xD0, 0x00, 0x2B, 0x03, 0xD0, 0x00, 0x20, 0x40, 0x49, -0x03, 0xF0, 0x7A, 0xF8, 0x3F, 0x4B, 0x80, 0x22, 0x19, 0x68, 0x52, 0x00, -0x0A, 0x43, 0x1A, 0x60, 0x1A, 0x68, 0xA0, 0x23, 0xDB, 0x05, 0x99, 0x68, -0x9A, 0x60, 0x37, 0x4B, 0x3A, 0x4A, 0x19, 0x68, 0x0A, 0x40, 0x1A, 0x60, -0x1A, 0x68, 0x80, 0x23, 0xDB, 0x05, 0x99, 0x68, 0x9A, 0x60, 0x37, 0x4A, -0x01, 0x21, 0x11, 0x70, 0x19, 0x68, 0x80, 0x22, 0x52, 0x04, 0x0A, 0x43, -0x1A, 0x60, 0xC0, 0x46, 0xC0, 0x46, 0xC0, 0x46, 0xC0, 0x46, 0x62, 0xB6, -0x31, 0x4A, 0x19, 0x68, 0x0A, 0x40, 0x1A, 0x60, 0xBF, 0xF3, 0x6F, 0x8F, -0xFA, 0x20, 0xC0, 0x00, 0x02, 0xF0, 0x6E, 0xFC, 0x11, 0xE0, 0x00, 0x2B, -0x02, 0xD0, 0x2C, 0x49, 0x03, 0xF0, 0x48, 0xF8, 0x2B, 0x48, 0x02, 0xF0, -0x65, 0xFC, 0x2B, 0x4B, 0x1B, 0x78, 0x00, 0x2B, 0x05, 0xD1, 0x2A, 0x4B, -0x1B, 0x78, 0x00, 0x2B, 0x01, 0xD1, 0x02, 0xF0, 0x59, 0xFE, 0x1D, 0x4B, -0x02, 0x21, 0x1A, 0x68, 0x0A, 0x43, 0x1A, 0x60, 0x19, 0x68, 0x80, 0x22, -0xD2, 0x05, 0x90, 0x68, 0x91, 0x60, 0x23, 0x49, 0x01, 0x31, 0xC8, 0x7F, -0x08, 0x21, 0x00, 0x28, 0x06, 0xD0, 0x18, 0x68, 0x01, 0x43, 0x19, 0x60, -0x19, 0x68, 0x90, 0x68, 0x91, 0x60, 0x05, 0xE0, 0x18, 0x68, 0x88, 0x43, -0x18, 0x60, 0x19, 0x68, 0x90, 0x68, 0x91, 0x60, 0x1A, 0x68, 0x04, 0x21, -0x0A, 0x43, 0x1A, 0x60, 0x1A, 0x68, 0x80, 0x23, 0xDB, 0x05, 0xFA, 0x20, -0x99, 0x68, 0xC0, 0x00, 0x9A, 0x60, 0x02, 0xF0, 0x31, 0xFC, 0x06, 0x4B, -0x1B, 0x78, 0x00, 0x2B, 0x06, 0xD0, 0x12, 0x4C, 0x0D, 0x20, 0x23, 0x68, -0x98, 0x47, 0x23, 0x68, 0x12, 0x20, 0x98, 0x47, 0x10, 0xBD, 0xC0, 0x46, -0xE8, 0x01, 0x00, 0x20, 0x68, 0x00, 0x00, 0x20, 0x14, 0x00, 0x00, 0x20, -0xEB, 0x01, 0x00, 0x20, 0xFB, 0x58, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x20, -0xFF, 0xFE, 0xFF, 0xFF, 0x2C, 0x00, 0x00, 0x20, 0xFF, 0xFF, 0xFF, 0xFE, -0x01, 0x59, 0x00, 0x00, 0x40, 0x42, 0x0F, 0x00, 0xE5, 0x01, 0x00, 0x20, -0xE4, 0x01, 0x00, 0x20, 0xAE, 0x09, 0x00, 0x20, 0xF8, 0x01, 0x00, 0x20, -0x10, 0xB5, 0x31, 0x4B, 0x02, 0x24, 0x19, 0x78, 0x30, 0x4B, 0x4A, 0xB2, -0x1B, 0x78, 0x00, 0x2B, 0x25, 0xD0, 0x2F, 0x4B, 0x1B, 0x78, 0x00, 0x2B, -0x21, 0xD1, 0x2E, 0x4B, 0x1B, 0x78, 0x00, 0x2B, 0x1D, 0xD1, 0x2D, 0x4B, -0xA2, 0x42, 0x07, 0xD0, 0x2C, 0x48, 0x80, 0x7B, 0x00, 0x28, 0x03, 0xD1, -0x2B, 0x48, 0x00, 0x68, 0x00, 0x28, 0x03, 0xD0, 0x00, 0x21, 0x19, 0x60, -0x01, 0x24, 0x0E, 0xE0, 0x28, 0x4A, 0x18, 0x68, 0x92, 0x68, 0x90, 0x42, -0x01, 0xDA, 0x01, 0x30, 0x18, 0x60, 0x00, 0x29, 0x36, 0xD0, 0x21, 0x4B, -0x00, 0x24, 0x1B, 0x68, 0x93, 0x42, 0x16, 0xDA, 0x30, 0xE0, 0x63, 0xB2, -0x93, 0x42, 0x2D, 0xD0, 0x01, 0x2B, 0x1D, 0xD0, 0x02, 0x2B, 0x02, 0xD0, -0x00, 0x2B, 0x0C, 0xD0, 0x24, 0xE0, 0x1D, 0x4B, 0x1B, 0x78, 0x00, 0x2B, -0x03, 0xD0, 0x00, 0x20, 0x1B, 0x49, 0x02, 0xF0, 0xA5, 0xFF, 0x00, 0x20, -0x02, 0xF0, 0x78, 0xFB, 0x18, 0xE0, 0x17, 0x4B, 0x1B, 0x78, 0x00, 0x2B, -0x03, 0xD0, 0x00, 0x20, 0x16, 0x49, 0x02, 0xF0, 0x99, 0xFF, 0x12, 0x4B, -0x58, 0x68, 0x02, 0xF0, 0x6B, 0xFB, 0x0B, 0xE0, 0x10, 0x4B, 0x1B, 0x78, -0x00, 0x2B, 0x03, 0xD0, 0x00, 0x20, 0x11, 0x49, 0x02, 0xF0, 0x8C, 0xFF, -0x0B, 0x4B, 0x18, 0x68, 0x02, 0xF0, 0x5E, 0xFB, 0x02, 0x4B, 0x1C, 0x70, -0x02, 0xF0, 0x4C, 0xFB, 0x10, 0xBD, 0xC0, 0x46, 0x3C, 0x00, 0x00, 0x20, -0x1C, 0x03, 0x00, 0x20, 0xE3, 0x01, 0x00, 0x20, 0xE2, 0x01, 0x00, 0x20, -0x5C, 0x00, 0x00, 0x20, 0x70, 0x01, 0x00, 0x20, 0xE0, 0x00, 0x00, 0x20, -0xFC, 0x02, 0x00, 0x20, 0xEB, 0x01, 0x00, 0x20, 0x09, 0x59, 0x00, 0x00, -0x0E, 0x59, 0x00, 0x00, 0x13, 0x59, 0x00, 0x00, 0x08, 0xB5, 0x02, 0xF0, -0x5F, 0xFB, 0x08, 0xBD, 0x08, 0xB5, 0x02, 0xF0, 0x4D, 0xFB, 0x08, 0xBD, -0x08, 0xB5, 0x02, 0xF0, 0xE5, 0xFA, 0x80, 0x23, 0xDB, 0x05, 0x9A, 0x6C, -0x01, 0x21, 0x0A, 0x43, 0x9A, 0x64, 0xFF, 0xF7, 0xF1, 0xFF, 0x08, 0xBD, -0xF0, 0xB5, 0x87, 0xB0, 0xFF, 0xF7, 0xF0, 0xFF, 0x78, 0x4A, 0x79, 0x4C, -0x53, 0x78, 0x15, 0x78, 0x78, 0x48, 0x10, 0xE0, 0x01, 0x3B, 0xDB, 0xB2, -0x9A, 0x1C, 0x67, 0x46, 0xB2, 0x18, 0x79, 0x01, 0x52, 0x00, 0x12, 0x5B, -0xC9, 0x18, 0x4F, 0x00, 0x3A, 0x52, 0x73, 0x4A, 0x00, 0x27, 0x8F, 0x54, -0x00, 0x2B, 0xEF, 0xD1, 0x63, 0x46, 0x5A, 0x1E, 0xD2, 0xB2, 0x00, 0x2B, -0x04, 0xD0, 0x56, 0x1C, 0x2B, 0x1C, 0xB6, 0x01, 0x94, 0x46, 0xF3, 0xE7, -0x6C, 0x4B, 0x6D, 0x4C, 0x1B, 0x78, 0x6D, 0x48, 0x67, 0x49, 0x6D, 0x4A, -0x0E, 0xE0, 0x01, 0x3B, 0xDB, 0xB2, 0xE5, 0x5C, 0xC6, 0x5C, 0x01, 0x35, -0x02, 0x36, 0xAD, 0x01, 0xAD, 0x19, 0x6D, 0x00, 0x6E, 0x5A, 0x5D, 0x00, -0xAE, 0x52, 0x67, 0x4D, 0x00, 0x26, 0xEE, 0x54, 0x00, 0x2B, 0xEE, 0xD1, -0x65, 0x25, 0x03, 0x95, 0x5B, 0x4C, 0x66, 0xE0, 0xFF, 0xF7, 0xB2, 0xFF, -0x26, 0x78, 0x63, 0x78, 0x05, 0x96, 0x2D, 0xE0, 0x01, 0x3B, 0xDB, 0xB2, -0x58, 0x4F, 0xF0, 0x18, 0x04, 0x9D, 0x40, 0x00, 0x9A, 0x1C, 0xC0, 0x5B, -0xAD, 0x18, 0x54, 0x4F, 0x6D, 0x00, 0xEF, 0x5B, 0xC7, 0x1B, 0x04, 0xD4, -0x51, 0x4F, 0xED, 0x5B, 0x45, 0x1B, 0x02, 0x95, 0x03, 0xE0, 0x4F, 0x4F, -0xED, 0x5B, 0x2D, 0x1A, 0x02, 0x95, 0x04, 0x98, 0x87, 0x18, 0x4C, 0x48, -0x7F, 0x00, 0xC0, 0x5B, 0x4B, 0x4F, 0x84, 0x46, 0xF0, 0x18, 0x42, 0x00, -0x15, 0x1C, 0x62, 0x46, 0xEA, 0x53, 0x49, 0x4D, 0x2F, 0x5C, 0x02, 0x9D, -0xBD, 0x42, 0x00, 0xDA, 0x3D, 0x1C, 0x46, 0x4F, 0x3D, 0x54, 0x00, 0x2B, -0xD2, 0xD1, 0x0B, 0x1C, 0x59, 0x1E, 0xC9, 0xB2, 0x00, 0x2B, 0x05, 0xD0, -0x48, 0x1C, 0x80, 0x01, 0x05, 0x9B, 0x4E, 0x01, 0x04, 0x90, 0xF2, 0xE7, -0x3F, 0x4B, 0x3C, 0x4A, 0x1B, 0x78, 0x22, 0xE0, 0x3E, 0x4D, 0x01, 0x3B, -0xDB, 0xB2, 0x3E, 0x4F, 0xEE, 0x5C, 0x3E, 0x48, 0xFD, 0x5C, 0x59, 0x00, -0x01, 0x36, 0x09, 0x5A, 0x02, 0x35, 0xB0, 0x01, 0x40, 0x19, 0x40, 0x00, -0x87, 0x5A, 0x80, 0x5A, 0xCF, 0x1B, 0x01, 0xD4, 0x09, 0x1A, 0x00, 0xE0, -0x41, 0x1A, 0xB6, 0x01, 0x75, 0x19, 0x2F, 0x48, 0x6D, 0x00, 0x46, 0x5B, -0x33, 0x48, 0x5D, 0x00, 0x2E, 0x52, 0x33, 0x48, 0xC5, 0x5C, 0xA9, 0x42, -0x00, 0xDA, 0x29, 0x1C, 0xC1, 0x54, 0x00, 0x2B, 0xDA, 0xD1, 0x03, 0x9B, -0x01, 0x3B, 0xDB, 0xB2, 0x03, 0x93, 0x00, 0x2B, 0x92, 0xD1, 0x61, 0x78, -0x24, 0x78, 0x24, 0x4A, 0x04, 0x94, 0x1E, 0xE0, 0x01, 0x3B, 0xDB, 0xB2, -0x45, 0x01, 0xED, 0x18, 0x21, 0x4F, 0x6D, 0x00, 0xEE, 0x5B, 0x25, 0x88, -0xAC, 0x46, 0x9D, 0x1C, 0x66, 0x45, 0x09, 0xD9, 0x27, 0x88, 0xF6, 0x1B, -0x8F, 0x01, 0xBC, 0x46, 0x65, 0x44, 0x6D, 0x00, 0xB6, 0xB2, 0xAF, 0x5A, -0xAE, 0x52, 0x05, 0xE0, 0x8E, 0x01, 0x75, 0x19, 0x6D, 0x00, 0xAE, 0x5A, -0x00, 0x26, 0xAE, 0x52, 0x00, 0x2B, 0xE1, 0xD1, 0x01, 0x1C, 0x48, 0x1E, -0xC0, 0xB2, 0x00, 0x29, 0x05, 0xD0, 0x41, 0x1C, 0x18, 0x4F, 0xCC, 0x01, -0x04, 0x9B, 0xE4, 0x19, 0xF2, 0xE7, 0x11, 0x4B, 0x13, 0x4F, 0x1B, 0x78, -0x10, 0x4E, 0x15, 0x48, 0x10, 0xE0, 0x01, 0x3B, 0xDB, 0xB2, 0xF5, 0x5C, -0x13, 0x49, 0xED, 0x01, 0x5A, 0x00, 0x6D, 0x18, 0xD4, 0x5B, 0x29, 0x88, -0x8C, 0x42, 0x03, 0xD9, 0x2D, 0x88, 0x64, 0x1B, 0x84, 0x52, 0x01, 0xE0, -0x00, 0x25, 0x85, 0x52, 0x00, 0x2B, 0xEC, 0xD1, 0x07, 0xB0, 0xF0, 0xBD, -0x0A, 0x03, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0xF8, 0x03, 0x00, 0x20, -0xB3, 0x0A, 0x00, 0x20, 0x7C, 0x09, 0x00, 0x20, 0x30, 0x75, 0x00, 0x00, -0x2A, 0x75, 0x00, 0x00, 0x14, 0x02, 0x00, 0x20, 0xA4, 0x0A, 0x00, 0x20, -0x02, 0x40, 0x00, 0x40, 0x3C, 0x0D, 0x00, 0x20, 0x82, 0x40, 0x00, 0x40, -0xF0, 0xB5, 0x87, 0xB0, 0x02, 0xF0, 0x4A, 0xF8, 0x02, 0xF0, 0x60, 0xF9, -0x00, 0x28, 0xFB, 0xD1, 0x52, 0x4B, 0x1B, 0x78, 0x02, 0x2B, 0x09, 0xD0, -0x51, 0x4B, 0x52, 0x49, 0x40, 0x33, 0x1A, 0x78, 0x53, 0x42, 0x54, 0x18, -0xE0, 0x54, 0x01, 0x33, 0x93, 0x42, 0xFA, 0xDD, 0x4C, 0x4E, 0x4E, 0x4F, -0x33, 0x1C, 0x40, 0x33, 0x1C, 0x78, 0x64, 0x42, 0x0C, 0xE0, 0xFA, 0x78, -0x80, 0x23, 0x12, 0x19, 0xD2, 0xB2, 0xDB, 0x05, 0x1A, 0x71, 0xFF, 0xF7, -0xC1, 0xFE, 0x28, 0x78, 0x20, 0x18, 0x03, 0xF0, 0xF3, 0xFD, 0x01, 0x34, -0x35, 0x1C, 0x40, 0x35, 0x2B, 0x78, 0x9C, 0x42, 0xED, 0xDD, 0x00, 0x26, -0x25, 0xE0, 0x2C, 0x78, 0x2F, 0x1C, 0x64, 0x42, 0x40, 0x3F, 0x1A, 0xE0, -0x3E, 0x4B, 0xDA, 0x78, 0x80, 0x23, 0x12, 0x19, 0xDB, 0x05, 0xD2, 0xB2, -0x1A, 0x71, 0xFF, 0xF7, 0xA7, 0xFE, 0x2D, 0x78, 0x04, 0xA9, 0x65, 0x19, -0x05, 0xAA, 0x28, 0x1C, 0x03, 0xF0, 0xF8, 0xFD, 0x35, 0x49, 0x04, 0x9B, -0x4A, 0x5D, 0xFF, 0x2B, 0x00, 0xDD, 0xFF, 0x23, 0x9A, 0x42, 0x00, 0xDA, -0x1A, 0x1C, 0x4A, 0x55, 0x01, 0x34, 0x3D, 0x1C, 0x40, 0x35, 0x2B, 0x78, -0x9C, 0x42, 0xDF, 0xDD, 0x01, 0x36, 0x2F, 0x4A, 0x2B, 0x4D, 0x13, 0x78, -0x40, 0x35, 0x9E, 0x42, 0xD3, 0xDB, 0x01, 0xF0, 0xDF, 0xFF, 0x2C, 0x49, -0x2A, 0x78, 0x0D, 0x78, 0x2B, 0x49, 0x27, 0x48, 0x09, 0x78, 0x01, 0x23, -0x03, 0x91, 0x9B, 0x1A, 0x00, 0x21, 0x29, 0x4C, 0x10, 0x18, 0x94, 0x46, -0x11, 0xE0, 0xC6, 0x18, 0x72, 0x1E, 0x12, 0x78, 0xC7, 0x5C, 0x6A, 0x43, -0x02, 0x92, 0x03, 0x9A, 0x57, 0x43, 0x02, 0x9A, 0xD7, 0x19, 0x72, 0x78, -0x6A, 0x43, 0xBA, 0x18, 0x94, 0x42, 0x01, 0xDB, 0x94, 0xB2, 0x19, 0x1C, -0x01, 0x33, 0x9C, 0x45, 0xEB, 0xDC, 0x19, 0x4B, 0x1D, 0x4C, 0xDA, 0x78, -0x51, 0x18, 0xC9, 0xB2, 0x99, 0x70, 0x13, 0x4B, 0x18, 0x78, 0x00, 0x28, -0x05, 0xD1, 0x23, 0x78, 0x00, 0x2B, 0x02, 0xD0, 0x18, 0x49, 0x02, 0xF0, -0xB7, 0xFD, 0x23, 0x78, 0x00, 0x2B, 0x0B, 0xD0, 0x0D, 0x4B, 0x00, 0x20, -0x40, 0x33, 0x19, 0x78, 0x0C, 0x4A, 0x49, 0x00, 0x01, 0x31, 0xC9, 0xB2, -0x01, 0x23, 0x00, 0x90, 0x02, 0xF0, 0x50, 0xFD, 0x0E, 0x4B, 0x1B, 0x78, -0x00, 0x2B, 0x06, 0xD0, 0x01, 0x21, 0x00, 0x20, 0x0D, 0x4A, 0x0B, 0x1C, -0x00, 0x90, 0x02, 0xF0, 0x45, 0xFD, 0x07, 0xB0, 0xF0, 0xBD, 0xC0, 0x46, -0xE0, 0x01, 0x00, 0x20, 0x48, 0x0D, 0x00, 0x20, 0x93, 0x01, 0x00, 0x20, -0xAA, 0x0A, 0x00, 0x20, 0x87, 0x0D, 0x00, 0x20, 0x54, 0x00, 0x00, 0x20, -0x55, 0x00, 0x00, 0x20, 0xFF, 0xFF, 0x00, 0x00, 0xEB, 0x01, 0x00, 0x20, -0x1A, 0x59, 0x00, 0x00, 0xAC, 0x0A, 0x00, 0x20, 0x13, 0xB5, 0x24, 0x4B, -0x24, 0x4C, 0x1B, 0x68, 0x00, 0x2B, 0x0E, 0xD0, 0x23, 0x78, 0x00, 0x2B, -0x03, 0xD0, 0x00, 0x20, 0x21, 0x49, 0x02, 0xF0, 0x77, 0xFD, 0xFF, 0xF7, -0x6D, 0xFA, 0x23, 0x78, 0x00, 0x2B, 0x02, 0xD1, 0x02, 0xF0, 0x38, 0xF8, -0xFE, 0xE7, 0x23, 0x78, 0x00, 0x2B, 0x09, 0xD0, 0x1B, 0x4C, 0x23, 0x68, -0xDA, 0x00, 0x05, 0xD5, 0xFF, 0xF7, 0x5E, 0xFA, 0x22, 0x68, 0x19, 0x4B, -0x13, 0x40, 0x23, 0x60, 0x14, 0x4C, 0x23, 0x78, 0x00, 0x2B, 0x22, 0xD0, -0x14, 0x4B, 0x1B, 0x68, 0x5A, 0x01, 0x1E, 0xD5, 0x14, 0x49, 0x00, 0x20, -0x02, 0xF0, 0x56, 0xFD, 0x13, 0x4B, 0x14, 0x4A, 0x19, 0x88, 0x11, 0x80, -0x59, 0x88, 0x51, 0x80, 0x99, 0x88, 0x91, 0x80, 0xDB, 0x88, 0xD3, 0x80, -0x10, 0x4B, 0x1B, 0x78, 0x13, 0x81, 0x23, 0x78, 0x00, 0x2B, 0x05, 0xD0, -0x00, 0x20, 0x05, 0x21, 0x02, 0x23, 0x00, 0x90, 0x02, 0xF0, 0xE8, 0xFC, -0x05, 0x4B, 0x0B, 0x4A, 0x19, 0x68, 0x0A, 0x40, 0x1A, 0x60, 0x13, 0xBD, -0x0C, 0x1E, 0x00, 0x20, 0xEB, 0x01, 0x00, 0x20, 0x20, 0x59, 0x00, 0x00, -0x58, 0x00, 0x00, 0x20, 0xFF, 0xFF, 0xFF, 0xEF, 0x27, 0x59, 0x00, 0x00, -0x04, 0x02, 0x00, 0x20, 0x54, 0x11, 0x00, 0x20, 0xAA, 0x0A, 0x00, 0x20, -0xFF, 0xFF, 0xFF, 0xFB, 0x10, 0xB5, 0x02, 0x28, 0x04, 0xD0, 0x03, 0x28, -0x45, 0xD0, 0x01, 0x28, 0x33, 0xD1, 0x15, 0xE0, 0xFF, 0xF7, 0xF6, 0xF9, -0x29, 0x4B, 0x2A, 0x4C, 0x40, 0x33, 0x1B, 0x78, 0x29, 0x49, 0x50, 0x22, -0x23, 0x70, 0x29, 0x48, 0x04, 0xF0, 0xA6, 0xF9, 0x28, 0x4B, 0x0D, 0x20, -0x1B, 0x68, 0x98, 0x47, 0xFF, 0xF7, 0xF4, 0xF9, 0x23, 0x78, 0x10, 0x2B, -0x1A, 0xD1, 0x14, 0xE0, 0xFF, 0xF7, 0xE0, 0xF9, 0x1E, 0x4B, 0x1F, 0x4C, -0x40, 0x33, 0x1B, 0x78, 0x21, 0x49, 0x50, 0x22, 0x23, 0x70, 0x1E, 0x48, -0x04, 0xF0, 0x90, 0xF9, 0x1D, 0x4B, 0x0C, 0x20, 0x1B, 0x68, 0x98, 0x47, -0xFF, 0xF7, 0xDE, 0xF9, 0x23, 0x78, 0x10, 0x2B, 0x04, 0xD1, 0x1B, 0x4B, -0xDA, 0x78, 0x9A, 0x70, 0x02, 0xF0, 0xD1, 0xFA, 0x02, 0xF0, 0x54, 0xFA, -0x20, 0xE0, 0x18, 0x4B, 0x1A, 0x78, 0x00, 0x2A, 0x05, 0xD0, 0x17, 0x4A, -0x11, 0x68, 0x01, 0x31, 0x11, 0x60, 0x00, 0x22, 0x1A, 0x70, 0x15, 0x4B, -0x1A, 0x68, 0x13, 0x2A, 0x05, 0xDD, 0x00, 0x22, 0x1A, 0x60, 0x0A, 0x4B, -0x10, 0x22, 0x1A, 0x70, 0x0C, 0xE0, 0x0F, 0x4B, 0x1A, 0x68, 0x3B, 0x2A, -0x08, 0xDD, 0x00, 0x22, 0x1A, 0x60, 0x0E, 0x4B, 0x01, 0x20, 0x1B, 0x68, -0x98, 0x47, 0x0D, 0x4B, 0x01, 0x22, 0x1A, 0x70, 0x10, 0xBD, 0xC0, 0x46, -0xAE, 0x09, 0x00, 0x20, 0x1D, 0x03, 0x00, 0x20, 0x4A, 0x74, 0x00, 0x00, -0x48, 0x0D, 0x00, 0x20, 0xF8, 0x01, 0x00, 0x20, 0x9A, 0x74, 0x00, 0x00, -0xAA, 0x0A, 0x00, 0x20, 0xC4, 0x01, 0x00, 0x20, 0xC0, 0x01, 0x00, 0x20, -0xBC, 0x01, 0x00, 0x20, 0x6C, 0x00, 0x00, 0x20, 0xE7, 0x01, 0x00, 0x20, -0x10, 0xB5, 0x0C, 0x4B, 0x01, 0x22, 0x99, 0x79, 0x00, 0x23, 0x00, 0xE0, -0x23, 0x1C, 0x5C, 0x1C, 0x10, 0x1C, 0xE4, 0xB2, 0x98, 0x40, 0x81, 0x42, -0xF8, 0xDA, 0x07, 0x4A, 0x07, 0x21, 0x13, 0x71, 0x80, 0x22, 0xD2, 0x05, -0x0B, 0x40, 0x19, 0x02, 0x10, 0x6C, 0x04, 0x4B, 0x03, 0x40, 0x0B, 0x43, -0x13, 0x64, 0x10, 0xBD, 0x48, 0x0D, 0x00, 0x20, 0x5C, 0x00, 0x00, 0x20, -0xFF, 0xF8, 0xFF, 0xFF, 0x06, 0x4B, 0x07, 0x22, 0xD9, 0x79, 0x80, 0x23, -0xDB, 0x05, 0x18, 0x6C, 0x11, 0x40, 0x04, 0x4A, 0x09, 0x02, 0x02, 0x40, -0x0A, 0x43, 0x1A, 0x64, 0x70, 0x47, 0xC0, 0x46, 0x48, 0x0D, 0x00, 0x20, -0xFF, 0xF8, 0xFF, 0xFF, 0xF0, 0xB5, 0x8D, 0xB0, 0x04, 0x90, 0xFF, 0xF7, -0xC9, 0xFF, 0xC7, 0x4B, 0xC7, 0x48, 0xDE, 0x78, 0x00, 0x21, 0x05, 0x96, -0x9C, 0x78, 0x07, 0xE0, 0x01, 0x3B, 0xDB, 0xB2, 0xEE, 0x18, 0x76, 0x00, -0x31, 0x52, 0x00, 0x2B, 0xF8, 0xD1, 0x05, 0x92, 0x05, 0x9A, 0x05, 0x9E, -0x01, 0x3A, 0xD2, 0xB2, 0x00, 0x2E, 0x02, 0xD0, 0x23, 0x1C, 0x55, 0x01, -0xF3, 0xE7, 0x04, 0x9F, 0x00, 0x2F, 0x05, 0xD0, 0xBB, 0x4B, 0x05, 0x9E, -0x5B, 0x7B, 0x06, 0x96, 0x03, 0x93, 0x04, 0xE0, 0xB9, 0x4B, 0x02, 0x27, -0x9B, 0x78, 0x06, 0x97, 0x03, 0x93, 0x68, 0x46, 0x0C, 0x21, 0x0B, 0x56, -0xB2, 0x4C, 0x0B, 0x93, 0x5B, 0x42, 0x09, 0x93, 0xAA, 0xE0, 0x6A, 0x46, -0x18, 0x23, 0x9A, 0x56, 0xE6, 0x7A, 0x27, 0x1C, 0x02, 0x92, 0x0D, 0xE0, -0x30, 0x1C, 0x00, 0x21, 0x2A, 0x1C, 0x02, 0x9B, 0x02, 0xF0, 0x4C, 0xF9, -0x30, 0x1C, 0x01, 0x21, 0x2A, 0x1C, 0x02, 0x9B, 0x02, 0xF0, 0x46, 0xF9, -0x01, 0x36, 0xF6, 0xB2, 0xBB, 0x7A, 0xFA, 0x7A, 0xD2, 0x18, 0x3B, 0x1C, -0x96, 0x42, 0xEB, 0xDB, 0x04, 0x9E, 0x00, 0x2E, 0x00, 0xD1, 0x0E, 0x3D, -0x68, 0x46, 0x18, 0x21, 0x08, 0x56, 0x5E, 0x7B, 0x9E, 0x4F, 0x02, 0x90, -0x0D, 0xE0, 0x30, 0x1C, 0x00, 0x21, 0x2A, 0x1C, 0x02, 0x9B, 0x02, 0xF0, -0x2D, 0xF9, 0x30, 0x1C, 0x01, 0x21, 0x2A, 0x1C, 0x02, 0x9B, 0x02, 0xF0, -0x27, 0xF9, 0x01, 0x36, 0xF6, 0xB2, 0x7A, 0x7B, 0x3B, 0x7B, 0xD3, 0x18, -0x9E, 0x42, 0xEC, 0xDB, 0xFF, 0xF7, 0xAE, 0xFC, 0x96, 0x4B, 0x1B, 0x78, -0x00, 0x2B, 0x06, 0xD0, 0x01, 0x23, 0x18, 0x1C, 0x19, 0x1C, 0x0B, 0xAA, -0x00, 0x93, 0x02, 0xF0, 0xAD, 0xFB, 0x00, 0x25, 0x8C, 0x4E, 0x90, 0x4F, -0x0E, 0xE0, 0x3B, 0x78, 0x00, 0x2B, 0x09, 0xD0, 0x8E, 0x4B, 0xEA, 0x01, -0xD2, 0x18, 0x00, 0x23, 0xB1, 0x78, 0x01, 0x20, 0x00, 0x93, 0x02, 0x23, -0x02, 0xF0, 0x9C, 0xFB, 0x01, 0x35, 0xED, 0xB2, 0xF3, 0x78, 0x9D, 0x42, -0xED, 0xD3, 0x0B, 0x9A, 0xB6, 0x78, 0xD2, 0xB2, 0x02, 0x96, 0x07, 0x92, -0x80, 0x4D, 0x39, 0xE0, 0x01, 0x3B, 0xDB, 0xB2, 0x08, 0x9E, 0x99, 0x1C, -0x71, 0x18, 0x82, 0x4F, 0x49, 0x00, 0xCE, 0x5B, 0xD1, 0x18, 0x48, 0x00, -0x40, 0x5B, 0xB7, 0xB2, 0xB8, 0x42, 0x14, 0xDC, 0xC0, 0x1B, 0x01, 0x1C, -0x80, 0x31, 0x01, 0xDA, 0x80, 0x20, 0x40, 0x42, 0xD7, 0x18, 0x7F, 0x28, -0x00, 0xDD, 0x7F, 0x20, 0x79, 0x49, 0x78, 0x54, 0xD1, 0x18, 0x48, 0x00, -0x2E, 0x52, 0x1C, 0x27, 0x6E, 0x46, 0x77, 0x48, 0xBE, 0x5D, 0x0E, 0x54, -0x13, 0xE0, 0x04, 0x9E, 0x00, 0x2E, 0x10, 0xD0, 0x74, 0x4E, 0xB0, 0x42, -0x08, 0xD0, 0x71, 0x4E, 0x8E, 0x57, 0x80, 0x19, 0x87, 0x42, 0x03, 0xDA, -0x6F, 0x48, 0x0E, 0x5C, 0x01, 0x36, 0x0E, 0x54, 0xD1, 0x18, 0x01, 0x27, -0x49, 0x00, 0x7F, 0x42, 0x6F, 0x52, 0x00, 0x2B, 0xC6, 0xD1, 0x63, 0x46, -0x5E, 0x1E, 0xF6, 0xB2, 0x00, 0x2B, 0x06, 0xD0, 0x72, 0x1C, 0x92, 0x01, -0x08, 0x92, 0x02, 0x9B, 0x72, 0x01, 0xB4, 0x46, 0xF1, 0xE7, 0x0B, 0x9B, -0x01, 0x3B, 0x0B, 0x93, 0x0B, 0x9D, 0x09, 0x9E, 0xB5, 0x42, 0x00, 0xDB, -0x4F, 0xE7, 0x04, 0x9F, 0x00, 0x2F, 0x45, 0xD0, 0xA0, 0x78, 0xE3, 0x78, -0x04, 0x90, 0x61, 0x78, 0x56, 0x4A, 0x06, 0x91, 0x24, 0x78, 0x02, 0x94, -0x11, 0x7C, 0xD0, 0x7A, 0x5B, 0x4C, 0x08, 0x18, 0xC0, 0xB2, 0x07, 0x90, -0x12, 0x7B, 0x89, 0x18, 0xC9, 0xB2, 0x08, 0x91, 0x55, 0x4A, 0x28, 0xE0, -0x03, 0x9E, 0x01, 0x3B, 0xDB, 0xB2, 0x00, 0x2E, 0x01, 0xD1, 0xC7, 0x18, -0xD6, 0x55, 0x06, 0x9E, 0xB1, 0x42, 0x02, 0xD2, 0x02, 0x9F, 0xBB, 0x42, -0x0C, 0xD3, 0xEF, 0x18, 0xC6, 0x18, 0x09, 0x97, 0x97, 0x5D, 0xBC, 0x46, -0x09, 0x9F, 0xE7, 0x5D, 0xBC, 0x44, 0x08, 0x9F, 0xBC, 0x44, 0x67, 0x46, -0x97, 0x55, 0x0B, 0xE0, 0xEF, 0x18, 0xC6, 0x18, 0x09, 0x97, 0x97, 0x5D, -0xBC, 0x46, 0x09, 0x9F, 0xE7, 0x5D, 0xBC, 0x44, 0x07, 0x9F, 0xBC, 0x44, -0x67, 0x46, 0x97, 0x55, 0x00, 0x2B, 0xD7, 0xD1, 0x0B, 0x1C, 0x59, 0x1E, -0xC9, 0xB2, 0x00, 0x2B, 0x3E, 0xD0, 0x26, 0x25, 0x04, 0x9B, 0x48, 0x01, -0x4D, 0x43, 0xF3, 0xE7, 0x63, 0x7C, 0xE2, 0x79, 0x07, 0x25, 0x9A, 0x18, -0x03, 0x92, 0x34, 0x4A, 0xA0, 0x7B, 0x02, 0x21, 0x52, 0x5E, 0x26, 0x79, -0xAD, 0x1A, 0x6D, 0x00, 0x86, 0x19, 0xED, 0xB2, 0x34, 0x49, 0x84, 0x46, -0x09, 0xE0, 0xB8, 0x18, 0x44, 0x5C, 0x01, 0x32, 0x2C, 0x19, 0x44, 0x54, -0xD2, 0xB2, 0xB2, 0x42, 0xF7, 0xDB, 0x01, 0x33, 0xDB, 0xB2, 0x03, 0x9A, -0x93, 0x42, 0x02, 0xDA, 0x62, 0x46, 0x5F, 0x01, 0xF5, 0xE7, 0x23, 0x4A, -0x2A, 0x49, 0x10, 0x7C, 0xD3, 0x7B, 0x56, 0x79, 0x95, 0x79, 0x9E, 0x19, -0x45, 0x19, 0x84, 0x46, 0x09, 0xE0, 0xB8, 0x18, 0x44, 0x5C, 0x01, 0x32, -0x0E, 0x3C, 0x44, 0x54, 0xD2, 0xB2, 0xAA, 0x42, 0xF7, 0xDB, 0x01, 0x33, -0xDB, 0xB2, 0xB3, 0x42, 0x02, 0xDA, 0x62, 0x46, 0x5F, 0x01, 0xF6, 0xE7, -0x1A, 0x4B, 0x1B, 0x78, 0x00, 0x2B, 0x13, 0xD0, 0x05, 0x20, 0x1F, 0x49, -0x02, 0xF0, 0x10, 0xFB, 0x0E, 0xE0, 0x2B, 0x78, 0x00, 0x2B, 0x08, 0xD0, -0x18, 0x4B, 0x72, 0x01, 0xA1, 0x78, 0xD2, 0x18, 0x05, 0x20, 0x01, 0x23, -0x00, 0x93, 0x02, 0xF0, 0xAB, 0xFA, 0x01, 0x36, 0xF6, 0xB2, 0x02, 0xE0, -0x0A, 0x4C, 0x0E, 0x4D, 0x05, 0x9E, 0xE3, 0x78, 0xB3, 0x42, 0xEA, 0xD8, -0x00, 0x21, 0x01, 0x20, 0x0A, 0x1C, 0x40, 0x42, 0x02, 0x23, 0x02, 0xF0, -0x01, 0xF8, 0x01, 0x20, 0x40, 0x42, 0x01, 0x21, 0x00, 0x22, 0x02, 0x23, -0x01, 0xF0, 0xFA, 0xFF, 0xA4, 0x78, 0x25, 0xE0, 0x0A, 0x03, 0x00, 0x20, -0xF8, 0x03, 0x00, 0x20, 0x48, 0x0D, 0x00, 0x20, 0x04, 0x02, 0x00, 0x20, -0xEB, 0x01, 0x00, 0x20, 0x84, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, -0x64, 0x0E, 0x00, 0x20, 0xB3, 0x0A, 0x00, 0x20, 0xFF, 0xFF, 0x00, 0x00, -0x36, 0x75, 0x00, 0x00, 0x2E, 0x59, 0x00, 0x00, 0x01, 0x3C, 0x00, 0x21, -0xE4, 0xB2, 0x0A, 0x1C, 0x20, 0x1C, 0x01, 0x23, 0x01, 0xF0, 0xD8, 0xFF, -0x01, 0x21, 0x20, 0x1C, 0x00, 0x22, 0x0B, 0x1C, 0x01, 0xF0, 0xD2, 0xFF, -0x00, 0x2C, 0xEF, 0xD1, 0xFF, 0xF7, 0x30, 0xFE, 0x0D, 0xB0, 0xF0, 0xBD, -0x08, 0xB5, 0x03, 0xF0, 0xC5, 0xFD, 0x05, 0x4B, 0x01, 0x20, 0x1B, 0x68, -0x98, 0x47, 0x01, 0x20, 0x04, 0xF0, 0x22, 0xF9, 0x01, 0xF0, 0xD6, 0xFD, -0x08, 0xBD, 0xC0, 0x46, 0xF8, 0x01, 0x00, 0x20, 0xF7, 0xB5, 0x2C, 0x4A, -0x00, 0x20, 0x10, 0x60, 0x2B, 0x4A, 0x2C, 0x4E, 0x11, 0x8C, 0x2C, 0x4A, -0x11, 0x60, 0x72, 0x1D, 0xD2, 0x7F, 0xF1, 0x7D, 0x50, 0x1E, 0x44, 0x42, -0x60, 0x41, 0x29, 0x4C, 0x08, 0x1A, 0x00, 0x90, 0x20, 0x60, 0xB0, 0x1D, -0xC5, 0x7F, 0x37, 0x7E, 0x6B, 0x1E, 0x58, 0x42, 0x58, 0x41, 0x3B, 0x1A, -0x01, 0x93, 0x63, 0x60, 0x01, 0x2A, 0x02, 0xD1, 0x00, 0x20, 0x20, 0x81, -0x05, 0xE0, 0x26, 0x23, 0xF0, 0x5E, 0x49, 0x00, 0x03, 0xF0, 0xBA, 0xFE, -0x20, 0x81, 0x01, 0x2D, 0x02, 0xD1, 0x00, 0x23, 0x63, 0x81, 0x05, 0xE0, -0x28, 0x23, 0xF0, 0x5E, 0x79, 0x00, 0x03, 0xF0, 0xAF, 0xFE, 0x60, 0x81, -0x15, 0x4F, 0x01, 0x9B, 0x28, 0x20, 0x3E, 0x5E, 0x59, 0x00, 0x70, 0x00, -0x80, 0x19, 0x03, 0xF0, 0xA5, 0xFE, 0x40, 0x43, 0x12, 0x4C, 0x43, 0x00, -0x80, 0x00, 0xE3, 0x60, 0xC3, 0x18, 0x23, 0x61, 0x26, 0x20, 0x3D, 0x5E, -0x00, 0x9B, 0x68, 0x00, 0x59, 0x00, 0x40, 0x19, 0x03, 0xF0, 0x96, 0xFE, -0x2C, 0x37, 0x60, 0x61, 0xA0, 0x61, 0x3B, 0x78, 0x00, 0x2B, 0x02, 0xD1, -0xE6, 0x61, 0x25, 0x62, 0x01, 0xE0, 0xE5, 0x61, 0x26, 0x62, 0x07, 0x4B, -0x01, 0x22, 0x52, 0x42, 0x5A, 0x60, 0xF7, 0xBD, 0x9C, 0x0D, 0x00, 0x20, -0x48, 0x0D, 0x00, 0x20, 0xAE, 0x09, 0x00, 0x20, 0x20, 0x02, 0x00, 0x20, -0x24, 0x09, 0x00, 0x20, 0xCC, 0x00, 0x00, 0x20, 0xF0, 0xB5, 0x24, 0x4B, -0x87, 0xB0, 0x1E, 0x7E, 0xDB, 0x7D, 0x72, 0x1C, 0xD9, 0x1C, 0x02, 0x33, -0x03, 0x93, 0x05, 0x92, 0x00, 0x23, 0x20, 0x4A, 0x04, 0x91, 0x18, 0x1C, -0x05, 0x9C, 0xE5, 0x1A, 0xEF, 0x01, 0x01, 0x97, 0xBC, 0x5A, 0xB8, 0x52, -0x04, 0x9C, 0xAD, 0x01, 0x29, 0x19, 0x4F, 0x00, 0xBC, 0x5A, 0x1A, 0x4C, -0xB8, 0x52, 0x00, 0x27, 0x2F, 0x55, 0x0F, 0x55, 0x01, 0x99, 0x18, 0x4F, -0x01, 0x33, 0xCF, 0x19, 0x02, 0x97, 0x39, 0x88, 0x38, 0x80, 0x03, 0x99, -0x6F, 0x18, 0x79, 0x00, 0x01, 0x91, 0x89, 0x5A, 0x01, 0x99, 0x88, 0x52, -0x12, 0x49, 0x6D, 0x18, 0x00, 0x21, 0x29, 0x70, 0x39, 0x55, 0xF7, 0x1A, -0x0C, 0x4D, 0x01, 0x37, 0xD8, 0xDA, 0x00, 0x22, 0x01, 0x36, 0x03, 0x9B, -0x11, 0x1C, 0xB6, 0x01, 0x58, 0x00, 0x2F, 0x5A, 0x2A, 0x52, 0xF0, 0x18, -0x47, 0x00, 0xEC, 0x5B, 0xEA, 0x53, 0x06, 0x4F, 0xF9, 0x54, 0x01, 0x3B, -0x39, 0x54, 0x01, 0x2B, 0xF2, 0xD1, 0x07, 0xB0, 0xF0, 0xBD, 0xC0, 0x46, -0xAE, 0x09, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x20, 0x00, 0x40, -0x02, 0x40, 0x00, 0x40, 0x01, 0x20, 0x00, 0x40, 0xF7, 0xB5, 0x0D, 0x4B, -0x19, 0x7E, 0xDE, 0x7D, 0x48, 0x1C, 0x01, 0x36, 0x00, 0x23, 0x01, 0x90, -0x01, 0x9C, 0x32, 0x1C, 0xE7, 0x1A, 0xBF, 0x01, 0x95, 0x1C, 0xAC, 0x46, -0xBC, 0x44, 0x07, 0x4C, 0x00, 0x25, 0x60, 0x46, 0x01, 0x3A, 0x05, 0x55, -0x50, 0x1C, 0xF5, 0xDA, 0x01, 0x33, 0xCA, 0x1A, 0x01, 0x32, 0xED, 0xDA, -0xF7, 0xBD, 0xC0, 0x46, 0xAE, 0x09, 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, -0x00, 0xB5, 0x0D, 0x4B, 0x08, 0x22, 0x9B, 0x5E, 0x0C, 0x4A, 0x11, 0x1C, -0x35, 0x31, 0x09, 0x78, 0x12, 0x7F, 0x4B, 0x43, 0x52, 0xB2, 0x9B, 0x11, -0x93, 0x42, 0x00, 0xDA, 0x13, 0x1C, 0x08, 0x4A, 0x13, 0x60, 0x80, 0x22, -0xD2, 0x05, 0x1B, 0x05, 0x19, 0x09, 0x90, 0x69, 0x05, 0x4B, 0x03, 0x40, -0x0B, 0x43, 0x93, 0x61, 0x00, 0xBD, 0xC0, 0x46, 0x70, 0x01, 0x00, 0x20, -0x48, 0x0D, 0x00, 0x20, 0x38, 0x0D, 0x00, 0x20, 0xFF, 0xFF, 0x00, 0xF0, -0xF0, 0xB5, 0xA9, 0x4A, 0xA9, 0x48, 0x11, 0x68, 0x07, 0x68, 0x93, 0xB0, -0x8C, 0x46, 0x0D, 0x22, 0x00, 0x21, 0x7F, 0x25, 0xFF, 0x24, 0x01, 0x97, -0x90, 0x00, 0x83, 0x18, 0xA4, 0x4E, 0x5B, 0x00, 0xF3, 0x18, 0x99, 0x87, -0x00, 0x27, 0x38, 0x33, 0x1F, 0x72, 0x67, 0x46, 0x39, 0x50, 0x01, 0x3A, -0x01, 0x9F, 0xD2, 0xB2, 0x39, 0x50, 0x00, 0x26, 0xDD, 0x72, 0x5D, 0x72, -0x1C, 0x73, 0x9C, 0x72, 0xD9, 0x80, 0xFF, 0x2A, 0xE8, 0xD1, 0x9B, 0x4A, -0x9B, 0x4B, 0x11, 0x7E, 0x98, 0x68, 0x9B, 0x4C, 0x97, 0x4D, 0x01, 0x39, -0x04, 0x90, 0xA6, 0x81, 0x2E, 0x60, 0x88, 0x42, 0x02, 0xDA, 0x01, 0x30, -0x04, 0x90, 0x98, 0x60, 0xDE, 0x68, 0x11, 0x96, 0x00, 0x2E, 0x02, 0xDD, -0x01, 0x3E, 0x11, 0x96, 0xDE, 0x60, 0xD1, 0x7D, 0x1A, 0x68, 0x01, 0x39, -0x8A, 0x42, 0x01, 0xDA, 0x01, 0x32, 0x1A, 0x60, 0x5A, 0x68, 0x00, 0x2A, -0x01, 0xDD, 0x01, 0x3A, 0x5A, 0x60, 0x04, 0x9F, 0x11, 0x98, 0x87, 0x42, -0x00, 0xDA, 0xA3, 0xE0, 0x19, 0x68, 0x5B, 0x68, 0x84, 0x4A, 0x06, 0x93, -0x88, 0x4B, 0x12, 0x68, 0x1B, 0x68, 0x86, 0x4C, 0x0D, 0x93, 0x80, 0x4B, -0x10, 0x91, 0x1B, 0x68, 0x09, 0x92, 0x0A, 0x93, 0xA4, 0x89, 0x84, 0x48, -0x0C, 0x94, 0x06, 0x9D, 0x10, 0x9E, 0xB5, 0x42, 0x00, 0xDD, 0x81, 0xE0, -0x04, 0x9A, 0x6F, 0x46, 0x10, 0x21, 0x01, 0x32, 0xCF, 0x5D, 0x92, 0x01, -0x33, 0x1C, 0x02, 0x92, 0x07, 0x97, 0x05, 0xE0, 0x00, 0x27, 0x2F, 0x54, -0x06, 0x9F, 0x01, 0x3B, 0x9F, 0x42, 0x71, 0xDC, 0x02, 0x99, 0x9C, 0x1C, -0x0D, 0x19, 0x2A, 0x5C, 0x77, 0x4E, 0x69, 0x00, 0x89, 0x5B, 0x0E, 0x2A, -0xF0, 0xD8, 0x0D, 0x9D, 0x49, 0x1B, 0x00, 0x2A, 0x00, 0xD1, 0x71, 0xE0, -0x01, 0x3A, 0xD4, 0xB2, 0x09, 0x9E, 0x04, 0x9F, 0xA2, 0x00, 0xB5, 0x18, -0x4F, 0x43, 0x2E, 0x68, 0xB4, 0x46, 0x67, 0x44, 0x2F, 0x60, 0x0A, 0x9D, -0x0E, 0x1C, 0xAF, 0x18, 0x3D, 0x68, 0x5E, 0x43, 0xAC, 0x46, 0x15, 0x19, -0x6D, 0x00, 0x01, 0x95, 0x62, 0x4D, 0x66, 0x44, 0xAC, 0x46, 0x01, 0x9D, -0x3E, 0x60, 0xAC, 0x44, 0x65, 0x46, 0xAF, 0x8F, 0x38, 0x35, 0x2E, 0x7A, -0xCF, 0x19, 0x03, 0x96, 0x09, 0x26, 0xAE, 0x57, 0xAF, 0x80, 0x01, 0x96, -0x0C, 0x9E, 0x6F, 0x46, 0xB4, 0x46, 0x01, 0x26, 0xB4, 0x44, 0x03, 0x9E, -0x01, 0x36, 0x03, 0x96, 0x66, 0x46, 0xB6, 0xB2, 0x0C, 0x96, 0x0C, 0x26, -0xF7, 0x5D, 0x04, 0x9E, 0x2F, 0x72, 0x01, 0x9F, 0xBE, 0x42, 0x00, 0xDA, -0x6E, 0x72, 0x51, 0x4E, 0x15, 0x19, 0x6D, 0x00, 0x75, 0x19, 0x38, 0x35, -0x0A, 0x26, 0xAE, 0x57, 0x04, 0x9F, 0xB7, 0x42, 0x00, 0xDD, 0xAF, 0x72, -0x4B, 0x4E, 0x15, 0x19, 0x6D, 0x00, 0x75, 0x19, 0x38, 0x35, 0x0B, 0x26, -0xAE, 0x57, 0xB3, 0x42, 0x00, 0xDA, 0xEB, 0x72, 0x15, 0x19, 0x46, 0x4F, -0x6D, 0x00, 0x7D, 0x19, 0x38, 0x35, 0x0C, 0x26, 0xAE, 0x57, 0xB3, 0x42, -0x00, 0xDD, 0x2B, 0x73, 0x12, 0x19, 0x41, 0x4C, 0x52, 0x00, 0xA2, 0x18, -0x3E, 0x25, 0x54, 0x5F, 0x38, 0x32, 0xA1, 0x42, 0x8E, 0xDD, 0x06, 0x9F, -0x01, 0x3B, 0xD1, 0x80, 0x9F, 0x42, 0x8D, 0xDD, 0x04, 0x99, 0x11, 0x9A, -0x01, 0x39, 0x04, 0x91, 0x91, 0x42, 0x00, 0xDB, 0x71, 0xE7, 0x6B, 0x46, -0x30, 0x24, 0xE4, 0x5A, 0x38, 0x4B, 0x9C, 0x81, 0x13, 0xB0, 0xF0, 0xBD, -0x02, 0x39, 0xCA, 0x43, 0xD2, 0x17, 0x11, 0x40, 0x03, 0x91, 0x04, 0x9E, -0x03, 0x9F, 0x71, 0x43, 0x5F, 0x43, 0x0E, 0x91, 0x00, 0x25, 0xD9, 0xB2, -0x0F, 0x97, 0x05, 0x91, 0x03, 0x22, 0x01, 0x95, 0x9C, 0x46, 0x08, 0x94, -0x31, 0x4E, 0x32, 0x4F, 0x07, 0x9C, 0xB1, 0x5C, 0x05, 0x9D, 0xBB, 0x5C, -0x61, 0x18, 0xEB, 0x18, 0x49, 0xB2, 0x01, 0x31, 0x5B, 0xB2, 0x89, 0x01, -0x02, 0x33, 0xCB, 0x18, 0x1C, 0x5C, 0x65, 0xB2, 0x69, 0x1E, 0x0D, 0x29, -0x27, 0xD8, 0x08, 0x9B, 0x02, 0x9F, 0x8E, 0x00, 0xFF, 0x18, 0x0B, 0x97, -0x09, 0x9F, 0x71, 0x18, 0xBB, 0x19, 0x0A, 0x9F, 0x49, 0x00, 0xBF, 0x19, -0x1B, 0x4E, 0x00, 0x97, 0x01, 0x9F, 0x71, 0x18, 0x38, 0x31, 0x00, 0x2F, -0x1A, 0xD1, 0xE4, 0xB2, 0x01, 0x94, 0x0B, 0x9D, 0x0E, 0x34, 0xE4, 0xB2, -0x2C, 0x54, 0x1C, 0x68, 0x0E, 0x9E, 0x00, 0x9F, 0xA4, 0x19, 0x1C, 0x60, -0x3B, 0x68, 0x0F, 0x9C, 0x03, 0x9D, 0x1B, 0x19, 0x3B, 0x60, 0x8C, 0x88, -0x0B, 0x7A, 0x2C, 0x19, 0x01, 0x33, 0x8C, 0x80, 0x0B, 0x72, 0x53, 0x1E, -0x00, 0x2A, 0x10, 0xD0, 0xDA, 0xB2, 0xBF, 0xE7, 0x02, 0x9E, 0x08, 0x99, -0x01, 0x9C, 0x73, 0x18, 0x1F, 0x2C, 0xF4, 0xD0, 0xAC, 0x42, 0xF2, 0xD0, -0x1F, 0x25, 0x1F, 0x26, 0x1D, 0x54, 0x01, 0x96, 0x53, 0x1E, 0x00, 0x2A, -0xEE, 0xD1, 0x63, 0x46, 0x18, 0xE7, 0xC0, 0x46, 0x44, 0x00, 0x00, 0x20, -0x48, 0x00, 0x00, 0x20, 0x24, 0x02, 0x00, 0x20, 0xAE, 0x09, 0x00, 0x20, -0xE4, 0x10, 0x00, 0x20, 0x70, 0x01, 0x00, 0x20, 0x38, 0x0D, 0x00, 0x20, -0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0xF8, 0x59, 0x00, 0x00, -0xF4, 0x59, 0x00, 0x00, 0xF0, 0xB5, 0x89, 0xB0, 0x0F, 0x23, 0x46, 0x49, -0xFF, 0x22, 0x02, 0xE0, 0x58, 0x18, 0x01, 0x38, 0x02, 0x70, 0x01, 0x3B, -0x00, 0x2B, 0xF9, 0xD1, 0x42, 0x4B, 0xD8, 0x68, 0x19, 0x68, 0x9A, 0x68, -0x5B, 0x68, 0x01, 0x90, 0x03, 0x93, 0x40, 0x4B, 0x02, 0x91, 0x1B, 0x68, -0x04, 0x93, 0x3F, 0x4B, 0x5B, 0x7F, 0x06, 0x93, 0x68, 0xE0, 0x07, 0x9B, -0x88, 0x1C, 0x3D, 0x4A, 0x18, 0x18, 0x83, 0x5C, 0x5B, 0xB2, 0x1F, 0x2B, -0x5A, 0xD1, 0x3B, 0x4A, 0x40, 0x00, 0x82, 0x5A, 0x04, 0x9D, 0x04, 0x20, -0x52, 0x1B, 0x05, 0x92, 0x38, 0x4A, 0x01, 0x38, 0xC0, 0xB2, 0x14, 0x56, -0x37, 0x4A, 0x64, 0x44, 0x12, 0x56, 0x01, 0x34, 0x8A, 0x18, 0xA4, 0x01, -0x02, 0x32, 0x31, 0x4E, 0xA2, 0x18, 0xB4, 0x5C, 0x0E, 0x2C, 0x41, 0xD8, -0x1F, 0x2B, 0x3E, 0xD0, 0xA3, 0x42, 0x3D, 0xD0, 0x00, 0x2C, 0x3B, 0xD0, -0x0A, 0x27, 0x5D, 0x1E, 0x7D, 0x43, 0x2E, 0x4A, 0x2D, 0x4E, 0x55, 0x19, -0x62, 0x1E, 0x7A, 0x43, 0xB2, 0x18, 0x3E, 0x27, 0xEE, 0x5F, 0x3E, 0x27, -0xD5, 0x5F, 0x1A, 0x1C, 0xAE, 0x42, 0x00, 0xDD, 0x22, 0x1C, 0x0A, 0x25, -0x01, 0x3A, 0x6A, 0x43, 0x25, 0x4E, 0x06, 0x9D, 0xB2, 0x18, 0x3E, 0x27, -0xD2, 0x5F, 0x05, 0x9E, 0x6A, 0x43, 0x92, 0x11, 0x96, 0x42, 0x1D, 0xDD, -0x9C, 0x42, 0x02, 0xD9, 0x1A, 0x1C, 0x23, 0x1C, 0x14, 0x1C, 0x5E, 0x1E, -0x15, 0x4A, 0xF6, 0xB2, 0x97, 0x5D, 0x00, 0x25, 0x00, 0x97, 0x6F, 0x46, -0x7D, 0x57, 0x01, 0x3C, 0xE4, 0xB2, 0x6F, 0x1C, 0x09, 0xD0, 0xA5, 0x42, -0x03, 0xDA, 0x6D, 0x46, 0x2D, 0x78, 0x15, 0x55, 0x06, 0xE0, 0xA5, 0x42, -0x04, 0xDD, 0xE4, 0xB2, 0x54, 0x55, 0x94, 0x55, 0x00, 0xE0, 0x23, 0x1C, -0x00, 0x28, 0xAB, 0xD1, 0x01, 0x39, 0x03, 0x9E, 0xB1, 0x42, 0x98, 0xDA, -0x62, 0x46, 0x01, 0x3A, 0x01, 0x9F, 0xBA, 0x42, 0x05, 0xDB, 0x53, 0x1C, -0x9B, 0x01, 0x02, 0x99, 0x07, 0x93, 0x94, 0x46, 0xF1, 0xE7, 0x09, 0xB0, -0xF0, 0xBD, 0xC0, 0x46, 0xEC, 0x02, 0x00, 0x20, 0xE4, 0x10, 0x00, 0x20, -0x38, 0x0D, 0x00, 0x20, 0x48, 0x0D, 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, -0x00, 0x40, 0x00, 0x40, 0xF8, 0x59, 0x00, 0x00, 0xF4, 0x59, 0x00, 0x00, -0x24, 0x02, 0x00, 0x20, 0xF0, 0xB5, 0xD4, 0x4A, 0x8D, 0xB0, 0x11, 0x68, -0x00, 0x23, 0xD0, 0x18, 0xBE, 0x30, 0x00, 0x24, 0x00, 0x5F, 0x0A, 0x3B, -0x44, 0x1E, 0xA0, 0x41, 0x1D, 0x1C, 0x09, 0x18, 0x8C, 0x35, 0xF4, 0xD1, -0xCD, 0x4B, 0x11, 0x60, 0x1B, 0x68, 0xBE, 0x32, 0x03, 0x93, 0xCC, 0x4B, -0x0E, 0x24, 0x1B, 0x68, 0x05, 0x93, 0xCB, 0x4E, 0x01, 0x3C, 0x33, 0x57, -0x5F, 0x1C, 0x01, 0xD1, 0x73, 0xE0, 0x03, 0x1C, 0xC7, 0x4D, 0xE8, 0x56, -0x46, 0x1C, 0xFA, 0xD1, 0x2B, 0x55, 0x5F, 0x1C, 0x6B, 0xD0, 0x03, 0x98, -0x9D, 0x00, 0x46, 0x19, 0x37, 0x68, 0xA0, 0x00, 0xBC, 0x46, 0x03, 0x9F, -0x3F, 0x58, 0xBC, 0x44, 0x67, 0x46, 0x37, 0x60, 0x05, 0x9E, 0x05, 0x9F, -0x75, 0x19, 0x2E, 0x68, 0x38, 0x58, 0xB9, 0x4F, 0x30, 0x18, 0x0A, 0x26, -0x28, 0x60, 0x30, 0x1C, 0x58, 0x43, 0x38, 0x18, 0x38, 0x30, 0x09, 0x27, -0xC7, 0x57, 0x55, 0x79, 0xBC, 0x46, 0x6F, 0xB2, 0xBC, 0x45, 0x00, 0xDD, -0x45, 0x72, 0x5E, 0x43, 0xB0, 0x4D, 0x90, 0x79, 0xAE, 0x19, 0x38, 0x36, -0x0A, 0x27, 0xF7, 0x57, 0x45, 0xB2, 0xAF, 0x42, 0x00, 0xDA, 0xB0, 0x72, -0xD6, 0x79, 0xAB, 0x4F, 0x06, 0x96, 0x0A, 0x26, 0x30, 0x1C, 0x58, 0x43, -0x38, 0x18, 0x38, 0x30, 0x0B, 0x25, 0x45, 0x57, 0xAC, 0x46, 0x6D, 0x46, -0x18, 0x35, 0x2D, 0x78, 0x6D, 0xB2, 0xAC, 0x45, 0x03, 0xDD, 0x6F, 0x46, -0x18, 0x25, 0xEF, 0x5D, 0xC7, 0x72, 0x5E, 0x43, 0xA0, 0x4D, 0x10, 0x7A, -0xAF, 0x19, 0x38, 0x37, 0x0C, 0x26, 0xBE, 0x57, 0x45, 0xB2, 0xAE, 0x42, -0x00, 0xDA, 0x38, 0x73, 0x0A, 0x20, 0x58, 0x43, 0x56, 0x88, 0x9A, 0x4F, -0x06, 0x96, 0x38, 0x18, 0x3E, 0x26, 0x85, 0x5F, 0x18, 0x26, 0xAC, 0x46, -0x6D, 0x46, 0x75, 0x5F, 0x38, 0x30, 0x0A, 0x26, 0xAC, 0x45, 0x03, 0xDA, -0x6F, 0x46, 0x18, 0x25, 0xEF, 0x5B, 0xC7, 0x80, 0x5E, 0x43, 0x91, 0x48, -0x01, 0x39, 0x87, 0x19, 0xBB, 0x8F, 0x10, 0x88, 0xC3, 0x18, 0xBB, 0x87, -0x38, 0x37, 0x10, 0x79, 0x3B, 0x7A, 0xC3, 0x18, 0x3B, 0x72, 0x0A, 0x3A, -0x00, 0x2C, 0x00, 0xD0, 0x81, 0xE7, 0x89, 0x4F, 0x26, 0x1C, 0x3D, 0x1C, -0x3C, 0x35, 0x03, 0x95, 0x39, 0x60, 0x25, 0x1C, 0x88, 0x48, 0x00, 0x22, -0x33, 0x18, 0x9A, 0x56, 0x01, 0x32, 0x19, 0xD1, 0x1D, 0x70, 0xB5, 0x42, -0x12, 0xD0, 0x82, 0x4B, 0xB1, 0x00, 0x1A, 0x68, 0xAB, 0x00, 0x50, 0x58, -0xD0, 0x50, 0x80, 0x4A, 0x7D, 0x48, 0x12, 0x68, 0x51, 0x58, 0xD1, 0x50, -0x0A, 0x22, 0x13, 0x1C, 0x6B, 0x43, 0xC0, 0x18, 0x3C, 0x30, 0x03, 0x99, -0x03, 0xF0, 0x7E, 0xFB, 0x3B, 0x68, 0x01, 0x35, 0x9D, 0x42, 0x05, 0xDA, -0x03, 0x99, 0x01, 0x36, 0x0A, 0x31, 0x03, 0x91, 0x0E, 0x2E, 0xD9, 0xD1, -0x76, 0x4B, 0x1B, 0x68, 0xDA, 0x06, 0x3B, 0xD5, 0x75, 0x4B, 0x1B, 0x78, -0x00, 0x2B, 0x03, 0xD0, 0x04, 0x20, 0x74, 0x49, 0x01, 0xF0, 0xD4, 0xFE, -0x00, 0x25, 0x73, 0x4E, 0x2C, 0xE0, 0x69, 0x1C, 0x89, 0x01, 0x33, 0x68, -0x77, 0x68, 0x71, 0x4A, 0x03, 0x91, 0xA4, 0x46, 0x12, 0xE0, 0x03, 0x9C, -0x99, 0x1C, 0x61, 0x18, 0x88, 0x5C, 0x40, 0xB2, 0x44, 0x1E, 0x0D, 0x2C, -0x09, 0xD8, 0x66, 0x4C, 0x20, 0x18, 0x01, 0x38, 0x00, 0x78, 0x40, 0xB2, -0x44, 0x1C, 0x02, 0xD0, 0x01, 0x30, 0xC0, 0xB2, 0x88, 0x54, 0x01, 0x3B, -0xBB, 0x42, 0xEA, 0xDA, 0x61, 0x4B, 0x64, 0x46, 0x1B, 0x78, 0x00, 0x2B, -0x09, 0xD0, 0x63, 0x4B, 0x63, 0x4F, 0xAA, 0x01, 0xD9, 0x7D, 0xD2, 0x19, -0x01, 0x23, 0x04, 0x20, 0x00, 0x93, 0x01, 0xF0, 0x4D, 0xFE, 0x01, 0x35, -0x5D, 0x4F, 0x3B, 0x7E, 0x9D, 0x42, 0xCE, 0xDB, 0x5D, 0x4B, 0x1B, 0x68, -0x00, 0x2B, 0x10, 0xDD, 0x5C, 0x4B, 0x5D, 0x4A, 0x99, 0x89, 0x11, 0x80, -0x1B, 0x89, 0x53, 0x80, 0x52, 0x4B, 0x1B, 0x78, 0x00, 0x2B, 0x06, 0xD0, -0x01, 0x23, 0x02, 0x21, 0x00, 0x93, 0x17, 0x20, 0x0B, 0x1C, 0x01, 0xF0, -0x33, 0xFE, 0x48, 0x4B, 0x55, 0x48, 0x1D, 0x1C, 0x40, 0xCD, 0x4F, 0x49, -0x07, 0x96, 0x47, 0x89, 0x08, 0x97, 0x0A, 0x8D, 0x47, 0x68, 0x16, 0xB2, -0x05, 0x96, 0x86, 0x69, 0x09, 0x97, 0xB7, 0xB2, 0xD2, 0x1B, 0x04, 0x97, -0x92, 0xB2, 0x31, 0x31, 0x09, 0x78, 0x0A, 0x92, 0x3E, 0x4A, 0x00, 0x20, -0x06, 0x91, 0x17, 0x68, 0x03, 0x90, 0x2F, 0xE0, 0x03, 0x9A, 0x0A, 0x23, -0x53, 0x43, 0x01, 0xCF, 0x05, 0x99, 0x48, 0x43, 0x37, 0x49, 0xCB, 0x18, -0x3C, 0x22, 0x99, 0x5E, 0x09, 0x9B, 0x59, 0x43, 0x03, 0xF0, 0x94, 0xFA, -0x08, 0x99, 0x42, 0x4A, 0x08, 0x18, 0x13, 0x78, 0x80, 0xB2, 0x28, 0x80, -0x00, 0x2B, 0x15, 0xD1, 0x00, 0xB2, 0xB0, 0x42, 0x07, 0xDA, 0x06, 0x9B, -0x80, 0x1B, 0x58, 0x43, 0x04, 0x99, 0x80, 0x11, 0x08, 0x18, 0x28, 0x80, -0x0A, 0xE0, 0x05, 0x9A, 0x10, 0x1A, 0xB0, 0x42, 0x06, 0xDA, 0x06, 0x9B, -0x80, 0x1B, 0x58, 0x43, 0x0A, 0x99, 0x80, 0x11, 0x08, 0x1A, 0x28, 0x80, -0x03, 0x9A, 0x02, 0x35, 0x01, 0x32, 0x03, 0x92, 0x03, 0x9B, 0x07, 0x98, -0x83, 0x42, 0xCB, 0xDB, 0x20, 0x4D, 0x2E, 0x49, 0x2D, 0x68, 0x28, 0x4A, -0x05, 0x95, 0x0E, 0x89, 0x0D, 0x68, 0x07, 0x96, 0xD3, 0x8C, 0x08, 0x95, -0x4D, 0x69, 0x1F, 0xB2, 0xAE, 0xB2, 0x11, 0x1C, 0x04, 0x97, 0x06, 0x96, -0x2F, 0x31, 0x09, 0x78, 0x9B, 0x1B, 0x9B, 0xB2, 0x09, 0x91, 0x30, 0x32, -0x12, 0x78, 0x15, 0x4E, 0x0B, 0x93, 0x16, 0x4B, 0x00, 0x20, 0x0A, 0x92, -0x1F, 0x68, 0x20, 0x36, 0x03, 0x90, 0x50, 0xE0, 0x03, 0x9A, 0x0A, 0x23, -0x53, 0x43, 0x01, 0xCF, 0x04, 0x99, 0x48, 0x43, 0x0D, 0x49, 0x5B, 0x18, -0x3C, 0x22, 0x99, 0x5E, 0x08, 0x9B, 0x59, 0x43, 0x03, 0xF0, 0x40, 0xFA, -0x07, 0x99, 0x18, 0x4A, 0x08, 0x18, 0x13, 0x78, 0x80, 0xB2, 0x30, 0x80, -0x00, 0x2B, 0x36, 0xD1, 0x00, 0xB2, 0xA8, 0x42, 0x28, 0xDA, 0x09, 0x9B, -0x40, 0x1B, 0x58, 0x43, 0x06, 0x99, 0x80, 0x11, 0x08, 0x18, 0x30, 0x80, -0x2B, 0xE0, 0xC0, 0x46, 0x24, 0x02, 0x00, 0x20, 0x48, 0x00, 0x00, 0x20, -0x44, 0x00, 0x00, 0x20, 0xEC, 0x02, 0x00, 0x20, 0x58, 0x00, 0x00, 0x20, -0xEB, 0x01, 0x00, 0x20, 0x64, 0x59, 0x00, 0x00, 0xE4, 0x10, 0x00, 0x20, -0x00, 0x20, 0x00, 0x40, 0xAE, 0x09, 0x00, 0x20, 0x42, 0x20, 0x00, 0x40, -0x9C, 0x0D, 0x00, 0x20, 0x70, 0x01, 0x00, 0x20, 0x54, 0x11, 0x00, 0x20, -0x24, 0x09, 0x00, 0x20, 0xDF, 0x01, 0x00, 0x20, 0x04, 0x9A, 0x10, 0x1A, -0xA8, 0x42, 0x06, 0xDA, 0x0A, 0x9B, 0x40, 0x1B, 0x58, 0x43, 0x0B, 0x99, -0x80, 0x11, 0x08, 0x1A, 0x30, 0x80, 0x03, 0x9A, 0x02, 0x36, 0x01, 0x32, -0x03, 0x92, 0x03, 0x9B, 0x05, 0x98, 0x83, 0x42, 0xAA, 0xDB, 0x1B, 0x4B, -0x1A, 0x1C, 0x2A, 0x32, 0x17, 0x78, 0x1A, 0x1C, 0x2B, 0x32, 0x12, 0x78, -0x28, 0x21, 0x5E, 0x5E, 0x03, 0x92, 0x26, 0x25, 0x5A, 0x5F, 0x2C, 0x33, -0x04, 0x92, 0x1B, 0x78, 0x14, 0x49, 0x06, 0x93, 0x00, 0x25, 0xB4, 0x46, -0x1D, 0xE0, 0x00, 0x26, 0x8B, 0x5F, 0x00, 0x2B, 0x16, 0xD0, 0x11, 0x4A, -0xA8, 0x18, 0x04, 0x23, 0xC2, 0x5E, 0x20, 0x26, 0x83, 0x5F, 0x00, 0x2F, -0x01, 0xD0, 0x66, 0x46, 0xB2, 0x1A, 0x03, 0x9E, 0x00, 0x2E, 0x01, 0xD0, -0x04, 0x9E, 0xF3, 0x1A, 0x06, 0x9E, 0x00, 0x2E, 0x02, 0xD0, 0x16, 0x1C, -0x1A, 0x1C, 0x33, 0x1C, 0x82, 0x80, 0x03, 0x84, 0x01, 0x34, 0x0A, 0x31, -0x02, 0x35, 0x05, 0x9E, 0xB4, 0x42, 0xDE, 0xDB, 0x0D, 0xB0, 0xF0, 0xBD, -0xAE, 0x09, 0x00, 0x20, 0x60, 0x02, 0x00, 0x20, 0x24, 0x02, 0x00, 0x20, -0x30, 0xB5, 0x0A, 0x4B, 0x00, 0x21, 0x04, 0x33, 0xDB, 0x7F, 0x09, 0x4A, -0x0A, 0x24, 0x08, 0x1C, 0x07, 0xE0, 0x01, 0x3B, 0xDB, 0xB2, 0x25, 0x1C, -0x5D, 0x43, 0x55, 0x19, 0xA9, 0x87, 0x05, 0x4D, 0xE8, 0x54, 0x00, 0x2B, -0xF5, 0xD1, 0x13, 0x60, 0x30, 0xBD, 0xC0, 0x46, 0xAE, 0x09, 0x00, 0x20, -0x9C, 0x0D, 0x00, 0x20, 0x64, 0x01, 0x00, 0x20, 0x00, 0xB5, 0x08, 0x4A, -0x01, 0x23, 0x5B, 0x42, 0x53, 0x60, 0x07, 0x4B, 0x00, 0x21, 0x11, 0x60, -0x1B, 0x78, 0x04, 0xE0, 0x01, 0x3B, 0xDB, 0xB2, 0x18, 0x1D, 0x40, 0x00, -0x81, 0x52, 0x00, 0x2B, 0xF8, 0xD1, 0x00, 0xBD, 0xE0, 0x00, 0x00, 0x20, -0x7C, 0x09, 0x00, 0x20, 0x49, 0x43, 0x40, 0x43, 0x40, 0x18, 0x70, 0x47, -0x70, 0x47, 0xF0, 0xB5, 0x83, 0x4B, 0x00, 0x22, 0x04, 0x33, 0xD9, 0x7F, -0x87, 0xB0, 0x0B, 0x1C, 0x81, 0x48, 0x0A, 0x26, 0x15, 0x1C, 0x07, 0xE0, -0x01, 0x3B, 0xDB, 0xB2, 0x34, 0x1C, 0x5C, 0x43, 0x04, 0x19, 0xA2, 0x87, -0x38, 0x34, 0x25, 0x72, 0x04, 0x1C, 0x00, 0x2B, 0xF4, 0xD1, 0x7B, 0x4B, -0x1A, 0x68, 0x0B, 0x1C, 0x91, 0x42, 0x00, 0xDD, 0x13, 0x1C, 0x23, 0x60, -0x78, 0x48, 0x79, 0x4A, 0x79, 0x4B, 0x0E, 0x24, 0xFF, 0x21, 0x01, 0x3C, -0xE4, 0xB2, 0xA5, 0x00, 0x01, 0x55, 0xAB, 0x50, 0x00, 0x2C, 0xF8, 0xD1, -0x6F, 0x4B, 0x25, 0x1C, 0x04, 0x33, 0xDB, 0x7F, 0x26, 0x1C, 0x03, 0x93, -0x72, 0x4B, 0x1B, 0x69, 0x04, 0x93, 0x6D, 0x4B, 0x1B, 0x68, 0x05, 0x93, -0x47, 0xE0, 0x70, 0x4C, 0x63, 0x5D, 0x00, 0x2B, 0x42, 0xD0, 0x6F, 0x4C, -0xAB, 0x00, 0xE3, 0x58, 0x04, 0x9C, 0x1B, 0x01, 0x1B, 0x19, 0x01, 0x93, -0x6C, 0x4B, 0x6A, 0x00, 0x01, 0x27, 0xD3, 0x18, 0x00, 0x24, 0x7F, 0x42, -0x02, 0x93, 0x20, 0xE0, 0x0A, 0x23, 0x63, 0x43, 0x60, 0x48, 0xC3, 0x18, -0x3C, 0x21, 0x5B, 0x5E, 0x00, 0x2B, 0x16, 0xD0, 0x02, 0x9A, 0x63, 0x00, -0xC3, 0x18, 0x98, 0x88, 0x93, 0x88, 0x5B, 0x4A, 0xC0, 0x1A, 0x23, 0x1C, -0x10, 0x33, 0x5B, 0x00, 0x99, 0x5A, 0x02, 0x9A, 0x00, 0xB2, 0x13, 0x8B, -0xC9, 0x1A, 0x09, 0xB2, 0xFF, 0xF7, 0x98, 0xFF, 0x01, 0x9B, 0x98, 0x42, -0x01, 0xDA, 0x27, 0x1C, 0x01, 0x90, 0x01, 0x34, 0xE4, 0xB2, 0x05, 0x98, -0x84, 0x42, 0xDB, 0xDB, 0x79, 0x1C, 0x0D, 0xD0, 0x4F, 0x4B, 0x50, 0x49, -0xD8, 0x57, 0xBA, 0x00, 0x01, 0x30, 0x04, 0xD0, 0x88, 0x58, 0x01, 0x9C, -0xA0, 0x42, 0x03, 0xDD, 0x00, 0xE0, 0x01, 0x9C, 0x8C, 0x50, 0xDD, 0x55, -0x01, 0x35, 0x03, 0x9C, 0xEB, 0xB2, 0xA3, 0x42, 0xB3, 0xD3, 0x34, 0x1C, -0x00, 0x25, 0x44, 0x4E, 0x28, 0xE0, 0x44, 0x48, 0x47, 0x5D, 0x7B, 0xB2, -0x01, 0x33, 0x21, 0xD0, 0x69, 0x00, 0xFF, 0xB2, 0x3E, 0x4B, 0x71, 0x18, -0x89, 0x88, 0x7A, 0x00, 0x9A, 0x18, 0x91, 0x80, 0x29, 0x1C, 0x10, 0x31, -0x3A, 0x1C, 0x49, 0x00, 0x89, 0x5B, 0x10, 0x32, 0x52, 0x00, 0xD1, 0x52, -0x0A, 0x22, 0x10, 0x1C, 0x78, 0x43, 0x11, 0x1C, 0x69, 0x43, 0x1B, 0x18, -0x18, 0x1C, 0x71, 0x18, 0x3C, 0x30, 0x3C, 0x31, 0x03, 0xF0, 0x40, 0xF9, -0x34, 0x4B, 0xAA, 0x00, 0xD2, 0x58, 0x37, 0x4B, 0xBF, 0x00, 0xFA, 0x50, -0x01, 0x35, 0xED, 0xB2, 0x33, 0x68, 0x9D, 0x42, 0xD3, 0xDB, 0x3D, 0xE0, -0x2D, 0x4E, 0x33, 0x57, 0x01, 0x33, 0x36, 0xD1, 0x0A, 0x23, 0x63, 0x43, -0xEB, 0x18, 0x3C, 0x20, 0x1B, 0x5E, 0x00, 0x2B, 0x2F, 0xD0, 0x25, 0x4B, -0x2E, 0x4A, 0x04, 0x33, 0xDF, 0x7F, 0x00, 0x23, 0x26, 0xE0, 0x29, 0x4E, -0xF6, 0x5C, 0x00, 0x2E, 0x20, 0xD1, 0x00, 0x26, 0x90, 0x5F, 0x00, 0x28, -0x1C, 0xD1, 0x21, 0x4A, 0x67, 0x00, 0x11, 0x55, 0x1E, 0x49, 0x1D, 0x48, -0xCF, 0x19, 0xBF, 0x88, 0x5A, 0x00, 0x82, 0x18, 0x97, 0x80, 0x27, 0x1C, -0x10, 0x37, 0x1A, 0x1C, 0x7F, 0x00, 0x7F, 0x5A, 0x10, 0x32, 0x52, 0x00, -0x17, 0x52, 0x0A, 0x22, 0x53, 0x43, 0xC0, 0x18, 0x13, 0x1C, 0x63, 0x43, -0xC9, 0x18, 0x3C, 0x31, 0x3C, 0x30, 0x03, 0xF0, 0xFF, 0xF8, 0x04, 0xE0, -0x01, 0x33, 0x0A, 0x32, 0xD9, 0xB2, 0xB9, 0x42, 0xD5, 0xD3, 0x01, 0x34, -0xE4, 0xB2, 0x00, 0xE0, 0x0D, 0x4D, 0x2B, 0x68, 0x9C, 0x42, 0xBD, 0xDB, -0x09, 0x4B, 0x0C, 0x49, 0x04, 0x33, 0xDD, 0x7F, 0x12, 0x4B, 0xFF, 0x20, -0x1C, 0x1C, 0x0E, 0x34, 0x1A, 0x78, 0xAA, 0x42, 0x02, 0xD2, 0x8A, 0x5C, -0x1A, 0x70, 0x00, 0xE0, 0x18, 0x70, 0x01, 0x33, 0xA3, 0x42, 0xF5, 0xD1, -0x07, 0xB0, 0xF0, 0xBD, 0xAE, 0x09, 0x00, 0x20, 0x9C, 0x0D, 0x00, 0x20, -0x24, 0x02, 0x00, 0x20, 0xE8, 0x03, 0x00, 0x20, 0xF8, 0x10, 0x00, 0x20, -0xFF, 0xFF, 0xFF, 0x7F, 0x24, 0x09, 0x00, 0x20, 0xEC, 0x01, 0x00, 0x20, -0xF8, 0x00, 0x00, 0x20, 0x80, 0x09, 0x00, 0x20, 0xD8, 0x0D, 0x00, 0x20, -0xEC, 0x02, 0x00, 0x20, 0xF7, 0xB5, 0x42, 0x4B, 0x00, 0x21, 0x19, 0x60, -0x41, 0x4B, 0x0A, 0x24, 0x19, 0x60, 0x41, 0x4B, 0x08, 0x1C, 0x04, 0x33, -0xDB, 0x7F, 0x40, 0x4D, 0x1A, 0x1C, 0xA4, 0x46, 0x11, 0xE0, 0x01, 0x3A, -0xD2, 0xB2, 0x26, 0x1C, 0x56, 0x43, 0xAE, 0x19, 0x38, 0x36, 0x36, 0x7A, -0xB0, 0x42, 0x00, 0xDA, 0x30, 0x1C, 0x66, 0x46, 0x56, 0x43, 0xAE, 0x19, -0x3C, 0x27, 0xF6, 0x5F, 0xB1, 0x42, 0x00, 0xDA, 0x31, 0x1C, 0x00, 0x2A, -0xEB, 0xD1, 0x32, 0x4A, 0x50, 0x60, 0x11, 0x60, 0x2F, 0x4A, 0x0A, 0x20, -0x11, 0x68, 0x31, 0x4A, 0x07, 0xE0, 0x01, 0x3B, 0xDB, 0xB2, 0x04, 0x1C, -0x5C, 0x43, 0x14, 0x19, 0x38, 0x34, 0x24, 0x7A, 0x09, 0x19, 0x14, 0x1C, -0x00, 0x2B, 0xF4, 0xD1, 0x27, 0x4B, 0x19, 0x60, 0x13, 0x68, 0x00, 0x2B, -0x0F, 0xDD, 0x26, 0x4B, 0x28, 0x4A, 0x5B, 0x68, 0x11, 0x80, 0x53, 0x80, -0x27, 0x4B, 0x1B, 0x78, 0x00, 0x2B, 0x06, 0xD0, 0x01, 0x23, 0x02, 0x21, -0x00, 0x93, 0x1D, 0x20, 0x0B, 0x1C, 0x01, 0xF0, 0x8F, 0xFB, 0x23, 0x68, -0x00, 0x2B, 0x19, 0xDD, 0x21, 0x4A, 0x08, 0x23, 0xD1, 0x5E, 0x21, 0x4B, -0x0C, 0x24, 0x12, 0x5F, 0x18, 0x1C, 0x3D, 0x33, 0x1B, 0x78, 0x3C, 0x30, -0x53, 0x43, 0x00, 0x78, 0x9B, 0x11, 0xC3, 0x18, 0x99, 0x42, 0x09, 0xDC, -0x18, 0x4B, 0x1B, 0x78, 0x00, 0x2B, 0x03, 0xD0, 0x00, 0x20, 0x19, 0x49, -0x01, 0xF0, 0xCC, 0xFB, 0xFF, 0xF7, 0x40, 0xFE, 0x11, 0x4B, 0x17, 0x4A, -0x1B, 0x68, 0x12, 0x78, 0x93, 0x42, 0x12, 0xDB, 0x0B, 0x4B, 0x12, 0x4A, -0x18, 0x68, 0xD1, 0x8E, 0x0A, 0x4B, 0x88, 0x42, 0x03, 0xDB, 0x11, 0x8F, -0x58, 0x68, 0x88, 0x42, 0x03, 0xDA, 0x52, 0x8F, 0x5B, 0x68, 0x93, 0x42, -0x07, 0xDB, 0x0E, 0x4B, 0x01, 0x22, 0x1A, 0x70, 0x03, 0xE0, 0x00, 0x2B, -0x01, 0xD1, 0x0B, 0x4A, 0x13, 0x70, 0xF7, 0xBD, 0x4C, 0x11, 0x00, 0x20, -0x0C, 0x02, 0x00, 0x20, 0xAE, 0x09, 0x00, 0x20, 0x9C, 0x0D, 0x00, 0x20, -0x54, 0x11, 0x00, 0x20, 0xEB, 0x01, 0x00, 0x20, 0x70, 0x01, 0x00, 0x20, -0x48, 0x0D, 0x00, 0x20, 0x6C, 0x59, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, -0xF5, 0x00, 0x00, 0x20, 0x38, 0xB5, 0x04, 0x1C, 0x08, 0x1C, 0x00, 0x2A, -0x07, 0xD0, 0x54, 0x43, 0x58, 0x43, 0xD1, 0x18, 0x20, 0x18, 0x4D, 0x10, -0x40, 0x19, 0x02, 0xF0, 0xBB, 0xFF, 0x38, 0xBD, 0x10, 0xB5, 0x43, 0x1A, -0xDC, 0x17, 0x1B, 0x19, 0x63, 0x40, 0xFF, 0xF7, 0xEB, 0xFF, 0x10, 0xBD, -0xF0, 0xB5, 0xA9, 0x4B, 0x00, 0x25, 0x04, 0x33, 0x87, 0xB0, 0xDC, 0x7F, -0x2E, 0x1C, 0x46, 0xE0, 0x01, 0x3C, 0xE4, 0xB2, 0x0A, 0x22, 0x62, 0x43, -0x99, 0x18, 0x38, 0x31, 0x88, 0x88, 0x00, 0x28, 0x3D, 0xD0, 0xA2, 0x4F, -0x3F, 0x5D, 0x00, 0x2F, 0x2A, 0xD1, 0xA1, 0x49, 0x09, 0x78, 0x00, 0x29, -0x07, 0xD0, 0x9A, 0x18, 0x01, 0x21, 0x3C, 0x32, 0x1D, 0x20, 0x02, 0x23, -0x00, 0x91, 0x01, 0xF0, 0x07, 0xFB, 0x0A, 0x20, 0x60, 0x43, 0x9B, 0x4B, -0x9B, 0x49, 0x18, 0x18, 0x3C, 0x27, 0xC2, 0x5F, 0x38, 0x30, 0x94, 0x46, -0x26, 0x27, 0xCA, 0x5F, 0x1F, 0x1C, 0x94, 0x45, 0x08, 0xDB, 0x4E, 0x31, -0x0A, 0x78, 0x96, 0x49, 0x00, 0x7A, 0x49, 0x68, 0x4A, 0x43, 0x92, 0x11, -0x90, 0x42, 0x16, 0xDA, 0x0A, 0x22, 0x62, 0x43, 0xBA, 0x18, 0xD5, 0x87, -0x38, 0x32, 0x16, 0x72, 0x95, 0x80, 0x08, 0xE0, 0x8D, 0x4A, 0x00, 0xB2, -0x28, 0x27, 0xD2, 0x5F, 0x82, 0x42, 0x08, 0xDD, 0xCD, 0x80, 0x0E, 0x72, -0x8D, 0x80, 0x8B, 0x4A, 0xA1, 0x00, 0x8D, 0x50, 0x1A, 0x68, 0x01, 0x3A, -0x1A, 0x60, 0x85, 0x4B, 0x00, 0x2C, 0xB5, 0xD1, 0x1C, 0x60, 0x87, 0x4B, -0x9C, 0x73, 0x7F, 0x4B, 0x04, 0x33, 0xDC, 0x7F, 0xC7, 0xE0, 0x01, 0x3C, -0xE4, 0xB2, 0x0A, 0x23, 0x63, 0x43, 0xED, 0x18, 0xAA, 0x8F, 0x38, 0x35, -0x00, 0x2A, 0x00, 0xD1, 0x93, 0xE0, 0x7C, 0x4B, 0x12, 0xB2, 0x1B, 0x8D, -0x19, 0xB2, 0x52, 0x1A, 0x52, 0x10, 0x5B, 0x00, 0xD3, 0x18, 0xAB, 0x80, -0x7A, 0x4B, 0x9A, 0x7B, 0x00, 0x2A, 0x0D, 0xD1, 0x79, 0x4A, 0x12, 0x57, -0x00, 0x2A, 0x09, 0xD1, 0x78, 0x4A, 0x01, 0x21, 0x11, 0x70, 0x80, 0x22, -0xD2, 0x05, 0x50, 0x69, 0x00, 0x0E, 0x00, 0x06, 0x01, 0x43, 0x51, 0x61, -0x01, 0x22, 0x9A, 0x73, 0x73, 0x4E, 0x71, 0x4B, 0x1A, 0x57, 0x33, 0x78, -0x9A, 0x42, 0x70, 0xDB, 0x6F, 0x4B, 0x1A, 0x78, 0x00, 0x2A, 0x01, 0xD0, -0x00, 0x22, 0x1A, 0x70, 0x66, 0x4D, 0x62, 0x00, 0x2B, 0x68, 0x01, 0x33, -0x2B, 0x60, 0xAB, 0x18, 0x04, 0x27, 0xD9, 0x5F, 0x6A, 0x4B, 0x9A, 0x18, -0x04, 0x26, 0x90, 0x5F, 0x22, 0x1C, 0x10, 0x32, 0x52, 0x00, 0x57, 0x5F, -0x03, 0x97, 0xD7, 0x5E, 0x0A, 0x1A, 0xD3, 0x17, 0x03, 0x9E, 0xD2, 0x18, -0x5A, 0x40, 0xF3, 0x1B, 0xDE, 0x17, 0x9B, 0x19, 0x73, 0x40, 0xD3, 0x18, -0x04, 0x93, 0x59, 0x4B, 0x2E, 0x22, 0x9E, 0x5E, 0x04, 0x9B, 0x32, 0x1C, -0x05, 0x96, 0xFF, 0xF7, 0x39, 0xFF, 0x05, 0x9A, 0x04, 0x9B, 0x06, 0x1C, -0x03, 0x99, 0x38, 0x1C, 0xFF, 0xF7, 0x32, 0xFF, 0x4D, 0x4A, 0x13, 0x1C, -0x2D, 0x33, 0x1B, 0x78, 0x2A, 0x1C, 0x5B, 0xB2, 0x9E, 0x42, 0x07, 0xDD, -0x55, 0x49, 0xC9, 0x69, 0xCF, 0x1A, 0xBE, 0x42, 0x03, 0xDB, 0x4E, 0x1E, -0xF6, 0x1A, 0x00, 0xE0, 0x1E, 0x1C, 0x45, 0x4B, 0x2E, 0x33, 0x1B, 0x78, -0x5B, 0xB2, 0x98, 0x42, 0x07, 0xDD, 0x4E, 0x49, 0x09, 0x6A, 0xCF, 0x1A, -0xB8, 0x42, 0x03, 0xDB, 0x48, 0x1E, 0xC0, 0x1A, 0x00, 0xE0, 0x18, 0x1C, -0x63, 0x00, 0xD3, 0x18, 0x9E, 0x80, 0x23, 0x1C, 0x10, 0x33, 0x5B, 0x00, -0xE8, 0x52, 0x0A, 0x25, 0x65, 0x43, 0x3D, 0x4B, 0x43, 0x4E, 0x30, 0x20, -0x1F, 0x5E, 0x76, 0x19, 0x55, 0x19, 0x3C, 0x21, 0x70, 0x5E, 0x3C, 0x22, -0xA9, 0x5E, 0x3A, 0x1C, 0xFF, 0xF7, 0x0A, 0xFF, 0x38, 0x36, 0xA8, 0x87, -0x38, 0x35, 0x30, 0x7A, 0x29, 0x7A, 0x3A, 0x1C, 0xFF, 0xF7, 0x02, 0xFF, -0x28, 0x72, 0x31, 0x4B, 0x62, 0x00, 0x99, 0x18, 0x37, 0x48, 0x89, 0x88, -0x82, 0x18, 0x91, 0x80, 0x22, 0x1C, 0x10, 0x32, 0x52, 0x00, 0xD1, 0x5A, -0x11, 0x52, 0x0A, 0x22, 0x11, 0x1C, 0x61, 0x43, 0x40, 0x18, 0x59, 0x18, -0x0D, 0x1C, 0x3C, 0x30, 0x3C, 0x31, 0x02, 0xF0, 0x07, 0xFF, 0x3C, 0x23, -0xEA, 0x5E, 0x38, 0x35, 0x29, 0x4B, 0x00, 0x2A, 0x0C, 0xD0, 0x24, 0x49, -0x1A, 0x5D, 0x32, 0x31, 0x09, 0x78, 0x50, 0xB2, 0x88, 0x42, 0x06, 0xDA, -0x01, 0x32, 0x1A, 0x55, 0x01, 0x23, 0x5B, 0x42, 0xAB, 0x80, 0x00, 0xE0, -0x1A, 0x55, 0x1C, 0x4D, 0x00, 0x2C, 0x00, 0xD0, 0x33, 0xE7, 0x22, 0x4E, -0x29, 0x68, 0x32, 0x68, 0x22, 0x4B, 0x91, 0x42, 0x25, 0xDA, 0x19, 0x68, -0x17, 0x48, 0x01, 0x31, 0x19, 0x60, 0x3E, 0x30, 0x00, 0x78, 0x40, 0xB2, -0x81, 0x42, 0x1C, 0xDA, 0x0F, 0x4B, 0x2A, 0x60, 0x04, 0x33, 0xDC, 0x7F, -0x14, 0xE0, 0x01, 0x3C, 0xE4, 0xB2, 0x63, 0x00, 0xF2, 0x18, 0x92, 0x88, -0xEB, 0x18, 0x9A, 0x80, 0x23, 0x1C, 0x10, 0x33, 0x5B, 0x00, 0x9A, 0x5B, -0x5A, 0x53, 0x0A, 0x22, 0x11, 0x1C, 0x61, 0x43, 0x68, 0x18, 0x71, 0x18, -0x3C, 0x30, 0x3C, 0x31, 0x02, 0xF0, 0xC6, 0xFE, 0x00, 0x2C, 0xE8, 0xD1, -0x00, 0xE0, 0x1C, 0x60, 0x07, 0xB0, 0xF0, 0xBD, 0xAE, 0x09, 0x00, 0x20, -0xEC, 0x01, 0x00, 0x20, 0xEB, 0x01, 0x00, 0x20, 0x9C, 0x0D, 0x00, 0x20, -0x48, 0x0D, 0x00, 0x20, 0x0C, 0x02, 0x00, 0x20, 0xF8, 0x00, 0x00, 0x20, -0x70, 0x01, 0x00, 0x20, 0x3E, 0x11, 0x00, 0x20, 0xE2, 0x01, 0x00, 0x20, -0x7A, 0x0D, 0x00, 0x20, 0x20, 0x03, 0x00, 0x20, 0x24, 0x09, 0x00, 0x20, -0x60, 0x01, 0x00, 0x20, 0xF0, 0xB5, 0x31, 0x4B, 0x31, 0x4D, 0x1E, 0x78, -0x31, 0x4B, 0x00, 0x27, 0x1A, 0x1C, 0x2F, 0x60, 0x2B, 0x32, 0x12, 0x78, -0x89, 0xB0, 0x04, 0x92, 0x50, 0x00, 0x1A, 0x1C, 0x06, 0x90, 0x32, 0x32, -0x12, 0x78, 0x07, 0x92, 0x30, 0x22, 0x99, 0x5E, 0x6B, 0x68, 0x05, 0x91, -0x02, 0x93, 0x03, 0x97, 0x42, 0xE0, 0x01, 0x3E, 0xF6, 0xB2, 0x33, 0x1D, -0x5B, 0x00, 0x01, 0x93, 0xEB, 0x5A, 0x00, 0x2B, 0x34, 0xD0, 0x04, 0x98, -0x1B, 0xB2, 0x1B, 0x1A, 0x06, 0x99, 0x5B, 0x10, 0xCB, 0x18, 0x01, 0x9A, -0x20, 0x48, 0x9B, 0xB2, 0xAB, 0x52, 0xF2, 0x00, 0x81, 0x58, 0x84, 0x18, -0x07, 0x98, 0x1B, 0xB2, 0x81, 0x42, 0x07, 0xDA, 0x1B, 0x48, 0x01, 0x31, -0x81, 0x50, 0x01, 0x99, 0x00, 0x22, 0x63, 0x60, 0x6A, 0x52, 0x21, 0xE0, -0x60, 0x68, 0x01, 0x37, 0x1A, 0x1A, 0xD1, 0x17, 0x84, 0x46, 0x50, 0x18, -0x05, 0x9A, 0x48, 0x40, 0x11, 0x18, 0x00, 0x90, 0x60, 0x46, 0x42, 0x43, -0x94, 0x46, 0x00, 0x9A, 0x53, 0x43, 0x62, 0x46, 0xD0, 0x18, 0x4B, 0x10, -0xC0, 0x18, 0x02, 0xF0, 0xF3, 0xFD, 0x01, 0x9B, 0x03, 0x99, 0x60, 0x60, -0xE8, 0x52, 0x81, 0x42, 0x04, 0xDB, 0x05, 0xE0, 0x09, 0x48, 0xF2, 0x00, -0x83, 0x50, 0x01, 0xE0, 0x02, 0x96, 0x03, 0x90, 0x00, 0x2E, 0xBA, 0xD1, -0x02, 0x99, 0x09, 0xB0, 0x2F, 0x60, 0x69, 0x60, 0xF0, 0xBD, 0xC0, 0x46, -0x7C, 0x09, 0x00, 0x20, 0xE0, 0x00, 0x00, 0x20, 0x48, 0x0D, 0x00, 0x20, -0x48, 0x09, 0x00, 0x20, 0xF7, 0xB5, 0x27, 0x4B, 0x27, 0x49, 0x04, 0x33, -0xDB, 0x7F, 0x27, 0x4A, 0x27, 0x48, 0x42, 0xE0, 0x01, 0x3B, 0xDB, 0xB2, -0x1C, 0x1C, 0x14, 0x34, 0x64, 0x00, 0x04, 0x19, 0x04, 0x25, 0x64, 0x5F, -0x00, 0x2C, 0x27, 0xD0, 0x0A, 0x24, 0x5C, 0x43, 0x0C, 0x19, 0x3C, 0x26, -0xA4, 0x5F, 0x00, 0x2C, 0x20, 0xD0, 0x5C, 0x00, 0x0E, 0x19, 0xB6, 0x88, -0x05, 0x19, 0x37, 0xB2, 0xBC, 0x46, 0x04, 0x27, 0xEF, 0x5F, 0x65, 0x46, -0xED, 0x1B, 0x6F, 0x10, 0xBE, 0x19, 0x14, 0x19, 0xA6, 0x80, 0x1C, 0x1C, -0x10, 0x34, 0x64, 0x00, 0x0E, 0x5B, 0x1C, 0x1C, 0x0C, 0x34, 0x37, 0xB2, -0x64, 0x00, 0xBC, 0x46, 0x25, 0x5E, 0x67, 0x46, 0x7F, 0x1B, 0x7F, 0x10, -0xBE, 0x19, 0xA6, 0x52, 0x10, 0x4C, 0x01, 0x26, 0xE6, 0x54, 0x10, 0xE0, -0x0B, 0x4D, 0x5C, 0x00, 0x2E, 0x19, 0xB6, 0x88, 0x14, 0x19, 0xA6, 0x80, -0x1E, 0x1C, 0x10, 0x36, 0x1C, 0x1C, 0x76, 0x00, 0x76, 0x5B, 0x0C, 0x34, -0x64, 0x00, 0x16, 0x53, 0x07, 0x4C, 0x00, 0x26, 0xE6, 0x54, 0x00, 0x2B, -0xBA, 0xD1, 0x0B, 0x68, 0x13, 0x60, 0xF7, 0xBD, 0xAE, 0x09, 0x00, 0x20, -0x9C, 0x0D, 0x00, 0x20, 0x80, 0x09, 0x00, 0x20, 0x20, 0x01, 0x00, 0x20, -0xEC, 0x01, 0x00, 0x20, 0xF7, 0xB5, 0x35, 0x4A, 0x35, 0x4B, 0x11, 0x1C, -0x33, 0x31, 0x34, 0x32, 0x0E, 0x78, 0x12, 0x78, 0x04, 0x33, 0xDB, 0x7F, -0x32, 0x49, 0x01, 0x92, 0xB4, 0x46, 0x32, 0x4A, 0x4B, 0xE0, 0x32, 0x48, -0x01, 0x3B, 0xDB, 0xB2, 0xC4, 0x5C, 0x01, 0x98, 0x00, 0x2C, 0x00, 0xD1, -0x60, 0x46, 0x5E, 0x00, 0x8D, 0x19, 0x96, 0x19, 0x04, 0x27, 0xF6, 0x5F, -0xAD, 0x88, 0x00, 0x96, 0x00, 0x9F, 0x2E, 0xB2, 0xBE, 0x1B, 0xF7, 0x17, -0xF6, 0x19, 0x7E, 0x40, 0x86, 0x42, 0x10, 0xDA, 0x1E, 0x1C, 0x0C, 0x36, -0x76, 0x00, 0xB6, 0x5E, 0x1F, 0x1C, 0x10, 0x37, 0x00, 0x96, 0x7F, 0x00, -0xCF, 0x5F, 0x00, 0x9E, 0xF7, 0x1B, 0xFE, 0x17, 0xBF, 0x19, 0x77, 0x40, -0x00, 0x97, 0x87, 0x42, 0x18, 0xDB, 0x58, 0x00, 0x10, 0x18, 0x1E, 0x1C, -0x85, 0x80, 0x10, 0x36, 0x19, 0x4D, 0x18, 0x1C, 0x76, 0x00, 0x0C, 0x30, -0x75, 0x5B, 0x40, 0x00, 0x15, 0x52, 0x18, 0x1C, 0x14, 0x30, 0x40, 0x00, -0x10, 0x18, 0x04, 0x27, 0xC0, 0x5F, 0x00, 0x28, 0x04, 0xDD, 0x00, 0x2C, -0x02, 0xD1, 0x13, 0x48, 0x01, 0x24, 0xC4, 0x54, 0x0A, 0x24, 0x5C, 0x43, -0x0E, 0x4D, 0x18, 0x1C, 0x2C, 0x19, 0x14, 0x30, 0x0D, 0x4D, 0x40, 0x00, -0xA4, 0x8F, 0x28, 0x18, 0x84, 0x80, 0x00, 0x2B, 0xB1, 0xD1, 0x0A, 0x68, -0x09, 0x4B, 0x0B, 0x49, 0x1A, 0x60, 0x0B, 0x4B, 0x1A, 0x78, 0x0B, 0x4B, -0x1A, 0x70, 0x0B, 0x4A, 0x0B, 0x1C, 0x31, 0xCA, 0x31, 0xC3, 0xC0, 0xCA, -0xC0, 0xC3, 0xF7, 0xBD, 0x48, 0x0D, 0x00, 0x20, 0xAE, 0x09, 0x00, 0x20, -0x9C, 0x0D, 0x00, 0x20, 0x20, 0x01, 0x00, 0x20, 0x64, 0x01, 0x00, 0x20, -0xCC, 0x00, 0x00, 0x20, 0xF5, 0x00, 0x00, 0x20, 0xF4, 0x00, 0x00, 0x20, -0xE0, 0x00, 0x00, 0x20, 0xF7, 0xB5, 0x19, 0x48, 0x01, 0x23, 0x5B, 0x42, -0x43, 0x60, 0x18, 0x4B, 0x1A, 0x78, 0x18, 0x4B, 0x19, 0x1C, 0x2B, 0x33, -0x1E, 0x78, 0x2A, 0x31, 0x0F, 0x78, 0x00, 0x23, 0xB4, 0x46, 0x1E, 0xE0, -0x01, 0x3A, 0xD2, 0xB2, 0x13, 0x4C, 0x51, 0x00, 0x61, 0x5A, 0x0E, 0xB2, -0xF6, 0x43, 0xF6, 0x17, 0x0E, 0x40, 0x11, 0x1D, 0x49, 0x00, 0xB5, 0xB2, -0x0E, 0x52, 0x00, 0x2D, 0x0F, 0xD0, 0x0E, 0x4E, 0x2D, 0xB2, 0x8E, 0x5F, -0x00, 0x2E, 0x04, 0xDC, 0xBD, 0x42, 0x07, 0xDA, 0x00, 0x25, 0x0D, 0x52, -0x05, 0xE0, 0x65, 0x45, 0x02, 0xDA, 0x00, 0x26, 0x0E, 0x52, 0x00, 0xE0, -0x01, 0x33, 0x00, 0x2A, 0xDE, 0xD1, 0x01, 0x4A, 0x13, 0x60, 0xF7, 0xBD, -0xE0, 0x00, 0x00, 0x20, 0x7C, 0x09, 0x00, 0x20, 0x48, 0x0D, 0x00, 0x20, -0x3C, 0x0D, 0x00, 0x20, 0xCC, 0x00, 0x00, 0x20, 0xEF, 0xF3, 0x08, 0x80, -0x70, 0x47, 0x00, 0xBA, 0x70, 0x47, 0x40, 0xBA, 0x70, 0x47, 0xC0, 0xBA, -0x70, 0x47, 0x70, 0xB5, 0x00, 0x28, 0x16, 0xDA, 0xC0, 0xB2, 0x0F, 0x23, -0x03, 0x40, 0x08, 0x3B, 0x12, 0x4A, 0x9B, 0x08, 0x9B, 0x00, 0x9B, 0x18, -0x03, 0x22, 0x10, 0x40, 0x90, 0x40, 0xFF, 0x22, 0x5D, 0x68, 0x14, 0x1C, -0x84, 0x40, 0x89, 0x01, 0xA5, 0x43, 0x0A, 0x40, 0x82, 0x40, 0x28, 0x1C, -0x10, 0x43, 0x58, 0x60, 0x11, 0xE0, 0x03, 0x24, 0x82, 0x08, 0x09, 0x4B, -0x20, 0x40, 0xC0, 0x32, 0xA0, 0x40, 0x92, 0x00, 0xFF, 0x24, 0xD5, 0x58, -0x26, 0x1C, 0x86, 0x40, 0x89, 0x01, 0xB5, 0x43, 0x0C, 0x40, 0x84, 0x40, -0x28, 0x1C, 0x20, 0x43, 0xD0, 0x50, 0x70, 0xBD, 0x18, 0xED, 0x00, 0xE0, -0x00, 0xE1, 0x00, 0xE0, 0x08, 0x4B, 0x40, 0x22, 0x19, 0x68, 0x7F, 0x20, -0x49, 0x06, 0x49, 0x0E, 0x11, 0x43, 0x1A, 0x68, 0x82, 0x43, 0x0A, 0x43, -0x1A, 0x60, 0x1A, 0x68, 0x80, 0x23, 0xDB, 0x05, 0x19, 0x69, 0x1A, 0x61, -0x70, 0x47, 0xC0, 0x46, 0x08, 0x00, 0x00, 0x20, 0x07, 0x4B, 0x3F, 0x22, -0x19, 0x68, 0x7F, 0x20, 0x11, 0x40, 0x1A, 0x68, 0x82, 0x43, 0x0A, 0x43, -0x1A, 0x60, 0x1A, 0x68, 0x80, 0x23, 0xDB, 0x05, 0x19, 0x69, 0x1A, 0x61, -0x70, 0x47, 0xC0, 0x46, 0x08, 0x00, 0x00, 0x20, 0x07, 0x4B, 0x08, 0x4A, -0x19, 0x68, 0x18, 0x68, 0x89, 0x04, 0x89, 0x0E, 0x09, 0x02, 0x02, 0x40, -0x0A, 0x43, 0x1A, 0x60, 0x1A, 0x68, 0x80, 0x23, 0xDB, 0x05, 0x19, 0x69, -0x1A, 0x61, 0x70, 0x47, 0x08, 0x00, 0x00, 0x20, 0xFF, 0x80, 0xFF, 0xFF, -0x08, 0x4B, 0x40, 0x22, 0x19, 0x68, 0x18, 0x68, 0x49, 0x04, 0x49, 0x0E, -0x11, 0x43, 0x06, 0x4A, 0x09, 0x02, 0x02, 0x40, 0x0A, 0x43, 0x1A, 0x60, -0x1A, 0x68, 0x80, 0x23, 0xDB, 0x05, 0x19, 0x69, 0x1A, 0x61, 0x70, 0x47, -0x08, 0x00, 0x00, 0x20, 0xFF, 0x80, 0xFF, 0xFF, 0x08, 0x4B, 0x20, 0x22, -0x19, 0x68, 0x7F, 0x20, 0x49, 0x06, 0x49, 0x0E, 0x11, 0x43, 0x1A, 0x68, -0x82, 0x43, 0x0A, 0x43, 0x1A, 0x60, 0x1A, 0x68, 0x80, 0x23, 0xDB, 0x05, -0x19, 0x69, 0x1A, 0x61, 0x70, 0x47, 0xC0, 0x46, 0x08, 0x00, 0x00, 0x20, -0x07, 0x4B, 0x5F, 0x22, 0x19, 0x68, 0x7F, 0x20, 0x11, 0x40, 0x1A, 0x68, -0x82, 0x43, 0x0A, 0x43, 0x1A, 0x60, 0x1A, 0x68, 0x80, 0x23, 0xDB, 0x05, -0x19, 0x69, 0x1A, 0x61, 0x70, 0x47, 0xC0, 0x46, 0x08, 0x00, 0x00, 0x20, -0x07, 0x4B, 0xBE, 0x21, 0x1A, 0x68, 0xC9, 0x01, 0x18, 0x68, 0x11, 0x40, -0x05, 0x4A, 0x02, 0x40, 0x0A, 0x43, 0x1A, 0x60, 0x1A, 0x68, 0x80, 0x23, -0xDB, 0x05, 0x19, 0x69, 0x1A, 0x61, 0x70, 0x47, 0x08, 0x00, 0x00, 0x20, -0xFF, 0x80, 0xFF, 0xFF, 0x08, 0x4B, 0x20, 0x22, 0x19, 0x68, 0x18, 0x68, -0x49, 0x04, 0x49, 0x0E, 0x11, 0x43, 0x06, 0x4A, 0x09, 0x02, 0x02, 0x40, -0x0A, 0x43, 0x1A, 0x60, 0x1A, 0x68, 0x80, 0x23, 0xDB, 0x05, 0x19, 0x69, -0x1A, 0x61, 0x70, 0x47, 0x08, 0x00, 0x00, 0x20, 0xFF, 0x80, 0xFF, 0xFF, -0x80, 0x23, 0xDB, 0x05, 0x18, 0x6C, 0x80, 0x00, 0xC0, 0x0F, 0x70, 0x47, -0x08, 0x4B, 0x10, 0x22, 0x19, 0x68, 0x7F, 0x20, 0x49, 0x06, 0x49, 0x0E, -0x11, 0x43, 0x1A, 0x68, 0x82, 0x43, 0x0A, 0x43, 0x1A, 0x60, 0x1A, 0x68, -0x80, 0x23, 0xDB, 0x05, 0x19, 0x69, 0x1A, 0x61, 0x70, 0x47, 0xC0, 0x46, -0x08, 0x00, 0x00, 0x20, 0x07, 0x4B, 0x6F, 0x22, 0x19, 0x68, 0x7F, 0x20, -0x11, 0x40, 0x1A, 0x68, 0x82, 0x43, 0x0A, 0x43, 0x1A, 0x60, 0x1A, 0x68, -0x80, 0x23, 0xDB, 0x05, 0x19, 0x69, 0x1A, 0x61, 0x70, 0x47, 0xC0, 0x46, -0x08, 0x00, 0x00, 0x20, 0x00, 0xB5, 0x0B, 0x4B, 0x19, 0x68, 0x00, 0x28, -0x04, 0xD0, 0x49, 0x06, 0x49, 0x0E, 0x10, 0x22, 0x11, 0x43, 0x01, 0xE0, -0x6F, 0x22, 0x11, 0x40, 0x1A, 0x68, 0x7F, 0x20, 0x82, 0x43, 0x0A, 0x43, -0x1A, 0x60, 0x1A, 0x68, 0x80, 0x23, 0xDB, 0x05, 0x19, 0x69, 0x1A, 0x61, -0x00, 0xBD, 0xC0, 0x46, 0x08, 0x00, 0x00, 0x20, 0x07, 0x4B, 0xDE, 0x21, -0x1A, 0x68, 0xC9, 0x01, 0x18, 0x68, 0x11, 0x40, 0x05, 0x4A, 0x02, 0x40, -0x0A, 0x43, 0x1A, 0x60, 0x1A, 0x68, 0x80, 0x23, 0xDB, 0x05, 0x19, 0x69, -0x1A, 0x61, 0x70, 0x47, 0x08, 0x00, 0x00, 0x20, 0xFF, 0x80, 0xFF, 0xFF, -0x08, 0x4B, 0x10, 0x22, 0x19, 0x68, 0x18, 0x68, 0x49, 0x04, 0x49, 0x0E, -0x11, 0x43, 0x06, 0x4A, 0x09, 0x02, 0x02, 0x40, 0x0A, 0x43, 0x1A, 0x60, -0x1A, 0x68, 0x80, 0x23, 0xDB, 0x05, 0x19, 0x69, 0x1A, 0x61, 0x70, 0x47, -0x08, 0x00, 0x00, 0x20, 0xFF, 0x80, 0xFF, 0xFF, 0x80, 0x23, 0xDB, 0x05, -0x18, 0x6C, 0xC0, 0x00, 0xC0, 0x0F, 0x70, 0x47, 0x08, 0x4B, 0x01, 0x22, -0x19, 0x68, 0x7F, 0x20, 0x49, 0x06, 0x49, 0x0E, 0x11, 0x43, 0x1A, 0x68, -0x82, 0x43, 0x0A, 0x43, 0x1A, 0x60, 0x1A, 0x68, 0x80, 0x23, 0xDB, 0x05, -0x19, 0x69, 0x1A, 0x61, 0x70, 0x47, 0xC0, 0x46, 0x08, 0x00, 0x00, 0x20, -0x07, 0x4B, 0x7E, 0x22, 0x19, 0x68, 0x7F, 0x20, 0x11, 0x40, 0x1A, 0x68, -0x82, 0x43, 0x0A, 0x43, 0x1A, 0x60, 0x1A, 0x68, 0x80, 0x23, 0xDB, 0x05, -0x19, 0x69, 0x1A, 0x61, 0x70, 0x47, 0xC0, 0x46, 0x08, 0x00, 0x00, 0x20, -0x07, 0x4B, 0xFC, 0x21, 0x1A, 0x68, 0xC9, 0x01, 0x18, 0x68, 0x11, 0x40, -0x05, 0x4A, 0x02, 0x40, 0x0A, 0x43, 0x1A, 0x60, 0x1A, 0x68, 0x80, 0x23, -0xDB, 0x05, 0x19, 0x69, 0x1A, 0x61, 0x70, 0x47, 0x08, 0x00, 0x00, 0x20, -0xFF, 0x80, 0xFF, 0xFF, 0x08, 0x4B, 0x01, 0x22, 0x19, 0x68, 0x18, 0x68, -0x49, 0x04, 0x49, 0x0E, 0x11, 0x43, 0x06, 0x4A, 0x09, 0x02, 0x02, 0x40, -0x0A, 0x43, 0x1A, 0x60, 0x1A, 0x68, 0x80, 0x23, 0xDB, 0x05, 0x19, 0x69, -0x1A, 0x61, 0x70, 0x47, 0x08, 0x00, 0x00, 0x20, 0xFF, 0x80, 0xFF, 0xFF, -0x80, 0x23, 0xDB, 0x05, 0x18, 0x6C, 0xC0, 0x01, 0xC0, 0x0F, 0x70, 0x47, -0x08, 0x4B, 0x02, 0x22, 0x19, 0x68, 0x7F, 0x20, 0x49, 0x06, 0x49, 0x0E, -0x11, 0x43, 0x1A, 0x68, 0x82, 0x43, 0x0A, 0x43, 0x1A, 0x60, 0x1A, 0x68, -0x80, 0x23, 0xDB, 0x05, 0x19, 0x69, 0x1A, 0x61, 0x70, 0x47, 0xC0, 0x46, -0x08, 0x00, 0x00, 0x20, 0x07, 0x4B, 0x7D, 0x22, 0x19, 0x68, 0x7F, 0x20, -0x11, 0x40, 0x1A, 0x68, 0x82, 0x43, 0x0A, 0x43, 0x1A, 0x60, 0x1A, 0x68, -0x80, 0x23, 0xDB, 0x05, 0x19, 0x69, 0x1A, 0x61, 0x70, 0x47, 0xC0, 0x46, -0x08, 0x00, 0x00, 0x20, 0x07, 0x4B, 0xFA, 0x21, 0x1A, 0x68, 0xC9, 0x01, -0x18, 0x68, 0x11, 0x40, 0x05, 0x4A, 0x02, 0x40, 0x0A, 0x43, 0x1A, 0x60, -0x1A, 0x68, 0x80, 0x23, 0xDB, 0x05, 0x19, 0x69, 0x1A, 0x61, 0x70, 0x47, -0x08, 0x00, 0x00, 0x20, 0xFF, 0x80, 0xFF, 0xFF, 0x08, 0x4B, 0x02, 0x22, -0x19, 0x68, 0x18, 0x68, 0x49, 0x04, 0x49, 0x0E, 0x11, 0x43, 0x06, 0x4A, -0x09, 0x02, 0x02, 0x40, 0x0A, 0x43, 0x1A, 0x60, 0x1A, 0x68, 0x80, 0x23, -0xDB, 0x05, 0x19, 0x69, 0x1A, 0x61, 0x70, 0x47, 0x08, 0x00, 0x00, 0x20, -0xFF, 0x80, 0xFF, 0xFF, 0x80, 0x23, 0xDB, 0x05, 0x18, 0x6C, 0x80, 0x01, -0xC0, 0x0F, 0x70, 0x47, 0x08, 0x4B, 0x04, 0x22, 0x19, 0x68, 0x7F, 0x20, -0x49, 0x06, 0x49, 0x0E, 0x11, 0x43, 0x1A, 0x68, 0x82, 0x43, 0x0A, 0x43, -0x1A, 0x60, 0x1A, 0x68, 0x80, 0x23, 0xDB, 0x05, 0x19, 0x69, 0x1A, 0x61, -0x70, 0x47, 0xC0, 0x46, 0x08, 0x00, 0x00, 0x20, 0x07, 0x4B, 0x7B, 0x22, -0x19, 0x68, 0x7F, 0x20, 0x11, 0x40, 0x1A, 0x68, 0x82, 0x43, 0x0A, 0x43, -0x1A, 0x60, 0x1A, 0x68, 0x80, 0x23, 0xDB, 0x05, 0x19, 0x69, 0x1A, 0x61, -0x70, 0x47, 0xC0, 0x46, 0x08, 0x00, 0x00, 0x20, 0x00, 0xB5, 0x0B, 0x4B, -0x19, 0x68, 0x00, 0x28, 0x04, 0xD0, 0x49, 0x06, 0x49, 0x0E, 0x04, 0x22, -0x11, 0x43, 0x01, 0xE0, 0x7B, 0x22, 0x11, 0x40, 0x1A, 0x68, 0x7F, 0x20, -0x82, 0x43, 0x0A, 0x43, 0x1A, 0x60, 0x1A, 0x68, 0x80, 0x23, 0xDB, 0x05, -0x19, 0x69, 0x1A, 0x61, 0x00, 0xBD, 0xC0, 0x46, 0x08, 0x00, 0x00, 0x20, -0x07, 0x4B, 0xF6, 0x21, 0x1A, 0x68, 0xC9, 0x01, 0x18, 0x68, 0x11, 0x40, -0x05, 0x4A, 0x02, 0x40, 0x0A, 0x43, 0x1A, 0x60, 0x1A, 0x68, 0x80, 0x23, -0xDB, 0x05, 0x19, 0x69, 0x1A, 0x61, 0x70, 0x47, 0x08, 0x00, 0x00, 0x20, -0xFF, 0x80, 0xFF, 0xFF, 0x08, 0x4B, 0x04, 0x22, 0x19, 0x68, 0x18, 0x68, -0x49, 0x04, 0x49, 0x0E, 0x11, 0x43, 0x06, 0x4A, 0x09, 0x02, 0x02, 0x40, -0x0A, 0x43, 0x1A, 0x60, 0x1A, 0x68, 0x80, 0x23, 0xDB, 0x05, 0x19, 0x69, -0x1A, 0x61, 0x70, 0x47, 0x08, 0x00, 0x00, 0x20, 0xFF, 0x80, 0xFF, 0xFF, -0x80, 0x23, 0xDB, 0x05, 0x18, 0x6C, 0x40, 0x01, 0xC0, 0x0F, 0x70, 0x47, -0x10, 0xB5, 0x80, 0x23, 0xDB, 0x05, 0x04, 0x1D, 0x98, 0x69, 0x3F, 0x22, -0x14, 0x40, 0x90, 0x43, 0x20, 0x43, 0x01, 0x24, 0x98, 0x61, 0x88, 0x1C, -0x21, 0x40, 0x41, 0x18, 0x0A, 0x40, 0x11, 0x02, 0x98, 0x69, 0x02, 0x4A, -0x02, 0x40, 0x0A, 0x43, 0x9A, 0x61, 0x10, 0xBD, 0xFF, 0xC0, 0xFF, 0xFF, -0x06, 0x4B, 0x7F, 0x22, 0x19, 0x68, 0x80, 0x23, 0xDB, 0x05, 0x18, 0x6C, -0x01, 0x39, 0x90, 0x43, 0x11, 0x40, 0x02, 0x1C, 0x0A, 0x43, 0x1A, 0x64, -0x70, 0x47, 0xC0, 0x46, 0x18, 0x09, 0x00, 0x20, 0x80, 0x23, 0xDB, 0x05, -0x1A, 0x6C, 0x7F, 0x21, 0x8A, 0x43, 0x01, 0x21, 0x0A, 0x43, 0x1A, 0x64, -0x70, 0x47, 0x80, 0x23, 0xDB, 0x05, 0xDA, 0x69, 0x0F, 0x21, 0x8A, 0x43, -0x02, 0x21, 0x0A, 0x43, 0xDA, 0x61, 0xDA, 0x69, 0xF0, 0x21, 0x8A, 0x43, -0x30, 0x21, 0x0A, 0x43, 0xDA, 0x61, 0x0C, 0x4A, 0x11, 0x79, 0x01, 0x39, -0xC9, 0xB2, 0x59, 0x77, 0xD8, 0x69, 0x0A, 0x49, 0x01, 0x40, 0x80, 0x20, -0xC0, 0x02, 0x01, 0x43, 0xD9, 0x61, 0xD8, 0x69, 0x07, 0x49, 0x01, 0x40, -0xA0, 0x20, 0xC0, 0x03, 0x01, 0x43, 0xD9, 0x61, 0x92, 0x79, 0x01, 0x3A, -0xD2, 0xB2, 0xDA, 0x77, 0x70, 0x47, 0xC0, 0x46, 0x04, 0x02, 0x00, 0x20, -0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0x30, 0xB5, 0x1A, 0x4A, -0x1A, 0x4B, 0x11, 0x88, 0x1A, 0x4C, 0xC9, 0x18, 0x80, 0x23, 0xDB, 0x05, -0x89, 0xB2, 0x18, 0x8C, 0x19, 0x84, 0x59, 0x8C, 0x00, 0x21, 0x59, 0x84, -0x50, 0x88, 0x16, 0x4D, 0x01, 0x19, 0x89, 0xB2, 0x9A, 0x8C, 0x99, 0x84, -0x42, 0x1E, 0xDC, 0x8C, 0x92, 0xB2, 0x44, 0x19, 0xDA, 0x84, 0xA4, 0xB2, -0x1D, 0x8D, 0x1C, 0x85, 0x10, 0x4C, 0x00, 0x19, 0x80, 0xB2, 0x5C, 0x8D, -0x58, 0x85, 0x98, 0x8D, 0x99, 0x85, 0xD8, 0x8D, 0xDA, 0x85, 0x18, 0x8E, -0x19, 0x86, 0x58, 0x8E, 0x5A, 0x86, 0x98, 0x8E, 0x99, 0x86, 0xD8, 0x8E, -0xDA, 0x86, 0x18, 0x8F, 0x19, 0x87, 0x58, 0x8F, 0x5A, 0x87, 0x98, 0x8F, -0x99, 0x87, 0xD9, 0x8F, 0xDA, 0x87, 0x30, 0xBD, 0x04, 0x02, 0x00, 0x20, -0xFF, 0x07, 0x00, 0x00, 0xFF, 0x03, 0x00, 0x00, 0xFF, 0x05, 0x00, 0x00, -0xFF, 0x01, 0x00, 0x00, 0x30, 0xB5, 0x22, 0x4B, 0xEE, 0x24, 0x1A, 0x68, -0xE4, 0x01, 0x14, 0x40, 0x20, 0x48, 0x1A, 0x68, 0x7F, 0x21, 0x02, 0x40, -0x22, 0x43, 0x1A, 0x60, 0x1C, 0x68, 0x80, 0x22, 0xD2, 0x05, 0x15, 0x69, -0x14, 0x61, 0x1C, 0x4C, 0xA4, 0x7C, 0x00, 0x2C, 0x16, 0xD0, 0x1C, 0x68, -0x04, 0x25, 0x64, 0x04, 0x64, 0x0E, 0x2C, 0x43, 0x1D, 0x68, 0x0C, 0x40, -0x24, 0x02, 0x28, 0x40, 0x20, 0x43, 0x18, 0x60, 0x18, 0x68, 0x14, 0x69, -0x10, 0x61, 0x1C, 0x68, 0x7B, 0x20, 0x20, 0x40, 0x1C, 0x68, 0x8C, 0x43, -0x21, 0x1C, 0x01, 0x43, 0x19, 0x60, 0x15, 0xE0, 0x1C, 0x68, 0x04, 0x25, -0x64, 0x06, 0x64, 0x0E, 0x2C, 0x43, 0x1D, 0x68, 0x0C, 0x40, 0x8D, 0x43, -0x29, 0x1C, 0x21, 0x43, 0x19, 0x60, 0x19, 0x68, 0x14, 0x69, 0x11, 0x61, -0x1C, 0x68, 0xF6, 0x21, 0xC9, 0x01, 0x21, 0x40, 0x1C, 0x68, 0x20, 0x40, -0x08, 0x43, 0x18, 0x60, 0x1B, 0x68, 0x11, 0x69, 0x13, 0x61, 0x30, 0xBD, -0x08, 0x00, 0x00, 0x20, 0xFF, 0x80, 0xFF, 0xFF, 0xAE, 0x09, 0x00, 0x20, -0x00, 0xB5, 0x72, 0xB6, 0x0F, 0x4B, 0x01, 0x22, 0x1A, 0x70, 0x0F, 0x4B, -0x9A, 0x7C, 0x0F, 0x4B, 0x00, 0x2A, 0x07, 0xD0, 0x1A, 0x68, 0xF6, 0x21, -0xC9, 0x01, 0x11, 0x40, 0x18, 0x68, 0x0C, 0x4A, 0x02, 0x40, 0x05, 0xE0, -0x19, 0x68, 0x7B, 0x22, 0x11, 0x40, 0x1A, 0x68, 0x7F, 0x20, 0x82, 0x43, -0x0A, 0x43, 0x1A, 0x60, 0x1A, 0x68, 0x80, 0x23, 0xDB, 0x05, 0x19, 0x69, -0x1A, 0x61, 0x62, 0xB6, 0x00, 0xBD, 0xC0, 0x46, 0x64, 0x00, 0x00, 0x20, -0xAE, 0x09, 0x00, 0x20, 0x08, 0x00, 0x00, 0x20, 0xFF, 0x80, 0xFF, 0xFF, -0x00, 0xB5, 0x72, 0xB6, 0x10, 0x4B, 0x00, 0x22, 0x1A, 0x70, 0x10, 0x4B, -0x9A, 0x7C, 0x10, 0x4B, 0x19, 0x68, 0x00, 0x2A, 0x08, 0xD0, 0x49, 0x04, -0x04, 0x22, 0x49, 0x0E, 0x11, 0x43, 0x18, 0x68, 0x0C, 0x4A, 0x09, 0x02, -0x02, 0x40, 0x06, 0xE0, 0x49, 0x06, 0x04, 0x22, 0x49, 0x0E, 0x11, 0x43, -0x1A, 0x68, 0x7F, 0x20, 0x82, 0x43, 0x0A, 0x43, 0x1A, 0x60, 0x1A, 0x68, -0x80, 0x23, 0xDB, 0x05, 0x19, 0x69, 0x1A, 0x61, 0x62, 0xB6, 0x00, 0xBD, -0x64, 0x00, 0x00, 0x20, 0xAE, 0x09, 0x00, 0x20, 0x08, 0x00, 0x00, 0x20, -0xFF, 0x80, 0xFF, 0xFF, 0x01, 0x4B, 0x18, 0x78, 0x70, 0x47, 0xC0, 0x46, -0x64, 0x00, 0x00, 0x20, 0x00, 0xB5, 0x80, 0x23, 0xDB, 0x05, 0x19, 0x6C, -0x80, 0x22, 0xD2, 0x01, 0x0A, 0x43, 0x1A, 0x64, 0x23, 0x4A, 0x80, 0x21, -0x10, 0x68, 0x49, 0x00, 0x01, 0x43, 0x11, 0x60, 0x12, 0x68, 0x99, 0x68, -0x9A, 0x60, 0x19, 0x6C, 0x80, 0x22, 0x12, 0x02, 0x0A, 0x43, 0x1A, 0x64, -0x19, 0x6C, 0x1D, 0x4A, 0x0A, 0x40, 0x1A, 0x64, 0x1C, 0x4B, 0x7F, 0x22, -0x59, 0x7B, 0x1C, 0x4B, 0x11, 0x40, 0x18, 0x68, 0x1B, 0x4A, 0x09, 0x04, -0x02, 0x40, 0x0A, 0x43, 0x1A, 0x60, 0x19, 0x68, 0xA0, 0x22, 0xD2, 0x05, -0x90, 0x68, 0x91, 0x60, 0x18, 0x68, 0x17, 0x49, 0x01, 0x40, 0x84, 0x20, -0xC0, 0x05, 0x01, 0x43, 0x19, 0x60, 0x19, 0x68, 0x90, 0x68, 0x91, 0x60, -0x13, 0x49, 0x09, 0x78, 0x49, 0xB2, 0x00, 0x29, 0x02, 0xD0, 0x01, 0x29, -0x0C, 0xD1, 0x03, 0xE0, 0x18, 0x68, 0x10, 0x49, 0x01, 0x40, 0x03, 0xE0, -0x18, 0x68, 0x80, 0x21, 0x09, 0x04, 0x01, 0x43, 0x19, 0x60, 0x1B, 0x68, -0x91, 0x68, 0x93, 0x60, 0x80, 0x23, 0xDB, 0x05, 0x19, 0x6C, 0x0A, 0x4A, -0x0A, 0x40, 0x1A, 0x64, 0x00, 0xBD, 0xC0, 0x46, 0x14, 0x00, 0x00, 0x20, -0xFF, 0x7F, 0xFF, 0xFF, 0xAE, 0x09, 0x00, 0x20, 0x0C, 0x00, 0x00, 0x20, -0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0xFA, 0x02, 0x00, 0x20, -0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0x04, 0x4B, 0x01, 0x22, -0x1A, 0x70, 0x80, 0x23, 0xDB, 0x05, 0x99, 0x6C, 0x91, 0x43, 0x99, 0x64, -0x1A, 0x70, 0x70, 0x47, 0x00, 0x00, 0x00, 0x20, 0x03, 0x4A, 0x01, 0x23, -0x13, 0x70, 0x80, 0x22, 0xD2, 0x05, 0x53, 0x70, 0x70, 0x47, 0xC0, 0x46, -0x02, 0x00, 0x00, 0x20, 0x00, 0xB5, 0x06, 0x4B, 0x72, 0xB6, 0x1A, 0x78, -0x00, 0x2A, 0x04, 0xD0, 0xC0, 0x46, 0xC0, 0x46, 0x62, 0xB6, 0x30, 0xBF, -0xF6, 0xE7, 0x62, 0xB6, 0x00, 0xBD, 0xC0, 0x46, 0x02, 0x00, 0x00, 0x20, -0x38, 0xB5, 0x09, 0x4B, 0x09, 0x49, 0x9A, 0x78, 0x1C, 0x79, 0x51, 0x43, -0x08, 0x4B, 0x05, 0x1C, 0xC9, 0x18, 0x08, 0x48, 0x02, 0xF0, 0x7A, 0xF8, -0x06, 0x4B, 0x29, 0x1C, 0x01, 0x34, 0x58, 0x43, 0xA1, 0x40, 0x02, 0xF0, -0x73, 0xF8, 0x38, 0xBD, 0xAA, 0x0A, 0x00, 0x20, 0x44, 0xFE, 0xFF, 0xFF, -0xFE, 0x24, 0x02, 0x00, 0x40, 0x42, 0x0F, 0x00, 0x05, 0x4B, 0x19, 0x68, -0x80, 0x23, 0xDB, 0x05, 0x5A, 0x69, 0x09, 0x02, 0x12, 0x0E, 0x09, 0x0A, -0x12, 0x06, 0x0A, 0x43, 0x5A, 0x61, 0x70, 0x47, 0x04, 0x00, 0x00, 0x20, -0x01, 0x4B, 0x18, 0x60, 0x70, 0x47, 0xC0, 0x46, 0x04, 0x00, 0x00, 0x20, -0x05, 0x4B, 0x01, 0x22, 0x1A, 0x70, 0x80, 0x23, 0xDB, 0x05, 0x59, 0x69, -0x80, 0x22, 0x52, 0x04, 0x0A, 0x43, 0x5A, 0x61, 0x70, 0x47, 0xC0, 0x46, -0x01, 0x00, 0x00, 0x20, 0x00, 0xB5, 0x05, 0x4B, 0x72, 0xB6, 0x1A, 0x78, -0x00, 0x2A, 0x03, 0xD0, 0xC0, 0x46, 0xC0, 0x46, 0x62, 0xB6, 0xF7, 0xE7, -0x62, 0xB6, 0x00, 0xBD, 0x00, 0x00, 0x00, 0x20, 0x00, 0xB5, 0x10, 0x4B, -0x1B, 0x68, 0x9A, 0x05, 0x0C, 0xD5, 0x0F, 0x4A, 0x0F, 0x4B, 0x72, 0xB6, -0x11, 0x78, 0x00, 0x29, 0x02, 0xD1, 0x19, 0x78, 0x00, 0x29, 0x11, 0xD0, -0xC0, 0x46, 0xC0, 0x46, 0x62, 0xB6, 0xF4, 0xE7, 0x08, 0x4A, 0x09, 0x4B, -0x72, 0xB6, 0x11, 0x78, 0x00, 0x29, 0x02, 0xD1, 0x19, 0x78, 0x00, 0x29, -0x04, 0xD0, 0xC0, 0x46, 0xC0, 0x46, 0x62, 0xB6, 0x30, 0xBF, 0xF3, 0xE7, -0x62, 0xB6, 0x00, 0xBD, 0x58, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x20, -0x00, 0x00, 0x00, 0x20, 0x70, 0xB5, 0x13, 0x49, 0x13, 0x4B, 0x04, 0x24, -0x19, 0x60, 0x13, 0x4B, 0x13, 0x4D, 0x1A, 0x68, 0x22, 0x43, 0x1A, 0x60, -0x1A, 0x68, 0x02, 0x24, 0xA2, 0x43, 0x1A, 0x60, 0x1A, 0x68, 0x01, 0x24, -0x22, 0x43, 0x0F, 0x4C, 0x1A, 0x60, 0x00, 0x22, 0x22, 0x60, 0x0E, 0x4A, -0x11, 0x60, 0x2E, 0x78, 0x2D, 0x79, 0x70, 0x43, 0x01, 0x35, 0xE8, 0x40, -0x09, 0x1A, 0x11, 0x60, 0x20, 0x68, 0x11, 0x68, 0x88, 0x42, 0xFB, 0xD2, -0x1A, 0x68, 0x01, 0x21, 0x8A, 0x43, 0x1A, 0x60, 0x70, 0xBD, 0xC0, 0x46, -0xFF, 0xFF, 0xFF, 0x00, 0x14, 0xE0, 0x00, 0xE0, 0x10, 0xE0, 0x00, 0xE0, -0xAA, 0x0A, 0x00, 0x20, 0x18, 0xE0, 0x00, 0xE0, 0xFC, 0x01, 0x00, 0x20, -0x00, 0xB5, 0x00, 0x23, 0x06, 0x4A, 0x98, 0x42, 0x02, 0xDB, 0xD3, 0x1C, -0xDB, 0x7F, 0x43, 0x43, 0x02, 0x32, 0xD2, 0x7F, 0x01, 0x30, 0x52, 0xB2, -0x90, 0x40, 0x18, 0x18, 0x40, 0x18, 0x00, 0xBD, 0xAE, 0x09, 0x00, 0x20, -0xF0, 0xB5, 0x85, 0xB0, 0x05, 0x1C, 0x0C, 0x1C, 0x16, 0x1C, 0x00, 0x29, -0x05, 0xD0, 0x2B, 0x4B, 0x02, 0x33, 0xDB, 0x7F, 0x5B, 0xB2, 0x00, 0x2B, -0x4E, 0xD0, 0x21, 0x1C, 0x28, 0x1C, 0xFF, 0xF7, 0xDD, 0xFF, 0x27, 0x49, -0x27, 0x4F, 0x4A, 0x7A, 0x09, 0x7A, 0x13, 0x19, 0x51, 0x18, 0x02, 0x91, -0x41, 0x01, 0xCF, 0x19, 0x00, 0x22, 0x03, 0x97, 0x84, 0x46, 0x13, 0xE0, -0x22, 0x48, 0xC1, 0x56, 0x58, 0x1C, 0xC0, 0xB2, 0xCF, 0x0F, 0x01, 0x90, -0x7F, 0x18, 0x03, 0x98, 0x7F, 0x10, 0xC7, 0x19, 0x08, 0x37, 0x00, 0x97, -0x6F, 0x46, 0x38, 0x79, 0x00, 0x9F, 0x02, 0x33, 0xB8, 0x70, 0x01, 0x27, -0x8F, 0x40, 0x3A, 0x43, 0x02, 0x98, 0x83, 0x42, 0xE8, 0xDB, 0x15, 0x4B, -0x60, 0x46, 0xDF, 0x79, 0x61, 0x42, 0x61, 0x41, 0x5B, 0x7C, 0x79, 0x18, -0x1C, 0x19, 0x49, 0x10, 0x01, 0x39, 0x01, 0x34, 0x89, 0x06, 0x24, 0x05, -0x0C, 0x43, 0x22, 0x43, 0x0E, 0x49, 0x10, 0x4C, 0x40, 0x01, 0x43, 0x18, -0x0F, 0x4F, 0x01, 0x19, 0x4C, 0x68, 0x4A, 0x60, 0xAA, 0x1C, 0xD2, 0xB2, -0xC0, 0x19, 0x02, 0x71, 0x00, 0x2E, 0x07, 0xD0, 0x0B, 0x4A, 0x01, 0x21, -0x52, 0x57, 0x91, 0x40, 0x0A, 0x1C, 0x99, 0x69, 0x9A, 0x61, 0x01, 0xE0, -0x9A, 0x69, 0x9E, 0x61, 0x05, 0xB0, 0xF0, 0xBD, 0xAE, 0x09, 0x00, 0x20, -0x0A, 0x03, 0x00, 0x20, 0x00, 0x10, 0x00, 0x40, 0x10, 0x75, 0x00, 0x00, -0x18, 0x10, 0x00, 0x40, 0x10, 0x10, 0x00, 0x40, 0xEA, 0x74, 0x00, 0x00, -0x10, 0xB5, 0x08, 0x4B, 0x00, 0x21, 0x1B, 0x68, 0x01, 0x3B, 0x08, 0xE0, -0x06, 0x4C, 0x58, 0x01, 0x09, 0x22, 0x00, 0x19, 0x84, 0x18, 0xA1, 0x72, -0x01, 0x3A, 0xFB, 0xD2, 0x01, 0x3B, 0x00, 0x2B, 0xF4, 0xDA, 0x10, 0xBD, -0x18, 0x09, 0x00, 0x20, 0x00, 0x10, 0x00, 0x40, 0x38, 0xB5, 0xFF, 0xF7, -0xE7, 0xFF, 0x00, 0x21, 0x01, 0x20, 0x0A, 0x1C, 0x40, 0x42, 0xFF, 0xF7, -0x75, 0xFF, 0x01, 0x20, 0x40, 0x42, 0x01, 0x21, 0x00, 0x22, 0xFF, 0xF7, -0x6F, 0xFF, 0x0A, 0x4D, 0xAC, 0x7B, 0x0B, 0xE0, 0x20, 0x1C, 0x00, 0x21, -0x01, 0x22, 0xFF, 0xF7, 0x67, 0xFF, 0x01, 0x21, 0x20, 0x1C, 0x0A, 0x1C, -0xFF, 0xF7, 0x62, 0xFF, 0x01, 0x34, 0xE4, 0xB2, 0xAA, 0x7B, 0x2B, 0x79, -0xD3, 0x18, 0x9C, 0x42, 0xEE, 0xDB, 0x38, 0xBD, 0x0A, 0x03, 0x00, 0x20, -0xF0, 0xB5, 0x85, 0xB0, 0x05, 0x1C, 0x0E, 0x1C, 0x02, 0x92, 0x1F, 0x1C, -0x00, 0x29, 0x05, 0xD0, 0x21, 0x4B, 0x02, 0x33, 0xDB, 0x7F, 0x5B, 0xB2, -0x00, 0x2B, 0x3B, 0xD0, 0x31, 0x1C, 0x28, 0x1C, 0xFF, 0xF7, 0x34, 0xFF, -0x1D, 0x4A, 0xC0, 0xB2, 0x01, 0x90, 0x53, 0x7A, 0x12, 0x7A, 0xF6, 0x18, -0x9A, 0x18, 0x1B, 0x4B, 0xB9, 0x1E, 0x1B, 0x7C, 0x48, 0x1E, 0x81, 0x41, -0x49, 0x42, 0xF6, 0xB2, 0x03, 0x91, 0x9C, 0x46, 0x24, 0xE0, 0x00, 0x2F, -0x07, 0xD1, 0x26, 0x21, 0x71, 0x43, 0x15, 0x4B, 0x49, 0x19, 0xCC, 0x5C, -0x64, 0x44, 0xE4, 0xB2, 0x08, 0xE0, 0x01, 0x2F, 0x04, 0xD1, 0x73, 0x01, -0x11, 0x49, 0x5B, 0x19, 0x5C, 0x5C, 0x01, 0xE0, 0x03, 0x9B, 0x1C, 0x40, -0x0F, 0x4B, 0x02, 0x99, 0x9B, 0x57, 0x02, 0x36, 0xD8, 0x0F, 0xC0, 0x18, -0x63, 0x18, 0xDB, 0xB2, 0x00, 0x93, 0x01, 0x9B, 0x40, 0x10, 0x59, 0x01, -0x6B, 0x46, 0x08, 0x18, 0x1B, 0x78, 0x09, 0x49, 0xF6, 0xB2, 0x43, 0x54, -0x96, 0x42, 0xD8, 0xDB, 0x05, 0xB0, 0xF0, 0xBD, 0xAE, 0x09, 0x00, 0x20, -0x0A, 0x03, 0x00, 0x20, 0x48, 0x0D, 0x00, 0x20, 0x36, 0x75, 0x00, 0x00, -0xB3, 0x0A, 0x00, 0x20, 0x10, 0x75, 0x00, 0x00, 0x00, 0x10, 0x00, 0x40, -0x70, 0xB5, 0x2A, 0x4B, 0x2A, 0x4A, 0x19, 0x68, 0x80, 0x24, 0x0A, 0x40, -0x1A, 0x60, 0x1A, 0x68, 0xE4, 0x05, 0x28, 0x4D, 0xA1, 0x68, 0xA2, 0x60, -0x69, 0x7A, 0x03, 0x22, 0x18, 0x68, 0x11, 0x40, 0x25, 0x4A, 0x89, 0x04, -0x02, 0x40, 0x0A, 0x43, 0x1A, 0x60, 0x1A, 0x68, 0xA1, 0x68, 0xA2, 0x60, -0x19, 0x68, 0x80, 0x22, 0x52, 0x03, 0x0A, 0x43, 0x1A, 0x60, 0x1A, 0x68, -0xA1, 0x68, 0xA2, 0x60, 0x29, 0x7A, 0x18, 0x68, 0x07, 0x26, 0x1D, 0x4A, -0x31, 0x40, 0x49, 0x05, 0x02, 0x40, 0x0A, 0x43, 0x1A, 0x60, 0x1A, 0x68, -0xA1, 0x68, 0xA2, 0x60, 0xA9, 0x7B, 0x0F, 0x29, 0x25, 0xD8, 0xEA, 0x7B, -0x0F, 0x2A, 0x22, 0xD8, 0x18, 0x68, 0x09, 0x07, 0x00, 0x01, 0x00, 0x09, -0x01, 0x43, 0x19, 0x60, 0x0F, 0x21, 0x0A, 0x40, 0x18, 0x68, 0x11, 0x06, -0x11, 0x4A, 0x02, 0x40, 0x0A, 0x43, 0x1A, 0x60, 0x1B, 0x68, 0xA2, 0x68, -0xA3, 0x60, 0xFF, 0xF7, 0x49, 0xFC, 0x0E, 0x4A, 0x63, 0x6C, 0x13, 0x43, -0x63, 0x64, 0xFF, 0xF7, 0x5C, 0xFC, 0xFF, 0xF7, 0x87, 0xFC, 0xEB, 0x79, -0x0A, 0x4A, 0x1E, 0x40, 0x33, 0x02, 0x26, 0x6C, 0x16, 0x40, 0x1E, 0x43, -0x26, 0x64, 0x70, 0xBD, 0x14, 0x00, 0x00, 0x20, 0xFF, 0xFF, 0xFC, 0xFF, -0x48, 0x0D, 0x00, 0x20, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, -0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0x0F, 0x00, 0xFF, 0xF8, 0xFF, 0xFF, -0x00, 0xB5, 0x80, 0x21, 0xC9, 0x05, 0x0B, 0x79, 0x5A, 0x1E, 0xD2, 0xB2, -0x98, 0x42, 0x09, 0xDD, 0x00, 0xE0, 0x0B, 0x71, 0x01, 0x33, 0xDB, 0xB2, -0x83, 0x42, 0xFA, 0xDD, 0x04, 0xE0, 0x0A, 0x71, 0x01, 0x3A, 0xD2, 0xB2, -0x82, 0x42, 0xFA, 0xDA, 0x00, 0xBD, 0x38, 0xB5, 0x17, 0x4C, 0xA0, 0x78, -0xFF, 0xF7, 0xE6, 0xFF, 0x80, 0x23, 0xDB, 0x05, 0x21, 0x79, 0x5A, 0x68, -0xC9, 0x07, 0x52, 0x00, 0x52, 0x08, 0x0A, 0x43, 0x5A, 0x60, 0x60, 0x79, -0x03, 0x22, 0x5D, 0x68, 0x10, 0x49, 0x10, 0x40, 0x80, 0x03, 0x29, 0x40, -0x01, 0x43, 0x59, 0x60, 0xA0, 0x79, 0x0E, 0x49, 0x5D, 0x68, 0x10, 0x40, -0x00, 0x03, 0x29, 0x40, 0x01, 0x43, 0x59, 0x60, 0xE0, 0x79, 0x0B, 0x49, -0x5D, 0x68, 0x10, 0x40, 0x29, 0x40, 0x80, 0x02, 0x01, 0x43, 0x59, 0x60, -0x21, 0x7A, 0x58, 0x68, 0x0A, 0x40, 0x11, 0x02, 0x06, 0x4A, 0x02, 0x40, -0x0A, 0x43, 0x5A, 0x60, 0x38, 0xBD, 0xC0, 0x46, 0xAA, 0x0A, 0x00, 0x20, -0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, -0xFF, 0xFC, 0xFF, 0xFF, 0xF8, 0xB5, 0x80, 0x23, 0xDB, 0x05, 0x1A, 0x68, -0x7A, 0x4A, 0x00, 0x21, 0x08, 0x20, 0x19, 0x60, 0x10, 0x60, 0x14, 0x68, -0x9D, 0x68, 0x9C, 0x60, 0x77, 0x4C, 0x21, 0x60, 0x24, 0x68, 0xDD, 0x68, -0xDC, 0x60, 0xFE, 0x25, 0x75, 0x4C, 0xED, 0x01, 0x25, 0x60, 0x24, 0x68, -0x1D, 0x69, 0x1C, 0x61, 0x5C, 0x69, 0x59, 0x61, 0x9C, 0x69, 0x99, 0x61, -0xDC, 0x69, 0xD9, 0x61, 0x1C, 0x6C, 0x80, 0x24, 0xE4, 0x01, 0x1C, 0x64, -0x5C, 0x6C, 0x59, 0x64, 0x9C, 0x6C, 0x6D, 0x4C, 0x99, 0x64, 0x21, 0x60, -0xA0, 0x24, 0xE4, 0x05, 0xA5, 0x68, 0xA1, 0x60, 0x1C, 0x6C, 0x6A, 0x49, -0x21, 0x40, 0x19, 0x64, 0x1C, 0x68, 0x80, 0x21, 0x49, 0x05, 0x21, 0x43, -0x19, 0x60, 0x67, 0x49, 0x01, 0x31, 0xC9, 0x7F, 0x00, 0x29, 0x03, 0xD0, -0x11, 0x68, 0x08, 0x43, 0x10, 0x60, 0x02, 0xE0, 0x11, 0x68, 0x81, 0x43, -0x11, 0x60, 0x11, 0x68, 0x98, 0x68, 0x99, 0x60, 0x13, 0x68, 0x04, 0x26, -0x33, 0x43, 0x13, 0x60, 0x13, 0x68, 0x80, 0x25, 0xED, 0x05, 0xA9, 0x68, -0xAB, 0x60, 0x13, 0x68, 0x02, 0x27, 0x3B, 0x43, 0x13, 0x60, 0x13, 0x68, -0xA9, 0x68, 0xAB, 0x60, 0x13, 0x68, 0x01, 0x20, 0x83, 0x43, 0x13, 0x60, -0x13, 0x68, 0xAA, 0x68, 0xAB, 0x60, 0xFF, 0xF7, 0xED, 0xFE, 0x54, 0x4B, -0x1C, 0x22, 0x9A, 0x56, 0xA9, 0x69, 0x53, 0x4B, 0x12, 0x05, 0xF2, 0x40, -0x0B, 0x40, 0x13, 0x43, 0xAB, 0x61, 0xFF, 0xF7, 0x61, 0xFE, 0x50, 0x4A, -0x50, 0x4B, 0x01, 0x21, 0x1A, 0x60, 0x50, 0x4B, 0x08, 0x24, 0x1A, 0x68, -0x10, 0x20, 0x32, 0x43, 0x1A, 0x60, 0x1A, 0x68, 0xBA, 0x43, 0x1A, 0x60, -0x4C, 0x4B, 0xC0, 0x22, 0x52, 0x00, 0x99, 0x50, 0x20, 0x21, 0x9F, 0x50, -0x9E, 0x50, 0x9C, 0x50, 0x98, 0x50, 0x99, 0x50, 0x40, 0x21, 0x99, 0x50, -0xC0, 0x22, 0xBA, 0x40, 0x98, 0x58, 0xFF, 0x24, 0xA0, 0x43, 0xC0, 0x24, -0x20, 0x43, 0x98, 0x50, 0x9C, 0x58, 0x43, 0x48, 0x04, 0x40, 0x9C, 0x50, -0x9C, 0x58, 0x42, 0x48, 0x20, 0x40, 0x80, 0x24, 0x24, 0x04, 0x04, 0x43, -0x9C, 0x50, 0x9C, 0x58, 0x24, 0x02, 0x24, 0x0A, 0x2C, 0x43, 0x9C, 0x50, -0xC1, 0x22, 0xBA, 0x40, 0x98, 0x58, 0x04, 0x1C, 0xFF, 0x20, 0x84, 0x43, -0x0C, 0x43, 0x9C, 0x50, 0x9C, 0x58, 0x37, 0x48, 0x20, 0x40, 0x80, 0x24, -0x24, 0x02, 0x20, 0x43, 0x98, 0x50, 0x98, 0x58, 0x34, 0x4C, 0x20, 0x40, -0x98, 0x50, 0x34, 0x4A, 0x10, 0x69, 0x30, 0x43, 0x10, 0x61, 0x62, 0xB6, -0x08, 0x22, 0x01, 0x20, 0x1E, 0x60, 0x18, 0x60, 0x1F, 0x60, 0x1A, 0x60, -0x2F, 0x4B, 0x20, 0x20, 0x10, 0x24, 0xDC, 0x67, 0xD8, 0x67, 0xD9, 0x67, -0xFF, 0xF7, 0x46, 0xFC, 0x21, 0x4C, 0xE0, 0x7D, 0x21, 0x7E, 0xFF, 0xF7, -0xFB, 0xFA, 0xE3, 0x7C, 0x00, 0x2B, 0x26, 0xD0, 0x1A, 0x4B, 0x01, 0x21, -0x18, 0x68, 0x27, 0x4A, 0x40, 0x00, 0x40, 0x0E, 0x08, 0x43, 0x19, 0x68, -0x00, 0x06, 0x11, 0x40, 0x01, 0x43, 0x19, 0x60, 0x19, 0x68, 0x28, 0x69, -0x29, 0x61, 0x19, 0x68, 0x49, 0x00, 0x49, 0x0E, 0x0F, 0x43, 0x39, 0x06, -0x1F, 0x68, 0x17, 0x40, 0x0F, 0x43, 0x1F, 0x60, 0x19, 0x68, 0x28, 0x69, -0x29, 0x61, 0x19, 0x68, 0x49, 0x00, 0x49, 0x0E, 0x0E, 0x43, 0x19, 0x68, -0x36, 0x06, 0x0A, 0x40, 0x32, 0x43, 0x1A, 0x60, 0x1B, 0x68, 0x2A, 0x69, -0x2B, 0x61, 0xFF, 0xF7, 0xD4, 0xFE, 0xFF, 0xF7, 0xC1, 0xF8, 0xFF, 0xF7, -0x0F, 0xF9, 0xFF, 0xF7, 0x7D, 0xF9, 0xFF, 0xF7, 0x65, 0xFB, 0xF8, 0xBD, -0x14, 0x00, 0x00, 0x20, 0x10, 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x20, -0x0C, 0x00, 0x00, 0x20, 0xFF, 0xFF, 0x7F, 0xFF, 0xAE, 0x09, 0x00, 0x20, -0x48, 0x0D, 0x00, 0x20, 0xFF, 0xFF, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0x00, -0x14, 0xE0, 0x00, 0xE0, 0x10, 0xE0, 0x00, 0xE0, 0x00, 0xE1, 0x00, 0xE0, -0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0xED, 0x00, 0xE0, -0x04, 0xE1, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x80, 0x08, 0xB5, 0x0C, 0x4A, -0x0C, 0x4B, 0x0D, 0x49, 0x01, 0xE0, 0x01, 0xCA, 0x01, 0xC3, 0x8B, 0x42, -0xFB, 0xD3, 0x0B, 0x4B, 0x0B, 0x49, 0x00, 0x22, 0x00, 0xE0, 0x04, 0xC3, -0x8B, 0x42, 0xFC, 0xD3, 0xFF, 0xF7, 0x26, 0xF8, 0x08, 0x4B, 0x00, 0x22, -0x00, 0xE0, 0x04, 0xC3, 0x83, 0x42, 0xFC, 0xD3, 0x08, 0xBD, 0xC0, 0x46, -0xFC, 0x59, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x20, 0x5C, 0x00, 0x00, 0x20, -0x5C, 0x00, 0x00, 0x20, 0xEC, 0x11, 0x00, 0x20, 0x0C, 0x1E, 0x00, 0x20, -0x00, 0xB5, 0x13, 0x4B, 0x1B, 0x68, 0x01, 0x2B, 0x02, 0xD0, 0x08, 0x2B, -0x1E, 0xD1, 0x0F, 0xE0, 0x10, 0x4B, 0x11, 0x4A, 0x1A, 0x60, 0x11, 0x4A, -0x5A, 0x60, 0x11, 0x4A, 0x11, 0x4B, 0x1A, 0x60, 0x11, 0x4B, 0x12, 0x4A, -0x1A, 0x60, 0x12, 0x4A, 0x5A, 0x60, 0x12, 0x4A, 0x9A, 0x60, 0x0D, 0xE0, -0x09, 0x4B, 0x08, 0x4A, 0x09, 0x49, 0x13, 0x60, 0x51, 0x60, 0x0A, 0x4A, -0x13, 0x60, 0x0A, 0x4A, 0x13, 0x60, 0x53, 0x60, 0x93, 0x60, 0x0C, 0x4B, -0x01, 0x22, 0x1A, 0x70, 0x00, 0xBD, 0xC0, 0x46, 0x50, 0x11, 0x00, 0x20, -0x68, 0x00, 0x00, 0x20, 0xF9, 0x03, 0x00, 0x00, 0x7D, 0x3F, 0x00, 0x00, -0xB5, 0x3F, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x18, 0x00, 0x00, 0x20, -0xC1, 0x40, 0x00, 0x00, 0xA9, 0x42, 0x00, 0x00, 0x0D, 0x44, 0x00, 0x00, -0xE4, 0x01, 0x00, 0x20, 0x00, 0xB5, 0x00, 0x23, 0xC2, 0x5C, 0x01, 0x33, -0x00, 0x2A, 0xFB, 0xD1, 0x01, 0x3B, 0xD8, 0xB2, 0x00, 0xBD, 0xC0, 0x46, -0xF7, 0xB5, 0x1C, 0x1C, 0x08, 0xAB, 0x1F, 0x78, 0x26, 0x4B, 0x0E, 0x1C, -0x1B, 0x68, 0x01, 0x21, 0x81, 0x40, 0x0B, 0x42, 0x44, 0xD0, 0x00, 0x2F, -0x07, 0xD0, 0x04, 0x2C, 0x32, 0xD8, 0x22, 0x4B, 0x19, 0x5D, 0x05, 0x33, -0x00, 0x91, 0x1F, 0x5D, 0x08, 0xE0, 0x04, 0x2C, 0x2E, 0xD8, 0x1E, 0x4B, -0x19, 0x1C, 0x0A, 0x31, 0x09, 0x5D, 0x0F, 0x33, 0x1F, 0x5D, 0x00, 0x91, -0x03, 0x2C, 0x28, 0xD0, 0x00, 0x2C, 0x28, 0xD0, 0x28, 0xE0, 0x3A, 0x20, -0x21, 0x1C, 0x01, 0xF0, 0x63, 0xFC, 0x86, 0x42, 0x05, 0xDD, 0x6B, 0x46, -0x1B, 0x78, 0xC0, 0xB2, 0x2B, 0x70, 0x68, 0x70, 0x02, 0xE0, 0x2F, 0x70, -0x30, 0x1C, 0x6E, 0x70, 0x36, 0x1A, 0x60, 0x43, 0x01, 0x99, 0x00, 0x23, -0x69, 0x60, 0xAB, 0x60, 0x09, 0x18, 0xF6, 0xB2, 0x01, 0x91, 0xFF, 0xF7, -0xE3, 0xFA, 0xFF, 0xF7, 0x37, 0xFB, 0x00, 0x28, 0xFB, 0xD1, 0x0B, 0xE0, -0x0F, 0x23, 0x00, 0x27, 0x00, 0x93, 0x05, 0xE0, 0x0F, 0x21, 0x00, 0x91, -0x02, 0xE0, 0x02, 0x24, 0x00, 0xE0, 0x01, 0x24, 0x04, 0x4D, 0x01, 0x92, -0x00, 0x2E, 0xD2, 0xD1, 0xF7, 0xBD, 0xC0, 0x46, 0x58, 0x00, 0x00, 0x20, -0x73, 0x59, 0x00, 0x00, 0x70, 0x00, 0x00, 0x20, 0x38, 0xB5, 0x11, 0x4B, -0x01, 0x22, 0x1B, 0x68, 0x82, 0x40, 0x0D, 0x1C, 0x13, 0x42, 0x19, 0xD0, -0x0E, 0x4C, 0x0B, 0x23, 0x23, 0x70, 0x08, 0x1C, 0xFF, 0xF7, 0x90, 0xFF, -0x60, 0x70, 0x63, 0x78, 0x07, 0x22, 0x02, 0x33, 0x13, 0x40, 0x93, 0x42, -0x03, 0xD1, 0x63, 0x78, 0x01, 0x3B, 0xDB, 0xB2, 0x63, 0x70, 0x00, 0x23, -0x65, 0x60, 0xA3, 0x60, 0xFF, 0xF7, 0xAA, 0xFA, 0xFF, 0xF7, 0xFE, 0xFA, -0x00, 0x28, 0xFB, 0xD1, 0x38, 0xBD, 0xC0, 0x46, 0x58, 0x00, 0x00, 0x20, -0x70, 0x00, 0x00, 0x20, 0x1F, 0xB5, 0x0B, 0x4C, 0x6B, 0x46, 0xD8, 0x73, -0x23, 0x78, 0x00, 0x2B, 0x03, 0xD0, 0x00, 0x20, 0x08, 0x49, 0xFF, 0xF7, -0xCD, 0xFF, 0x23, 0x78, 0x00, 0x2B, 0x07, 0xD0, 0x6A, 0x46, 0x01, 0x21, -0x00, 0x20, 0x0F, 0x32, 0x04, 0x23, 0x00, 0x91, 0xFF, 0xF7, 0x6A, 0xFF, -0x1F, 0xBD, 0xC0, 0x46, 0xEB, 0x01, 0x00, 0x20, 0x87, 0x59, 0x00, 0x00, -0xF8, 0xB5, 0xFF, 0xF7, 0xD7, 0xFA, 0x00, 0x28, 0x70, 0xD1, 0x39, 0x4B, -0x1A, 0x68, 0x00, 0x2A, 0x03, 0xDC, 0x38, 0x4B, 0x1B, 0x68, 0x00, 0x2B, -0x3E, 0xDD, 0x37, 0x49, 0x03, 0x23, 0x0B, 0x70, 0x36, 0x4B, 0x04, 0x33, -0xDB, 0x7F, 0x1C, 0x1C, 0x9A, 0x42, 0x00, 0xDA, 0xD3, 0xB2, 0x4B, 0x70, -0x0A, 0x21, 0x8C, 0x46, 0x32, 0x4A, 0x00, 0x23, 0x2D, 0x49, 0x1F, 0xE0, -0x01, 0x33, 0x03, 0xE0, 0x66, 0x46, 0x5E, 0x43, 0x00, 0x20, 0x76, 0x18, -0x0A, 0x30, 0x37, 0x18, 0x32, 0x25, 0x7F, 0x5F, 0x00, 0x2F, 0xF3, 0xD0, -0xA3, 0x42, 0x13, 0xDA, 0x58, 0x00, 0x08, 0x18, 0x80, 0x88, 0xDE, 0x00, -0x10, 0x70, 0x00, 0xB2, 0x00, 0x12, 0x80, 0x19, 0x50, 0x70, 0x18, 0x1C, -0x10, 0x30, 0x40, 0x00, 0x08, 0x5A, 0x01, 0x33, 0x90, 0x70, 0x00, 0x0A, -0xD0, 0x70, 0x04, 0x32, 0xA3, 0x42, 0xDF, 0xDB, 0x1D, 0x4B, 0x1F, 0x4A, -0x5A, 0x60, 0x00, 0x22, 0x9A, 0x60, 0xFF, 0xF7, 0x3D, 0xFA, 0xFF, 0xF7, -0x91, 0xFA, 0x00, 0x28, 0xFB, 0xD1, 0x29, 0xE0, 0x1A, 0x4A, 0x53, 0x68, -0x01, 0x33, 0x25, 0xD0, 0x15, 0x4B, 0x13, 0x21, 0x19, 0x70, 0x11, 0x68, -0x94, 0x46, 0x59, 0x70, 0x16, 0x4B, 0x14, 0x49, 0x1D, 0x78, 0x03, 0x1C, -0x0D, 0xE0, 0x23, 0x1C, 0x01, 0xE0, 0x5E, 0x00, 0x66, 0x44, 0x02, 0x30, -0x34, 0x18, 0x06, 0x22, 0xA7, 0x5E, 0x5C, 0x1C, 0x00, 0x2F, 0xF4, 0xD0, -0x0B, 0x70, 0x23, 0x1C, 0x01, 0x31, 0x00, 0x20, 0xAB, 0x42, 0xF0, 0xDB, -0x07, 0x4B, 0x09, 0x4A, 0x98, 0x60, 0x5A, 0x60, 0xFF, 0xF7, 0x12, 0xFA, -0xFF, 0xF7, 0x66, 0xFA, 0x00, 0x28, 0xFB, 0xD1, 0xF8, 0xBD, 0xC0, 0x46, -0x9C, 0x0D, 0x00, 0x20, 0x20, 0x01, 0x00, 0x20, 0x70, 0x00, 0x00, 0x20, -0xAE, 0x09, 0x00, 0x20, 0xF0, 0x09, 0x00, 0x20, 0xE0, 0x00, 0x00, 0x20, -0x7C, 0x09, 0x00, 0x20, 0x08, 0xB5, 0x64, 0x4B, 0x1B, 0x88, 0x1D, 0x2B, -0x47, 0xD0, 0x1A, 0xD8, 0x05, 0x2B, 0x00, 0xD1, 0x96, 0xE0, 0x0D, 0xD8, -0x02, 0x2B, 0x63, 0xD0, 0x03, 0xD8, 0x01, 0x2B, 0x00, 0xD0, 0xB7, 0xE0, -0x57, 0xE0, 0x03, 0x2B, 0x00, 0xD1, 0x87, 0xE0, 0x04, 0x2B, 0x00, 0xD0, -0xB0, 0xE0, 0x8F, 0xE0, 0x07, 0x2B, 0x65, 0xD0, 0x5C, 0xD3, 0x1B, 0x2B, -0x1C, 0xD0, 0x1C, 0x2B, 0x00, 0xD0, 0xA7, 0xE0, 0x22, 0xE0, 0x22, 0x2B, -0x40, 0xD0, 0x08, 0xD8, 0x1F, 0x2B, 0x5D, 0xD0, 0x2A, 0xD3, 0x20, 0x2B, -0x5E, 0xD0, 0x21, 0x2B, 0x00, 0xD0, 0x9B, 0xE0, 0x5E, 0xE0, 0x41, 0x2B, -0x64, 0xD0, 0x03, 0xD8, 0x40, 0x2B, 0x00, 0xD0, 0x94, 0xE0, 0x5B, 0xE0, -0x42, 0x2B, 0x61, 0xD0, 0x60, 0x2B, 0x00, 0xD0, 0x8E, 0xE0, 0x72, 0xE0, -0x48, 0x4A, 0x49, 0x4B, 0x12, 0x78, 0x01, 0x20, 0x19, 0x68, 0x90, 0x40, -0x02, 0x1C, 0x0A, 0x43, 0x1A, 0x60, 0x83, 0xE0, 0x43, 0x49, 0x44, 0x4B, -0x09, 0x78, 0x1A, 0x68, 0x01, 0x20, 0x88, 0x40, 0x82, 0x43, 0x1A, 0x60, -0x7A, 0xE0, 0x3F, 0x4B, 0x1A, 0x78, 0x40, 0x4B, 0x1A, 0x70, 0x75, 0xE0, -0x3C, 0x4B, 0x0D, 0x21, 0x1A, 0x78, 0x3E, 0x4B, 0x1A, 0x70, 0x3C, 0x4A, -0x11, 0x70, 0x1A, 0x78, 0x3C, 0x4B, 0x00, 0x2A, 0x02, 0xD0, 0x00, 0x22, -0x5A, 0x70, 0x67, 0xE0, 0x3A, 0x4A, 0x52, 0x78, 0x5A, 0x70, 0x63, 0xE0, -0x33, 0x4B, 0x1A, 0x78, 0x38, 0x4B, 0x1A, 0x70, 0x5E, 0xE0, 0x31, 0x4B, -0x1A, 0x78, 0x37, 0x4B, 0x1A, 0x60, 0xFD, 0xF7, 0x09, 0xFC, 0x57, 0xE0, -0x2D, 0x4B, 0x1A, 0x78, 0x34, 0x4B, 0x9A, 0x70, 0x98, 0x78, 0xFF, 0xF7, -0x8D, 0xFC, 0x4F, 0xE0, 0x29, 0x4B, 0x1A, 0x78, 0x30, 0x4B, 0x9A, 0x70, -0x29, 0x4B, 0x0F, 0x22, 0x1A, 0x70, 0x47, 0xE0, 0x2E, 0x4B, 0x01, 0x22, -0x1A, 0x70, 0x43, 0xE0, 0x2D, 0x4B, 0x01, 0x22, 0x1A, 0x70, 0x3F, 0xE0, -0x0C, 0x20, 0xFD, 0xF7, 0x85, 0xF9, 0x3B, 0xE0, 0x0D, 0x20, 0xFD, 0xF7, -0x81, 0xF9, 0x37, 0xE0, 0x28, 0x4B, 0x01, 0x22, 0x1A, 0x70, 0x33, 0xE0, -0x27, 0x4B, 0x01, 0x22, 0x1A, 0x70, 0x2F, 0xE0, 0x26, 0x4B, 0x01, 0x22, -0x1A, 0x70, 0x2B, 0xE0, 0x25, 0x4B, 0x01, 0x22, 0x1A, 0x70, 0x27, 0xE0, -0x24, 0x4B, 0x01, 0x22, 0x1A, 0x70, 0x14, 0x4B, 0x1A, 0x78, 0x23, 0x4B, -0x1A, 0x70, 0x1F, 0xE0, 0x11, 0x4B, 0x1A, 0x78, 0x1E, 0x4B, 0x9A, 0x70, -0x1A, 0xE0, 0x0F, 0x4B, 0x1A, 0x78, 0x1F, 0x4B, 0x1A, 0x70, 0x1A, 0x78, -0x10, 0x4B, 0x01, 0x3A, 0x01, 0x2A, 0x03, 0xD8, 0x40, 0x33, 0x0F, 0x22, -0x1A, 0x70, 0x0D, 0xE0, 0x1A, 0x4A, 0x40, 0x33, 0x12, 0x78, 0x00, 0x2A, -0x04, 0xD0, 0x19, 0x4A, 0x40, 0x32, 0x12, 0x78, 0x1A, 0x70, 0x03, 0xE0, -0x08, 0x4A, 0x40, 0x32, 0x12, 0x78, 0x1A, 0x70, 0x08, 0xBD, 0xC0, 0x46, -0x28, 0x00, 0x00, 0x20, 0x0C, 0x00, 0x00, 0x50, 0x58, 0x00, 0x00, 0x20, -0x1D, 0x03, 0x00, 0x20, 0xE3, 0x01, 0x00, 0x20, 0x48, 0x0D, 0x00, 0x20, -0x4A, 0x74, 0x00, 0x00, 0xDE, 0x01, 0x00, 0x20, 0x50, 0x11, 0x00, 0x20, -0xAA, 0x0A, 0x00, 0x20, 0xE4, 0x01, 0x00, 0x20, 0xDC, 0x01, 0x00, 0x20, -0xE8, 0x01, 0x00, 0x20, 0xE7, 0x01, 0x00, 0x20, 0xE5, 0x01, 0x00, 0x20, -0x8B, 0x01, 0x00, 0x20, 0xE6, 0x01, 0x00, 0x20, 0x92, 0x01, 0x00, 0x20, -0xE0, 0x01, 0x00, 0x20, 0xDD, 0x01, 0x00, 0x20, 0x9A, 0x74, 0x00, 0x00, -0x30, 0xB5, 0x4A, 0x4B, 0x1B, 0x88, 0x34, 0x2B, 0x47, 0xD0, 0x0C, 0xD8, -0x2E, 0x2B, 0x4F, 0xD0, 0x04, 0xD8, 0x00, 0x2B, 0x14, 0xD0, 0x1D, 0x2B, -0x78, 0xD1, 0x16, 0xE0, 0x2F, 0x2B, 0x51, 0xD0, 0x30, 0x2B, 0x73, 0xD1, -0x56, 0xE0, 0x38, 0x2B, 0x66, 0xD0, 0x04, 0xD8, 0x35, 0x2B, 0x39, 0xD0, -0x37, 0x2B, 0x6B, 0xD1, 0x5B, 0xE0, 0x39, 0x2B, 0x63, 0xD0, 0x86, 0x2B, -0x66, 0xD1, 0x09, 0xE0, 0x3B, 0x4B, 0x5A, 0x7B, 0x3B, 0x4B, 0x1A, 0x70, -0x6F, 0xE0, 0x3B, 0x4B, 0x1A, 0x78, 0x39, 0x4B, 0x1A, 0x70, 0x6A, 0xE0, -0x39, 0x49, 0x3A, 0x4A, 0x0B, 0x78, 0x00, 0x2B, 0x0F, 0xD1, 0x10, 0x78, -0x34, 0x49, 0x08, 0x70, 0x50, 0x78, 0x37, 0x49, 0x08, 0x70, 0x52, 0x68, -0xD1, 0x18, 0x36, 0x4C, 0x08, 0x78, 0x19, 0x19, 0x01, 0x33, 0x08, 0x70, -0x06, 0x2B, 0xF7, 0xD1, 0x55, 0xE0, 0x52, 0x68, 0x00, 0x23, 0x08, 0x78, -0x2B, 0x4D, 0xC0, 0x18, 0x02, 0x38, 0x10, 0x18, 0x04, 0x78, 0x58, 0x19, -0x01, 0x33, 0x04, 0x70, 0x08, 0x2B, 0xF4, 0xD1, 0x47, 0xE0, 0x2C, 0x4B, -0x1A, 0x68, 0x25, 0x4B, 0x1A, 0x60, 0x42, 0xE0, 0x80, 0x23, 0xDB, 0x05, -0x1A, 0x79, 0x22, 0x4B, 0x1A, 0x70, 0x3C, 0xE0, 0x22, 0x4B, 0x27, 0x4A, -0x1B, 0x78, 0x1F, 0x49, 0xD3, 0x18, 0x1A, 0x68, 0x5B, 0x68, 0x0A, 0x60, -0x4B, 0x60, 0x32, 0xE0, 0x1A, 0x4B, 0x1A, 0x1C, 0x2C, 0x32, 0x11, 0x78, -0x19, 0x4A, 0x00, 0x29, 0x07, 0xD1, 0x09, 0xE0, 0x16, 0x4B, 0x1A, 0x1C, -0x2C, 0x32, 0x11, 0x78, 0x15, 0x4A, 0x00, 0x29, 0x02, 0xD1, 0xDB, 0x8C, -0x13, 0x80, 0x20, 0xE0, 0x1B, 0x8D, 0x13, 0x80, 0x1D, 0xE0, 0x19, 0x4B, -0x1A, 0x78, 0x10, 0x4B, 0x1A, 0x70, 0x18, 0xE0, 0x17, 0x4B, 0x1A, 0x78, -0x0D, 0x4B, 0x1A, 0x70, 0x13, 0xE0, 0x16, 0x4B, 0x1A, 0x78, 0x0B, 0x4B, -0x1A, 0x70, 0x0E, 0xE0, 0x90, 0x3B, 0x9A, 0xB2, 0x13, 0x2A, 0x0A, 0xD8, -0x09, 0x4A, 0x5B, 0x01, 0x12, 0x78, 0x06, 0x49, 0x9B, 0x18, 0x10, 0x4A, -0x9B, 0x18, 0x1A, 0x68, 0x5B, 0x68, 0x0A, 0x60, 0x4B, 0x60, 0x30, 0xBD, -0x28, 0x00, 0x00, 0x20, 0xAE, 0x09, 0x00, 0x20, 0x0C, 0x00, 0x00, 0x50, -0x1D, 0x03, 0x00, 0x20, 0x2A, 0x00, 0x00, 0x20, 0x70, 0x00, 0x00, 0x20, -0x0D, 0x00, 0x00, 0x50, 0x0E, 0x00, 0x00, 0x50, 0x1C, 0x09, 0x00, 0x20, -0xB1, 0x09, 0x00, 0x20, 0xFF, 0x5B, 0x00, 0x00, 0xFF, 0x73, 0x00, 0x00, -0xFF, 0x7B, 0x00, 0x00, 0xB3, 0x0A, 0x00, 0x20, 0x08, 0xB5, 0x08, 0x4B, -0x1B, 0x88, 0x86, 0x2B, 0x0B, 0xD1, 0x07, 0x4B, 0x9A, 0x68, 0x01, 0x2A, -0x02, 0xDC, 0x9A, 0x68, 0x01, 0x32, 0x9A, 0x60, 0x9B, 0x68, 0x02, 0x2B, -0x01, 0xD1, 0xFF, 0xF7, 0x71, 0xF8, 0x08, 0xBD, 0x28, 0x00, 0x00, 0x20, -0x70, 0x00, 0x00, 0x20, 0x7F, 0xB5, 0x31, 0x4C, 0x03, 0x90, 0x23, 0x78, -0x0D, 0x1C, 0x16, 0x1C, 0x00, 0x2B, 0x03, 0xD0, 0x01, 0x20, 0x2E, 0x49, -0xFF, 0xF7, 0x6E, 0xFD, 0x23, 0x78, 0x00, 0x2B, 0x06, 0xD0, 0x01, 0x21, -0x08, 0x1C, 0x03, 0xAA, 0x04, 0x23, 0x00, 0x91, 0xFF, 0xF7, 0x0C, 0xFD, -0x28, 0x4B, 0x03, 0x99, 0x1B, 0x78, 0x28, 0x4A, 0x00, 0x2B, 0x15, 0xD1, -0x13, 0x1C, 0x4A, 0x33, 0x00, 0x20, 0x1B, 0x5E, 0x8E, 0x1B, 0x9E, 0x42, -0x05, 0xDC, 0x13, 0x1C, 0x4C, 0x33, 0x00, 0x20, 0x1B, 0x5E, 0x9E, 0x42, -0x08, 0xDA, 0x21, 0x48, 0x01, 0x23, 0x03, 0x70, 0x20, 0x48, 0x03, 0x70, -0x20, 0x48, 0x03, 0x70, 0x20, 0x48, 0x03, 0x70, 0x53, 0x78, 0x00, 0x2B, -0x04, 0xD0, 0x1F, 0x4B, 0x5B, 0x5D, 0x59, 0x43, 0x89, 0x11, 0x03, 0x91, -0x1D, 0x4B, 0x6A, 0x00, 0xD0, 0x5A, 0x1D, 0x4B, 0x03, 0x99, 0xD4, 0x5E, -0xC0, 0x08, 0x14, 0x4A, 0x89, 0xB2, 0x04, 0x1B, 0x64, 0x1A, 0x56, 0x7C, -0x24, 0xB2, 0x19, 0x4B, 0xB4, 0x42, 0x02, 0xDC, 0x76, 0x42, 0xB4, 0x42, -0x02, 0xDA, 0x00, 0x24, 0x5C, 0x55, 0x05, 0xE0, 0x5C, 0x5D, 0x96, 0x7C, -0xA6, 0x42, 0x01, 0xD0, 0x01, 0x34, 0x5C, 0x55, 0x43, 0x1A, 0x9B, 0xB2, -0x92, 0x7E, 0x19, 0xB2, 0x91, 0x42, 0x02, 0xDB, 0x09, 0x4A, 0x01, 0x21, -0x11, 0x70, 0x0C, 0x4A, 0x6D, 0x00, 0xAB, 0x52, 0x7F, 0xBD, 0xC0, 0x46, -0xEB, 0x01, 0x00, 0x20, 0x8B, 0x59, 0x00, 0x00, 0xE4, 0x01, 0x00, 0x20, -0x48, 0x0D, 0x00, 0x20, 0x48, 0x11, 0x00, 0x20, 0x14, 0x09, 0x00, 0x20, -0x30, 0x11, 0x00, 0x20, 0xC4, 0x01, 0x00, 0x20, 0x92, 0x7B, 0x00, 0x00, -0x14, 0x02, 0x00, 0x20, 0x3C, 0x0D, 0x00, 0x20, 0xA4, 0x0A, 0x00, 0x20, -0xF0, 0xB5, 0x48, 0x4B, 0x89, 0xB0, 0x1B, 0x78, 0x00, 0x2B, 0x03, 0xD0, -0x00, 0x20, 0x46, 0x49, 0xFF, 0xF7, 0xF4, 0xFC, 0x45, 0x4A, 0x00, 0x23, -0x13, 0x70, 0x45, 0x4A, 0x0C, 0x20, 0x01, 0x38, 0xC0, 0xB2, 0x81, 0x00, -0x8B, 0x50, 0x00, 0x28, 0xF9, 0xD1, 0x42, 0x4B, 0x42, 0x4A, 0x18, 0x70, -0x01, 0x23, 0x13, 0x70, 0x41, 0x4A, 0x13, 0x70, 0x41, 0x4B, 0x19, 0x7E, -0x04, 0x91, 0xDA, 0x7D, 0x05, 0x92, 0x1B, 0x7D, 0x06, 0x93, 0x0B, 0x1C, -0x2D, 0xE0, 0x01, 0x3B, 0xDB, 0xB2, 0x5D, 0x1C, 0x3C, 0x4C, 0xEA, 0x01, -0x12, 0x19, 0x16, 0x88, 0x3B, 0x49, 0x5A, 0x00, 0x5C, 0x01, 0x56, 0x52, -0xAD, 0x01, 0x05, 0x9A, 0x07, 0x94, 0x9C, 0x46, 0x1A, 0xE0, 0x01, 0x3A, -0xD2, 0xB2, 0x93, 0x1C, 0xEB, 0x18, 0x36, 0x4C, 0x5B, 0x00, 0x19, 0x5B, -0x06, 0x9B, 0x00, 0x2B, 0x05, 0xD0, 0xD3, 0x1C, 0xEB, 0x18, 0x5B, 0x00, -0x1B, 0x5B, 0xC9, 0x18, 0x49, 0x10, 0x07, 0x9C, 0xA7, 0x18, 0x7B, 0x00, -0x1C, 0x1C, 0x2F, 0x4B, 0xE1, 0x52, 0x2F, 0x4C, 0x01, 0x23, 0x89, 0x1B, -0x3B, 0x55, 0x40, 0x18, 0x00, 0x2A, 0xE2, 0xD1, 0x63, 0x46, 0x00, 0x2B, -0xCF, 0xD1, 0x25, 0x4B, 0x04, 0x9C, 0xD9, 0x7D, 0x61, 0x43, 0x01, 0xF0, -0xD5, 0xF8, 0x28, 0x4B, 0x05, 0x1C, 0x58, 0x8C, 0x27, 0x4C, 0x00, 0x28, -0x02, 0xD1, 0x40, 0x23, 0x23, 0x60, 0x07, 0xE0, 0x80, 0x01, 0x29, 0x1C, -0x01, 0xF0, 0xC8, 0xF8, 0x6E, 0x28, 0x00, 0xDD, 0x6E, 0x20, 0x20, 0x60, -0x12, 0x4C, 0x23, 0x78, 0x00, 0x2B, 0x03, 0xD0, 0x00, 0x20, 0x1F, 0x49, -0xFF, 0xF7, 0x8A, 0xFC, 0x1B, 0x4B, 0x1E, 0x4A, 0x5B, 0x8C, 0x55, 0x80, -0x13, 0x80, 0x23, 0x78, 0x00, 0x2B, 0x06, 0xD0, 0x01, 0x23, 0x02, 0x21, -0x00, 0x93, 0x00, 0x20, 0x0B, 0x1C, 0xFF, 0xF7, 0x23, 0xFC, 0x18, 0x4B, -0x18, 0x48, 0x1B, 0x78, 0x00, 0x22, 0x18, 0x49, 0x04, 0xE0, 0x01, 0x3B, -0xDB, 0xB2, 0x5C, 0x00, 0xC2, 0x54, 0x62, 0x52, 0x00, 0x2B, 0xF8, 0xD1, -0x09, 0xB0, 0xF0, 0xBD, 0xEB, 0x01, 0x00, 0x20, 0x91, 0x59, 0x00, 0x00, -0x1C, 0x03, 0x00, 0x20, 0xBC, 0x11, 0x00, 0x20, 0xF4, 0x10, 0x00, 0x20, -0x20, 0x09, 0x00, 0x20, 0x3C, 0x11, 0x00, 0x20, 0xAE, 0x09, 0x00, 0x20, -0x02, 0x40, 0x00, 0x40, 0x94, 0x11, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, -0xF8, 0x03, 0x00, 0x20, 0xB3, 0x0A, 0x00, 0x20, 0x48, 0x0D, 0x00, 0x20, -0x78, 0x09, 0x00, 0x20, 0x9A, 0x59, 0x00, 0x00, 0x54, 0x11, 0x00, 0x20, -0x7C, 0x09, 0x00, 0x20, 0xA4, 0x0A, 0x00, 0x20, 0x14, 0x02, 0x00, 0x20, -0xF0, 0xB5, 0xA0, 0x4A, 0x00, 0x23, 0x13, 0x70, 0x9F, 0x4A, 0x85, 0xB0, -0x13, 0x70, 0x9F, 0x4A, 0x13, 0x70, 0x9F, 0x4A, 0x13, 0x70, 0x9F, 0x4B, -0x1B, 0x78, 0x00, 0x2B, 0x03, 0xD0, 0x01, 0x20, 0x9D, 0x49, 0xFF, 0xF7, -0x31, 0xFC, 0x00, 0x24, 0x9C, 0x4D, 0x9A, 0x4E, 0x11, 0xE0, 0x33, 0x78, -0x00, 0x2B, 0x0C, 0xD0, 0xEB, 0x7D, 0x29, 0x7D, 0x99, 0x48, 0xC9, 0x18, -0xE2, 0x01, 0x00, 0x23, 0x12, 0x18, 0x00, 0x93, 0xC9, 0xB2, 0x01, 0x20, -0x02, 0x23, 0xFF, 0xF7, 0xC5, 0xFB, 0x01, 0x34, 0xE4, 0xB2, 0x29, 0x7E, -0x8C, 0x42, 0xEA, 0xD3, 0x92, 0x4B, 0x1B, 0x78, 0x00, 0x2B, 0x00, 0xD1, -0x0D, 0xE1, 0x91, 0x4B, 0x1A, 0x78, 0x00, 0x2A, 0x1F, 0xD1, 0x90, 0x4B, -0x1B, 0x78, 0x00, 0x2B, 0x1B, 0xD0, 0xEB, 0x7D, 0x8E, 0x4C, 0x07, 0xE0, -0x01, 0x3B, 0xDB, 0xB2, 0x5D, 0x01, 0x2D, 0x18, 0x2A, 0x55, 0x00, 0x2B, -0xF8, 0xD1, 0x03, 0x1C, 0x58, 0x1E, 0xC0, 0xB2, 0x00, 0x2B, 0x01, 0xD0, -0x0B, 0x1C, 0xF6, 0xE7, 0x87, 0x4A, 0x86, 0x48, 0x12, 0x78, 0x49, 0x01, -0x03, 0xE0, 0x01, 0x3A, 0xD2, 0xB2, 0x8C, 0x18, 0x23, 0x54, 0x00, 0x2A, -0xF9, 0xD1, 0x80, 0x4B, 0x7E, 0x4A, 0x19, 0x78, 0x1B, 0x78, 0x11, 0x70, -0x00, 0x2B, 0x70, 0xD0, 0x78, 0x4B, 0x1A, 0x7E, 0xD9, 0x7D, 0x02, 0x92, -0x1B, 0x7D, 0x03, 0x93, 0x22, 0xE0, 0x01, 0x3B, 0xDB, 0xB2, 0x59, 0x1C, -0x89, 0x01, 0xC8, 0x19, 0x79, 0x4C, 0x03, 0x9D, 0x40, 0x00, 0x00, 0x5B, -0x00, 0x2D, 0x04, 0xD0, 0x89, 0x19, 0x49, 0x00, 0x09, 0x5B, 0x40, 0x18, -0x40, 0x10, 0x59, 0x01, 0x89, 0x18, 0x74, 0x4D, 0x4C, 0x00, 0x65, 0x5B, -0x6F, 0x4C, 0xED, 0x08, 0x0C, 0x5D, 0x28, 0x1A, 0x84, 0x42, 0x04, 0xDA, -0xFF, 0x28, 0x00, 0xDD, 0xFF, 0x20, 0x6B, 0x4D, 0x68, 0x54, 0x00, 0x2B, -0xDD, 0xD1, 0x11, 0x1C, 0x4A, 0x1E, 0xD2, 0xB2, 0x00, 0x29, 0x03, 0xD0, -0x02, 0x9B, 0x97, 0x1C, 0xD6, 0x1C, 0xF4, 0xE7, 0x5F, 0x4A, 0x65, 0x4B, -0x17, 0x7E, 0x1B, 0x78, 0x62, 0x49, 0x7F, 0x01, 0x10, 0xE0, 0x01, 0x3B, -0xDB, 0xB2, 0x64, 0x4E, 0x5A, 0x00, 0x94, 0x5B, 0xF8, 0x18, 0x45, 0x56, -0x26, 0xB2, 0x2A, 0x1C, 0xB5, 0x42, 0x00, 0xDA, 0x22, 0x1C, 0x12, 0xB2, -0xFF, 0x2A, 0x00, 0xDD, 0xFF, 0x22, 0x42, 0x54, 0x00, 0x2B, 0xEC, 0xD1, -0x50, 0x4B, 0x1B, 0x78, 0x00, 0x2B, 0x03, 0xD0, 0x03, 0x20, 0x5A, 0x49, -0xFF, 0xF7, 0x94, 0xFB, 0x00, 0x24, 0x4E, 0x4D, 0x4B, 0x4E, 0x0E, 0xE0, -0x33, 0x78, 0x00, 0x2B, 0x09, 0xD0, 0x50, 0x4B, 0x62, 0x01, 0xD2, 0x18, -0x00, 0x23, 0xE9, 0x7D, 0x03, 0x20, 0x00, 0x93, 0x01, 0x23, 0xFF, 0xF7, -0x2B, 0xFB, 0x01, 0x34, 0xE4, 0xB2, 0x2B, 0x7E, 0xA3, 0x42, 0xED, 0xD8, -0x40, 0x4A, 0x01, 0x23, 0x13, 0x70, 0x3D, 0x4A, 0x13, 0x70, 0x3B, 0x4A, -0x13, 0x70, 0x3E, 0x4B, 0x1B, 0x78, 0x00, 0x2B, 0x6D, 0xD0, 0x49, 0x4B, -0x1B, 0x68, 0x58, 0x02, 0x69, 0xD5, 0x3C, 0x4A, 0x80, 0x24, 0x16, 0x7D, -0x13, 0x7E, 0xD2, 0x7D, 0x45, 0x4D, 0xB6, 0x18, 0xF6, 0xB2, 0x24, 0x06, -0xB4, 0x46, 0x18, 0xE0, 0x01, 0x3B, 0xDB, 0xB2, 0x42, 0x49, 0x5A, 0x00, -0x5F, 0x1C, 0x56, 0x5A, 0xBF, 0x01, 0x62, 0x46, 0x0D, 0xE0, 0x01, 0x3A, -0xD2, 0xB2, 0x91, 0x1C, 0x79, 0x18, 0x37, 0x48, 0x49, 0x00, 0x09, 0x5A, -0x89, 0x1B, 0x8C, 0x42, 0x00, 0xDA, 0x0C, 0x1C, 0x8D, 0x42, 0x00, 0xDD, -0x0D, 0x1C, 0x00, 0x2A, 0xEF, 0xD1, 0x00, 0x2B, 0xE4, 0xD1, 0x16, 0x20, -0x36, 0x49, 0xFF, 0xF7, 0x45, 0xFB, 0x25, 0x4B, 0x35, 0x4A, 0x1B, 0x78, -0x14, 0x80, 0x55, 0x80, 0x00, 0x2B, 0x06, 0xD0, 0x01, 0x23, 0x02, 0x21, -0x00, 0x93, 0x16, 0x20, 0x0B, 0x1C, 0xFF, 0xF7, 0xDF, 0xFA, 0x26, 0x4B, -0x80, 0x20, 0x1B, 0x78, 0x2A, 0x49, 0x00, 0x06, 0x2D, 0x4E, 0x2E, 0x4D, -0x19, 0xE0, 0x01, 0x3B, 0xDB, 0xB2, 0xF7, 0x5C, 0x7A, 0x1C, 0x94, 0x46, -0x64, 0x46, 0xEA, 0x5C, 0xA4, 0x01, 0xA4, 0x46, 0x02, 0x32, 0x62, 0x44, -0x1D, 0x4C, 0x52, 0x00, 0x12, 0x5B, 0x22, 0x4C, 0x7F, 0x00, 0x94, 0x46, -0x3A, 0x5B, 0x64, 0x46, 0xA2, 0x1A, 0x90, 0x42, 0x00, 0xDA, 0x10, 0x1C, -0x91, 0x42, 0x00, 0xDD, 0x11, 0x1C, 0x00, 0x2B, 0xE3, 0xD1, 0x0C, 0x4B, -0x1C, 0x4A, 0x1B, 0x78, 0x10, 0x80, 0x51, 0x80, 0x00, 0x2B, 0x06, 0xD0, -0x01, 0x23, 0x02, 0x21, 0x00, 0x93, 0x16, 0x20, 0x0B, 0x1C, 0xFF, 0xF7, -0xAD, 0xFA, 0x05, 0xB0, 0xF0, 0xBD, 0xC0, 0x46, 0xAC, 0x09, 0x00, 0x20, -0x14, 0x09, 0x00, 0x20, 0x30, 0x11, 0x00, 0x20, 0x48, 0x11, 0x00, 0x20, -0xEB, 0x01, 0x00, 0x20, 0xAB, 0x59, 0x00, 0x00, 0xAE, 0x09, 0x00, 0x20, -0x84, 0x40, 0x00, 0x40, 0x1C, 0x03, 0x00, 0x20, 0xE1, 0x01, 0x00, 0x20, -0xE3, 0x01, 0x00, 0x20, 0x64, 0x0E, 0x00, 0x20, 0x7C, 0x09, 0x00, 0x20, -0x00, 0x40, 0x00, 0x40, 0xF8, 0x03, 0x00, 0x20, 0x3C, 0x0D, 0x00, 0x20, -0xAF, 0x59, 0x00, 0x00, 0x58, 0x00, 0x00, 0x20, 0xFF, 0xFF, 0xFF, 0x7F, -0x94, 0x11, 0x00, 0x20, 0xB5, 0x59, 0x00, 0x00, 0x54, 0x11, 0x00, 0x20, -0x30, 0x75, 0x00, 0x00, 0x2A, 0x75, 0x00, 0x00, 0xF0, 0xB5, 0xB3, 0x4B, -0xA5, 0xB0, 0x1B, 0x78, 0x00, 0x2B, 0x00, 0xD0, 0x01, 0xE2, 0xB1, 0x4A, -0xB1, 0x4C, 0x12, 0x78, 0xB1, 0x4D, 0xB2, 0x4E, 0x64, 0x7C, 0x52, 0xB2, -0x6B, 0x60, 0x2B, 0x60, 0x6B, 0x82, 0x6B, 0x81, 0x2B, 0x82, 0x2B, 0x81, -0x33, 0x60, 0xB3, 0x60, 0x1B, 0x92, 0xAD, 0x4F, 0xFF, 0x22, 0xAD, 0x4B, -0x72, 0x60, 0xF2, 0x60, 0x11, 0x94, 0x3F, 0x7E, 0x1B, 0x78, 0xA9, 0x4C, -0x09, 0x97, 0x0B, 0x93, 0xE4, 0x7D, 0xA4, 0x4D, 0x08, 0x94, 0x46, 0x23, -0xED, 0x5E, 0xA2, 0x4F, 0x0E, 0x95, 0x48, 0x23, 0xFF, 0x5E, 0xA3, 0x4C, -0x0F, 0x97, 0x24, 0x7D, 0x2D, 0x23, 0x0C, 0x94, 0x9D, 0x4D, 0xA2, 0x4E, -0x11, 0x9F, 0x6D, 0x78, 0x36, 0x68, 0x7F, 0x42, 0x9A, 0x4C, 0x0D, 0x95, -0x12, 0x96, 0x1D, 0x97, 0xA4, 0x7C, 0x98, 0x4D, 0x22, 0x94, 0xEB, 0x5C, -0x1B, 0x9E, 0x13, 0x93, 0x10, 0x23, 0x9B, 0x1B, 0x1E, 0x93, 0x18, 0x27, -0xEF, 0x57, 0x1C, 0x20, 0x14, 0x97, 0x28, 0x56, 0x19, 0x21, 0x18, 0x90, -0x69, 0x56, 0x00, 0x23, 0x00, 0x22, 0x00, 0x24, 0x23, 0x91, 0x05, 0x93, -0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0xFF, 0x20, 0x00, 0x21, 0xFF, 0x23, -0x06, 0x92, 0x17, 0x94, 0x10, 0x95, 0x1A, 0x96, 0x15, 0x97, 0x19, 0x90, -0x21, 0x91, 0x1F, 0x92, 0x16, 0x93, 0x1C, 0x94, 0x09, 0x9C, 0x00, 0x2C, -0x00, 0xD1, 0x27, 0xE1, 0x09, 0x9B, 0x89, 0x4D, 0x01, 0x3B, 0xDB, 0xB2, -0x09, 0x93, 0x5B, 0x00, 0x5B, 0x5B, 0x08, 0x9E, 0x0A, 0x93, 0x00, 0x2E, -0xF0, 0xD0, 0x09, 0x9F, 0x84, 0x48, 0x01, 0x37, 0xFB, 0x01, 0x1B, 0x18, -0x1B, 0x88, 0x0A, 0x99, 0x0E, 0x9C, 0x5A, 0x1A, 0x94, 0x42, 0x00, 0xDA, -0x92, 0xE1, 0x0F, 0x9D, 0x95, 0x42, 0x00, 0xDD, 0x8B, 0xE1, 0x09, 0x9E, -0xBF, 0x01, 0x01, 0x21, 0x02, 0x25, 0x00, 0x22, 0x70, 0x01, 0x03, 0x97, -0x2C, 0xE0, 0x7A, 0x4D, 0x84, 0x18, 0x64, 0x00, 0x6E, 0x46, 0x18, 0x27, -0x2C, 0x5B, 0xBD, 0x5F, 0xE4, 0x1A, 0xAC, 0x42, 0x01, 0xDD, 0xA7, 0xB2, -0x06, 0x97, 0x6E, 0x46, 0x14, 0x27, 0xBD, 0x5F, 0xAC, 0x42, 0x01, 0xDA, -0xA4, 0xB2, 0x05, 0x94, 0x82, 0x18, 0x70, 0x4F, 0x52, 0x00, 0xBB, 0x52, -0x08, 0x9A, 0xCB, 0xB2, 0x9A, 0x42, 0xBD, 0xD9, 0x03, 0x9A, 0x8D, 0x1C, -0x53, 0x19, 0x6C, 0x4C, 0x5B, 0x00, 0x1B, 0x5B, 0x0A, 0x9E, 0x0E, 0x9F, -0x0A, 0x1C, 0x9C, 0x1B, 0xBC, 0x42, 0x00, 0xDD, 0x38, 0xE1, 0x0F, 0x9E, -0x01, 0x31, 0xB4, 0x42, 0x00, 0xDA, 0xD1, 0xE0, 0x0C, 0x9F, 0x00, 0x2F, -0x07, 0xD0, 0x03, 0x9E, 0xD4, 0x1C, 0x34, 0x19, 0x61, 0x4F, 0x64, 0x00, -0xE4, 0x5B, 0xE3, 0x18, 0x5B, 0x10, 0x0D, 0x9C, 0x00, 0x2C, 0x06, 0xD0, -0x5E, 0x4E, 0x84, 0x18, 0xA4, 0x5D, 0x12, 0x9F, 0x63, 0x43, 0x7B, 0x43, -0x1B, 0x13, 0x0B, 0x9C, 0x00, 0x2C, 0xBA, 0xD0, 0x86, 0x18, 0x57, 0x4F, -0x74, 0x00, 0x3F, 0x5B, 0xBC, 0x46, 0x58, 0x4F, 0xBC, 0x57, 0x66, 0x46, -0xF6, 0x08, 0x34, 0x1B, 0x07, 0x94, 0x6F, 0x46, 0x18, 0x24, 0x04, 0x96, -0xE7, 0x5F, 0x07, 0x9E, 0xF4, 0x1A, 0xBC, 0x42, 0x01, 0xDD, 0xA7, 0xB2, -0x06, 0x97, 0x6E, 0x46, 0x14, 0x27, 0xBE, 0x5F, 0xB4, 0x42, 0x01, 0xDA, -0xA6, 0xB2, 0x05, 0x96, 0x11, 0x9F, 0xBC, 0x42, 0x5D, 0xDD, 0x84, 0x18, -0xA4, 0x46, 0x4B, 0x4C, 0x00, 0x27, 0x66, 0x46, 0x37, 0x55, 0x04, 0x9F, -0x13, 0x9E, 0xFC, 0x1A, 0x00, 0x2E, 0x08, 0xD0, 0x1B, 0x9F, 0x07, 0x9C, -0x1E, 0x9E, 0x7B, 0x43, 0x74, 0x43, 0x04, 0x9F, 0x1C, 0x19, 0x24, 0x11, -0x3C, 0x1B, 0x23, 0x1C, 0x7F, 0x33, 0x17, 0xDA, 0x3F, 0x4E, 0x82, 0x18, -0x80, 0x23, 0xB3, 0x54, 0x23, 0x9A, 0x21, 0x9E, 0xA3, 0x1A, 0xF6, 0x18, -0x21, 0x96, 0x1F, 0xAF, 0x00, 0x23, 0xFB, 0x5E, 0x9C, 0x42, 0x01, 0xDC, -0xA4, 0xB2, 0x1F, 0x94, 0x03, 0x9A, 0x35, 0x4C, 0x55, 0x19, 0x6D, 0x00, -0x00, 0x27, 0x2B, 0x5B, 0x2F, 0x53, 0x83, 0xE7, 0x83, 0x18, 0x7E, 0x2C, -0x36, 0xDD, 0x32, 0x4E, 0x7F, 0x27, 0xF7, 0x54, 0x14, 0x9F, 0xBC, 0x42, -0x03, 0xDB, 0x17, 0x9E, 0xE3, 0x1B, 0xF6, 0x18, 0x17, 0x96, 0x10, 0xAF, -0x00, 0x23, 0xFB, 0x5E, 0x9C, 0x42, 0x24, 0xDC, 0xA3, 0xB2, 0x18, 0x9E, -0xB4, 0x42, 0x11, 0xDB, 0x1A, 0x9F, 0x09, 0x9C, 0xA7, 0x42, 0x00, 0xDA, -0x1A, 0x94, 0x16, 0x9E, 0x09, 0x9C, 0xA6, 0x42, 0x00, 0xDD, 0x16, 0x94, -0x15, 0x9E, 0x96, 0x42, 0x00, 0xDA, 0x15, 0x92, 0x19, 0x9F, 0xBA, 0x42, -0x00, 0xDA, 0x19, 0x92, 0x03, 0x9A, 0x1D, 0x4C, 0x55, 0x19, 0x6D, 0x00, -0x2A, 0x5B, 0x2B, 0x53, 0x54, 0xE7, 0x1D, 0x9E, 0x87, 0x18, 0xB4, 0x42, -0x0E, 0xDA, 0x1B, 0x4C, 0x00, 0x26, 0x3E, 0x55, 0x9F, 0xE7, 0xA3, 0xB2, -0x10, 0x93, 0xD8, 0xE7, 0x16, 0x4E, 0xF4, 0x54, 0x00, 0x2C, 0xC7, 0xDA, -0x23, 0x9F, 0xBC, 0x42, 0xAF, 0xDC, 0xA9, 0xE7, 0x13, 0x4E, 0x20, 0x97, -0xBC, 0x5D, 0x22, 0x9E, 0x67, 0xB2, 0xB7, 0x42, 0x8D, 0xD0, 0x20, 0x9F, -0x0F, 0x4E, 0x01, 0x34, 0xBC, 0x55, 0x88, 0xE7, 0xAC, 0x09, 0x00, 0x20, -0x4C, 0x00, 0x00, 0x20, 0x48, 0x0D, 0x00, 0x20, 0x70, 0x01, 0x00, 0x20, -0xE4, 0x10, 0x00, 0x20, 0xAE, 0x09, 0x00, 0x20, 0x1C, 0x03, 0x00, 0x20, -0x78, 0x09, 0x00, 0x20, 0x94, 0x11, 0x00, 0x20, 0x04, 0x40, 0x00, 0x40, -0xF8, 0x03, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x12, 0x79, 0x00, 0x00, -0x64, 0x0E, 0x00, 0x20, 0xB3, 0x0A, 0x00, 0x20, 0x09, 0x9C, 0x01, 0x27, -0x1C, 0x97, 0x00, 0x2C, 0x00, 0xD0, 0xD7, 0xE6, 0x6D, 0x46, 0x6F, 0x46, -0x18, 0x26, 0x14, 0x20, 0x76, 0x5B, 0xC0, 0x5B, 0x41, 0x4D, 0x17, 0x99, -0x10, 0xAC, 0x2F, 0x1C, 0x2E, 0x82, 0x68, 0x82, 0x29, 0x60, 0x25, 0x88, -0x21, 0x9B, 0x3C, 0x1C, 0x3D, 0x81, 0x1A, 0x9E, 0x3C, 0x4F, 0x63, 0x60, -0x1F, 0xAC, 0x25, 0x88, 0xBE, 0x60, 0x16, 0x98, 0x15, 0x99, 0x19, 0x9A, -0x37, 0x4C, 0x0B, 0x9E, 0xF8, 0x60, 0x39, 0x60, 0x7A, 0x60, 0x65, 0x81, -0x00, 0x2E, 0x24, 0xD0, 0x35, 0x4B, 0x1B, 0x78, 0x00, 0x2B, 0x03, 0xD0, -0x34, 0x4B, 0x1B, 0x68, 0x00, 0x2B, 0x1C, 0xDD, 0x33, 0x4C, 0x23, 0x78, -0x00, 0x2B, 0x56, 0xD1, 0x32, 0x4F, 0x3B, 0x7E, 0x00, 0x2B, 0x14, 0xD0, -0x31, 0x4D, 0x09, 0x9F, 0x01, 0x26, 0x23, 0x78, 0x00, 0x2B, 0x08, 0xD0, -0x2D, 0x48, 0x7A, 0x01, 0xC1, 0x7D, 0x52, 0x19, 0x03, 0x20, 0x01, 0x23, -0x00, 0x96, 0xFF, 0xF7, 0xAD, 0xF8, 0x29, 0x49, 0x01, 0x37, 0x0B, 0x7E, -0xFF, 0xB2, 0xBB, 0x42, 0xED, 0xD8, 0x26, 0x4C, 0x23, 0x7D, 0x00, 0x2B, -0x13, 0xD0, 0x22, 0x7E, 0xE4, 0x7D, 0x01, 0x3A, 0x24, 0x49, 0xD2, 0xB2, -0x02, 0x34, 0x00, 0x20, 0x53, 0x1C, 0x9B, 0x01, 0x1B, 0x19, 0x5B, 0x00, -0x01, 0x3A, 0x5D, 0x5A, 0xD2, 0xB2, 0x5D, 0x5A, 0x58, 0x52, 0xF5, 0xE7, -0x01, 0x26, 0x1C, 0x96, 0x74, 0xE6, 0x1D, 0x4D, 0x1D, 0x4E, 0xAB, 0x7E, -0x32, 0x68, 0x13, 0x4F, 0x53, 0x43, 0x08, 0x21, 0x79, 0x5E, 0x1B, 0x48, -0x9B, 0x11, 0x1B, 0x4A, 0xCD, 0x17, 0xDC, 0x0F, 0x00, 0x78, 0x99, 0x42, -0x65, 0x41, 0x15, 0x70, 0x00, 0x28, 0x0A, 0xD1, 0x1C, 0x9C, 0x00, 0x2C, -0x07, 0xD0, 0x01, 0x23, 0x13, 0x70, 0x15, 0x4A, 0x15, 0x49, 0x13, 0x70, -0x15, 0x4A, 0x0B, 0x70, 0x13, 0x70, 0x25, 0xB0, 0xF0, 0xBD, 0x01, 0x25, -0x1C, 0x95, 0x51, 0xE6, 0x01, 0x24, 0x1C, 0x94, 0x4E, 0xE6, 0x03, 0x20, -0x10, 0x49, 0xFF, 0xF7, 0xBD, 0xF8, 0xA3, 0xE7, 0x70, 0x01, 0x00, 0x20, -0xE4, 0x10, 0x00, 0x20, 0xDE, 0x01, 0x00, 0x20, 0x20, 0x01, 0x00, 0x20, -0xEB, 0x01, 0x00, 0x20, 0xAE, 0x09, 0x00, 0x20, 0x64, 0x0E, 0x00, 0x20, -0x00, 0x40, 0x00, 0x40, 0x48, 0x0D, 0x00, 0x20, 0x78, 0x09, 0x00, 0x20, -0xE4, 0x01, 0x00, 0x20, 0x14, 0x09, 0x00, 0x20, 0x30, 0x11, 0x00, 0x20, -0x48, 0x11, 0x00, 0x20, 0xC4, 0x01, 0x00, 0x20, 0xF0, 0x59, 0x00, 0x00, -0xF0, 0xB5, 0x2F, 0x4B, 0x85, 0xB0, 0x1C, 0x78, 0x2E, 0x4D, 0x2F, 0x4E, -0x10, 0xE0, 0x01, 0x3C, 0xE4, 0xB2, 0x2B, 0x57, 0x32, 0x57, 0x59, 0x1C, -0x02, 0x32, 0x89, 0x01, 0x89, 0x18, 0x2B, 0x4A, 0x49, 0x00, 0x88, 0x5A, -0x2A, 0x4A, 0x5B, 0x00, 0x9A, 0x5A, 0x21, 0x1C, 0xFF, 0xF7, 0x0A, 0xFB, -0x00, 0x2C, 0xEC, 0xD1, 0x27, 0x4B, 0x1B, 0x78, 0x00, 0x2B, 0x08, 0xD0, -0x20, 0x4B, 0x03, 0x20, 0x19, 0x78, 0x01, 0x23, 0x00, 0x93, 0x24, 0x4A, -0x02, 0x23, 0xFF, 0xF7, 0x1D, 0xF8, 0x23, 0x4B, 0x1E, 0x49, 0x18, 0x78, -0x9A, 0x78, 0x84, 0x1C, 0x03, 0x92, 0xDE, 0x78, 0x00, 0x23, 0x02, 0x94, -0x0D, 0xE0, 0xA4, 0x01, 0xE4, 0x19, 0x64, 0x00, 0x65, 0x5A, 0x00, 0x25, -0x65, 0x52, 0x01, 0x32, 0x02, 0xE0, 0x02, 0x9C, 0x00, 0x22, 0xE7, 0x18, -0xB4, 0x1A, 0xF2, 0xD1, 0x01, 0x33, 0x03, 0x9D, 0x1A, 0x18, 0xAA, 0x42, -0xF5, 0xDB, 0x15, 0x4B, 0x10, 0x49, 0x58, 0x78, 0xDE, 0x78, 0x42, 0x1C, -0x01, 0x23, 0x5B, 0x42, 0x02, 0x92, 0x00, 0x22, 0x9F, 0x1C, 0x08, 0xE0, -0x02, 0x9D, 0xAC, 0x18, 0xA4, 0x01, 0xE4, 0x19, 0x64, 0x00, 0x65, 0x5A, -0x00, 0x25, 0x65, 0x52, 0x01, 0x32, 0x14, 0x18, 0xB4, 0x42, 0xF3, 0xDB, -0x03, 0x9A, 0x01, 0x33, 0x93, 0x42, 0xEC, 0xDB, 0x05, 0xB0, 0xF0, 0xBD, -0x7C, 0x09, 0x00, 0x20, 0x30, 0x75, 0x00, 0x00, 0x2A, 0x75, 0x00, 0x00, -0x00, 0x40, 0x00, 0x40, 0x94, 0x11, 0x00, 0x20, 0xEB, 0x01, 0x00, 0x20, -0x3C, 0x0D, 0x00, 0x20, 0x0A, 0x03, 0x00, 0x20, 0x30, 0xB5, 0x0C, 0x4B, -0x0C, 0x4C, 0xDB, 0x78, 0x0C, 0x49, 0x10, 0xE0, 0x01, 0x3B, 0xDB, 0xB2, -0x5A, 0x1C, 0x0B, 0x4D, 0xD2, 0x01, 0x52, 0x19, 0x45, 0x1C, 0x03, 0xD1, -0x15, 0x88, 0x5A, 0x00, 0x55, 0x52, 0x04, 0xE0, 0x15, 0x88, 0x5A, 0x01, -0x12, 0x18, 0x52, 0x00, 0x15, 0x53, 0x00, 0x2B, 0xEC, 0xD1, 0x30, 0xBD, -0x0A, 0x03, 0x00, 0x20, 0xF8, 0x03, 0x00, 0x20, 0x94, 0x11, 0x00, 0x20, -0x02, 0x40, 0x00, 0x40, 0xF0, 0xB5, 0x8D, 0xB0, 0x0A, 0x91, 0x0B, 0x92, -0x63, 0x4B, 0x41, 0x1C, 0x0C, 0xD1, 0x63, 0x4A, 0x63, 0x49, 0x12, 0x7E, -0x01, 0x3A, 0x03, 0x92, 0xDA, 0x78, 0x5E, 0x78, 0x54, 0x00, 0x00, 0x23, -0x55, 0x1C, 0x64, 0x18, 0x94, 0x46, 0x0E, 0xE0, 0xDC, 0x7B, 0x5A, 0x79, -0xA2, 0x18, 0x01, 0x3A, 0x10, 0xE0, 0x5C, 0x4A, 0xE9, 0x18, 0xC9, 0x01, -0x89, 0x18, 0x0A, 0x88, 0x5F, 0x00, 0xE2, 0x53, 0x0A, 0x88, 0x00, 0x22, -0x0A, 0x80, 0x01, 0x3B, 0x67, 0x46, 0xDA, 0x19, 0xB2, 0x42, 0xF0, 0xDA, -0x03, 0x9A, 0x00, 0x24, 0x56, 0x01, 0x54, 0x4D, 0x36, 0x18, 0x00, 0x23, -0x76, 0x00, 0x11, 0x1C, 0x08, 0x93, 0x07, 0x93, 0x06, 0x93, 0x05, 0x93, -0x03, 0x95, 0x09, 0x96, 0xA4, 0x46, 0x55, 0xE0, 0x44, 0x1C, 0x04, 0xD1, -0x4A, 0x4C, 0x56, 0x00, 0x34, 0x19, 0xE4, 0x5A, 0x04, 0xE0, 0x4B, 0x4C, -0x09, 0x9F, 0x3E, 0x19, 0x5C, 0x01, 0x34, 0x5B, 0x4E, 0x1C, 0x46, 0x4F, -0x04, 0x96, 0xF6, 0x01, 0xF6, 0x19, 0x37, 0x88, 0x24, 0xB2, 0x3E, 0xB2, -0x45, 0x4F, 0xA6, 0x1B, 0x54, 0x00, 0xE7, 0x19, 0xF4, 0x17, 0xFE, 0x52, -0x36, 0x19, 0x66, 0x40, 0x0F, 0x1C, 0x01, 0x24, 0xA7, 0x43, 0xB9, 0x42, -0x09, 0xD1, 0x07, 0x9C, 0xA4, 0x19, 0x07, 0x94, 0xB5, 0x42, 0x00, 0xDD, -0x35, 0x1C, 0x06, 0x9F, 0xB7, 0x42, 0x0B, 0xDB, 0x0D, 0xE0, 0x08, 0x9C, -0x03, 0x9F, 0xA4, 0x19, 0x08, 0x94, 0xB7, 0x42, 0x00, 0xDD, 0x03, 0x96, -0x05, 0x9C, 0xB4, 0x42, 0x02, 0xDB, 0x02, 0xE0, 0x06, 0x96, 0x00, 0xE0, -0x05, 0x96, 0x04, 0x9E, 0xF4, 0x01, 0x2F, 0x4E, 0xA4, 0x19, 0x47, 0x1C, -0x0E, 0xD1, 0x27, 0x88, 0x2B, 0x4E, 0x04, 0x97, 0x57, 0x00, 0xBE, 0x19, -0x02, 0x96, 0x10, 0x27, 0x6E, 0x46, 0xBF, 0x5B, 0x02, 0x9E, 0xF7, 0x52, -0x26, 0x88, 0x00, 0x26, 0x26, 0x80, 0x05, 0xE0, 0x27, 0x88, 0x27, 0x4E, -0x09, 0x9C, 0xA6, 0x19, 0x5C, 0x01, 0x37, 0x53, 0x01, 0x39, 0x02, 0x3B, -0x61, 0x45, 0xA7, 0xDA, 0x01, 0x30, 0x13, 0xD1, 0x23, 0x4C, 0x23, 0x78, -0x00, 0x2B, 0x03, 0xD0, 0x01, 0x20, 0x22, 0x49, 0xFE, 0xF7, 0x70, 0xFF, -0x23, 0x78, 0x00, 0x2B, 0x08, 0xD0, 0x17, 0x4B, 0x01, 0x20, 0xD9, 0x78, -0x00, 0x23, 0x00, 0x93, 0x16, 0x4A, 0x02, 0x23, 0xFE, 0xF7, 0x0C, 0xFF, -0x07, 0x9E, 0x08, 0x9F, 0x0A, 0x9C, 0xF3, 0x19, 0x23, 0x60, 0x05, 0x9E, -0x03, 0x9F, 0x06, 0x9C, 0xF3, 0x1B, 0x65, 0x1B, 0x9D, 0x42, 0x00, 0xDA, -0x1D, 0x1C, 0x0B, 0x9E, 0x12, 0x4C, 0x35, 0x60, 0x23, 0x78, 0x00, 0x2B, -0x03, 0xD0, 0x0B, 0x20, 0x11, 0x49, 0xFE, 0xF7, 0x4D, 0xFF, 0x23, 0x78, -0x00, 0x2B, 0x08, 0xD0, 0x06, 0x4B, 0x0B, 0x20, 0x19, 0x7E, 0x01, 0x23, -0x00, 0x93, 0x09, 0x4A, 0x02, 0x23, 0xFE, 0xF7, 0xE9, 0xFE, 0x0D, 0xB0, -0xF0, 0xBD, 0xC0, 0x46, 0x0A, 0x03, 0x00, 0x20, 0xAE, 0x09, 0x00, 0x20, -0x94, 0x11, 0x00, 0x20, 0x02, 0x40, 0x00, 0x40, 0xFF, 0xFF, 0x00, 0x00, -0xF8, 0x03, 0x00, 0x20, 0x54, 0x11, 0x00, 0x20, 0xEB, 0x01, 0x00, 0x20, -0xC6, 0x59, 0x00, 0x00, 0xCD, 0x59, 0x00, 0x00, 0xF0, 0xB5, 0xA6, 0x4B, -0x85, 0xB0, 0x1D, 0x78, 0x00, 0x2D, 0x29, 0xD0, 0xA4, 0x4B, 0xA5, 0x4C, -0x18, 0x78, 0xA5, 0x4B, 0x46, 0xB2, 0x19, 0x68, 0x5B, 0x68, 0xB2, 0x00, -0xCB, 0x18, 0x13, 0x51, 0x82, 0x1D, 0xD2, 0xB2, 0x00, 0x25, 0x06, 0x23, -0x01, 0x3B, 0xDB, 0xB2, 0xF1, 0x1A, 0x00, 0xD5, 0x0C, 0x31, 0x89, 0x00, -0x09, 0x59, 0x6D, 0x18, 0x11, 0x1C, 0x0B, 0x2A, 0x01, 0xD9, 0x0C, 0x39, -0xC9, 0xB2, 0x89, 0x00, 0x61, 0x58, 0x01, 0x3A, 0x6D, 0x1A, 0xD2, 0xB2, -0x00, 0x2B, 0xEB, 0xD1, 0x01, 0x30, 0x93, 0x4A, 0xC0, 0xB2, 0x10, 0x70, -0x40, 0xB2, 0x0B, 0x28, 0x00, 0xDD, 0x13, 0x70, 0x92, 0x4B, 0x1B, 0x78, -0x00, 0x2B, 0x00, 0xD0, 0x15, 0xE1, 0x91, 0x4B, 0x14, 0x21, 0x5B, 0x5E, -0x9D, 0x42, 0x02, 0xDA, 0x8F, 0x4B, 0x01, 0x22, 0x1A, 0x70, 0x8B, 0x4B, -0x10, 0x22, 0x9E, 0x5E, 0x12, 0x24, 0x1B, 0x5F, 0xF6, 0x1A, 0x85, 0x4B, -0x18, 0x78, 0x00, 0x28, 0x16, 0xD1, 0x8A, 0x4B, 0x8A, 0x4F, 0x1B, 0x68, -0x8A, 0x4C, 0xBB, 0x80, 0x23, 0x78, 0x3E, 0x80, 0x00, 0x2B, 0x02, 0xD0, -0x88, 0x49, 0xFE, 0xF7, 0xD7, 0xFE, 0x23, 0x78, 0x00, 0x2B, 0x07, 0xD0, -0x01, 0x23, 0x02, 0x21, 0x00, 0x93, 0x00, 0x20, 0x3A, 0x1C, 0x0B, 0x1C, -0xFE, 0xF7, 0x74, 0xFE, 0x7C, 0x4B, 0x9A, 0x7D, 0x96, 0x42, 0x07, 0xDC, -0x80, 0x4B, 0x1A, 0x78, 0x51, 0xB2, 0x02, 0x29, 0x08, 0xDC, 0x01, 0x32, -0x1A, 0x70, 0x05, 0xE0, 0xDB, 0x7D, 0x9E, 0x42, 0x02, 0xDB, 0x7B, 0x4B, -0x00, 0x22, 0x1A, 0x70, 0x71, 0x4B, 0x76, 0x4A, 0x59, 0x68, 0x1B, 0x68, -0x15, 0x80, 0xCB, 0x18, 0x53, 0x80, 0x74, 0x4B, 0x96, 0x80, 0x1B, 0x78, -0x00, 0x2B, 0x06, 0xD0, 0x01, 0x23, 0x00, 0x93, 0x19, 0x20, 0x03, 0x21, -0x02, 0x23, 0xFE, 0xF7, 0x4F, 0xFE, 0x6B, 0x4B, 0x64, 0x4C, 0x1B, 0x78, -0x00, 0x2B, 0x61, 0xD0, 0x6B, 0x4D, 0x2B, 0x78, 0x00, 0x2B, 0x03, 0xD0, -0x19, 0x20, 0x6C, 0x49, 0xFE, 0xF7, 0x9A, 0xFE, 0x69, 0x4B, 0x1B, 0x78, -0x00, 0x2B, 0x05, 0xD1, 0x22, 0x78, 0x00, 0x2A, 0x52, 0xD0, 0x61, 0x4A, -0x13, 0x70, 0x4F, 0xE0, 0x03, 0x2B, 0x4D, 0xD1, 0x2B, 0x78, 0x00, 0x2B, -0x03, 0xD0, 0x00, 0x20, 0x63, 0x49, 0xFE, 0xF7, 0x87, 0xFE, 0x55, 0x4B, -0x62, 0x4A, 0x19, 0x78, 0x00, 0x29, 0x1A, 0xD1, 0x01, 0x20, 0x18, 0x70, -0x13, 0x7E, 0xD6, 0x7D, 0x5F, 0x4D, 0x60, 0x4A, 0x0B, 0xE0, 0x01, 0x3B, -0xDB, 0xB2, 0xF8, 0x18, 0x44, 0x00, 0xA1, 0x5A, 0xC9, 0x00, 0xA1, 0x52, -0x00, 0x21, 0x41, 0x55, 0x00, 0x2B, 0xF4, 0xD1, 0x63, 0x46, 0x59, 0x1E, -0xC9, 0xB2, 0x00, 0x2B, 0x23, 0xD0, 0x33, 0x1C, 0x4F, 0x01, 0x8C, 0x46, -0xF4, 0xE7, 0x13, 0x7E, 0xD6, 0x7D, 0x54, 0x4A, 0x0E, 0xE0, 0x01, 0x3B, -0x51, 0x4D, 0xDB, 0xB2, 0xFC, 0x18, 0x60, 0x00, 0x64, 0x57, 0xE4, 0x00, -0x02, 0x94, 0x84, 0x5A, 0x02, 0x9D, 0x64, 0x1B, 0x84, 0x52, 0x00, 0x2B, -0xF1, 0xD1, 0x0B, 0x1C, 0x59, 0x1E, 0xC9, 0xB2, 0x00, 0x2B, 0x02, 0xD0, -0x33, 0x1C, 0x4F, 0x01, 0xF5, 0xE7, 0x3A, 0x4A, 0x11, 0x1C, 0x30, 0x31, -0x08, 0xC2, 0x8A, 0x42, 0xFC, 0xD1, 0x3B, 0x4B, 0x00, 0x22, 0x1A, 0x70, -0x44, 0x4B, 0x01, 0x22, 0x1A, 0x70, 0x60, 0xE0, 0x22, 0x78, 0x43, 0x4B, -0x00, 0x2A, 0x06, 0xD1, 0x40, 0x4A, 0x01, 0x21, 0x11, 0x70, 0x1A, 0x68, -0x52, 0x18, 0x1A, 0x60, 0x55, 0xE0, 0x00, 0x22, 0x1A, 0x60, 0x39, 0x4B, -0x3D, 0x48, 0x1C, 0x7E, 0xDB, 0x7D, 0x39, 0x49, 0x02, 0x93, 0x2D, 0x4B, -0x9B, 0x7C, 0x03, 0x93, 0x11, 0xE0, 0x01, 0x3B, 0xDB, 0xB2, 0xF2, 0x18, -0x14, 0x56, 0x03, 0x9D, 0xAC, 0x42, 0x07, 0xD1, 0x31, 0x4D, 0x54, 0x00, -0x57, 0x57, 0x65, 0x5A, 0xEF, 0x1B, 0x67, 0x52, 0x00, 0x24, 0x14, 0x54, -0x00, 0x2B, 0xEE, 0xD1, 0x64, 0x46, 0x65, 0x1E, 0xED, 0xB2, 0x00, 0x2C, -0x03, 0xD0, 0x02, 0x9B, 0x6E, 0x01, 0xAC, 0x46, 0xF4, 0xE7, 0x2D, 0x4B, -0x1B, 0x68, 0x5D, 0x07, 0x2B, 0xD5, 0x20, 0x4B, 0x1B, 0x78, 0x00, 0x2B, -0x22, 0xD0, 0x02, 0x20, 0x29, 0x49, 0xFE, 0xF7, 0x03, 0xFE, 0x1D, 0xE0, -0xE9, 0x7D, 0x62, 0x01, 0x0B, 0x1C, 0x21, 0x48, 0x02, 0x92, 0x08, 0xE0, -0x01, 0x3B, 0x02, 0x9A, 0xDB, 0xB2, 0xD2, 0x18, 0x52, 0x00, 0x12, 0x5A, -0x5F, 0x00, 0xD2, 0x08, 0xBA, 0x53, 0x00, 0x2B, 0xF4, 0xD1, 0x13, 0x4A, -0x12, 0x78, 0x00, 0x2A, 0x05, 0xD0, 0x02, 0x20, 0x00, 0x93, 0x0F, 0x4A, -0x03, 0x1C, 0xFE, 0xF7, 0x8F, 0xFD, 0x01, 0x34, 0xE4, 0xB2, 0x01, 0xE0, -0x11, 0x4D, 0x0B, 0x4E, 0x2B, 0x7E, 0xA3, 0x42, 0xDC, 0xD8, 0x05, 0xB0, -0xF0, 0xBD, 0xC0, 0x46, 0x1C, 0x03, 0x00, 0x20, 0xF4, 0x10, 0x00, 0x20, -0xBC, 0x11, 0x00, 0x20, 0x70, 0x01, 0x00, 0x20, 0x14, 0x09, 0x00, 0x20, -0x48, 0x0D, 0x00, 0x20, 0x3C, 0x11, 0x00, 0x20, 0x34, 0x11, 0x00, 0x20, -0x54, 0x11, 0x00, 0x20, 0xEB, 0x01, 0x00, 0x20, 0xD2, 0x59, 0x00, 0x00, -0x20, 0x09, 0x00, 0x20, 0xD9, 0x59, 0x00, 0x00, 0xE2, 0x59, 0x00, 0x00, -0xAE, 0x09, 0x00, 0x20, 0x64, 0x0E, 0x00, 0x20, 0xF8, 0x03, 0x00, 0x20, -0x48, 0x11, 0x00, 0x20, 0xBC, 0x01, 0x00, 0x20, 0xB3, 0x0A, 0x00, 0x20, -0x58, 0x00, 0x00, 0x20, 0xEB, 0x59, 0x00, 0x00, 0xF0, 0xB5, 0x25, 0x4B, -0x87, 0xB0, 0x1B, 0x78, 0x00, 0x2B, 0x2B, 0xD1, 0x23, 0x4A, 0x24, 0x4B, -0x90, 0x7C, 0x1B, 0x78, 0x04, 0x90, 0xD2, 0x7E, 0x22, 0x4D, 0x52, 0xB2, -0x92, 0xB2, 0x05, 0x92, 0x21, 0x4A, 0x1D, 0xE0, 0x01, 0x3B, 0x21, 0x4C, -0xDB, 0xB2, 0xE1, 0x5C, 0x04, 0x9F, 0xB9, 0x42, 0x16, 0xD1, 0x59, 0x00, -0x88, 0x5A, 0x00, 0x28, 0x07, 0xD0, 0x6E, 0x5A, 0x6F, 0x46, 0x34, 0xB2, -0xA4, 0x46, 0x14, 0x24, 0xE7, 0x5F, 0xBC, 0x45, 0x05, 0xDA, 0x59, 0x00, -0x6E, 0x5A, 0xF6, 0x00, 0x80, 0x1B, 0x50, 0x52, 0x01, 0xE0, 0x80, 0x1B, -0x88, 0x52, 0x14, 0x4F, 0x00, 0x21, 0xF9, 0x54, 0x00, 0x2B, 0xDF, 0xD1, -0x0E, 0x4B, 0x12, 0x4C, 0x19, 0x78, 0x0F, 0x48, 0x0B, 0x1C, 0x05, 0xE0, -0x01, 0x3B, 0xDB, 0xB2, 0x5A, 0x00, 0x15, 0x5A, 0xED, 0x08, 0x15, 0x53, -0x00, 0x2B, 0xF7, 0xD1, 0x0C, 0x4A, 0x12, 0x78, 0x00, 0x2A, 0x05, 0xD0, -0x02, 0x20, 0x00, 0x93, 0x08, 0x4A, 0x03, 0x1C, 0xFE, 0xF7, 0x0E, 0xFD, -0x07, 0xB0, 0xF0, 0xBD, 0x30, 0x11, 0x00, 0x20, 0x48, 0x0D, 0x00, 0x20, -0x7C, 0x09, 0x00, 0x20, 0x3C, 0x0D, 0x00, 0x20, 0x14, 0x02, 0x00, 0x20, -0xA4, 0x0A, 0x00, 0x20, 0x54, 0x11, 0x00, 0x20, 0xEB, 0x01, 0x00, 0x20, -0x10, 0xB5, 0x09, 0x49, 0x50, 0x22, 0x09, 0x48, 0x00, 0xF0, 0xE2, 0xF9, -0x08, 0x4C, 0x09, 0x49, 0x20, 0x1C, 0x42, 0x22, 0x00, 0xF0, 0xDC, 0xF9, -0x07, 0x4B, 0xA2, 0x7B, 0x1A, 0x60, 0xE3, 0x7D, 0xE3, 0x76, 0x23, 0x7E, -0x23, 0x77, 0x10, 0xBD, 0x4A, 0x74, 0x00, 0x00, 0x48, 0x0D, 0x00, 0x20, -0xAE, 0x09, 0x00, 0x20, 0x08, 0x74, 0x00, 0x00, 0x50, 0x11, 0x00, 0x20, -0x08, 0xB5, 0x04, 0x49, 0x04, 0x4B, 0x41, 0x43, 0x04, 0x48, 0xC9, 0x18, -0x00, 0xF0, 0x60, 0xF9, 0xC0, 0xB2, 0x08, 0xBD, 0x44, 0xFE, 0xFF, 0xFF, -0xFE, 0x24, 0x02, 0x00, 0x40, 0x42, 0x0F, 0x00, 0x10, 0xB5, 0x15, 0x4C, -0x00, 0x23, 0x23, 0x71, 0x03, 0x23, 0x63, 0x71, 0x02, 0x23, 0x23, 0x72, -0x12, 0x4B, 0x98, 0x78, 0x02, 0x38, 0x03, 0x28, 0x1D, 0xD8, 0x00, 0xF0, -0xE7, 0xF8, 0x0B, 0x04, 0x02, 0x14, 0xC7, 0x20, 0x00, 0xE0, 0xD7, 0x20, -0xE0, 0x70, 0xFF, 0xF7, 0xD9, 0xFF, 0x02, 0x23, 0x20, 0x70, 0x0E, 0xE0, -0xF4, 0x20, 0xE0, 0x70, 0xFF, 0xF7, 0xD2, 0xFF, 0x02, 0x23, 0x20, 0x70, -0xA3, 0x71, 0x01, 0x23, 0x06, 0xE0, 0xF4, 0x20, 0xE0, 0x70, 0xFF, 0xF7, -0xC9, 0xFF, 0x01, 0x23, 0x20, 0x70, 0xA3, 0x71, 0xE3, 0x71, 0x10, 0xBD, -0xAA, 0x0A, 0x00, 0x20, 0x48, 0x0D, 0x00, 0x20, 0xF0, 0xB5, 0x59, 0x4B, -0x87, 0xB0, 0x1A, 0x68, 0x58, 0x4B, 0x08, 0x2A, 0x01, 0xD1, 0x01, 0x22, -0x00, 0xE0, 0x00, 0x22, 0x1A, 0x70, 0x56, 0x4B, 0x56, 0x4C, 0x01, 0x33, -0xDB, 0x7F, 0x00, 0x2B, 0x00, 0xD1, 0xE3, 0x71, 0x23, 0x78, 0x01, 0x25, -0xA2, 0x79, 0x28, 0x1C, 0xD9, 0x00, 0x90, 0x40, 0x82, 0xB2, 0xCB, 0x1A, -0x53, 0x43, 0x50, 0x4E, 0xDB, 0x10, 0xDB, 0xB2, 0x33, 0x80, 0x22, 0x78, -0xFA, 0x23, 0xA0, 0x79, 0x9B, 0x00, 0x53, 0x43, 0x4C, 0x4F, 0x29, 0x1C, -0x81, 0x40, 0x88, 0xB2, 0xB9, 0x88, 0x58, 0x43, 0x09, 0x01, 0x00, 0xF0, -0xFB, 0xF8, 0xC1, 0xB2, 0x71, 0x80, 0x23, 0x78, 0x2D, 0x22, 0xA0, 0x79, -0x53, 0x43, 0x2A, 0x1C, 0x82, 0x40, 0x90, 0xB2, 0x58, 0x43, 0x6B, 0x46, -0x19, 0x81, 0x09, 0x01, 0x00, 0xF0, 0xEC, 0xF8, 0xC0, 0xB2, 0xB0, 0x80, -0x23, 0x7A, 0xB9, 0x79, 0xD8, 0x00, 0x18, 0x1A, 0xA9, 0x40, 0xC0, 0x00, -0x49, 0x19, 0xE0, 0x30, 0x48, 0x43, 0xA2, 0x79, 0x6C, 0x46, 0x08, 0x21, -0x61, 0x5E, 0x90, 0x40, 0x49, 0x01, 0x00, 0xF0, 0x8B, 0xF8, 0x34, 0x4A, -0xF0, 0x80, 0x11, 0x7D, 0xD0, 0x7D, 0x36, 0x4B, 0x08, 0x18, 0xC0, 0xB2, -0x18, 0x70, 0x17, 0x7E, 0x5F, 0x70, 0x56, 0x7E, 0x01, 0x96, 0x96, 0x7F, -0x01, 0x9C, 0x66, 0x43, 0xF4, 0xB2, 0x20, 0x18, 0xC0, 0xB2, 0x98, 0x70, -0x02, 0x90, 0x96, 0x7E, 0x03, 0x96, 0x03, 0x98, 0xD6, 0x7F, 0x46, 0x43, -0xF0, 0xB2, 0xC7, 0x19, 0xFF, 0xB2, 0xDF, 0x70, 0xD6, 0x7E, 0xB4, 0x46, -0x61, 0x44, 0x61, 0x18, 0xC9, 0xB2, 0x19, 0x71, 0x16, 0x7F, 0x80, 0x19, -0x02, 0x9E, 0xC0, 0xB2, 0x74, 0x1A, 0x3F, 0x1A, 0xE6, 0xB2, 0xFF, 0xB2, -0x58, 0x71, 0x9E, 0x71, 0xDF, 0x71, 0xBC, 0x46, 0x57, 0x7D, 0xEC, 0x1B, -0x04, 0x97, 0x27, 0x1C, 0x77, 0x43, 0xFF, 0xB2, 0x05, 0x97, 0x9F, 0x73, -0x97, 0x7D, 0x64, 0x46, 0xED, 0x1B, 0x65, 0x43, 0x47, 0x43, 0x04, 0x9C, -0x5F, 0x74, 0x4C, 0x43, 0x18, 0x72, 0x6F, 0x46, 0x14, 0x20, 0xC7, 0x5D, -0xED, 0xB2, 0xE4, 0xB2, 0xDD, 0x73, 0x1C, 0x74, 0x5D, 0x72, 0x99, 0x72, -0xDF, 0x72, 0x1E, 0x73, 0x5C, 0x73, 0x51, 0x7F, 0x12, 0x4B, 0x00, 0x29, -0x03, 0xD0, 0x69, 0x46, 0x09, 0x79, 0x19, 0x70, 0x03, 0xE0, 0x01, 0x9C, -0x03, 0x9E, 0x74, 0x43, 0x1C, 0x70, 0x93, 0x1C, 0x03, 0x32, 0x02, 0x9F, -0xD2, 0x7F, 0xDB, 0x7F, 0xBA, 0x18, 0x5B, 0xB2, 0x01, 0x32, 0x9A, 0x40, -0x09, 0x4B, 0x07, 0xB0, 0x1A, 0x60, 0xF0, 0xBD, 0x50, 0x11, 0x00, 0x20, -0xFA, 0x02, 0x00, 0x20, 0xAE, 0x09, 0x00, 0x20, 0xAA, 0x0A, 0x00, 0x20, -0x04, 0x02, 0x00, 0x20, 0x48, 0x0D, 0x00, 0x20, 0x0A, 0x03, 0x00, 0x20, -0x7C, 0x09, 0x00, 0x20, 0x18, 0x09, 0x00, 0x20, 0x02, 0xB4, 0x71, 0x46, -0x49, 0x08, 0x49, 0x00, 0x09, 0x5C, 0x49, 0x00, 0x8E, 0x44, 0x02, 0xBC, -0x70, 0x47, 0xC0, 0x46, 0x03, 0xB4, 0x71, 0x46, 0x49, 0x08, 0x40, 0x00, -0x49, 0x00, 0x09, 0x5A, 0x49, 0x00, 0x8E, 0x44, 0x03, 0xBC, 0x70, 0x47, -0x00, 0x29, 0x34, 0xD0, 0x01, 0x23, 0x00, 0x22, 0x10, 0xB4, 0x88, 0x42, -0x2C, 0xD3, 0x01, 0x24, 0x24, 0x07, 0xA1, 0x42, 0x04, 0xD2, 0x81, 0x42, -0x02, 0xD2, 0x09, 0x01, 0x1B, 0x01, 0xF8, 0xE7, 0xE4, 0x00, 0xA1, 0x42, -0x04, 0xD2, 0x81, 0x42, 0x02, 0xD2, 0x49, 0x00, 0x5B, 0x00, 0xF8, 0xE7, -0x88, 0x42, 0x01, 0xD3, 0x40, 0x1A, 0x1A, 0x43, 0x4C, 0x08, 0xA0, 0x42, -0x02, 0xD3, 0x00, 0x1B, 0x5C, 0x08, 0x22, 0x43, 0x8C, 0x08, 0xA0, 0x42, -0x02, 0xD3, 0x00, 0x1B, 0x9C, 0x08, 0x22, 0x43, 0xCC, 0x08, 0xA0, 0x42, -0x02, 0xD3, 0x00, 0x1B, 0xDC, 0x08, 0x22, 0x43, 0x00, 0x28, 0x03, 0xD0, -0x1B, 0x09, 0x01, 0xD0, 0x09, 0x09, 0xE3, 0xE7, 0x10, 0x1C, 0x10, 0xBC, -0x70, 0x47, 0x00, 0x28, 0x01, 0xD0, 0x00, 0x20, 0xC0, 0x43, 0x07, 0xB4, -0x02, 0x48, 0x02, 0xA1, 0x40, 0x18, 0x02, 0x90, 0x03, 0xBD, 0xC0, 0x46, -0xD9, 0x00, 0x00, 0x00, 0x00, 0x29, 0xF0, 0xD0, 0x03, 0xB5, 0xFF, 0xF7, -0xB9, 0xFF, 0x0E, 0xBC, 0x42, 0x43, 0x89, 0x1A, 0x18, 0x47, 0xC0, 0x46, -0x00, 0x29, 0x41, 0xD0, 0x10, 0xB4, 0x04, 0x1C, 0x4C, 0x40, 0xA4, 0x46, -0x01, 0x23, 0x00, 0x22, 0x00, 0x29, 0x00, 0xD5, 0x49, 0x42, 0x00, 0x28, -0x00, 0xD5, 0x40, 0x42, 0x88, 0x42, 0x2C, 0xD3, 0x01, 0x24, 0x24, 0x07, -0xA1, 0x42, 0x04, 0xD2, 0x81, 0x42, 0x02, 0xD2, 0x09, 0x01, 0x1B, 0x01, -0xF8, 0xE7, 0xE4, 0x00, 0xA1, 0x42, 0x04, 0xD2, 0x81, 0x42, 0x02, 0xD2, -0x49, 0x00, 0x5B, 0x00, 0xF8, 0xE7, 0x88, 0x42, 0x01, 0xD3, 0x40, 0x1A, -0x1A, 0x43, 0x4C, 0x08, 0xA0, 0x42, 0x02, 0xD3, 0x00, 0x1B, 0x5C, 0x08, -0x22, 0x43, 0x8C, 0x08, 0xA0, 0x42, 0x02, 0xD3, 0x00, 0x1B, 0x9C, 0x08, -0x22, 0x43, 0xCC, 0x08, 0xA0, 0x42, 0x02, 0xD3, 0x00, 0x1B, 0xDC, 0x08, -0x22, 0x43, 0x00, 0x28, 0x03, 0xD0, 0x1B, 0x09, 0x01, 0xD0, 0x09, 0x09, -0xE3, 0xE7, 0x10, 0x1C, 0x64, 0x46, 0x00, 0x2C, 0x00, 0xD5, 0x40, 0x42, -0x10, 0xBC, 0x70, 0x47, 0x00, 0x28, 0x06, 0xD0, 0x03, 0xDB, 0x00, 0x20, -0xC0, 0x43, 0x40, 0x08, 0x01, 0xE0, 0x80, 0x20, 0x00, 0x06, 0x07, 0xB4, -0x02, 0x48, 0x02, 0xA1, 0x40, 0x18, 0x02, 0x90, 0x03, 0xBD, 0xC0, 0x46, -0x19, 0x00, 0x00, 0x00, 0x00, 0x29, 0xEB, 0xD0, 0x03, 0xB5, 0xFF, 0xF7, -0xA7, 0xFF, 0x0E, 0xBC, 0x42, 0x43, 0x89, 0x1A, 0x18, 0x47, 0xC0, 0x46, -0x70, 0x47, 0xC0, 0x46, 0xF0, 0xB5, 0x05, 0x1C, 0x0F, 0x2A, 0x2F, 0xD9, -0x0B, 0x1C, 0x03, 0x43, 0x05, 0x1C, 0x9C, 0x07, 0x2C, 0xD1, 0x0C, 0x1C, -0x03, 0x1C, 0x15, 0x1C, 0x26, 0x68, 0x10, 0x3D, 0x1E, 0x60, 0x66, 0x68, -0x5E, 0x60, 0xA6, 0x68, 0x9E, 0x60, 0xE6, 0x68, 0x10, 0x34, 0xDE, 0x60, -0x10, 0x33, 0x0F, 0x2D, 0xF2, 0xD8, 0x13, 0x1C, 0x10, 0x3B, 0x1B, 0x09, -0x01, 0x33, 0x1B, 0x01, 0xC5, 0x18, 0xC9, 0x18, 0x0F, 0x23, 0x1A, 0x40, -0x03, 0x2A, 0x0F, 0xD9, 0x0E, 0x1C, 0x2C, 0x1C, 0x13, 0x1C, 0x80, 0xCE, -0x04, 0x3B, 0x80, 0xC4, 0x03, 0x2B, 0xFA, 0xD8, 0x13, 0x1F, 0x9B, 0x08, -0x01, 0x33, 0x9B, 0x00, 0x03, 0x24, 0x22, 0x40, 0xC9, 0x18, 0xED, 0x18, -0x00, 0x2A, 0x05, 0xD0, 0x00, 0x23, 0xCC, 0x5C, 0xEC, 0x54, 0x01, 0x33, -0x93, 0x42, 0xFA, 0xD1, 0xF0, 0xBD, 0xC0, 0x46, 0x50, 0x61, 0x6C, 0x6D, -0x20, 0x49, 0x6E, 0x69, 0x74, 0x00, 0x27, 0x45, 0x6E, 0x74, 0x65, 0x72, -0x27, 0x20, 0x4E, 0x00, 0x4E, 0x2D, 0x6C, 0x65, 0x73, 0x73, 0x21, 0x00, -0x27, 0x45, 0x78, 0x69, 0x74, 0x27, 0x20, 0x4E, 0x00, 0x4E, 0x20, 0x53, -0x2F, 0x50, 0x00, 0x53, 0x6C, 0x65, 0x65, 0x70, 0x00, 0x53, 0x2D, 0x72, -0x65, 0x73, 0x65, 0x74, 0x00, 0x46, 0x41, 0x53, 0x54, 0x00, 0x49, 0x64, -0x6C, 0x65, 0x00, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x00, 0x53, 0x70, -0x65, 0x63, 0x74, 0x00, 0x53, 0x74, 0x61, 0x63, 0x6B, 0x21, 0x00, 0x52, -0x45, 0x47, 0x56, 0x41, 0x4C, 0x00, 0x44, 0x65, 0x6C, 0x61, 0x79, 0x00, -0x4F, 0x53, 0x43, 0x00, 0x4E, 0x4F, 0x49, 0x53, 0x45, 0x00, 0x54, 0x6F, -0x75, 0x63, 0x68, 0x20, 0x4F, 0x6E, 0x00, 0x54, 0x6F, 0x75, 0x63, 0x68, -0x20, 0x4F, 0x46, 0x46, 0x00, 0x4C, 0x54, 0x5F, 0x50, 0x52, 0x4F, 0x46, -0x49, 0x4C, 0x49, 0x4E, 0x47, 0x00, 0x46, 0x69, 0x78, 0x65, 0x64, 0x00, -0x47, 0x2D, 0x41, 0x66, 0x74, 0x65, 0x72, 0x00, 0x3D, 0x48, 0x6F, 0x76, -0x6F, 0x72, 0x00, 0x12, 0x0E, 0x07, 0x0D, 0x0A, 0x12, 0x04, 0x06, 0x0C, -0x09, 0x12, 0x0F, 0x05, 0x11, 0x08, 0x12, 0x00, 0x01, 0x10, 0x02, 0x45, -0x72, 0x72, 0x00, 0x4B, 0x65, 0x79, 0x20, 0x52, 0x00, 0x52, 0x45, 0x46, -0x20, 0x49, 0x4E, 0x49, 0x54, 0x00, 0x43, 0x6D, 0x44, 0x65, 0x6C, 0x74, -0x61, 0x20, 0x52, 0x65, 0x66, 0x2F, 0x52, 0x65, 0x61, 0x6C, 0x00, 0x52, -0x61, 0x77, 0x00, 0x4D, 0x41, 0x58, 0x20, 0x49, 0x00, 0x43, 0x4D, 0x5F, -0x44, 0x45, 0x4C, 0x54, 0x41, 0x5F, 0x4D, 0x41, 0x58, 0x5F, 0x4D, 0x49, -0x4E, 0x00, 0x54, 0x78, 0x6C, 0x65, 0x73, 0x73, 0x00, 0x44, 0x69, 0x66, -0x66, 0x00, 0x44, 0x49, 0x46, 0x46, 0x2F, 0x4E, 0x00, 0x42, 0x69, 0x67, -0x20, 0x47, 0x72, 0x61, 0x64, 0x00, 0x4E, 0x65, 0x67, 0x2D, 0x45, 0x64, -0x67, 0x65, 0x00, 0x52, 0x65, 0x66, 0x00, 0x00, 0x2D, 0x49, 0x00, 0x00, -0xFF, 0x00, 0x00, 0x01, 0x00, 0xFF, 0x01, 0x00, 0xFF, 0x00, 0x00, 0x00, -0x01, 0x00, 0x00, 0x00, 0xA0, 0x0D, 0x00, 0x20, 0x28, 0x02, 0x00, 0x20, -0x0C, 0x00, 0x00, 0x00, 0x54, 0x11, 0x00, 0x20, 0x01, 0x02, 0xFF, 0x00, -0x01, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x45, 0x4D, 0x31, 0x48, 0x30, -0x50, 0x52, 0x34, 0x35, 0x08, 0xB5, 0x00, 0x28, 0x02, 0xD0, 0x01, 0x28, -0x24, 0xD1, 0x07, 0xE0, 0x12, 0x4B, 0x13, 0x4A, 0x1A, 0x60, 0x13, 0x4B, -0x58, 0x60, 0x98, 0x60, 0xD8, 0x60, 0x1B, 0xE0, 0x11, 0x4B, 0x1B, 0x68, -0x10, 0x2B, 0x15, 0xD1, 0x10, 0x4A, 0x11, 0x4B, 0x1A, 0x60, 0x11, 0x4A, -0x11, 0x4B, 0x1A, 0x60, 0x11, 0x4A, 0x12, 0x4B, 0x1A, 0x60, 0x12, 0x4A, -0x12, 0x4B, 0x1A, 0x60, 0x12, 0x4A, 0x13, 0x4B, 0x1A, 0x60, 0x13, 0x4A, -0x13, 0x4B, 0x1A, 0x60, 0x13, 0x4A, 0x14, 0x4B, 0x1A, 0x60, 0x01, 0xE0, -0xFE, 0xF7, 0xC8, 0xF8, 0x08, 0xBD, 0xC0, 0x46, 0xF8, 0x01, 0x00, 0x20, -0xC1, 0x68, 0x00, 0x00, 0xF8, 0x08, 0x00, 0x20, 0x50, 0x11, 0x00, 0x20, -0xA9, 0x5C, 0x00, 0x00, 0x68, 0x00, 0x00, 0x20, 0x81, 0x68, 0x00, 0x00, -0x6C, 0x00, 0x00, 0x20, 0x2D, 0x66, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, -0x49, 0x71, 0x00, 0x00, 0x18, 0x00, 0x00, 0x20, 0x05, 0x62, 0x00, 0x00, -0x1C, 0x00, 0x00, 0x20, 0xE9, 0x61, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, -0xAB, 0x5C, 0x00, 0x00, 0x24, 0x00, 0x00, 0x20, 0x70, 0x47, 0xA0, 0x23, -0xDB, 0x05, 0x01, 0x22, 0x1A, 0x72, 0x09, 0x49, 0x10, 0x22, 0x1A, 0x72, -0x00, 0x22, 0x0A, 0x70, 0x1A, 0x72, 0x07, 0x4B, 0x80, 0x22, 0x19, 0x68, -0x52, 0x00, 0x0A, 0x43, 0x1A, 0x60, 0x1A, 0x68, 0x80, 0x23, 0xDB, 0x05, -0x99, 0x68, 0x9A, 0x60, 0x70, 0x47, 0xC0, 0x46, 0x0C, 0x00, 0x00, 0x20, -0x14, 0x00, 0x00, 0x20, 0x00, 0xB5, 0x5A, 0x28, 0x07, 0xD0, 0x05, 0x4B, -0x59, 0x28, 0x01, 0xDD, 0xB4, 0x22, 0x10, 0x1A, 0x40, 0x00, 0x18, 0x5A, -0x00, 0xE0, 0x02, 0x48, 0x00, 0xBD, 0xC0, 0x46, 0x90, 0x72, 0x00, 0x00, -0xFF, 0xFF, 0x00, 0x00, 0x00, 0xB5, 0x00, 0x28, 0x0E, 0xD0, 0xB4, 0x28, -0x0E, 0xD0, 0x08, 0x4B, 0x5A, 0x28, 0x04, 0xDC, 0x5A, 0x22, 0x10, 0x1A, -0x40, 0x00, 0x18, 0x5A, 0x07, 0xE0, 0x5A, 0x38, 0x40, 0x00, 0x18, 0x5A, -0x40, 0x42, 0x02, 0xE0, 0x02, 0x48, 0x00, 0xE0, 0x02, 0x48, 0x00, 0xBD, -0x90, 0x72, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0x00, 0xFF, 0xFF, -0xF0, 0xB5, 0x9B, 0xB0, 0x0E, 0x93, 0x11, 0x90, 0x0B, 0x91, 0x08, 0x78, -0xC9, 0x4B, 0x03, 0x90, 0x49, 0x78, 0x16, 0x1C, 0x49, 0xB2, 0x12, 0x91, -0x0A, 0x20, 0x1A, 0x5E, 0x00, 0x25, 0x13, 0x92, 0xC5, 0x4A, 0x2C, 0x1C, -0x28, 0x20, 0x11, 0x5E, 0x2F, 0x1C, 0x14, 0x91, 0x59, 0x68, 0x15, 0x91, -0xC2, 0x49, 0x09, 0x68, 0x0D, 0x91, 0x08, 0x21, 0x58, 0x5E, 0x1B, 0x68, -0x17, 0x90, 0x26, 0x21, 0x50, 0x5E, 0x19, 0x93, 0x18, 0x90, 0x04, 0x95, -0x06, 0x95, 0x05, 0x95, 0x09, 0x95, 0x0A, 0x95, 0x08, 0x95, 0x95, 0xE0, -0x03, 0x9A, 0x14, 0x98, 0x15, 0x99, 0x50, 0x43, 0xFF, 0xF7, 0xFA, 0xFC, -0x13, 0x9B, 0x00, 0xB2, 0x18, 0x18, 0x33, 0x68, 0x0B, 0x99, 0xC3, 0x1A, -0x0B, 0x98, 0x0C, 0x93, 0x80, 0x78, 0x03, 0x9A, 0x02, 0x90, 0xC9, 0x78, -0x01, 0x32, 0x49, 0xB2, 0x93, 0x01, 0x16, 0x91, 0x0F, 0x92, 0x10, 0x93, -0x75, 0xE0, 0x02, 0x9A, 0x10, 0x99, 0x02, 0x32, 0x88, 0x18, 0xAC, 0x49, -0x43, 0x5C, 0x0E, 0x2B, 0x27, 0xD9, 0x04, 0x23, 0x94, 0x46, 0xAA, 0x48, -0x01, 0x3B, 0xDB, 0xB2, 0xC2, 0x56, 0x03, 0x99, 0x8A, 0x18, 0xA8, 0x49, -0x01, 0x32, 0xC8, 0x56, 0x02, 0x99, 0x92, 0x01, 0x08, 0x18, 0x02, 0x30, -0xA2, 0x49, 0x10, 0x18, 0x0A, 0x5C, 0x01, 0x3A, 0xD2, 0xB2, 0x0D, 0x2A, -0x0E, 0xD8, 0xA2, 0x48, 0x0E, 0x99, 0x82, 0x56, 0x8A, 0x42, 0x09, 0xD1, -0x10, 0x9B, 0x62, 0x46, 0x9A, 0x18, 0x9F, 0x48, 0x52, 0x00, 0x13, 0x5A, -0x0D, 0x99, 0x5B, 0x1A, 0x07, 0x93, 0x12, 0xE0, 0x00, 0x2B, 0xDA, 0xD1, -0x41, 0xE0, 0x00, 0x2B, 0x3F, 0xD0, 0x98, 0x4A, 0x0E, 0x99, 0xD3, 0x18, -0x01, 0x3B, 0x1B, 0x78, 0x5B, 0xB2, 0x8B, 0x42, 0x37, 0xD1, 0x95, 0x4A, -0x40, 0x00, 0x83, 0x5A, 0x0D, 0x98, 0x1B, 0x1A, 0x07, 0x93, 0x07, 0x99, -0x00, 0x29, 0x2E, 0xD0, 0x02, 0x9A, 0x18, 0x98, 0x19, 0x99, 0x50, 0x43, -0xFF, 0xF7, 0x9E, 0xFC, 0x07, 0x9A, 0x17, 0x9B, 0x08, 0x99, 0x00, 0xB2, -0x89, 0x18, 0x18, 0x18, 0x73, 0x68, 0x08, 0x91, 0x0C, 0x99, 0xC0, 0x1A, -0x13, 0x1C, 0x4B, 0x43, 0x42, 0x43, 0x00, 0x28, 0x0B, 0xDC, 0x00, 0x29, -0x04, 0xDD, 0xFF, 0x18, 0x0A, 0x9B, 0x9B, 0x1A, 0x0A, 0x93, 0x12, 0xE0, -0x09, 0x98, 0xE4, 0x1A, 0x80, 0x1A, 0x09, 0x90, 0x0D, 0xE0, 0x0C, 0x99, -0x00, 0x29, 0x06, 0xDC, 0x05, 0x98, 0x06, 0x99, 0xC0, 0x1A, 0x89, 0x18, -0x05, 0x90, 0x06, 0x91, 0x03, 0xE0, 0x04, 0x98, 0xAD, 0x18, 0xC0, 0x18, -0x04, 0x90, 0x02, 0x9B, 0x01, 0x33, 0xDB, 0xB2, 0x02, 0x93, 0x02, 0x99, -0x16, 0x9A, 0x91, 0x42, 0x85, 0xDD, 0x0F, 0xAB, 0x1B, 0x78, 0x03, 0x93, -0x03, 0x98, 0x12, 0x99, 0x88, 0x42, 0x00, 0xDC, 0x64, 0xE7, 0x05, 0x9A, -0x04, 0x98, 0x94, 0x46, 0x63, 0x46, 0x3A, 0x1B, 0x19, 0x1A, 0x02, 0x97, -0xD1, 0x42, 0x02, 0xD4, 0x00, 0x21, 0x07, 0x91, 0x0D, 0xE0, 0x06, 0x9A, -0x06, 0x95, 0x15, 0x1C, 0x04, 0x9A, 0x09, 0x99, 0x04, 0x93, 0x0A, 0x9B, -0x05, 0x92, 0x27, 0x1C, 0x01, 0x22, 0x02, 0x9C, 0x0A, 0x91, 0x09, 0x93, -0x07, 0x92, 0x05, 0x9B, 0x04, 0x99, 0xF8, 0x18, 0x00, 0x19, 0x40, 0x18, -0x08, 0x99, 0xFF, 0xF7, 0x43, 0xFC, 0x02, 0x90, 0x00, 0x28, 0x64, 0xD0, -0x0A, 0x9A, 0x06, 0x9B, 0x09, 0x99, 0xD0, 0x18, 0x40, 0x18, 0x40, 0x19, -0x08, 0x99, 0xFF, 0xF7, 0x37, 0xFC, 0x03, 0x90, 0x03, 0x9A, 0x5A, 0x20, -0x00, 0x2A, 0x56, 0xD0, 0x02, 0x9B, 0x2D, 0x20, 0x9A, 0x42, 0x52, 0xD0, -0x93, 0x42, 0x24, 0xDA, 0x11, 0x1C, 0x98, 0x01, 0xFF, 0xF7, 0x28, 0xFC, -0x05, 0x1C, 0x05, 0x98, 0x04, 0x99, 0x3F, 0x1B, 0x3F, 0x18, 0x78, 0x1A, -0xC3, 0x43, 0xDB, 0x17, 0x18, 0x40, 0x08, 0x99, 0xFF, 0xF7, 0x1C, 0xFC, -0x03, 0x99, 0x80, 0x01, 0xFF, 0xF7, 0x18, 0xFC, 0x4B, 0x4B, 0x1A, 0x1C, -0x3F, 0x28, 0x00, 0xDD, 0x3F, 0x20, 0x1B, 0x5C, 0x3F, 0x2D, 0x00, 0xDD, -0x3F, 0x25, 0x51, 0x5D, 0x2D, 0x20, 0x41, 0x1A, 0xC9, 0x18, 0x58, 0x43, -0xFF, 0xF7, 0x08, 0xFC, 0x2B, 0xE0, 0x03, 0x9A, 0x02, 0x99, 0x90, 0x01, -0xFF, 0xF7, 0x02, 0xFC, 0x3F, 0x28, 0x00, 0xDD, 0x3F, 0x20, 0x3F, 0x4B, -0x09, 0x99, 0x1C, 0x5C, 0x0A, 0x9B, 0x06, 0x9A, 0x58, 0x1A, 0x80, 0x18, -0x40, 0x1B, 0xC3, 0x43, 0xDB, 0x17, 0x08, 0x99, 0x18, 0x40, 0xFF, 0xF7, -0xF1, 0xFB, 0x02, 0x99, 0x80, 0x01, 0xFF, 0xF7, 0xED, 0xFB, 0x3F, 0x28, -0x00, 0xDD, 0x3F, 0x20, 0x34, 0x4B, 0x5A, 0x22, 0x1B, 0x5C, 0x2D, 0x20, -0xD1, 0x1A, 0x00, 0x1B, 0x12, 0x1B, 0x48, 0x43, 0x5A, 0x43, 0x87, 0x23, -0x1C, 0x1B, 0x80, 0x18, 0x61, 0x1A, 0xFF, 0xF7, 0xDB, 0xFB, 0x07, 0x9B, -0x00, 0x2B, 0x00, 0xD0, 0x40, 0x42, 0x11, 0x99, 0x5A, 0x24, 0x24, 0x1A, -0x08, 0x70, 0x20, 0x1C, 0xFF, 0xF7, 0x8A, 0xFE, 0x09, 0x90, 0x20, 0x1C, -0xFF, 0xF7, 0x74, 0xFE, 0x0B, 0x9A, 0x0A, 0x90, 0x01, 0x23, 0xD3, 0x56, -0x17, 0x78, 0x0F, 0x93, 0x1A, 0x4B, 0x1B, 0x4A, 0x0A, 0x21, 0x58, 0x5E, -0x00, 0x24, 0x10, 0x90, 0x28, 0x21, 0x50, 0x5E, 0x18, 0x49, 0x12, 0x90, -0x09, 0x68, 0x58, 0x68, 0x07, 0x91, 0x13, 0x90, 0x08, 0x20, 0x19, 0x5E, -0x1B, 0x68, 0x15, 0x91, 0x26, 0x20, 0x11, 0x5E, 0x17, 0x93, 0x16, 0x91, -0x05, 0x94, 0x04, 0x94, 0x02, 0x94, 0xA8, 0xE0, 0x12, 0x98, 0x13, 0x99, -0x78, 0x43, 0xFF, 0xF7, 0xA7, 0xFB, 0x10, 0x99, 0x00, 0xB2, 0x33, 0x68, -0x08, 0x18, 0xC3, 0x1A, 0x03, 0x93, 0x0B, 0x9A, 0x03, 0x99, 0x03, 0x23, -0x0A, 0x98, 0xD3, 0x56, 0x95, 0x78, 0x09, 0x9A, 0x48, 0x43, 0x4A, 0x43, -0x14, 0x93, 0x7B, 0x1C, 0x18, 0x90, 0x98, 0x01, 0x19, 0x92, 0x0C, 0x93, -0x0D, 0x90, 0x87, 0xE0, 0x24, 0x09, 0x00, 0x20, 0xAE, 0x09, 0x00, 0x20, -0x38, 0x0D, 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0xF8, 0x59, 0x00, 0x00, -0xF4, 0x59, 0x00, 0x00, 0xEC, 0x02, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, -0x50, 0x72, 0x00, 0x00, 0x0D, 0x99, 0xAA, 0x1C, 0x88, 0x18, 0x4E, 0x49, -0x43, 0x5C, 0x0E, 0x2B, 0x25, 0xD9, 0x04, 0x23, 0x94, 0x46, 0x4C, 0x48, -0x01, 0x3B, 0xDB, 0xB2, 0x4B, 0x49, 0xC2, 0x56, 0xC8, 0x56, 0xBA, 0x18, -0x01, 0x32, 0x28, 0x18, 0x92, 0x01, 0x02, 0x30, 0x45, 0x49, 0x10, 0x18, -0x0A, 0x5C, 0x01, 0x3A, 0xD2, 0xB2, 0x0D, 0x2A, 0x0E, 0xD8, 0x45, 0x48, -0x0E, 0x99, 0x82, 0x56, 0x8A, 0x42, 0x09, 0xD1, 0x0D, 0x9B, 0x62, 0x46, -0x9A, 0x18, 0x42, 0x48, 0x52, 0x00, 0x13, 0x5A, 0x07, 0x99, 0x5B, 0x1A, -0x06, 0x93, 0x12, 0xE0, 0x00, 0x2B, 0xDC, 0xD1, 0x46, 0xE0, 0x00, 0x2B, -0x44, 0xD0, 0x3B, 0x4A, 0x0E, 0x99, 0xD3, 0x18, 0x01, 0x3B, 0x1B, 0x78, -0x5B, 0xB2, 0x8B, 0x42, 0x3C, 0xD1, 0x38, 0x4A, 0x40, 0x00, 0x83, 0x5A, -0x07, 0x98, 0x1B, 0x1A, 0x06, 0x93, 0x06, 0x99, 0x00, 0x29, 0x33, 0xD0, -0x16, 0x98, 0x17, 0x99, 0x68, 0x43, 0xFF, 0xF7, 0x39, 0xFB, 0x15, 0x9A, -0x00, 0xB2, 0x73, 0x68, 0x10, 0x18, 0x1B, 0x1A, 0x01, 0x93, 0x01, 0x98, -0x03, 0x9B, 0x06, 0x9A, 0x09, 0x99, 0x5A, 0x43, 0x41, 0x43, 0x06, 0x9B, -0x43, 0x43, 0x18, 0x98, 0x09, 0x1A, 0x00, 0x29, 0x04, 0xDD, 0x05, 0x99, -0xE4, 0x18, 0x89, 0x18, 0x05, 0x91, 0x03, 0xE0, 0x05, 0x98, 0xE4, 0x1A, -0x80, 0x1A, 0x05, 0x90, 0x01, 0x99, 0x0A, 0x98, 0x48, 0x43, 0x19, 0x99, -0x40, 0x18, 0x00, 0x28, 0x06, 0xDD, 0x02, 0x98, 0x04, 0x99, 0x80, 0x18, -0xC9, 0x18, 0x02, 0x90, 0x04, 0x91, 0x05, 0xE0, 0x02, 0x98, 0x04, 0x99, -0x80, 0x1A, 0xC9, 0x1A, 0x02, 0x90, 0x04, 0x91, 0x01, 0x35, 0xED, 0xB2, -0x14, 0x9A, 0x95, 0x42, 0x86, 0xDD, 0x0C, 0xAB, 0x1F, 0x78, 0x0F, 0x98, -0x87, 0x42, 0x00, 0xDC, 0x52, 0xE7, 0x08, 0x99, 0x02, 0x98, 0xFF, 0xF7, -0xFB, 0xFA, 0x08, 0x99, 0x07, 0x1C, 0x04, 0x98, 0xFF, 0xF7, 0xF6, 0xFA, -0x08, 0x99, 0x05, 0x1C, 0x05, 0x98, 0xFF, 0xF7, 0xF1, 0xFA, 0x08, 0x99, -0x06, 0x1C, 0x20, 0x1C, 0xFF, 0xF7, 0xEC, 0xFA, 0x7F, 0x43, 0x76, 0x43, -0x6D, 0x43, 0x40, 0x43, 0x11, 0x99, 0x7D, 0x19, 0x30, 0x18, 0xAD, 0x11, -0x80, 0x11, 0x1B, 0xB0, 0x4D, 0x60, 0x88, 0x60, 0xF0, 0xBD, 0xC0, 0x46, -0x00, 0x20, 0x00, 0x40, 0xF8, 0x59, 0x00, 0x00, 0xF4, 0x59, 0x00, 0x00, -0xEC, 0x02, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x08, 0xB5, 0x05, 0x4B, -0x1B, 0x88, 0xDB, 0xB2, 0x10, 0x2B, 0x01, 0xD0, 0xAF, 0x2B, 0x01, 0xD1, -0xFD, 0xF7, 0x8A, 0xF9, 0x08, 0xBD, 0xC0, 0x46, 0x28, 0x00, 0x00, 0x20, -0x38, 0xB5, 0xC1, 0x4A, 0x13, 0x88, 0x1B, 0xB2, 0xAE, 0x2B, 0x00, 0xD1, -0x59, 0xE1, 0x3B, 0xDC, 0x0C, 0x2B, 0x00, 0xD1, 0xD2, 0xE0, 0x1B, 0xDC, -0x05, 0x2B, 0x00, 0xD1, 0xA6, 0xE0, 0x08, 0xDC, 0x03, 0x2B, 0x00, 0xD1, -0x8F, 0xE0, 0x00, 0xDD, 0x96, 0xE0, 0x02, 0x2B, 0x00, 0xD0, 0xA5, 0xE1, -0x7C, 0xE0, 0x09, 0x2B, 0x00, 0xD1, 0xA4, 0xE0, 0x03, 0xDC, 0x06, 0x2B, -0x00, 0xD0, 0x9D, 0xE1, 0x99, 0xE0, 0x0A, 0x2B, 0x00, 0xD1, 0xAC, 0xE0, -0x0B, 0x2B, 0x00, 0xD0, 0x96, 0xE1, 0xAD, 0xE0, 0x31, 0x2B, 0x00, 0xD1, -0x95, 0xE0, 0x08, 0xDC, 0x10, 0x2B, 0x5A, 0xD0, 0x30, 0x2B, 0x00, 0xD1, -0x9A, 0xE0, 0x0F, 0x2B, 0x00, 0xD0, 0x89, 0xE1, 0x48, 0xE0, 0x62, 0x2B, -0x00, 0xD1, 0x81, 0xE1, 0x03, 0xDC, 0x61, 0x2B, 0x00, 0xD0, 0x81, 0xE1, -0x77, 0xE1, 0x64, 0x2B, 0x00, 0xD1, 0x6F, 0xE1, 0xA8, 0x2B, 0x00, 0xD0, -0x7A, 0xE1, 0x5B, 0xE1, 0xF4, 0x2B, 0x00, 0xD1, 0xBC, 0xE0, 0x19, 0xDC, -0xEF, 0x2B, 0x00, 0xD1, 0x2E, 0xE1, 0x09, 0xDC, 0xBF, 0x2B, 0x00, 0xD1, -0x50, 0xE1, 0xEE, 0x2B, 0x00, 0xD1, 0x23, 0xE1, 0xAF, 0x2B, 0x00, 0xD0, -0x68, 0xE1, 0x11, 0xE1, 0xF1, 0x2B, 0x00, 0xD1, 0x91, 0xE0, 0x00, 0xDA, -0x8C, 0xE0, 0xF2, 0x2B, 0x00, 0xD1, 0x94, 0xE0, 0xF3, 0x2B, 0x00, 0xD0, -0x5C, 0xE1, 0x99, 0xE0, 0xF9, 0x2B, 0x00, 0xD1, 0xCD, 0xE0, 0x0B, 0xDC, -0xF6, 0x2B, 0x00, 0xD1, 0xAD, 0xE0, 0x00, 0xDA, 0xA1, 0xE0, 0xF7, 0x2B, -0x00, 0xD1, 0xAF, 0xE0, 0xF8, 0x2B, 0x00, 0xD0, 0x4C, 0xE1, 0xB7, 0xE0, -0xFB, 0x2B, 0x00, 0xD1, 0xCF, 0xE0, 0x00, 0xDA, 0xC4, 0xE0, 0xFC, 0x2B, -0x00, 0xD1, 0xD3, 0xE0, 0xFD, 0x2B, 0x00, 0xD0, 0x40, 0xE1, 0xD8, 0xE0, -0x83, 0x4C, 0x23, 0x68, 0x00, 0x2B, 0x01, 0xD1, 0xFD, 0xF7, 0x02, 0xF9, -0x22, 0x68, 0x81, 0x4B, 0xD2, 0x00, 0x1A, 0x70, 0x34, 0xE1, 0x80, 0x49, -0x80, 0x4A, 0x00, 0x23, 0x08, 0x78, 0x7D, 0x4D, 0xC0, 0x18, 0x14, 0x5C, -0x58, 0x19, 0x01, 0x33, 0x04, 0x70, 0x08, 0x2B, 0xF6, 0xD1, 0x27, 0xE1, -0x7B, 0x4A, 0x0F, 0x23, 0x26, 0x20, 0x11, 0x5E, 0x28, 0x25, 0x52, 0x5F, -0x09, 0x11, 0x12, 0x12, 0x99, 0x43, 0x13, 0x40, 0x73, 0x4A, 0xCB, 0x18, -0x13, 0x70, 0x70, 0x4B, 0x1A, 0x88, 0x03, 0x23, 0x12, 0xB2, 0x9A, 0x1A, -0x72, 0x4B, 0x19, 0x8D, 0x6E, 0x4B, 0xD1, 0x54, 0x6B, 0x4B, 0x1A, 0x88, -0x04, 0x23, 0x12, 0xB2, 0x9A, 0x1A, 0x6E, 0x4B, 0xD9, 0x8C, 0x6A, 0x4B, -0xD1, 0x54, 0x07, 0xE1, 0x6C, 0x4B, 0xDA, 0x8C, 0x67, 0x4B, 0x1A, 0x70, -0x02, 0xE1, 0x6A, 0x4B, 0x34, 0x33, 0x1A, 0x78, 0x64, 0x4B, 0x1A, 0x70, -0xFC, 0xE0, 0x68, 0x4B, 0x1A, 0x78, 0x62, 0x4B, 0x00, 0x2A, 0x02, 0xD0, -0x02, 0x22, 0x1A, 0x70, 0xF4, 0xE0, 0x01, 0x22, 0x1A, 0x70, 0xF1, 0xE0, -0x62, 0x4B, 0x1A, 0x78, 0x5C, 0x4B, 0x1A, 0x70, 0xEC, 0xE0, 0x61, 0x4B, -0x1A, 0x78, 0x5A, 0x4B, 0x1A, 0x70, 0xE7, 0xE0, 0x12, 0x88, 0x5F, 0x4B, -0x12, 0xB2, 0x19, 0x78, 0x0B, 0x23, 0x9A, 0x1A, 0x55, 0x4B, 0xD1, 0x54, -0x52, 0x4B, 0x1A, 0x88, 0x5A, 0x4B, 0x12, 0xB2, 0x59, 0x78, 0x0C, 0x23, -0x9A, 0x1A, 0x51, 0x4B, 0xD1, 0x54, 0xD5, 0xE0, 0x4F, 0x4B, 0x42, 0x22, -0x1A, 0x70, 0x4C, 0x4B, 0x01, 0x21, 0x1A, 0x88, 0xF1, 0x23, 0x12, 0xB2, -0x9A, 0x1A, 0x4B, 0x4B, 0xD1, 0x54, 0x48, 0x4B, 0x1A, 0x88, 0x4C, 0x4B, -0x12, 0xB2, 0x59, 0x78, 0xF2, 0x23, 0x9A, 0x1A, 0x46, 0x4B, 0xD1, 0x54, -0x43, 0x4B, 0xBB, 0x21, 0x1A, 0x88, 0xF3, 0x23, 0x12, 0xB2, 0x9A, 0x1A, -0x42, 0x4B, 0xD1, 0x54, 0x3F, 0x4B, 0x1A, 0x88, 0x48, 0x4B, 0x12, 0xB2, -0x19, 0x78, 0xF4, 0x23, 0x9A, 0x1A, 0x3E, 0x4B, 0xD1, 0x54, 0x3B, 0x4B, -0x1A, 0x88, 0x45, 0x4B, 0x12, 0xB2, 0x19, 0x78, 0xF5, 0x23, 0x9A, 0x1A, -0x39, 0x4B, 0xD1, 0x54, 0xA6, 0xE0, 0x39, 0x4B, 0x3A, 0x4A, 0x1B, 0x78, -0xD3, 0x18, 0xDA, 0x78, 0x35, 0x4B, 0x1A, 0x70, 0x32, 0x4B, 0x37, 0x49, -0x1A, 0x88, 0x34, 0x4B, 0x12, 0xB2, 0x1B, 0x78, 0xCB, 0x18, 0x19, 0x79, -0xF7, 0x23, 0x9A, 0x1A, 0x2F, 0x4B, 0xD1, 0x54, 0x2C, 0x4B, 0x1A, 0x88, -0x30, 0x4B, 0x12, 0xB2, 0x59, 0x79, 0xF8, 0x23, 0x9A, 0x1A, 0x2B, 0x4B, -0xD1, 0x54, 0x28, 0x4B, 0x1A, 0x88, 0x2C, 0x4B, 0x12, 0xB2, 0x99, 0x79, -0xF9, 0x23, 0x9A, 0x1A, 0x26, 0x4B, 0xD1, 0x54, 0x23, 0x4B, 0x1A, 0x88, -0x27, 0x4B, 0x12, 0xB2, 0xD9, 0x79, 0xFA, 0x23, 0x9A, 0x1A, 0x22, 0x4B, -0xD1, 0x54, 0x1F, 0x4B, 0x1A, 0x88, 0x23, 0x4B, 0x12, 0xB2, 0x19, 0x7A, -0xFB, 0x23, 0x9A, 0x1A, 0x1D, 0x4B, 0xD1, 0x54, 0x1A, 0x4B, 0x1A, 0x88, -0x1E, 0x4B, 0x12, 0xB2, 0x59, 0x7A, 0xFC, 0x23, 0x9A, 0x1A, 0x19, 0x4B, -0xD1, 0x54, 0x16, 0x4B, 0x1A, 0x88, 0x1A, 0x4B, 0x12, 0xB2, 0x99, 0x7A, -0xFD, 0x23, 0x9A, 0x1A, 0x14, 0x4B, 0xD1, 0x54, 0x5C, 0xE0, 0x1D, 0x4B, -0x1A, 0x78, 0x12, 0x4B, 0x1A, 0x70, 0xFD, 0xF7, 0x1F, 0xF8, 0x55, 0xE0, -0x1A, 0x49, 0x10, 0x4A, 0x00, 0x23, 0x0C, 0x68, 0x10, 0x78, 0x0D, 0x4D, -0x20, 0x18, 0xC4, 0x5C, 0x58, 0x19, 0x01, 0x33, 0x04, 0x70, 0x08, 0x2B, -0xF5, 0xD1, 0x47, 0xE0, 0x0B, 0x4B, 0x1A, 0x7E, 0x07, 0x4B, 0x1A, 0x70, -0x04, 0x4B, 0x1A, 0x88, 0x08, 0x4B, 0x12, 0xB2, 0xD9, 0x7D, 0xEF, 0x23, -0x9A, 0x1A, 0x03, 0x4B, 0xD1, 0x54, 0x39, 0xE0, 0x28, 0x00, 0x00, 0x20, -0x98, 0x0D, 0x00, 0x20, 0x0C, 0x00, 0x00, 0x50, 0x2A, 0x00, 0x00, 0x20, -0xEC, 0x11, 0x00, 0x20, 0xAE, 0x09, 0x00, 0x20, 0x48, 0x0D, 0x00, 0x20, -0xDD, 0x01, 0x00, 0x20, 0xDF, 0x01, 0x00, 0x20, 0x0A, 0x03, 0x00, 0x20, -0xFF, 0x73, 0x00, 0x00, 0xFF, 0x7B, 0x00, 0x00, 0xF6, 0x03, 0x00, 0x20, -0x34, 0x0D, 0x00, 0x20, 0x0F, 0x49, 0x10, 0x4A, 0x00, 0x23, 0x0C, 0x68, -0x10, 0x78, 0x0F, 0x4D, 0x20, 0x18, 0xC4, 0x5C, 0x58, 0x19, 0x01, 0x33, -0x04, 0x70, 0x08, 0x2B, 0xF5, 0xD1, 0xFC, 0xF7, 0xD7, 0xFF, 0x0D, 0xE0, -0x0A, 0x4B, 0x1A, 0x78, 0x08, 0x4B, 0x1A, 0x70, 0x08, 0xE0, 0x09, 0x4B, -0x9A, 0x78, 0x06, 0x4B, 0x1A, 0x70, 0x03, 0xE0, 0x06, 0x4B, 0xDA, 0x78, -0x03, 0x4B, 0x1A, 0x70, 0x38, 0xBD, 0xC0, 0x46, 0x34, 0x0D, 0x00, 0x20, -0x2A, 0x00, 0x00, 0x20, 0x0C, 0x00, 0x00, 0x50, 0xFF, 0x5B, 0x00, 0x00, -0x35, 0x00, 0x00, 0x20, 0x08, 0xB5, 0x03, 0x1C, 0x50, 0x1E, 0x06, 0x28, -0x35, 0xD8, 0xFF, 0xF7, 0x93, 0xF8, 0x04, 0x0A, 0x2A, 0x1B, 0x15, 0x2A, -0x2A, 0x00, 0x18, 0x4A, 0x01, 0x23, 0x13, 0x70, 0x17, 0x4A, 0x13, 0x70, -0x29, 0xE0, 0x16, 0x4A, 0x9B, 0x01, 0x59, 0x18, 0x02, 0x20, 0x15, 0x4B, -0x10, 0x70, 0x49, 0x00, 0x14, 0x4A, 0xC9, 0x18, 0x11, 0x60, 0x1E, 0xE0, -0xFC, 0xF7, 0x9E, 0xFF, 0x0E, 0x4B, 0x00, 0x22, 0x1A, 0x70, 0x18, 0xE0, -0x0D, 0x4A, 0x5B, 0x01, 0x59, 0x18, 0x01, 0x20, 0x0E, 0x4B, 0x10, 0x70, -0x5A, 0x56, 0x0E, 0x4B, 0x00, 0x2A, 0x00, 0xDC, 0x00, 0x22, 0x1A, 0x80, -0x09, 0x4A, 0x13, 0x60, 0x09, 0xE0, 0x06, 0x4A, 0x02, 0x20, 0x5B, 0x01, -0x10, 0x70, 0xC9, 0x18, 0x08, 0x4A, 0x49, 0x00, 0x89, 0x18, 0x04, 0x4A, -0x11, 0x60, 0x08, 0xBD, 0xE5, 0x01, 0x00, 0x20, 0xF6, 0x03, 0x00, 0x20, -0x84, 0x40, 0x00, 0x40, 0x34, 0x0D, 0x00, 0x20, 0x64, 0x0E, 0x00, 0x20, -0x08, 0x03, 0x00, 0x20, 0xF8, 0x03, 0x00, 0x20, 0xF0, 0xB5, 0x87, 0x4C, -0x23, 0x23, 0xE3, 0x5C, 0x8D, 0xB0, 0x00, 0x2B, 0x12, 0xD0, 0x01, 0x3B, -0xDB, 0xB2, 0x84, 0x4D, 0x84, 0x49, 0x00, 0xE0, 0x13, 0x1C, 0x9A, 0x00, -0xD2, 0x18, 0x52, 0x00, 0x8A, 0x18, 0x3C, 0x26, 0x90, 0x5F, 0x5A, 0x1E, -0x46, 0x1E, 0xB0, 0x41, 0xE8, 0x54, 0xD2, 0xB2, 0x00, 0x2B, 0xF1, 0xD1, -0xFC, 0xF7, 0x82, 0xFF, 0x00, 0x28, 0xFB, 0xD1, 0x23, 0x23, 0xE4, 0x5C, -0x07, 0x94, 0x00, 0x2C, 0x00, 0xD1, 0xA3, 0xE0, 0x78, 0x4B, 0x60, 0x22, -0x19, 0x78, 0x78, 0x4B, 0x09, 0x01, 0x1B, 0x78, 0x52, 0x42, 0x0A, 0x43, -0x76, 0x4C, 0x20, 0x21, 0x1B, 0x01, 0x0B, 0x43, 0x34, 0x21, 0x61, 0x5C, -0x74, 0x48, 0x09, 0x91, 0x00, 0x21, 0x74, 0x4F, 0x08, 0x91, 0x6E, 0x49, -0xD2, 0xB2, 0xDB, 0xB2, 0x0A, 0x92, 0x0B, 0x93, 0xC4, 0x19, 0x00, 0x23, -0x01, 0x22, 0x01, 0x91, 0x3E, 0xE0, 0x01, 0x99, 0x6E, 0x4D, 0x6F, 0x4F, -0xC9, 0x18, 0x8C, 0x46, 0x79, 0x5D, 0x6E, 0x4F, 0xFD, 0x18, 0x67, 0x46, -0xBF, 0x88, 0x04, 0x97, 0xAF, 0x88, 0x06, 0x97, 0x67, 0x46, 0x3F, 0x8C, -0xBC, 0x46, 0x2F, 0x8B, 0x03, 0x97, 0x00, 0x29, 0x22, 0xD1, 0x61, 0x46, -0x09, 0xB2, 0x6F, 0x46, 0x05, 0x91, 0x0C, 0x37, 0x00, 0x21, 0x79, 0x5E, -0x05, 0x9F, 0x79, 0x1A, 0xCF, 0x17, 0xC9, 0x19, 0x79, 0x40, 0x09, 0x9F, -0xB9, 0x42, 0x65, 0xDA, 0x10, 0x27, 0x69, 0x46, 0x79, 0x5E, 0x03, 0x91, -0x69, 0x46, 0x18, 0x31, 0x00, 0x27, 0xCF, 0x5F, 0x03, 0x99, 0xCF, 0x1B, -0xF9, 0x17, 0x7F, 0x18, 0x4F, 0x40, 0x09, 0x99, 0xB9, 0x42, 0x55, 0xDD, -0x2C, 0x27, 0xED, 0x5F, 0x00, 0x2D, 0x57, 0xDD, 0x07, 0x9E, 0x55, 0x1C, -0x02, 0x33, 0x01, 0x30, 0x0C, 0x34, 0x96, 0x42, 0x45, 0xDD, 0x2A, 0x1C, -0x01, 0x9D, 0x9E, 0x00, 0xF6, 0x18, 0xAE, 0x19, 0x3C, 0x27, 0xF5, 0x5F, -0x00, 0x2D, 0xB8, 0xDC, 0x4D, 0x4E, 0xF5, 0x18, 0x2C, 0x27, 0xEE, 0x5F, -0x00, 0x2E, 0xE9, 0xDD, 0x06, 0x78, 0x00, 0x2E, 0xE6, 0xD0, 0x05, 0x21, -0x69, 0x56, 0x2E, 0x8B, 0x8C, 0x46, 0x08, 0x99, 0xAD, 0x88, 0xC9, 0x00, -0x37, 0xB2, 0x03, 0x91, 0x04, 0x95, 0x61, 0x46, 0x0F, 0x25, 0x0D, 0x40, -0x3F, 0x11, 0x0F, 0x21, 0x8F, 0x43, 0x03, 0x99, 0x2F, 0x43, 0x8C, 0x46, -0x3E, 0x49, 0x08, 0x9D, 0x8C, 0x44, 0x0B, 0x99, 0x01, 0x35, 0x11, 0x43, -0x05, 0x95, 0x65, 0x46, 0x29, 0x70, 0x6F, 0x70, 0x6D, 0x46, 0x10, 0x27, -0x7F, 0x5D, 0x00, 0x21, 0x65, 0x46, 0xEE, 0x70, 0xAF, 0x70, 0x29, 0x71, -0x69, 0x71, 0xA9, 0x71, 0xE9, 0x71, 0x14, 0x26, 0x6D, 0x46, 0x75, 0x5D, -0x07, 0x9E, 0x08, 0x95, 0x01, 0x70, 0x55, 0x1C, 0x02, 0x33, 0x01, 0x30, -0x0C, 0x34, 0x96, 0x42, 0xB9, 0xDC, 0x08, 0x9F, 0x00, 0x2F, 0x42, 0xD1, -0x0D, 0xB0, 0xF0, 0xBD, 0x2D, 0x4F, 0xD7, 0x19, 0x01, 0x3F, 0x3F, 0x78, -0x00, 0x2F, 0xA3, 0xD0, 0x69, 0x46, 0x10, 0x27, 0x7D, 0x5E, 0x08, 0x99, -0x2D, 0x12, 0x03, 0x95, 0xC9, 0x00, 0x05, 0x9D, 0x02, 0x91, 0x03, 0x99, -0x2F, 0x11, 0x0F, 0x25, 0x0D, 0x40, 0x40, 0x36, 0x03, 0x95, 0x36, 0x78, -0x0F, 0x25, 0xAF, 0x43, 0x05, 0x97, 0x06, 0x96, 0x02, 0x9F, 0x1E, 0x4E, -0x05, 0x99, 0xF5, 0x19, 0x0A, 0x9F, 0x03, 0x9E, 0x17, 0x43, 0x0E, 0x43, -0x2F, 0x70, 0x6E, 0x70, 0x10, 0x27, 0x6E, 0x46, 0xBE, 0x5D, 0x69, 0x46, -0xAE, 0x70, 0x18, 0x26, 0x71, 0x5C, 0x67, 0x46, 0xEF, 0x70, 0x29, 0x71, -0x26, 0x78, 0x6E, 0x71, 0x66, 0x68, 0xFF, 0x2E, 0x00, 0xDD, 0xFF, 0x26, -0xAE, 0x71, 0xA6, 0x68, 0xFF, 0x2E, 0x00, 0xDD, 0xFF, 0x26, 0x08, 0x9F, -0xEE, 0x71, 0x01, 0x37, 0xFF, 0xB2, 0x01, 0x25, 0x08, 0x97, 0x05, 0x70, -0x6C, 0xE7, 0x0E, 0x4B, 0x1F, 0x60, 0xFC, 0xF7, 0x39, 0xFE, 0xB7, 0xE7, -0xAE, 0x09, 0x00, 0x20, 0xEC, 0x01, 0x00, 0x20, 0x9C, 0x0D, 0x00, 0x20, -0xF5, 0x00, 0x00, 0x20, 0xF4, 0x00, 0x00, 0x20, 0x48, 0x0D, 0x00, 0x20, -0xF4, 0x16, 0x00, 0x20, 0x38, 0xFC, 0xFF, 0xFF, 0x04, 0x05, 0x00, 0x00, -0xEC, 0x11, 0x00, 0x20, 0x20, 0x01, 0x00, 0x20, 0x64, 0x01, 0x00, 0x20, -0x98, 0x0D, 0x00, 0x20, 0x10, 0xB5, 0x04, 0x1C, 0xFC, 0xF7, 0x70, 0xFE, -0x00, 0x28, 0xFB, 0xD1, 0x0A, 0x4B, 0x01, 0x2C, 0x02, 0xD0, 0x02, 0x2C, -0x05, 0xD1, 0x02, 0xE0, 0x0F, 0x22, 0x1A, 0x70, 0x01, 0xE0, 0x0E, 0x22, -0x1A, 0x70, 0x00, 0x22, 0xDA, 0x70, 0x9A, 0x70, 0x5A, 0x70, 0x04, 0x4B, -0x01, 0x22, 0x1A, 0x60, 0xFC, 0xF7, 0x04, 0xFE, 0x10, 0xBD, 0xC0, 0x46, -0xEC, 0x11, 0x00, 0x20, 0x98, 0x0D, 0x00, 0x20, 0xF0, 0xB5, 0x8B, 0xB0, -0x14, 0x28, 0x00, 0xD9, 0xA3, 0xE3, 0xFE, 0xF7, 0x09, 0xFF, 0x15, 0x00, -0xA2, 0x03, 0x43, 0x00, 0xA2, 0x03, 0x59, 0x00, 0xA2, 0x03, 0x64, 0x00, -0x88, 0x00, 0xA2, 0x03, 0xFB, 0x00, 0xA2, 0x03, 0xA2, 0x03, 0x48, 0x01, -0xA2, 0x03, 0x54, 0x01, 0x30, 0x03, 0xB7, 0x02, 0xA2, 0x03, 0xA2, 0x03, -0x8C, 0x03, 0x9D, 0x03, 0xC0, 0x4B, 0x1B, 0x78, 0x00, 0x2B, 0x00, 0xD0, -0x87, 0xE3, 0xBF, 0x4C, 0x01, 0x23, 0xF2, 0x20, 0x23, 0x72, 0xE0, 0x70, -0xFE, 0xF7, 0xD8, 0xFD, 0xBC, 0x4B, 0x20, 0x70, 0x1B, 0x78, 0xAA, 0x2B, -0x00, 0xD0, 0x7A, 0xE3, 0xBA, 0x4A, 0xBB, 0x4B, 0x11, 0x78, 0xBB, 0x4A, -0x1B, 0x78, 0x12, 0x78, 0xC9, 0x18, 0x91, 0x42, 0x00, 0xD0, 0x70, 0xE3, -0xB8, 0x4A, 0xE0, 0x78, 0x40, 0x32, 0x12, 0x78, 0x59, 0xB2, 0x41, 0x18, -0x89, 0x18, 0xFF, 0x29, 0x03, 0xDD, 0xD2, 0x43, 0xD2, 0xB2, 0xE2, 0x70, -0x63, 0xE3, 0xE2, 0x78, 0xD3, 0x18, 0xDB, 0xB2, 0xE3, 0x70, 0x5E, 0xE3, -0xB0, 0x4A, 0x00, 0x23, 0x13, 0x70, 0xA0, 0x21, 0xAF, 0x4A, 0xC9, 0x00, -0x53, 0x54, 0xAF, 0x49, 0xA1, 0x20, 0x53, 0x54, 0xAE, 0x49, 0xC0, 0x00, -0x53, 0x54, 0x0A, 0x21, 0x12, 0x18, 0x01, 0x39, 0xC9, 0xB2, 0x88, 0x18, -0x03, 0x70, 0x00, 0x29, 0xF9, 0xD1, 0x48, 0xE3, 0xA9, 0x49, 0x00, 0x23, -0x0A, 0x68, 0x9A, 0x42, 0x02, 0xDD, 0x4B, 0x68, 0xD3, 0x18, 0xDB, 0x0F, -0xA6, 0x4A, 0x13, 0x70, 0x3D, 0xE3, 0xA6, 0x4B, 0xA0, 0x49, 0x9B, 0x69, -0xA0, 0x4A, 0x00, 0x2B, 0x0D, 0xD1, 0x8B, 0x5C, 0x19, 0x20, 0x01, 0x2B, -0x11, 0xD0, 0xA2, 0x4B, 0x1B, 0x78, 0x01, 0x2B, 0x02, 0xD1, 0xA1, 0x4B, -0x98, 0x7E, 0x0A, 0xE0, 0xA0, 0x4B, 0x98, 0x7E, 0x07, 0xE0, 0x8A, 0x5C, -0x08, 0x20, 0x01, 0x2A, 0x03, 0xD1, 0x19, 0x20, 0x03, 0x2B, 0x00, 0xD0, -0x08, 0x20, 0x9C, 0x4B, 0x80, 0x01, 0x19, 0x68, 0xFE, 0xF7, 0xDC, 0xFE, -0x8E, 0x4B, 0x98, 0x76, 0x19, 0xE3, 0x94, 0x4B, 0x00, 0x22, 0x1A, 0x60, -0x93, 0x4A, 0x11, 0x78, 0x96, 0x4A, 0x00, 0x29, 0x03, 0xD0, 0x02, 0x21, -0x11, 0x70, 0x08, 0x27, 0x08, 0xE0, 0x01, 0x21, 0x11, 0x70, 0x8B, 0x4A, -0x06, 0x27, 0x08, 0x21, 0x52, 0x5E, 0x22, 0x2A, 0x00, 0xDC, 0x03, 0x27, -0x5D, 0x69, 0x1C, 0x69, 0x1B, 0x68, 0x00, 0x26, 0x05, 0x95, 0x04, 0x94, -0x03, 0x93, 0x02, 0x96, 0x1A, 0x25, 0x47, 0xE0, 0x00, 0x20, 0x0E, 0x23, -0xAE, 0x1C, 0x01, 0x3B, 0xDB, 0xB2, 0x5A, 0x1C, 0x92, 0x01, 0x87, 0x49, -0x92, 0x19, 0x52, 0x00, 0x52, 0x5A, 0x0C, 0x1C, 0x12, 0xB2, 0x80, 0x18, -0x00, 0x2B, 0xF2, 0xD1, 0x1C, 0x21, 0xFE, 0xF7, 0xA7, 0xFE, 0xFA, 0x0F, -0x06, 0x90, 0x0E, 0x23, 0x07, 0x92, 0x01, 0x3B, 0xDB, 0xB2, 0x58, 0x1C, -0x82, 0x01, 0x92, 0x19, 0x00, 0x90, 0x52, 0x00, 0xA2, 0x5A, 0x90, 0xB2, -0x11, 0xB2, 0x02, 0x9A, 0x8A, 0x42, 0x03, 0xDA, 0xC1, 0xB2, 0x02, 0x91, -0x05, 0x95, 0x04, 0x93, 0x06, 0x9A, 0x80, 0x1A, 0x80, 0xB2, 0x01, 0x90, -0x68, 0x46, 0x04, 0x22, 0x82, 0x5E, 0x00, 0x98, 0x81, 0x01, 0x89, 0x19, -0x49, 0x00, 0x00, 0x2A, 0x0D, 0xDD, 0x00, 0x91, 0x68, 0x46, 0x61, 0x5A, -0x81, 0x88, 0x00, 0x98, 0x21, 0x52, 0x07, 0x98, 0xD1, 0x17, 0xBA, 0x42, -0x41, 0x41, 0x03, 0x9A, 0x52, 0x18, 0x03, 0x92, 0x02, 0xE0, 0x00, 0x20, -0x62, 0x5A, 0x60, 0x52, 0x00, 0x2B, 0xCE, 0xD1, 0x01, 0x3D, 0xED, 0xB2, -0xFF, 0x2D, 0xB3, 0xD1, 0x5E, 0x4B, 0x04, 0x9C, 0x05, 0x9D, 0x03, 0x9E, -0x1C, 0x61, 0x5D, 0x61, 0x1E, 0x60, 0xA6, 0xE2, 0x61, 0x4B, 0x62, 0x48, -0x00, 0x24, 0x1C, 0x60, 0x82, 0x68, 0xC3, 0x68, 0x9A, 0x42, 0x00, 0xDA, -0x9D, 0xE2, 0x0C, 0x25, 0xD6, 0x0F, 0x95, 0x42, 0x66, 0x41, 0x92, 0x19, -0xDE, 0x17, 0x41, 0x68, 0xF6, 0x1A, 0x00, 0x68, 0xF6, 0x0F, 0x9B, 0x1B, -0x18, 0x27, 0xC6, 0x0F, 0x87, 0x42, 0x66, 0x41, 0x80, 0x19, 0xCE, 0x17, -0x76, 0x1A, 0xF6, 0x0F, 0x89, 0x1B, 0x41, 0x1A, 0xC8, 0x0F, 0x8D, 0x42, -0x44, 0x41, 0xE4, 0xB2, 0x00, 0x2C, 0x08, 0xD1, 0xD3, 0x1A, 0xD9, 0x0F, -0x0B, 0x22, 0x9A, 0x42, 0x4C, 0x41, 0xE4, 0xB2, 0x00, 0x2C, 0x00, 0xD1, -0x79, 0xE2, 0x4D, 0x4B, 0x1A, 0x78, 0x0E, 0x23, 0x00, 0x2A, 0x13, 0xD1, -0x73, 0xE2, 0x5F, 0x1C, 0x1A, 0x22, 0xBF, 0x01, 0x01, 0x3A, 0xD2, 0xB2, -0x91, 0x1C, 0x79, 0x18, 0x0D, 0x5D, 0x00, 0x2D, 0x02, 0xD0, 0x01, 0x25, -0x0D, 0x55, 0x02, 0xE0, 0x49, 0x00, 0x0E, 0x5A, 0x0D, 0x52, 0x00, 0x2A, -0xF0, 0xD1, 0x01, 0xE0, 0x41, 0x4C, 0x3D, 0x48, 0x01, 0x3B, 0xDB, 0xB2, -0xFF, 0x2B, 0xE6, 0xD1, 0x59, 0xE2, 0x3F, 0x4B, 0x34, 0x33, 0x1A, 0x78, -0x00, 0x2A, 0x00, 0xD0, 0x53, 0xE2, 0x01, 0x22, 0x1A, 0x70, 0x02, 0x20, -0xFF, 0xF7, 0x86, 0xFE, 0x4D, 0xE2, 0x2E, 0x4B, 0x2B, 0x4A, 0x99, 0x69, -0x01, 0x29, 0x73, 0xD0, 0x2C, 0x48, 0x04, 0x78, 0xFF, 0x20, 0x01, 0x2C, -0x00, 0xD0, 0x10, 0x20, 0x14, 0x89, 0x25, 0x1C, 0x0B, 0x3D, 0xAD, 0xB2, -0x09, 0x2D, 0x00, 0xD9, 0x82, 0xE0, 0x0C, 0x27, 0xD2, 0x5F, 0x05, 0x2A, -0x00, 0xDD, 0x7D, 0xE0, 0x2E, 0x4A, 0x24, 0xB2, 0x40, 0x32, 0x12, 0x78, -0xA2, 0x42, 0x77, 0xDA, 0x2C, 0x4A, 0x12, 0x68, 0x82, 0x42, 0x73, 0xDA, -0x00, 0x29, 0x03, 0xD1, 0x1C, 0x4B, 0x03, 0x22, 0x9A, 0x61, 0x6F, 0xE0, -0x03, 0x29, 0x6D, 0xD1, 0x15, 0x4A, 0x14, 0x4B, 0x99, 0x5C, 0xA0, 0x22, -0xD2, 0x00, 0x01, 0x29, 0x03, 0xD1, 0x99, 0x5C, 0x01, 0x31, 0x99, 0x54, -0x02, 0xE0, 0x99, 0x5C, 0x02, 0x31, 0x99, 0x54, 0x9A, 0x5C, 0x01, 0x2A, -0x5C, 0xD9, 0x11, 0x4A, 0x01, 0x21, 0x91, 0x61, 0xA0, 0x22, 0x00, 0x21, -0xD2, 0x00, 0x99, 0x54, 0x54, 0xE0, 0xC0, 0x46, 0xE5, 0x01, 0x00, 0x20, -0xAA, 0x0A, 0x00, 0x20, 0x28, 0x7C, 0x00, 0x00, 0x29, 0x7C, 0x00, 0x00, -0x2A, 0x7C, 0x00, 0x00, 0x2B, 0x7C, 0x00, 0x00, 0x48, 0x0D, 0x00, 0x20, -0x54, 0x00, 0x00, 0x20, 0xEC, 0x11, 0x00, 0x20, 0x0C, 0x05, 0x00, 0x00, -0x04, 0x05, 0x00, 0x00, 0x70, 0x01, 0x00, 0x20, 0x3D, 0x11, 0x00, 0x20, -0xF8, 0x08, 0x00, 0x20, 0xDD, 0x01, 0x00, 0x20, 0x9A, 0x74, 0x00, 0x00, -0x4A, 0x74, 0x00, 0x00, 0x78, 0x09, 0x00, 0x20, 0x40, 0x00, 0x00, 0x20, -0x00, 0x40, 0x00, 0x40, 0x38, 0x0D, 0x00, 0x20, 0xE4, 0x10, 0x00, 0x20, -0xF5, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0xAE, 0x09, 0x00, 0x20, -0x9C, 0x0D, 0x00, 0x20, 0x4C, 0x11, 0x00, 0x20, 0x10, 0x89, 0xC7, 0x49, -0x04, 0x1C, 0x0A, 0x3C, 0xA4, 0xB2, 0x0A, 0x2C, 0x0B, 0xD8, 0x0C, 0x24, -0x12, 0x5F, 0x05, 0x2A, 0x07, 0xDC, 0x0A, 0x1C, 0x40, 0x32, 0x12, 0x78, -0x00, 0xB2, 0x82, 0x42, 0x01, 0xDA, 0x00, 0x22, 0xDA, 0x60, 0xDA, 0x68, -0x59, 0x2A, 0x05, 0xDC, 0x09, 0x68, 0x00, 0x29, 0x04, 0xD1, 0x01, 0x32, -0xDA, 0x60, 0x01, 0xE0, 0x00, 0x22, 0x9A, 0x61, 0xB9, 0x4B, 0x1A, 0x78, -0xB9, 0x4B, 0x00, 0x2A, 0x08, 0xD1, 0x99, 0x69, 0x01, 0x29, 0x05, 0xD1, -0xB7, 0x49, 0x08, 0x25, 0x49, 0x5F, 0x21, 0x29, 0x00, 0xDD, 0x9A, 0x61, -0x99, 0x69, 0xB5, 0x4B, 0x01, 0x29, 0x06, 0xD1, 0x3C, 0x22, 0xDA, 0x85, -0x0F, 0x22, 0xDA, 0x84, 0x0A, 0x22, 0x1A, 0x85, 0x0A, 0xE0, 0x2D, 0x20, -0xD8, 0x85, 0x28, 0x21, 0x00, 0x2A, 0x02, 0xD0, 0xD8, 0x84, 0x19, 0x85, -0x02, 0xE0, 0x23, 0x22, 0xD9, 0x84, 0x1A, 0x85, 0xA7, 0x4B, 0x19, 0x78, -0x00, 0x29, 0x68, 0xD1, 0xA4, 0x4B, 0x1B, 0x68, 0x00, 0x2B, 0x64, 0xDD, -0xA6, 0x4A, 0xA4, 0x4B, 0x12, 0x7F, 0x18, 0x7D, 0x52, 0xB2, 0x02, 0x92, -0x1A, 0x69, 0x02, 0x38, 0x02, 0x3A, 0x02, 0x24, 0xC0, 0xB2, 0xD2, 0xB2, -0x64, 0x42, 0x0F, 0x1C, 0x0B, 0x1C, 0x04, 0x90, 0x21, 0xE0, 0x1E, 0x1C, -0x19, 0x22, 0x82, 0x42, 0x5E, 0x41, 0xF6, 0xB2, 0x00, 0x2E, 0x0F, 0xD0, -0x66, 0x46, 0x00, 0x2E, 0x0C, 0xD0, 0x03, 0x9A, 0x86, 0x1C, 0x96, 0x19, -0x98, 0x4A, 0x76, 0x00, 0xB6, 0x5A, 0x02, 0x9A, 0x96, 0x42, 0x03, 0xDB, -0xF7, 0x19, 0x01, 0x31, 0xBF, 0xB2, 0xC9, 0xB2, 0x01, 0x30, 0x01, 0x35, -0xC0, 0xB2, 0x03, 0x2D, 0xE3, 0xD1, 0x05, 0x9A, 0x01, 0x34, 0x01, 0x32, -0xD2, 0xB2, 0x03, 0x2C, 0x0D, 0xD0, 0x0D, 0x25, 0x18, 0x1C, 0x95, 0x42, -0x58, 0x41, 0x56, 0x1C, 0xC0, 0xB2, 0x02, 0x25, 0xB6, 0x01, 0x84, 0x46, -0x6D, 0x42, 0x04, 0x98, 0x03, 0x96, 0x05, 0x92, 0xCF, 0xE7, 0x85, 0x4B, -0x1E, 0x89, 0x83, 0x4B, 0x9C, 0x69, 0x00, 0x2C, 0x1D, 0xD1, 0xF5, 0x01, -0x7D, 0x19, 0x2D, 0xB2, 0x01, 0x31, 0x28, 0x1C, 0xFE, 0xF7, 0xFC, 0xFC, -0x81, 0x4B, 0x80, 0xB2, 0x27, 0x1C, 0x83, 0x42, 0x67, 0x41, 0xFB, 0xB2, -0x00, 0x2B, 0x0E, 0xD0, 0x7E, 0x4B, 0xEA, 0x0F, 0xAB, 0x42, 0x54, 0x41, -0xE4, 0xB2, 0x00, 0x2C, 0x07, 0xD0, 0x74, 0x4B, 0x36, 0xB2, 0x40, 0x33, -0x1B, 0x78, 0xB3, 0x42, 0x01, 0xDD, 0xFB, 0xF7, 0x29, 0xFB, 0x78, 0x4B, -0x0A, 0x24, 0x1A, 0x78, 0x6E, 0x4D, 0x53, 0x42, 0x5A, 0x41, 0x71, 0x4B, -0x52, 0x00, 0x32, 0x33, 0x1A, 0x70, 0x27, 0x1C, 0x01, 0x3C, 0xE4, 0xB2, -0x39, 0x1C, 0x61, 0x43, 0x6B, 0x18, 0x3C, 0x20, 0x1B, 0x5E, 0x00, 0x2B, -0x15, 0xD0, 0x63, 0x00, 0xEB, 0x18, 0x04, 0x22, 0x9B, 0x5E, 0x0C, 0x20, -0x08, 0x93, 0x23, 0x1C, 0x10, 0x33, 0x60, 0x43, 0x5B, 0x00, 0x5B, 0x5F, -0x41, 0x30, 0x09, 0x93, 0x68, 0x4B, 0xFF, 0x30, 0x69, 0x18, 0xC0, 0x18, -0x41, 0x31, 0x08, 0xAA, 0x23, 0x1C, 0xFE, 0xF7, 0x91, 0xFF, 0x3B, 0x1C, -0x63, 0x43, 0x5A, 0x4E, 0x5B, 0x4A, 0xF6, 0x18, 0x38, 0x36, 0x33, 0x7A, -0x10, 0x68, 0x58, 0x43, 0x60, 0x4B, 0x19, 0x68, 0xFE, 0xF7, 0xAE, 0xFC, -0x30, 0x72, 0x00, 0x2C, 0xD0, 0xD1, 0xEA, 0xE0, 0x53, 0x4B, 0x1B, 0x78, -0x00, 0x2B, 0x00, 0xD0, 0xE5, 0xE0, 0x54, 0x4B, 0x58, 0x49, 0x32, 0x33, -0x18, 0x78, 0x50, 0x4B, 0x58, 0x4C, 0x9B, 0x69, 0x47, 0x1E, 0x02, 0x93, -0x0B, 0x5D, 0xBC, 0x46, 0x0A, 0x22, 0x01, 0x3A, 0xD2, 0xB2, 0x0C, 0x21, -0x51, 0x43, 0x51, 0x4C, 0x47, 0x4D, 0x61, 0x18, 0x0C, 0x1C, 0x05, 0x31, -0xFF, 0x31, 0x4E, 0x6C, 0x0A, 0x21, 0x51, 0x43, 0xFC, 0x34, 0x69, 0x18, -0xA7, 0x6C, 0x3C, 0x25, 0x4C, 0x5F, 0x38, 0x31, 0x00, 0x2C, 0x22, 0xD0, -0xBC, 0x1B, 0xE5, 0x17, 0x64, 0x19, 0x6C, 0x40, 0x49, 0x4D, 0xE4, 0xB2, -0xAD, 0x56, 0x65, 0x45, 0x0F, 0xD1, 0x11, 0x2C, 0x16, 0xD8, 0x02, 0x9C, -0x00, 0x2C, 0x14, 0xD0, 0x28, 0x2F, 0x11, 0xDC, 0x28, 0x2E, 0x0F, 0xDC, -0x06, 0x25, 0x4C, 0x5F, 0x09, 0x7A, 0x02, 0x34, 0x8C, 0x42, 0x0A, 0xDA, -0x08, 0xE0, 0x85, 0x42, 0x07, 0xDB, 0x00, 0x2B, 0x05, 0xD1, 0x14, 0x23, -0xA3, 0x42, 0x9B, 0x41, 0x5B, 0x42, 0x00, 0xE0, 0x01, 0x23, 0x00, 0x2A, -0xC5, 0xD1, 0x2D, 0x4C, 0x0A, 0x21, 0x01, 0x39, 0xC9, 0xB2, 0x00, 0x2B, -0x0D, 0xD0, 0x0A, 0x25, 0x4D, 0x43, 0x65, 0x19, 0x3E, 0x27, 0xEE, 0x5F, -0x00, 0x20, 0x02, 0x96, 0x02, 0x9F, 0x14, 0x25, 0xF6, 0x0F, 0xBD, 0x42, -0x46, 0x41, 0x75, 0x42, 0x2B, 0x40, 0x0A, 0x25, 0x4D, 0x43, 0x65, 0x19, -0x3C, 0x20, 0x2D, 0x5E, 0x00, 0x2D, 0x01, 0xD0, 0x01, 0x32, 0xD2, 0xB2, -0x00, 0x29, 0xE2, 0xD1, 0x26, 0x49, 0x28, 0x4C, 0x0B, 0x55, 0x00, 0x2A, -0x7B, 0xD1, 0x27, 0x48, 0x0A, 0x23, 0x01, 0x3B, 0xDB, 0xB2, 0xC2, 0x54, -0x00, 0x2B, 0xFA, 0xD1, 0x22, 0x4D, 0x4B, 0x55, 0x71, 0xE0, 0x18, 0x4B, -0x9A, 0x69, 0x00, 0x2A, 0x10, 0xD0, 0x21, 0x4A, 0x12, 0x68, 0x00, 0x2A, -0x0C, 0xDD, 0x12, 0x4A, 0x12, 0x68, 0x01, 0x2A, 0x08, 0xD1, 0x1E, 0x4A, -0x12, 0x78, 0x00, 0x2A, 0x04, 0xD0, 0x1D, 0x4A, 0x12, 0x68, 0x00, 0x2A, -0x00, 0xD1, 0x9A, 0x61, 0x9A, 0x69, 0x00, 0x2A, 0x04, 0xD1, 0xA0, 0x21, -0x12, 0x48, 0xC9, 0x00, 0x42, 0x54, 0xDA, 0x60, 0x9A, 0x68, 0x01, 0x2A, -0x51, 0xD1, 0x00, 0x22, 0x9A, 0x60, 0x5B, 0x68, 0x01, 0x2B, 0x2B, 0xD1, -0x04, 0x4A, 0x13, 0x70, 0x12, 0x4A, 0x34, 0x32, 0x13, 0x70, 0x12, 0x4A, -0x13, 0x70, 0x44, 0xE0, 0x9C, 0x0D, 0x00, 0x20, 0xDD, 0x01, 0x00, 0x20, -0xF8, 0x08, 0x00, 0x20, 0x70, 0x01, 0x00, 0x20, 0x48, 0x0D, 0x00, 0x20, -0x00, 0x40, 0x00, 0x40, 0x8F, 0x01, 0x00, 0x00, 0x5F, 0x09, 0x00, 0x00, -0xF5, 0x00, 0x00, 0x20, 0xEC, 0x11, 0x00, 0x20, 0x4C, 0x11, 0x00, 0x20, -0x04, 0x05, 0x00, 0x00, 0x3E, 0x11, 0x00, 0x20, 0x20, 0x01, 0x00, 0x20, -0x48, 0x11, 0x00, 0x20, 0xBC, 0x11, 0x00, 0x20, 0xAE, 0x09, 0x00, 0x20, -0xB3, 0x01, 0x00, 0x20, 0x00, 0x2B, 0x1E, 0xD1, 0x10, 0x4A, 0x13, 0x70, -0x10, 0x4A, 0x34, 0x32, 0x13, 0x70, 0x10, 0x4B, 0x02, 0x22, 0x1A, 0x70, -0x15, 0xE0, 0x0F, 0x4B, 0x04, 0x22, 0x9A, 0x70, 0x87, 0x22, 0x52, 0x00, -0x9A, 0x80, 0x40, 0x22, 0x9A, 0x71, 0x06, 0x22, 0xDA, 0x71, 0x01, 0x22, -0x1A, 0x72, 0x03, 0x22, 0x5A, 0x72, 0x00, 0x22, 0x1A, 0x70, 0x04, 0xE0, -0x06, 0x48, 0x07, 0x49, 0x50, 0x22, 0xFE, 0xF7, 0x21, 0xFC, 0x0B, 0xB0, -0xF0, 0xBD, 0xC0, 0x46, 0xDD, 0x01, 0x00, 0x20, 0xAE, 0x09, 0x00, 0x20, -0xB3, 0x01, 0x00, 0x20, 0x48, 0x0D, 0x00, 0x20, 0x4A, 0x74, 0x00, 0x00, -0x38, 0xB5, 0x50, 0x28, 0x05, 0xD1, 0x3B, 0x4B, 0x01, 0x20, 0x18, 0x60, -0xFE, 0xF7, 0xE6, 0xFD, 0x6F, 0xE0, 0x39, 0x4B, 0x40, 0x28, 0x01, 0xD1, -0x01, 0x24, 0x1C, 0x70, 0x1B, 0x78, 0x00, 0x2B, 0x67, 0xD0, 0x41, 0x38, -0x0E, 0x28, 0x64, 0xD8, 0xFE, 0xF7, 0x3A, 0xFB, 0x08, 0x12, 0x08, 0x2D, -0x08, 0x47, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x5E, 0x00, -0x2F, 0x4B, 0x01, 0x22, 0x1A, 0x70, 0x2F, 0x4B, 0x1A, 0x80, 0x2F, 0x4A, -0x13, 0x60, 0xFC, 0xF7, 0x21, 0xFA, 0x50, 0xE0, 0x2A, 0x48, 0x2C, 0x4B, -0xFF, 0x2A, 0x0B, 0xD1, 0x2B, 0x4A, 0xC9, 0x01, 0x12, 0x78, 0x52, 0x00, -0xD2, 0xB2, 0x02, 0x70, 0x29, 0x4A, 0x89, 0x18, 0x19, 0x60, 0xFC, 0xF7, -0x11, 0xFA, 0x40, 0xE0, 0x89, 0x01, 0x8A, 0x18, 0x25, 0x49, 0x52, 0x00, -0x02, 0x24, 0x52, 0x18, 0x04, 0x70, 0x1A, 0x60, 0xFC, 0xF7, 0x06, 0xFA, -0x35, 0xE0, 0x1D, 0x4C, 0x1E, 0x4B, 0x21, 0x48, 0xFF, 0x2A, 0x0A, 0xD1, -0x1D, 0x4A, 0x89, 0x01, 0x12, 0x78, 0x40, 0x18, 0x52, 0x00, 0xD2, 0xB2, -0x22, 0x70, 0x18, 0x60, 0xFC, 0xF7, 0xF6, 0xF9, 0x25, 0xE0, 0x49, 0x01, -0x52, 0x18, 0x52, 0x00, 0x02, 0x25, 0x80, 0x18, 0x25, 0x70, 0x18, 0x60, -0xFC, 0xF7, 0xEC, 0xF9, 0x1B, 0xE0, 0x10, 0x4C, 0x11, 0x4B, 0x15, 0x48, -0xFF, 0x2A, 0x08, 0xD1, 0x10, 0x4A, 0x49, 0x01, 0x92, 0x78, 0x40, 0x18, -0x22, 0x70, 0x18, 0x60, 0xFC, 0xF7, 0xDE, 0xF9, 0x0D, 0xE0, 0x49, 0x01, -0x52, 0x18, 0x01, 0x25, 0x80, 0x18, 0x25, 0x70, 0x18, 0x60, 0xFC, 0xF7, -0xD5, 0xF9, 0x04, 0xE0, 0x0B, 0x4A, 0x00, 0x23, 0x13, 0x70, 0x02, 0x4A, -0x13, 0x70, 0x38, 0xBD, 0x50, 0x11, 0x00, 0x20, 0xE5, 0x01, 0x00, 0x20, -0xF6, 0x03, 0x00, 0x20, 0x08, 0x03, 0x00, 0x20, 0x34, 0x0D, 0x00, 0x20, -0x0A, 0x03, 0x00, 0x20, 0x84, 0x40, 0x00, 0x40, 0xF8, 0x03, 0x00, 0x20, -0xB3, 0x0A, 0x00, 0x20, 0x1D, 0x03, 0x00, 0x20, 0x08, 0xB5, 0x35, 0x4B, -0x1B, 0x88, 0x33, 0x2B, 0x29, 0xD0, 0x06, 0xD8, 0x0A, 0x2B, 0x2F, 0xD0, -0x30, 0x2B, 0x11, 0xD0, 0x01, 0x2B, 0x5D, 0xD1, 0x06, 0xE0, 0xA0, 0x2B, -0x32, 0xD0, 0xB0, 0x2B, 0x4C, 0xD0, 0x5F, 0x2B, 0x56, 0xD1, 0x3F, 0xE0, -0x2C, 0x4A, 0x11, 0x78, 0x0E, 0x22, 0x11, 0x42, 0x50, 0xD1, 0x2B, 0x4A, -0x13, 0x70, 0x4D, 0xE0, 0x28, 0x4B, 0x2A, 0x4A, 0x1B, 0x78, 0x12, 0x78, -0x01, 0x2B, 0x05, 0xD1, 0x00, 0x2A, 0x45, 0xD1, 0x27, 0x4A, 0x53, 0x60, -0x93, 0x60, 0x41, 0xE0, 0x01, 0x2A, 0x3F, 0xD1, 0x24, 0x4B, 0x00, 0x21, -0x59, 0x60, 0x9A, 0x60, 0x3A, 0xE0, 0x1F, 0x4B, 0x22, 0x4A, 0x19, 0x78, -0x22, 0x4B, 0x01, 0x29, 0x00, 0xD0, 0x00, 0x21, 0xD1, 0x54, 0x31, 0xE0, -0x20, 0x4B, 0x1A, 0x78, 0x00, 0x2A, 0x02, 0xD1, 0x01, 0x22, 0x1A, 0x70, -0x2A, 0xE0, 0x00, 0x22, 0x1A, 0x70, 0x27, 0xE0, 0x15, 0x4B, 0x1C, 0x4A, -0x18, 0x78, 0x1C, 0x4B, 0x1A, 0x28, 0x06, 0xD1, 0x19, 0x78, 0x1B, 0x4B, -0x10, 0x78, 0x1A, 0x78, 0xFF, 0xF7, 0xDA, 0xF9, 0x1A, 0xE0, 0x11, 0x78, -0x1A, 0x78, 0xFF, 0xF7, 0x1F, 0xFF, 0x15, 0xE0, 0x0C, 0x4B, 0x1B, 0x78, -0x00, 0x2B, 0x11, 0xD0, 0x14, 0x4B, 0x08, 0x22, 0x1A, 0x60, 0xFA, 0xF7, -0xD7, 0xFB, 0x0B, 0xE0, 0x07, 0x4B, 0x1B, 0x78, 0x1A, 0x2B, 0x07, 0xD1, -0x0C, 0x4B, 0x18, 0x78, 0x0C, 0x4B, 0x19, 0x78, 0x0C, 0x4B, 0x1A, 0x78, -0xFF, 0xF7, 0xBE, 0xF9, 0x08, 0xBD, 0xC0, 0x46, 0x28, 0x00, 0x00, 0x20, -0x0C, 0x00, 0x00, 0x50, 0xE8, 0x01, 0x00, 0x20, 0xDD, 0x01, 0x00, 0x20, -0xF8, 0x08, 0x00, 0x20, 0xEC, 0x11, 0x00, 0x20, 0x0C, 0x05, 0x00, 0x00, -0xDF, 0x01, 0x00, 0x20, 0x0E, 0x00, 0x00, 0x50, 0x0D, 0x00, 0x00, 0x50, -0x10, 0x00, 0x00, 0x50, 0x50, 0x11, 0x00, 0x20, 0x00, 0x01, 0x02, 0x03, -0x04, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0B, 0x0C, 0x0D, -0x0E, 0x0F, 0x10, 0x11, 0x11, 0x12, 0x13, 0x14, 0x15, 0x15, 0x16, 0x17, -0x18, 0x18, 0x19, 0x1A, 0x1B, 0x1B, 0x1C, 0x1D, 0x1D, 0x1E, 0x1F, 0x1F, -0x20, 0x21, 0x21, 0x22, 0x23, 0x23, 0x24, 0x24, 0x25, 0x25, 0x26, 0x27, -0x27, 0x28, 0x28, 0x29, 0x29, 0x2A, 0x2A, 0x2B, 0x2B, 0x2C, 0x2C, 0x2D, -0x00, 0x00, 0x78, 0x04, 0xEF, 0x08, 0x66, 0x0D, 0xDB, 0x11, 0x50, 0x16, -0xC2, 0x1A, 0x33, 0x1F, 0xA1, 0x23, 0x0C, 0x28, 0x74, 0x2C, 0xD9, 0x30, -0x39, 0x35, 0x96, 0x39, 0xEE, 0x3D, 0x42, 0x42, 0x90, 0x46, 0xD9, 0x4A, -0x1B, 0x4F, 0x58, 0x53, 0x8E, 0x57, 0xBE, 0x5B, 0xE6, 0x5F, 0x07, 0x64, -0x1F, 0x68, 0x30, 0x6C, 0x39, 0x70, 0x38, 0x74, 0x2F, 0x78, 0x1C, 0x7C, -0xFF, 0x7F, 0xD9, 0x83, 0xA8, 0x87, 0x6D, 0x8B, 0x27, 0x8F, 0xD5, 0x92, -0x79, 0x96, 0x10, 0x9A, 0x9B, 0x9D, 0x1B, 0xA1, 0x8D, 0xA4, 0xF3, 0xA7, -0x4B, 0xAB, 0x97, 0xAE, 0xD4, 0xB1, 0x04, 0xB5, 0x26, 0xB8, 0x39, 0xBB, -0x3E, 0xBE, 0x34, 0xC1, 0x1B, 0xC4, 0xF2, 0xC6, 0xBA, 0xC9, 0x73, 0xCC, -0x1B, 0xCF, 0xB3, 0xD1, 0x3B, 0xD4, 0xB2, 0xD6, 0x19, 0xD9, 0x6E, 0xDB, -0xB3, 0xDD, 0xE6, 0xDF, 0x08, 0xE2, 0x18, 0xE4, 0x16, 0xE6, 0x03, 0xE8, -0xDD, 0xE9, 0xA5, 0xEB, 0x5B, 0xED, 0xFE, 0xEE, 0x8F, 0xF0, 0x0D, 0xF2, -0x77, 0xF3, 0xCF, 0xF4, 0x14, 0xF6, 0x46, 0xF7, 0x64, 0xF8, 0x6F, 0xF9, -0x67, 0xFA, 0x4B, 0xFB, 0x1B, 0xFC, 0xD8, 0xFC, 0x81, 0xFD, 0x17, 0xFE, -0x98, 0xFE, 0x06, 0xFF, 0x5F, 0xFF, 0xA5, 0xFF, 0xD7, 0xFF, 0xF5, 0xFF, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x20, 0x4D, 0x31, 0x48, 0x30, -0x50, 0x42, 0x34, 0x35, 0x25, 0x44, 0x01, 0x34, 0x38, 0x30, 0x47, 0x59, -0x30, 0x31, 0x00, 0x00, 0x00, 0x48, 0x10, 0x5A, 0x28, 0x1E, 0x01, 0x01, -0x00, 0x00, 0x00, 0x1A, 0x0E, 0x00, 0x00, 0x1A, 0x0E, 0x00, 0x00, 0x00, -0x01, 0x01, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x05, 0xD0, 0x02, 0x00, 0x00, -0x00, 0x01, 0x01, 0x50, 0x50, 0x50, 0x01, 0x01, 0x00, 0x00, 0x62, 0x00, -0x4B, 0x00, 0x23, 0x00, 0x04, 0x03, 0x32, 0x32, 0x10, 0x00, 0x01, 0x01, -0x04, 0x00, 0x08, 0x02, 0x18, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x04, -0x05, 0x0F, 0x00, 0x07, 0x05, 0x00, 0xC0, 0xF9, 0x14, 0x1E, 0x0A, 0xF6, -0x0F, 0x00, 0x05, 0x14, 0x1E, 0x00, 0xA2, 0x29, 0xDE, 0x01, 0x00, 0x00, -0x28, 0x00, 0x23, 0x00, 0x0F, 0x0A, 0x3C, 0x01, 0x2D, 0x00, 0x00, 0x00, -0x02, 0x01, 0x01, 0x14, 0x32, 0x00, 0x32, 0x00, 0xFF, 0x7F, 0x00, 0x01, -0x01, 0x07, 0x0B, 0x00, 0x32, 0x00, 0x0A, 0x05, 0xD0, 0x03, 0xB3, 0x00, -0xFF, 0x7F, 0x00, 0x80, 0x01, 0x00, 0x01, 0x01, 0x04, 0x00, 0x08, 0x02, -0x30, 0x04, 0x03, 0x03, 0x00, 0x00, 0x00, 0x04, 0x05, 0x0F, 0x00, 0x08, -0x06, 0x00, 0xC0, 0xF9, 0x14, 0x1E, 0x0A, 0xF6, 0x19, 0x00, 0x08, 0x23, -0x1E, 0x00, 0xA2, 0x29, 0xDE, 0x01, 0x00, 0x00, 0x2D, 0x00, 0x28, 0x00, -0x0F, 0x0A, 0x3C, 0x01, 0x2D, 0x00, 0x1E, 0x00, 0x02, 0x01, 0x01, 0x14, -0x96, 0x00, 0x32, 0x00, 0xFF, 0x7F, 0x01, 0x01, 0x01, 0x07, 0x0A, 0x00, -0x32, 0x00, 0x0A, 0x05, 0xD0, 0x03, 0xB3, 0x00, 0xFF, 0x7F, 0x00, 0x80, -0x19, 0x00, 0x1F, 0x1E, 0x1D, 0x1C, 0x1B, 0x1A, 0x19, 0x15, 0x14, 0x13, -0x12, 0x11, 0x10, 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x06, 0x05, 0x04, -0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x11, 0x10, 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x08, -0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x03, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x03, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, -0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, -0x02, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, -0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, -0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x04, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x04, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x04, -0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, -0x03, 0x03, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, -0x03, 0x03, 0x03, 0x04, 0x04, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, -0x02, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x05, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x01, 0x02, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, -0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x05, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0x4E, -0x4E, 0x4E, 0x4D, 0x4D, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4A, 0x4B, 0x4B, -0x4A, 0x47, 0x4A, 0x48, 0x47, 0x47, 0x47, 0x47, 0x45, 0x45, 0x48, 0x4B, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x47, 0x48, 0x45, 0x47, 0x45, -0x45, 0x45, 0x45, 0x45, 0x43, 0x43, 0x45, 0x46, 0x46, 0x43, 0x41, 0x42, -0x42, 0x41, 0x41, 0x41, 0x3E, 0x40, 0x42, 0x48, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x52, 0x48, 0x47, 0x48, 0x48, 0x47, 0x46, 0x48, 0x47, 0x46, -0x48, 0x45, 0x45, 0x43, 0x42, 0x43, 0x42, 0x41, 0x42, 0x45, 0x43, 0x42, -0x42, 0x43, 0x41, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x4A, -0x4A, 0x48, 0x47, 0x47, 0x47, 0x48, 0x48, 0x48, 0x48, 0x48, 0x45, 0x43, -0x43, 0x43, 0x42, 0x42, 0x42, 0x42, 0x42, 0x43, 0x43, 0x45, 0x41, 0x4A, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x4D, 0x4B, 0x4A, 0x4B, 0x4A, -0x48, 0x47, 0x48, 0x48, 0x46, 0x47, 0x48, 0x4A, 0x47, 0x42, 0x45, 0x46, -0x42, 0x46, 0x45, 0x43, 0x45, 0x45, 0x46, 0x4B, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x55, 0x4E, 0x4B, 0x4B, 0x4B, 0x4A, 0x48, 0x4A, 0x47, 0x47, -0x48, 0x48, 0x48, 0x46, 0x43, 0x45, 0x46, 0x43, 0x45, 0x46, 0x42, 0x43, -0x45, 0x46, 0x46, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x4E, -0x4D, 0x4B, 0x48, 0x4A, 0x4A, 0x4A, 0x48, 0x4A, 0x4A, 0x4A, 0x4A, 0x45, -0x46, 0x45, 0x46, 0x46, 0x45, 0x46, 0x43, 0x46, 0x45, 0x46, 0x46, 0x4D, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x50, 0x4D, 0x4D, 0x47, 0x48, -0x47, 0x47, 0x48, 0x48, 0x48, 0x48, 0x48, 0x46, 0x45, 0x46, 0x46, 0x45, -0x43, 0x45, 0x45, 0x43, 0x46, 0x46, 0x46, 0x4B, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x52, 0x4D, 0x4A, 0x4A, 0x48, 0x4A, 0x47, 0x46, 0x48, 0x48, -0x48, 0x47, 0x45, 0x45, 0x46, 0x45, 0x46, 0x45, 0x41, 0x43, 0x43, 0x45, -0x41, 0x46, 0x47, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x4D, -0x4B, 0x4A, 0x47, 0x48, 0x46, 0x46, 0x46, 0x46, 0x46, 0x45, 0x45, 0x45, -0x46, 0x46, 0x42, 0x42, 0x42, 0x42, 0x42, 0x41, 0x43, 0x45, 0x45, 0x4B, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x4B, 0x4A, 0x48, 0x48, 0x46, -0x45, 0x45, 0x46, 0x47, 0x46, 0x45, 0x43, 0x42, 0x42, 0x41, 0x41, 0x40, -0x41, 0x41, 0x40, 0x42, 0x41, 0x42, 0x43, 0x48, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x50, 0x4B, 0x48, 0x48, 0x47, 0x47, 0x45, 0x46, 0x43, 0x45, -0x45, 0x43, 0x41, 0x3F, 0x3F, 0x41, 0x40, 0x40, 0x40, 0x42, 0x3F, 0x42, -0x42, 0x40, 0x42, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x4B, -0x4A, 0x47, 0x45, 0x45, 0x43, 0x46, 0x45, 0x45, 0x45, 0x42, 0x42, 0x41, -0x3E, 0x42, 0x41, 0x41, 0x41, 0x40, 0x3E, 0x40, 0x41, 0x40, 0x40, 0x43, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x4B, 0x4D, 0x4D, 0x4B, 0x4A, -0x4A, 0x4A, 0x4A, 0x4A, 0x4A, 0x48, 0x48, 0x47, 0x45, 0x45, 0x46, 0x45, -0x45, 0x46, 0x43, 0x46, 0x46, 0x46, 0x46, 0x4A, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x45, 0x20, +0x00,0x20,0x00,0x20,0x79,0x02,0x00,0x00,0x39,0x02,0x00,0x00,0x3D,0x02,0x00,0x00, +0x41,0x02,0x00,0x00,0x45,0x02,0x00,0x00,0x49,0x02,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4D,0x02,0x00,0x00, +0x51,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x02,0x00,0x00,0x59,0x02,0x00,0x00, +0x39,0x01,0x00,0x00,0x61,0x01,0x00,0x00,0x25,0x01,0x00,0x00,0x21,0x02,0x00,0x00, +0x35,0x02,0x00,0x00,0x71,0x02,0x00,0x00,0x75,0x02,0x00,0x00,0x75,0x02,0x00,0x00, +0x75,0x02,0x00,0x00,0x75,0x02,0x00,0x00,0x75,0x02,0x00,0x00,0x75,0x02,0x00,0x00, +0x75,0x02,0x00,0x00,0x75,0x02,0x00,0x00,0x75,0x02,0x00,0x00,0x75,0x02,0x00,0x00, +0x75,0x02,0x00,0x00,0x75,0x02,0x00,0x00,0x75,0x02,0x00,0x00,0x75,0x02,0x00,0x00, +0x75,0x02,0x00,0x00,0x75,0x02,0x00,0x00,0x75,0x02,0x00,0x00,0x75,0x02,0x00,0x00, +0x75,0x02,0x00,0x00,0x75,0x02,0x00,0x00,0x75,0x02,0x00,0x00,0x75,0x02,0x00,0x00, +0x75,0x02,0x00,0x00,0x75,0x02,0x00,0x00,0x75,0x02,0x00,0x00,0x75,0x02,0x00,0x00, +0x30,0xB5,0x11,0x4B,0x11,0x4A,0x1B,0x88,0x12,0x78,0xD3,0x18,0xDB,0xB2,0xE1,0x2B, +0x02,0xD0,0xE5,0x2B,0x17,0xD1,0x09,0xE0,0x0D,0x49,0x0E,0x4A,0x04,0x23,0x01,0x3B, +0xDB,0xB2,0xC8,0x5C,0x98,0x54,0x00,0x2B,0xF9,0xD1,0x0C,0xE0,0x0A,0x4C,0x09,0x48, +0x0A,0x49,0x0B,0x4A,0x04,0x23,0x01,0x3B,0xDB,0xB2,0xE5,0x5C,0x1D,0x54,0xCD,0x5C, +0x9D,0x54,0x00,0x2B,0xF7,0xD1,0x30,0xBD,0x28,0x00,0x00,0x20,0x2A,0x00,0x00,0x20, +0x2D,0x00,0x00,0x20,0x0C,0x00,0x00,0x50,0x35,0x00,0x00,0x20,0x31,0x00,0x00,0x20, +0x10,0x00,0x00,0x50,0x03,0x4A,0x00,0x23,0x13,0x70,0x80,0x22,0xD2,0x05,0x13,0x70, +0x70,0x47,0xC0,0x46,0x00,0x00,0x00,0x20,0x06,0x4B,0x00,0x22,0x5A,0x70,0x80,0x23, +0xDB,0x05,0x59,0x69,0x04,0x4A,0x0A,0x40,0x5A,0x61,0x59,0x69,0x03,0x4A,0x0A,0x40, +0x5A,0x61,0x70,0x47,0x00,0x00,0x00,0x20,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xEF, +0x70,0xB5,0xA0,0x23,0xDB,0x05,0x1C,0x7A,0x24,0x4D,0x0F,0x22,0x14,0x40,0x2A,0x78, +0x23,0x4E,0x00,0x2A,0x06,0xD0,0x23,0x4B,0x1B,0x68,0x98,0x47,0x00,0x23,0x2B,0x70, +0x34,0x70,0x3A,0xE0,0x9B,0x7A,0x32,0x78,0xE1,0x07,0x02,0xD5,0x1E,0x4A,0x13,0x80, +0x07,0xE0,0x08,0x21,0x0C,0x42,0x0A,0xD0,0x1C,0x4B,0x1A,0x78,0x52,0x18,0xD2,0xB2, +0x1A,0x70,0xFF,0xF7,0x8D,0xFF,0x1A,0x4B,0x1B,0x68,0x98,0x47,0x19,0xE0,0xA1,0x07, +0x0D,0xD5,0x08,0x2A,0x01,0xD0,0x01,0x2A,0x01,0xD1,0x16,0x4B,0x02,0xE0,0x12,0x4A, +0x13,0x80,0x15,0x4B,0x1B,0x68,0x98,0x47,0x00,0x22,0x10,0x4B,0x08,0xE0,0x63,0x07, +0x07,0xD5,0x11,0x4B,0x1B,0x68,0x98,0x47,0x0C,0x4B,0x1A,0x78,0x08,0x32,0xD2,0xB2, +0x1A,0x70,0x07,0x4B,0x01,0x22,0x1C,0x70,0xA0,0x23,0xDB,0x05,0x1A,0x72,0x0B,0x49, +0x10,0x22,0x1A,0x72,0x00,0x22,0x0A,0x70,0x1A,0x72,0x70,0xBD,0x2C,0x00,0x00,0x20, +0x2B,0x00,0x00,0x20,0x24,0x00,0x00,0x20,0x28,0x00,0x00,0x20,0x2A,0x00,0x00,0x20, +0x1C,0x00,0x00,0x20,0x20,0x00,0x00,0x20,0x18,0x00,0x00,0x20,0x0C,0x00,0x00,0x20, +0x03,0x4A,0x00,0x23,0x93,0x70,0x80,0x22,0xD2,0x05,0x53,0x70,0x70,0x47,0xC0,0x46, +0x00,0x00,0x00,0x20,0x70,0x47,0xC0,0x46,0x00,0xB5,0xFE,0xE7,0x00,0xB5,0xFE,0xE7, +0x00,0xB5,0xFE,0xE7,0x00,0xB5,0xFE,0xE7,0x00,0xB5,0xFE,0xE7,0x00,0xB5,0xFE,0xE7, +0x00,0xB5,0xFE,0xE7,0x00,0xB5,0xFE,0xE7,0x00,0xB5,0xFE,0xE7,0x00,0xB5,0xFE,0xE7, +0x00,0xB5,0xFE,0xE7,0x00,0xB5,0xFE,0xE7,0x00,0xB5,0xFE,0xE7,0x00,0xB5,0xFE,0xE7, +0x00,0xB5,0xFE,0xE7,0x00,0xB5,0xFE,0xE7,0x38,0xB5,0x80,0x23,0xDB,0x05,0xFB,0x21, +0x5A,0x68,0x59,0x60,0x99,0x68,0x08,0x21,0x99,0x60,0x00,0x22,0xD9,0x68,0xDA,0x60, +0x19,0x6C,0x80,0x21,0xC9,0x01,0x19,0x64,0x19,0x69,0x44,0x49,0x19,0x61,0x44,0x4B, +0x44,0x49,0x00,0xE0,0x04,0xC3,0x8B,0x42,0xFC,0xD3,0x43,0x4B,0x43,0x4A,0x9B,0x0A, +0xDB,0xB2,0x13,0x70,0x42,0x4B,0x43,0x49,0x1B,0x68,0x9B,0x0A,0xDB,0xB2,0x53,0x70, +0x41,0x4B,0x1B,0x68,0x9B,0x0A,0xDB,0xB2,0x93,0x70,0x40,0x4B,0x1B,0x68,0x9B,0x0A, +0xDB,0xB2,0xD3,0x70,0x00,0x23,0x0B,0x70,0x03,0x23,0x08,0xE0,0x58,0x1C,0x15,0x5C, +0xD4,0x5C,0xA5,0x42,0x07,0xD9,0xD4,0x5C,0x01,0x34,0xE4,0xB2,0x0C,0x54,0x01,0x3B, +0xDB,0xB2,0xFF,0x2B,0xF2,0xD1,0x30,0x4A,0x11,0x78,0x35,0x4A,0x11,0x70,0x11,0x1C, +0xFF,0x2B,0x03,0xD1,0x2D,0x4B,0xDB,0x78,0x1E,0x2B,0x04,0xD9,0xFF,0x23,0x4B,0x70, +0x8B,0x70,0xCB,0x70,0x0B,0xE0,0x2A,0x4B,0x1B,0x68,0x1B,0x78,0x53,0x70,0x2A,0x4B, +0x1B,0x68,0x1B,0x78,0x93,0x70,0x29,0x4B,0x1B,0x68,0x1B,0x78,0xD3,0x70,0x28,0x4B, +0xDA,0x78,0xFF,0x2A,0x08,0xD0,0x9A,0x78,0xFF,0x2A,0x05,0xD0,0x5B,0x78,0xFF,0x2B, +0x02,0xD0,0x00,0xF0,0x67,0xF8,0x38,0xBD,0x22,0x4B,0x23,0x4A,0xC0,0x21,0x13,0x60, +0x22,0x4A,0x49,0x00,0x13,0x60,0x22,0x4A,0x22,0x48,0x13,0x60,0x22,0x4A,0x13,0x60, +0x22,0x4B,0x02,0x22,0x5A,0x50,0xC0,0x21,0x91,0x40,0x5C,0x58,0x20,0x40,0x58,0x50, +0x1F,0x49,0x04,0x24,0x08,0x69,0x20,0x43,0x08,0x61,0x62,0xB6,0x1A,0x60,0x80,0x23, +0xDB,0x05,0x1A,0x6C,0x80,0x22,0x12,0x02,0x1A,0x64,0x1A,0x6C,0x80,0x22,0xD2,0x01, +0x1A,0x64,0x9A,0x68,0x80,0x22,0x52,0x00,0x9A,0x60,0xA0,0x22,0xD2,0x05,0x91,0x68, +0x14,0x49,0x91,0x60,0x1A,0x6C,0x00,0x22,0x1A,0x64,0xFE,0xE7,0x10,0x4F,0x00,0x00, +0x00,0x00,0x00,0x20,0x3C,0x00,0x00,0x20,0xFF,0x03,0x00,0x00,0x31,0x00,0x00,0x20, +0x08,0x04,0x00,0x00,0x35,0x00,0x00,0x20,0x0C,0x04,0x00,0x00,0x10,0x04,0x00,0x00, +0x2D,0x00,0x00,0x20,0xF9,0x03,0x00,0x00,0x24,0x00,0x00,0x20,0x18,0x00,0x00,0x20, +0x1C,0x00,0x00,0x20,0xFF,0x00,0xFF,0xFF,0x20,0x00,0x00,0x20,0x00,0xE1,0x00,0xE0, +0x00,0xED,0x00,0xE0,0x00,0x00,0xC8,0x42,0x70,0x47,0xFF,0xFF,0xFF,0xFF,0xFF,0x02, +0x4D,0x31,0x48,0x30,0x43,0x4F,0x34,0x35,0xFF,0x5B,0x00,0x00,0xFF,0x73,0x00,0x00, +0xFF,0x7B,0x00,0x00,0xF7,0xB5,0x03,0xF0,0xC3,0xFC,0x05,0xF0,0x33,0xF8,0x00,0x20, +0x05,0xF0,0xF2,0xFB,0x4E,0x4B,0x33,0x33,0x1B,0x78,0x5E,0x42,0x73,0x41,0x10,0x26, +0xF6,0x1A,0x4C,0x4B,0x1E,0x70,0x4C,0x4B,0x1A,0x68,0x01,0x3A,0x53,0x42,0x5A,0x41, +0x4A,0x4B,0x1A,0x70,0x4A,0x4B,0x1C,0x78,0x00,0x2C,0x22,0xD1,0x49,0x4A,0x01,0x25, +0x14,0x70,0x1D,0x70,0x00,0xF0,0x52,0xFA,0x47,0x4B,0x28,0x1C,0xDA,0x78,0x9A,0x70, +0x5C,0x70,0x05,0xF0,0xD1,0xFB,0x03,0xF0,0x7F,0xFB,0x01,0xF0,0x17,0xFB,0x80,0x23, +0xDB,0x05,0x1A,0x6C,0x7F,0x21,0x8A,0x43,0x1A,0x64,0x00,0xF0,0xF5,0xFD,0x02,0xF0, +0x4B,0xFF,0x01,0xF0,0x0B,0xFB,0x01,0xF0,0xA3,0xFA,0x3C,0x4B,0x02,0x20,0x1B,0x68, +0x98,0x47,0x3B,0x4C,0x23,0x78,0x00,0x2B,0x03,0xD1,0x3A,0x4B,0x1B,0x78,0x00,0x2B, +0x0F,0xD0,0x23,0x78,0x00,0xF0,0x94,0xFC,0x22,0x78,0x2E,0x4B,0x00,0x2A,0x01,0xD0, +0x1E,0x70,0x01,0xE0,0x0D,0x22,0x1A,0x70,0x31,0x4A,0x00,0x23,0x13,0x70,0x31,0x4A, +0x13,0x70,0x2C,0x4B,0x1B,0x78,0x00,0x2B,0x2C,0xD0,0x2F,0x4D,0x2B,0x78,0x00,0x2B, +0x28,0xD0,0x2A,0x4C,0x13,0x20,0x23,0x68,0x98,0x47,0x00,0xF0,0x0F,0xFA,0x03,0xF0, +0x08,0xFB,0x03,0xF0,0x8B,0xFA,0x29,0x4B,0x18,0x78,0x01,0xF0,0xA1,0xF8,0x00,0xF0, +0xC7,0xFD,0x27,0x4A,0x01,0x23,0x13,0x70,0x26,0x4A,0x13,0x80,0x02,0xF0,0xDE,0xFF, +0x2B,0x78,0x00,0x2B,0xFC,0xD1,0x23,0x68,0x14,0x20,0x98,0x47,0x00,0xF0,0xF6,0xF9, +0x03,0xF0,0xEF,0xFA,0x03,0xF0,0x72,0xFA,0x1C,0x4B,0x18,0x78,0x01,0xF0,0x88,0xF8, +0x10,0x4B,0x1E,0x70,0x00,0xF0,0x7E,0xFF,0x0E,0x4C,0x27,0x78,0x78,0xB2,0x13,0x28, +0x00,0xD9,0x8D,0xE1,0x05,0xF0,0xD4,0xF8,0x74,0x00,0x8C,0x01,0x78,0x01,0x8C,0x01, +0x8C,0x01,0x8C,0x01,0x8C,0x01,0x8C,0x01,0x8C,0x01,0x8C,0x01,0x8C,0x01,0x8C,0x01, +0x8C,0x01,0x68,0x00,0x8C,0x01,0x3A,0x00,0x30,0x00,0x5F,0x00,0x8C,0x01,0x89,0x01, +0xAE,0x09,0x00,0x20,0x1D,0x03,0x00,0x20,0x50,0x11,0x00,0x20,0xEB,0x01,0x00,0x20, +0xE9,0x01,0x00,0x20,0xEA,0x01,0x00,0x20,0xAA,0x0A,0x00,0x20,0xF8,0x01,0x00,0x20, +0xE8,0x01,0x00,0x20,0xE7,0x01,0x00,0x20,0xE5,0x01,0x00,0x20,0x48,0x0D,0x00,0x20, +0xF6,0x03,0x00,0x20,0x08,0x03,0x00,0x20,0xB1,0x4B,0x00,0x22,0x1A,0x70,0x00,0xF0, +0x7D,0xFE,0xB0,0x4B,0x1B,0x78,0x00,0x2B,0x00,0xD0,0x55,0xE1,0xAE,0x4C,0x23,0x78, +0x00,0x2B,0x03,0xD0,0x00,0x20,0xAD,0x49,0x03,0xF0,0xB8,0xFC,0x23,0x78,0x00,0x2B, +0x06,0xD0,0x01,0x21,0x00,0x20,0xAA,0x4A,0x0B,0x1C,0x00,0x90,0x03,0xF0,0x56,0xFC, +0xA8,0x4B,0x98,0x78,0x03,0xF0,0x78,0xFA,0xA7,0x4D,0xE8,0x7B,0x03,0xF0,0x52,0xF8, +0xA6,0x4C,0x20,0x60,0x28,0x7C,0x03,0xF0,0x4D,0xF8,0x11,0x23,0x60,0x60,0xEB,0x56, +0xEA,0x7B,0x53,0x43,0xA3,0x60,0x9A,0x4B,0x00,0x22,0x1A,0x70,0xA0,0x4B,0x1B,0x78, +0xA0,0x4B,0x18,0x78,0x01,0xF0,0x14,0xF8,0x95,0x4B,0x9D,0x4D,0x00,0x24,0x1C,0x70, +0x2B,0x78,0x00,0xF0,0x29,0xFD,0x03,0xF0,0x8B,0xFF,0x00,0xF0,0x25,0xFD,0x2C,0x70, +0x8F,0x4B,0x01,0x24,0x1C,0x70,0x00,0xF0,0x9B,0xFC,0x97,0x4B,0x1B,0x68,0x9A,0x05, +0x13,0xD5,0x96,0x4A,0x96,0x4B,0x04,0x20,0x1A,0x60,0x96,0x4B,0x19,0x68,0x01,0x43, +0x19,0x60,0x19,0x68,0x02,0x20,0x81,0x43,0x19,0x60,0x19,0x68,0x0C,0x43,0x1C,0x60, +0x91,0x4B,0x00,0x21,0x19,0x60,0x91,0x4B,0x1A,0x60,0x91,0x4C,0x03,0x20,0x23,0x68, +0x98,0x47,0x03,0xF0,0x3F,0xF8,0x23,0x68,0x05,0x20,0x98,0x47,0x02,0xF0,0xE4,0xFF, +0x8C,0x4C,0x8D,0x4D,0x01,0x20,0x40,0x42,0x21,0x1C,0x2A,0x1C,0x04,0xF0,0x4C,0xFC, +0x79,0x4B,0x1B,0x78,0x00,0x2B,0x03,0xD0,0x0C,0x20,0x88,0x49,0x03,0xF0,0x4E,0xFC, +0x87,0x4A,0x23,0x68,0x13,0x80,0x2B,0x68,0x53,0x80,0x73,0x4B,0x1B,0x78,0x00,0x2B, +0x06,0xD0,0x01,0x23,0x02,0x21,0x00,0x93,0x0C,0x20,0x0B,0x1C,0x03,0xF0,0xE6,0xFB, +0x7B,0x4C,0x06,0x20,0x23,0x68,0x98,0x47,0x03,0xF0,0xF4,0xFF,0x04,0xF0,0x64,0xF9, +0x04,0xF0,0x98,0xFB,0x00,0xF0,0x62,0xF9,0x04,0xF0,0x06,0xFD,0x04,0xF0,0x7E,0xFE, +0x78,0x4B,0x1B,0x78,0x00,0x2B,0x2A,0xD1,0x23,0x68,0x07,0x20,0x98,0x47,0x01,0xF0, +0x51,0xFA,0x23,0x68,0x08,0x20,0x98,0x47,0x02,0xF0,0xB2,0xFF,0x02,0xF0,0xBA,0xFF, +0x23,0x68,0x09,0x20,0x98,0x47,0x01,0xF0,0x69,0xFA,0x01,0xF0,0xD1,0xFB,0x23,0x68, +0x0A,0x20,0x98,0x47,0x01,0xF0,0x6E,0xFC,0x02,0xF0,0x44,0xFB,0x23,0x68,0x0B,0x20, +0x98,0x47,0x01,0xF0,0xB8,0xFE,0x01,0xF0,0xD7,0xFF,0x23,0x68,0x0E,0x20,0x98,0x47, +0x02,0xF0,0x84,0xF8,0x02,0xF0,0xF2,0xF9,0x23,0x68,0x10,0x20,0x98,0x47,0x00,0xF0, +0x81,0xF9,0x5B,0x4B,0x0F,0x20,0x1B,0x68,0x98,0x47,0x5E,0x4B,0x1B,0x78,0x00,0x2B, +0x3C,0xD1,0x02,0xF0,0x4F,0xFA,0x5C,0x4B,0x1A,0x68,0x5C,0x4B,0x00,0x2A,0x04,0xD1, +0x5B,0x49,0x09,0x68,0x00,0x29,0x00,0xDD,0x1A,0x70,0x47,0x4A,0x19,0x78,0x32,0x32, +0x12,0x78,0x91,0x42,0x01,0xD3,0x00,0x22,0x1A,0x70,0x1B,0x78,0x00,0x2B,0x21,0xD1, +0x53,0x4B,0x51,0x4C,0x1B,0x68,0x00,0x2B,0x09,0xDD,0x20,0x68,0x00,0x28,0x06,0xD1, +0x39,0x4B,0x1B,0x78,0x00,0x2B,0x02,0xD0,0x4E,0x49,0x03,0xF0,0xCF,0xFB,0x4E,0x4B, +0x1B,0x68,0x98,0x47,0x23,0x68,0x00,0x2B,0x0A,0xDD,0x49,0x4B,0x18,0x68,0x00,0x28, +0x06,0xD1,0x31,0x4B,0x1B,0x78,0x00,0x2B,0x02,0xD0,0x48,0x49,0x03,0xF0,0xBE,0xFB, +0x02,0xF0,0x72,0xFA,0x41,0x4B,0x1A,0x78,0x01,0x32,0x1A,0x70,0x32,0x4B,0x1B,0x68, +0x9A,0x05,0x23,0xD5,0x34,0x4B,0x18,0x68,0x2A,0x4B,0x1A,0x79,0x19,0x78,0x2F,0x4B, +0x18,0x1A,0x53,0x1C,0x98,0x40,0x04,0xF0,0x8D,0xFF,0x23,0x4C,0x2F,0x4D,0x23,0x78, +0x28,0x60,0x00,0x2B,0x03,0xD0,0x00,0x20,0x39,0x49,0x03,0xF0,0x9F,0xFB,0x23,0x78, +0x00,0x2B,0x06,0xD0,0x00,0x20,0x01,0x21,0x2A,0x1C,0x04,0x23,0x00,0x90,0x03,0xF0, +0x3D,0xFB,0x24,0x4B,0x01,0x21,0x1A,0x68,0x8A,0x43,0x1A,0x60,0x80,0x23,0xDB,0x05, +0x9A,0x6C,0x01,0x21,0x0A,0x43,0x9A,0x64,0x00,0xF0,0x1E,0xFC,0x2D,0x4B,0x00,0x20, +0x18,0x56,0x00,0xF0,0x5D,0xFE,0x17,0xE0,0x0F,0x4B,0x1B,0x78,0x00,0x2B,0x03,0xD0, +0x05,0x20,0x29,0x49,0x03,0xF0,0x7A,0xFB,0x01,0x20,0x00,0xF0,0xF9,0xFE,0x00,0x20, +0x00,0xF0,0xF6,0xFE,0x13,0x23,0x23,0x70,0x06,0xE0,0x00,0xF0,0x0D,0xFC,0x03,0xE0, +0x13,0x4B,0x11,0x20,0x1B,0x68,0x98,0x47,0x20,0x4B,0x1F,0x70,0xEB,0xE5,0xC0,0x46, +0xEA,0x01,0x00,0x20,0xE0,0x01,0x00,0x20,0xEB,0x01,0x00,0x20,0x34,0x59,0x00,0x00, +0xAC,0x0A,0x00,0x20,0xAA,0x0A,0x00,0x20,0xAE,0x09,0x00,0x20,0xFC,0x02,0x00,0x20, +0x1D,0x03,0x00,0x20,0x48,0x0D,0x00,0x20,0x58,0x00,0x00,0x20,0xFF,0xFF,0xFF,0x00, +0x14,0xE0,0x00,0xE0,0x10,0xE0,0x00,0xE0,0x18,0xE0,0x00,0xE0,0xFC,0x01,0x00,0x20, +0xF8,0x01,0x00,0x20,0x34,0x11,0x00,0x20,0x38,0x11,0x00,0x20,0x38,0x59,0x00,0x00, +0x54,0x11,0x00,0x20,0x48,0x11,0x00,0x20,0x20,0x01,0x00,0x20,0xCA,0x00,0x00,0x20, +0x9C,0x0D,0x00,0x20,0x3E,0x59,0x00,0x00,0x00,0x02,0x00,0x20,0x47,0x59,0x00,0x00, +0x51,0x59,0x00,0x00,0xB3,0x01,0x00,0x20,0x5E,0x59,0x00,0x00,0x56,0x00,0x00,0x20, +0x08,0xB5,0x01,0xF0,0x99,0xFD,0x01,0xF0,0xB3,0xFD,0x03,0x4B,0x1B,0x68,0x98,0x47, +0x02,0xF0,0xD2,0xF9,0x08,0xBD,0xC0,0x46,0x00,0x02,0x00,0x20,0x10,0xB5,0x04,0xF0, +0xEF,0xFD,0x05,0x4C,0x00,0x20,0x23,0x68,0x98,0x47,0x04,0xF0,0x19,0xFE,0x23,0x68, +0x01,0x20,0x98,0x47,0x10,0xBD,0xC0,0x46,0xF8,0x01,0x00,0x20,0x7F,0xB5,0x17,0x4D, +0x17,0x4B,0x5B,0x1B,0x03,0x93,0x17,0x4B,0x1B,0x78,0x00,0x2B,0x06,0xD0,0x00,0x20, +0x01,0x21,0x03,0xAA,0x04,0x23,0x00,0x90,0x03,0xF0,0xA0,0xFA,0x12,0x4E,0x18,0xE0, +0x14,0x2C,0x00,0xDD,0x14,0x24,0xE1,0xB2,0x08,0x1C,0x03,0xE0,0x01,0x38,0xC0,0xB2, +0x2B,0x5C,0x33,0x54,0x00,0x28,0xF9,0xD1,0x0A,0x4B,0x1B,0x78,0x00,0x2B,0x04,0xD0, +0x09,0x4A,0x01,0x23,0x00,0x90,0x03,0xF0,0x89,0xFA,0x03,0x9B,0x2D,0x19,0x1B,0x1B, +0x03,0x93,0x03,0x9C,0x00,0x2C,0xE3,0xD1,0x7F,0xBD,0xC0,0x46,0x0C,0x1E,0x00,0x20, +0x00,0x20,0x00,0x20,0xEB,0x01,0x00,0x20,0x54,0x11,0x00,0x20,0x13,0xB5,0x1E,0x4B, +0x1B,0x78,0x00,0x2B,0x37,0xD0,0x1D,0x4C,0x00,0x23,0x23,0x70,0x1C,0x4B,0x04,0x20, +0x1B,0x68,0x98,0x47,0x1B,0x4B,0x1C,0x4A,0x59,0x68,0x1B,0x68,0x11,0x80,0x53,0x80, +0x1A,0x4B,0x1B,0x78,0x00,0x2B,0x06,0xD0,0x01,0x23,0x02,0x21,0x00,0x93,0x18,0x20, +0x0B,0x1C,0x03,0xF0,0x5B,0xFA,0x23,0x78,0x15,0x4C,0x00,0x2B,0x1A,0xD0,0x13,0x4B, +0x1B,0x78,0x00,0x2B,0x03,0xD0,0x00,0x20,0x12,0x49,0x03,0xF0,0xA7,0xFA,0x12,0x4A, +0x01,0x23,0x13,0x70,0x22,0x68,0x02,0x2A,0x04,0xDC,0xD2,0x18,0x22,0x60,0x0F,0x4A, +0x13,0x70,0x08,0xE0,0xFF,0xF7,0x74,0xFF,0x0D,0x4B,0x0D,0x22,0x1A,0x70,0x00,0x23, +0x23,0x60,0x00,0xE0,0x23,0x60,0x13,0xBD,0x1C,0x03,0x00,0x20,0x3D,0x11,0x00,0x20, +0xF8,0x01,0x00,0x20,0x70,0x01,0x00,0x20,0x54,0x11,0x00,0x20,0xEB,0x01,0x00,0x20, +0x84,0x01,0x00,0x20,0xD0,0x58,0x00,0x00,0x48,0x11,0x00,0x20,0x14,0x09,0x00,0x20, +0x1D,0x03,0x00,0x20,0xF0,0xB5,0xBA,0x4B,0x85,0xB0,0x04,0x33,0xDB,0x7F,0x00,0x24, +0xB8,0x49,0x0A,0x22,0x09,0xE0,0x01,0x3B,0xDB,0xB2,0x10,0x1C,0x58,0x43,0x08,0x18, +0x3C,0x25,0x40,0x5F,0x00,0x28,0x00,0xD0,0x01,0x24,0x00,0x2B,0xF3,0xD1,0xB2,0x4B, +0xB2,0x4A,0x1B,0x78,0x07,0xE0,0x01,0x3B,0xDB,0xB2,0x19,0x1D,0x49,0x00,0x89,0x5E, +0x00,0x29,0x00,0xD0,0x01,0x24,0x00,0x2B,0xF5,0xD1,0xAD,0x4A,0x00,0x2C,0x04,0xD1, +0x13,0x68,0xAC,0x49,0x8B,0x42,0x01,0xD0,0x01,0x33,0x13,0x60,0xAA,0x4B,0x00,0x22, +0x1A,0x70,0xA4,0x4B,0x1A,0x68,0xA2,0x4B,0x00,0x2A,0x7C,0xD1,0xA3,0x4A,0x12,0x68, +0x00,0x2A,0x78,0xD1,0x1A,0x1C,0x34,0x32,0x10,0x78,0x00,0x28,0x41,0xD1,0xA3,0x4A, +0x12,0x78,0x01,0x2A,0x17,0xD1,0xA2,0x4B,0x18,0x70,0xA2,0x4B,0x1A,0x70,0xA2,0x4B, +0x18,0x70,0xA2,0x4B,0x1B,0x78,0x00,0x2B,0x02,0xD0,0xA1,0x49,0x03,0xF0,0x2E,0xFA, +0x99,0x4B,0x01,0x22,0x1A,0x70,0x01,0xF0,0x9F,0xFC,0x01,0xF0,0xB9,0xFC,0x97,0x4B, +0x00,0x22,0x1A,0x70,0x67,0xE1,0x9B,0x4A,0x3C,0x33,0x1B,0x78,0x12,0x68,0x9A,0x42, +0x1F,0xDB,0x96,0x4B,0x1B,0x78,0x00,0x2B,0x02,0xD0,0x97,0x49,0x03,0xF0,0x16,0xFA, +0x96,0x4B,0x87,0x49,0x1A,0x68,0x3D,0x31,0x01,0x32,0x1A,0x60,0x09,0x78,0x8A,0x42, +0x0F,0xDB,0x00,0x20,0x18,0x60,0x8A,0x4B,0x18,0x70,0x8A,0x4B,0x18,0x70,0x8B,0x4B, +0x1B,0x78,0x83,0x42,0x02,0xD0,0x8E,0x49,0x03,0xF0,0x00,0xFA,0x82,0x4B,0x02,0x22, +0x1A,0x70,0x85,0x4B,0x8B,0x4A,0x00,0x21,0x19,0x70,0x10,0x68,0x85,0x4B,0x19,0x60, +0x13,0x1C,0x88,0x42,0x0E,0xDD,0x01,0x38,0x10,0x60,0x8C,0x42,0x00,0xD0,0x11,0x60, +0x1A,0x68,0x01,0x2A,0x00,0xD0,0x18,0xE1,0x00,0x22,0x1A,0x60,0x76,0x4B,0x03,0x22, +0x1A,0x70,0x28,0xE1,0x80,0x4B,0x81,0x49,0x04,0x33,0xDB,0x8F,0x8B,0x42,0x00,0xD1, +0x0B,0xE1,0x7F,0x49,0x09,0x68,0x99,0x42,0x00,0xDA,0x06,0xE1,0x68,0x4B,0x6C,0x48, +0x19,0x1C,0x3E,0x31,0x09,0x78,0x00,0x68,0x88,0x42,0x00,0xDA,0xFD,0xE0,0x3F,0x33, +0x1B,0x78,0x13,0x60,0xF9,0xE0,0x04,0x33,0xD8,0x7F,0x00,0x23,0x1A,0x1C,0x75,0x49, +0x31,0xE0,0x01,0x38,0xC0,0xB2,0x0A,0x24,0x44,0x43,0x5E,0x4F,0x3D,0x19,0x3C,0x26, +0xAD,0x5F,0x00,0x2D,0x27,0xDD,0x0C,0x19,0x3C,0x27,0xE4,0x5F,0x00,0x2C,0x22,0xDD, +0x44,0x00,0x0D,0x19,0xAF,0x88,0x57,0x4D,0x3E,0xB2,0x2C,0x19,0xA4,0x88,0x25,0xB2, +0x76,0x1B,0x02,0xD4,0x3C,0x1B,0xA4,0xB2,0x01,0xE0,0xE4,0x1B,0xA4,0xB2,0x05,0x1C, +0x64,0x4E,0x50,0x4F,0x10,0x35,0x6D,0x00,0xA2,0x18,0xAC,0x5B,0xED,0x5B,0x27,0xB2, +0x2E,0xB2,0x92,0xB2,0xBF,0x1B,0x02,0xD4,0x64,0x1B,0xA4,0xB2,0x01,0xE0,0x2C,0x1B, +0xA4,0xB2,0xE3,0x18,0x9B,0xB2,0x00,0x28,0xCB,0xD1,0x56,0x49,0x08,0x60,0x4D,0x49, +0x0C,0x78,0x43,0x49,0x00,0x2C,0x40,0xD0,0x34,0x31,0x0B,0x78,0x00,0x2B,0x00,0xD0, +0xB3,0xE0,0x4A,0x4B,0x1B,0x78,0x00,0x2B,0x02,0xD0,0x53,0x49,0x03,0xF0,0x7E,0xF9, +0x4F,0x4C,0x52,0x4A,0x23,0x68,0x13,0x80,0x51,0x4B,0x1B,0x68,0x53,0x80,0x43,0x4B, +0x1B,0x78,0x00,0x2B,0x06,0xD0,0x01,0x23,0x02,0x21,0x00,0x93,0x00,0x20,0x0B,0x1C, +0x03,0xF0,0x14,0xF9,0x32,0x49,0x20,0x68,0x4A,0x8F,0x3B,0x4B,0x90,0x42,0x14,0xDA, +0x41,0x4A,0x47,0x48,0x45,0x32,0x12,0x78,0x00,0x68,0x90,0x42,0x0D,0xDA,0x1B,0x78, +0x00,0x2B,0x00,0xD0,0x89,0xE0,0x37,0x4B,0x3C,0x31,0x1A,0x68,0x09,0x78,0x8A,0x42, +0x00,0xDB,0x82,0xE0,0x01,0x32,0x1A,0x60,0x7F,0xE0,0x01,0x22,0x1A,0x70,0x31,0x4A, +0x00,0x23,0x13,0x60,0x31,0x4A,0x13,0x60,0x77,0xE0,0x08,0x1C,0x34,0x30,0x00,0x78, +0x00,0x28,0x72,0xD1,0x32,0x48,0x09,0x8F,0x00,0x68,0x88,0x42,0x09,0xDB,0x2E,0x49, +0x33,0x48,0x45,0x31,0x09,0x78,0x00,0x68,0x88,0x42,0x02,0xDB,0x22,0x49,0x01,0x20, +0x08,0x70,0x1F,0x49,0x09,0x78,0x00,0x29,0x08,0xD1,0x15,0x49,0x08,0x8F,0x27,0x49, +0x88,0x42,0x5A,0xD0,0x1C,0x49,0x09,0x78,0x00,0x29,0x56,0xD0,0x11,0x49,0x09,0x68, +0x01,0x29,0x05,0xDC,0x0E,0x49,0xC9,0x8E,0x8A,0x42,0x01,0xD8,0x8B,0x42,0x49,0xD9, +0x13,0x4B,0x00,0x20,0x18,0x70,0x13,0x4B,0x01,0x22,0x1A,0x70,0x12,0x4B,0x18,0x70, +0x12,0x4B,0x1B,0x78,0x83,0x42,0x02,0xD0,0x11,0x49,0x03,0xF0,0x0F,0xF9,0x0A,0x4B, +0x01,0x22,0x1A,0x70,0x01,0xF0,0x80,0xFB,0x01,0xF0,0x9A,0xFB,0x35,0xE0,0xC0,0x46, +0xAE,0x09,0x00,0x20,0x9C,0x0D,0x00,0x20,0x7C,0x09,0x00,0x20,0xE0,0x00,0x00,0x20, +0xC8,0x01,0x00,0x20,0xFF,0xFF,0xFF,0x7F,0xB3,0x01,0x00,0x20,0xB4,0x01,0x00,0x20, +0xDC,0x01,0x00,0x20,0xDD,0x01,0x00,0x20,0xD4,0x01,0x00,0x20,0xEB,0x01,0x00,0x20, +0xDA,0x58,0x00,0x00,0xD8,0x01,0x00,0x20,0xE4,0x58,0x00,0x00,0xD0,0x01,0x00,0x20, +0xEC,0x58,0x00,0x00,0xCC,0x01,0x00,0x20,0x48,0x0D,0x00,0x20,0xFF,0xFF,0x00,0x00, +0x34,0x11,0x00,0x20,0x20,0x03,0x00,0x20,0xF5,0x58,0x00,0x00,0x54,0x11,0x00,0x20, +0x38,0x11,0x00,0x20,0x0D,0x4B,0x01,0x22,0x1A,0x70,0x0D,0x4B,0x34,0x33,0x1B,0x78, +0x00,0x2B,0x10,0xD0,0x0B,0x4B,0x1A,0x78,0x00,0x2A,0x0C,0xD0,0x0A,0x4A,0x00,0x21, +0x51,0x56,0x03,0x29,0x07,0xD0,0x09,0x49,0x09,0x78,0x48,0x42,0x41,0x41,0x01,0x31, +0x11,0x70,0x00,0x22,0x1A,0x70,0x05,0xB0,0xF0,0xBD,0xC0,0x46,0xB4,0x01,0x00,0x20, +0xAE,0x09,0x00,0x20,0xDC,0x01,0x00,0x20,0xB3,0x01,0x00,0x20,0xDD,0x01,0x00,0x20, +0x10,0xB5,0x54,0x4B,0x1B,0x78,0x00,0x2B,0x0A,0xD0,0x53,0x4B,0x1B,0x68,0x98,0x47, +0x01,0xF0,0x1A,0xFB,0x01,0xF0,0x34,0xFB,0x01,0xF0,0x56,0xFF,0x02,0xF0,0x90,0xFB, +0x4E,0x4B,0x02,0x21,0x1A,0x68,0x8A,0x43,0x1A,0x60,0x19,0x68,0x80,0x22,0xD2,0x05, +0x90,0x68,0x91,0x60,0x19,0x68,0x08,0x20,0x81,0x43,0x19,0x60,0x19,0x68,0x90,0x68, +0x91,0x60,0x19,0x68,0x04,0x20,0x81,0x43,0x19,0x60,0x1B,0x68,0x91,0x68,0x93,0x60, +0x40,0x4B,0x18,0x78,0x42,0x4B,0x1B,0x78,0x00,0x28,0x32,0xD0,0x00,0x2B,0x03,0xD0, +0x00,0x20,0x40,0x49,0x03,0xF0,0x7A,0xF8,0x3F,0x4B,0x80,0x22,0x19,0x68,0x52,0x00, +0x0A,0x43,0x1A,0x60,0x1A,0x68,0xA0,0x23,0xDB,0x05,0x99,0x68,0x9A,0x60,0x37,0x4B, +0x3A,0x4A,0x19,0x68,0x0A,0x40,0x1A,0x60,0x1A,0x68,0x80,0x23,0xDB,0x05,0x99,0x68, +0x9A,0x60,0x37,0x4A,0x01,0x21,0x11,0x70,0x19,0x68,0x80,0x22,0x52,0x04,0x0A,0x43, +0x1A,0x60,0xC0,0x46,0xC0,0x46,0xC0,0x46,0xC0,0x46,0x62,0xB6,0x31,0x4A,0x19,0x68, +0x0A,0x40,0x1A,0x60,0xBF,0xF3,0x6F,0x8F,0xFA,0x20,0xC0,0x00,0x02,0xF0,0x6E,0xFC, +0x11,0xE0,0x00,0x2B,0x02,0xD0,0x2C,0x49,0x03,0xF0,0x48,0xF8,0x2B,0x48,0x02,0xF0, +0x65,0xFC,0x2B,0x4B,0x1B,0x78,0x00,0x2B,0x05,0xD1,0x2A,0x4B,0x1B,0x78,0x00,0x2B, +0x01,0xD1,0x02,0xF0,0x59,0xFE,0x1D,0x4B,0x02,0x21,0x1A,0x68,0x0A,0x43,0x1A,0x60, +0x19,0x68,0x80,0x22,0xD2,0x05,0x90,0x68,0x91,0x60,0x23,0x49,0x01,0x31,0xC8,0x7F, +0x08,0x21,0x00,0x28,0x06,0xD0,0x18,0x68,0x01,0x43,0x19,0x60,0x19,0x68,0x90,0x68, +0x91,0x60,0x05,0xE0,0x18,0x68,0x88,0x43,0x18,0x60,0x19,0x68,0x90,0x68,0x91,0x60, +0x1A,0x68,0x04,0x21,0x0A,0x43,0x1A,0x60,0x1A,0x68,0x80,0x23,0xDB,0x05,0xFA,0x20, +0x99,0x68,0xC0,0x00,0x9A,0x60,0x02,0xF0,0x31,0xFC,0x06,0x4B,0x1B,0x78,0x00,0x2B, +0x06,0xD0,0x12,0x4C,0x0D,0x20,0x23,0x68,0x98,0x47,0x23,0x68,0x12,0x20,0x98,0x47, +0x10,0xBD,0xC0,0x46,0xE8,0x01,0x00,0x20,0x68,0x00,0x00,0x20,0x14,0x00,0x00,0x20, +0xEB,0x01,0x00,0x20,0xFB,0x58,0x00,0x00,0x0C,0x00,0x00,0x20,0xFF,0xFE,0xFF,0xFF, +0x2C,0x00,0x00,0x20,0xFF,0xFF,0xFF,0xFE,0x01,0x59,0x00,0x00,0x40,0x42,0x0F,0x00, +0xE5,0x01,0x00,0x20,0xE4,0x01,0x00,0x20,0xAE,0x09,0x00,0x20,0xF8,0x01,0x00,0x20, +0x10,0xB5,0x31,0x4B,0x02,0x24,0x19,0x78,0x30,0x4B,0x4A,0xB2,0x1B,0x78,0x00,0x2B, +0x25,0xD0,0x2F,0x4B,0x1B,0x78,0x00,0x2B,0x21,0xD1,0x2E,0x4B,0x1B,0x78,0x00,0x2B, +0x1D,0xD1,0x2D,0x4B,0xA2,0x42,0x07,0xD0,0x2C,0x48,0x80,0x7B,0x00,0x28,0x03,0xD1, +0x2B,0x48,0x00,0x68,0x00,0x28,0x03,0xD0,0x00,0x21,0x19,0x60,0x01,0x24,0x0E,0xE0, +0x28,0x4A,0x18,0x68,0x92,0x68,0x90,0x42,0x01,0xDA,0x01,0x30,0x18,0x60,0x00,0x29, +0x36,0xD0,0x21,0x4B,0x00,0x24,0x1B,0x68,0x93,0x42,0x16,0xDA,0x30,0xE0,0x63,0xB2, +0x93,0x42,0x2D,0xD0,0x01,0x2B,0x1D,0xD0,0x02,0x2B,0x02,0xD0,0x00,0x2B,0x0C,0xD0, +0x24,0xE0,0x1D,0x4B,0x1B,0x78,0x00,0x2B,0x03,0xD0,0x00,0x20,0x1B,0x49,0x02,0xF0, +0xA5,0xFF,0x00,0x20,0x02,0xF0,0x78,0xFB,0x18,0xE0,0x17,0x4B,0x1B,0x78,0x00,0x2B, +0x03,0xD0,0x00,0x20,0x16,0x49,0x02,0xF0,0x99,0xFF,0x12,0x4B,0x58,0x68,0x02,0xF0, +0x6B,0xFB,0x0B,0xE0,0x10,0x4B,0x1B,0x78,0x00,0x2B,0x03,0xD0,0x00,0x20,0x11,0x49, +0x02,0xF0,0x8C,0xFF,0x0B,0x4B,0x18,0x68,0x02,0xF0,0x5E,0xFB,0x02,0x4B,0x1C,0x70, +0x02,0xF0,0x4C,0xFB,0x10,0xBD,0xC0,0x46,0x3C,0x00,0x00,0x20,0x1C,0x03,0x00,0x20, +0xE3,0x01,0x00,0x20,0xE2,0x01,0x00,0x20,0x5C,0x00,0x00,0x20,0x70,0x01,0x00,0x20, +0xE0,0x00,0x00,0x20,0xFC,0x02,0x00,0x20,0xEB,0x01,0x00,0x20,0x09,0x59,0x00,0x00, +0x0E,0x59,0x00,0x00,0x13,0x59,0x00,0x00,0x08,0xB5,0x02,0xF0,0x5F,0xFB,0x08,0xBD, +0x08,0xB5,0x02,0xF0,0x4D,0xFB,0x08,0xBD,0x08,0xB5,0x02,0xF0,0xE5,0xFA,0x80,0x23, +0xDB,0x05,0x9A,0x6C,0x01,0x21,0x0A,0x43,0x9A,0x64,0xFF,0xF7,0xF1,0xFF,0x08,0xBD, +0xF0,0xB5,0x87,0xB0,0xFF,0xF7,0xF0,0xFF,0x78,0x4A,0x79,0x4C,0x53,0x78,0x15,0x78, +0x78,0x48,0x10,0xE0,0x01,0x3B,0xDB,0xB2,0x9A,0x1C,0x67,0x46,0xB2,0x18,0x79,0x01, +0x52,0x00,0x12,0x5B,0xC9,0x18,0x4F,0x00,0x3A,0x52,0x73,0x4A,0x00,0x27,0x8F,0x54, +0x00,0x2B,0xEF,0xD1,0x63,0x46,0x5A,0x1E,0xD2,0xB2,0x00,0x2B,0x04,0xD0,0x56,0x1C, +0x2B,0x1C,0xB6,0x01,0x94,0x46,0xF3,0xE7,0x6C,0x4B,0x6D,0x4C,0x1B,0x78,0x6D,0x48, +0x67,0x49,0x6D,0x4A,0x0E,0xE0,0x01,0x3B,0xDB,0xB2,0xE5,0x5C,0xC6,0x5C,0x01,0x35, +0x02,0x36,0xAD,0x01,0xAD,0x19,0x6D,0x00,0x6E,0x5A,0x5D,0x00,0xAE,0x52,0x67,0x4D, +0x00,0x26,0xEE,0x54,0x00,0x2B,0xEE,0xD1,0x65,0x25,0x03,0x95,0x5B,0x4C,0x66,0xE0, +0xFF,0xF7,0xB2,0xFF,0x26,0x78,0x63,0x78,0x05,0x96,0x2D,0xE0,0x01,0x3B,0xDB,0xB2, +0x58,0x4F,0xF0,0x18,0x04,0x9D,0x40,0x00,0x9A,0x1C,0xC0,0x5B,0xAD,0x18,0x54,0x4F, +0x6D,0x00,0xEF,0x5B,0xC7,0x1B,0x04,0xD4,0x51,0x4F,0xED,0x5B,0x45,0x1B,0x02,0x95, +0x03,0xE0,0x4F,0x4F,0xED,0x5B,0x2D,0x1A,0x02,0x95,0x04,0x98,0x87,0x18,0x4C,0x48, +0x7F,0x00,0xC0,0x5B,0x4B,0x4F,0x84,0x46,0xF0,0x18,0x42,0x00,0x15,0x1C,0x62,0x46, +0xEA,0x53,0x49,0x4D,0x2F,0x5C,0x02,0x9D,0xBD,0x42,0x00,0xDA,0x3D,0x1C,0x46,0x4F, +0x3D,0x54,0x00,0x2B,0xD2,0xD1,0x0B,0x1C,0x59,0x1E,0xC9,0xB2,0x00,0x2B,0x05,0xD0, +0x48,0x1C,0x80,0x01,0x05,0x9B,0x4E,0x01,0x04,0x90,0xF2,0xE7,0x3F,0x4B,0x3C,0x4A, +0x1B,0x78,0x22,0xE0,0x3E,0x4D,0x01,0x3B,0xDB,0xB2,0x3E,0x4F,0xEE,0x5C,0x3E,0x48, +0xFD,0x5C,0x59,0x00,0x01,0x36,0x09,0x5A,0x02,0x35,0xB0,0x01,0x40,0x19,0x40,0x00, +0x87,0x5A,0x80,0x5A,0xCF,0x1B,0x01,0xD4,0x09,0x1A,0x00,0xE0,0x41,0x1A,0xB6,0x01, +0x75,0x19,0x2F,0x48,0x6D,0x00,0x46,0x5B,0x33,0x48,0x5D,0x00,0x2E,0x52,0x33,0x48, +0xC5,0x5C,0xA9,0x42,0x00,0xDA,0x29,0x1C,0xC1,0x54,0x00,0x2B,0xDA,0xD1,0x03,0x9B, +0x01,0x3B,0xDB,0xB2,0x03,0x93,0x00,0x2B,0x92,0xD1,0x61,0x78,0x24,0x78,0x24,0x4A, +0x04,0x94,0x1E,0xE0,0x01,0x3B,0xDB,0xB2,0x45,0x01,0xED,0x18,0x21,0x4F,0x6D,0x00, +0xEE,0x5B,0x25,0x88,0xAC,0x46,0x9D,0x1C,0x66,0x45,0x09,0xD9,0x27,0x88,0xF6,0x1B, +0x8F,0x01,0xBC,0x46,0x65,0x44,0x6D,0x00,0xB6,0xB2,0xAF,0x5A,0xAE,0x52,0x05,0xE0, +0x8E,0x01,0x75,0x19,0x6D,0x00,0xAE,0x5A,0x00,0x26,0xAE,0x52,0x00,0x2B,0xE1,0xD1, +0x01,0x1C,0x48,0x1E,0xC0,0xB2,0x00,0x29,0x05,0xD0,0x41,0x1C,0x18,0x4F,0xCC,0x01, +0x04,0x9B,0xE4,0x19,0xF2,0xE7,0x11,0x4B,0x13,0x4F,0x1B,0x78,0x10,0x4E,0x15,0x48, +0x10,0xE0,0x01,0x3B,0xDB,0xB2,0xF5,0x5C,0x13,0x49,0xED,0x01,0x5A,0x00,0x6D,0x18, +0xD4,0x5B,0x29,0x88,0x8C,0x42,0x03,0xD9,0x2D,0x88,0x64,0x1B,0x84,0x52,0x01,0xE0, +0x00,0x25,0x85,0x52,0x00,0x2B,0xEC,0xD1,0x07,0xB0,0xF0,0xBD,0x0A,0x03,0x00,0x20, +0x00,0x40,0x00,0x40,0xF8,0x03,0x00,0x20,0xB3,0x0A,0x00,0x20,0x7C,0x09,0x00,0x20, +0x30,0x75,0x00,0x00,0x2A,0x75,0x00,0x00,0x14,0x02,0x00,0x20,0xA4,0x0A,0x00,0x20, +0x02,0x40,0x00,0x40,0x3C,0x0D,0x00,0x20,0x82,0x40,0x00,0x40,0xF0,0xB5,0x87,0xB0, +0x02,0xF0,0x4A,0xF8,0x02,0xF0,0x60,0xF9,0x00,0x28,0xFB,0xD1,0x52,0x4B,0x1B,0x78, +0x02,0x2B,0x09,0xD0,0x51,0x4B,0x52,0x49,0x40,0x33,0x1A,0x78,0x53,0x42,0x54,0x18, +0xE0,0x54,0x01,0x33,0x93,0x42,0xFA,0xDD,0x4C,0x4E,0x4E,0x4F,0x33,0x1C,0x40,0x33, +0x1C,0x78,0x64,0x42,0x0C,0xE0,0xFA,0x78,0x80,0x23,0x12,0x19,0xD2,0xB2,0xDB,0x05, +0x1A,0x71,0xFF,0xF7,0xC1,0xFE,0x28,0x78,0x20,0x18,0x03,0xF0,0xF3,0xFD,0x01,0x34, +0x35,0x1C,0x40,0x35,0x2B,0x78,0x9C,0x42,0xED,0xDD,0x00,0x26,0x25,0xE0,0x2C,0x78, +0x2F,0x1C,0x64,0x42,0x40,0x3F,0x1A,0xE0,0x3E,0x4B,0xDA,0x78,0x80,0x23,0x12,0x19, +0xDB,0x05,0xD2,0xB2,0x1A,0x71,0xFF,0xF7,0xA7,0xFE,0x2D,0x78,0x04,0xA9,0x65,0x19, +0x05,0xAA,0x28,0x1C,0x03,0xF0,0xF8,0xFD,0x35,0x49,0x04,0x9B,0x4A,0x5D,0xFF,0x2B, +0x00,0xDD,0xFF,0x23,0x9A,0x42,0x00,0xDA,0x1A,0x1C,0x4A,0x55,0x01,0x34,0x3D,0x1C, +0x40,0x35,0x2B,0x78,0x9C,0x42,0xDF,0xDD,0x01,0x36,0x2F,0x4A,0x2B,0x4D,0x13,0x78, +0x40,0x35,0x9E,0x42,0xD3,0xDB,0x01,0xF0,0xDF,0xFF,0x2C,0x49,0x2A,0x78,0x0D,0x78, +0x2B,0x49,0x27,0x48,0x09,0x78,0x01,0x23,0x03,0x91,0x9B,0x1A,0x00,0x21,0x29,0x4C, +0x10,0x18,0x94,0x46,0x11,0xE0,0xC6,0x18,0x72,0x1E,0x12,0x78,0xC7,0x5C,0x6A,0x43, +0x02,0x92,0x03,0x9A,0x57,0x43,0x02,0x9A,0xD7,0x19,0x72,0x78,0x6A,0x43,0xBA,0x18, +0x94,0x42,0x01,0xDB,0x94,0xB2,0x19,0x1C,0x01,0x33,0x9C,0x45,0xEB,0xDC,0x19,0x4B, +0x1D,0x4C,0xDA,0x78,0x51,0x18,0xC9,0xB2,0x99,0x70,0x13,0x4B,0x18,0x78,0x00,0x28, +0x05,0xD1,0x23,0x78,0x00,0x2B,0x02,0xD0,0x18,0x49,0x02,0xF0,0xB7,0xFD,0x23,0x78, +0x00,0x2B,0x0B,0xD0,0x0D,0x4B,0x00,0x20,0x40,0x33,0x19,0x78,0x0C,0x4A,0x49,0x00, +0x01,0x31,0xC9,0xB2,0x01,0x23,0x00,0x90,0x02,0xF0,0x50,0xFD,0x0E,0x4B,0x1B,0x78, +0x00,0x2B,0x06,0xD0,0x01,0x21,0x00,0x20,0x0D,0x4A,0x0B,0x1C,0x00,0x90,0x02,0xF0, +0x45,0xFD,0x07,0xB0,0xF0,0xBD,0xC0,0x46,0xE0,0x01,0x00,0x20,0x48,0x0D,0x00,0x20, +0x93,0x01,0x00,0x20,0xAA,0x0A,0x00,0x20,0x87,0x0D,0x00,0x20,0x54,0x00,0x00,0x20, +0x55,0x00,0x00,0x20,0xFF,0xFF,0x00,0x00,0xEB,0x01,0x00,0x20,0x1A,0x59,0x00,0x00, +0xAC,0x0A,0x00,0x20,0x13,0xB5,0x24,0x4B,0x24,0x4C,0x1B,0x68,0x00,0x2B,0x0E,0xD0, +0x23,0x78,0x00,0x2B,0x03,0xD0,0x00,0x20,0x21,0x49,0x02,0xF0,0x77,0xFD,0xFF,0xF7, +0x6D,0xFA,0x23,0x78,0x00,0x2B,0x02,0xD1,0x02,0xF0,0x38,0xF8,0xFE,0xE7,0x23,0x78, +0x00,0x2B,0x09,0xD0,0x1B,0x4C,0x23,0x68,0xDA,0x00,0x05,0xD5,0xFF,0xF7,0x5E,0xFA, +0x22,0x68,0x19,0x4B,0x13,0x40,0x23,0x60,0x14,0x4C,0x23,0x78,0x00,0x2B,0x22,0xD0, +0x14,0x4B,0x1B,0x68,0x5A,0x01,0x1E,0xD5,0x14,0x49,0x00,0x20,0x02,0xF0,0x56,0xFD, +0x13,0x4B,0x14,0x4A,0x19,0x88,0x11,0x80,0x59,0x88,0x51,0x80,0x99,0x88,0x91,0x80, +0xDB,0x88,0xD3,0x80,0x10,0x4B,0x1B,0x78,0x13,0x81,0x23,0x78,0x00,0x2B,0x05,0xD0, +0x00,0x20,0x05,0x21,0x02,0x23,0x00,0x90,0x02,0xF0,0xE8,0xFC,0x05,0x4B,0x0B,0x4A, +0x19,0x68,0x0A,0x40,0x1A,0x60,0x13,0xBD,0x0C,0x1E,0x00,0x20,0xEB,0x01,0x00,0x20, +0x20,0x59,0x00,0x00,0x58,0x00,0x00,0x20,0xFF,0xFF,0xFF,0xEF,0x27,0x59,0x00,0x00, +0x04,0x02,0x00,0x20,0x54,0x11,0x00,0x20,0xAA,0x0A,0x00,0x20,0xFF,0xFF,0xFF,0xFB, +0x10,0xB5,0x02,0x28,0x04,0xD0,0x03,0x28,0x45,0xD0,0x01,0x28,0x33,0xD1,0x15,0xE0, +0xFF,0xF7,0xF6,0xF9,0x29,0x4B,0x2A,0x4C,0x40,0x33,0x1B,0x78,0x29,0x49,0x50,0x22, +0x23,0x70,0x29,0x48,0x04,0xF0,0xA6,0xF9,0x28,0x4B,0x0D,0x20,0x1B,0x68,0x98,0x47, +0xFF,0xF7,0xF4,0xF9,0x23,0x78,0x10,0x2B,0x1A,0xD1,0x14,0xE0,0xFF,0xF7,0xE0,0xF9, +0x1E,0x4B,0x1F,0x4C,0x40,0x33,0x1B,0x78,0x21,0x49,0x50,0x22,0x23,0x70,0x1E,0x48, +0x04,0xF0,0x90,0xF9,0x1D,0x4B,0x0C,0x20,0x1B,0x68,0x98,0x47,0xFF,0xF7,0xDE,0xF9, +0x23,0x78,0x10,0x2B,0x04,0xD1,0x1B,0x4B,0xDA,0x78,0x9A,0x70,0x02,0xF0,0xD1,0xFA, +0x02,0xF0,0x54,0xFA,0x20,0xE0,0x18,0x4B,0x1A,0x78,0x00,0x2A,0x05,0xD0,0x17,0x4A, +0x11,0x68,0x01,0x31,0x11,0x60,0x00,0x22,0x1A,0x70,0x15,0x4B,0x1A,0x68,0x13,0x2A, +0x05,0xDD,0x00,0x22,0x1A,0x60,0x0A,0x4B,0x10,0x22,0x1A,0x70,0x0C,0xE0,0x0F,0x4B, +0x1A,0x68,0x3B,0x2A,0x08,0xDD,0x00,0x22,0x1A,0x60,0x0E,0x4B,0x01,0x20,0x1B,0x68, +0x98,0x47,0x0D,0x4B,0x01,0x22,0x1A,0x70,0x10,0xBD,0xC0,0x46,0xAE,0x09,0x00,0x20, +0x1D,0x03,0x00,0x20,0x4A,0x74,0x00,0x00,0x48,0x0D,0x00,0x20,0xF8,0x01,0x00,0x20, +0x9A,0x74,0x00,0x00,0xAA,0x0A,0x00,0x20,0xC4,0x01,0x00,0x20,0xC0,0x01,0x00,0x20, +0xBC,0x01,0x00,0x20,0x6C,0x00,0x00,0x20,0xE7,0x01,0x00,0x20,0x10,0xB5,0x0C,0x4B, +0x01,0x22,0x99,0x79,0x00,0x23,0x00,0xE0,0x23,0x1C,0x5C,0x1C,0x10,0x1C,0xE4,0xB2, +0x98,0x40,0x81,0x42,0xF8,0xDA,0x07,0x4A,0x07,0x21,0x13,0x71,0x80,0x22,0xD2,0x05, +0x0B,0x40,0x19,0x02,0x10,0x6C,0x04,0x4B,0x03,0x40,0x0B,0x43,0x13,0x64,0x10,0xBD, +0x48,0x0D,0x00,0x20,0x5C,0x00,0x00,0x20,0xFF,0xF8,0xFF,0xFF,0x06,0x4B,0x07,0x22, +0xD9,0x79,0x80,0x23,0xDB,0x05,0x18,0x6C,0x11,0x40,0x04,0x4A,0x09,0x02,0x02,0x40, +0x0A,0x43,0x1A,0x64,0x70,0x47,0xC0,0x46,0x48,0x0D,0x00,0x20,0xFF,0xF8,0xFF,0xFF, +0xF0,0xB5,0x8D,0xB0,0x04,0x90,0xFF,0xF7,0xC9,0xFF,0xC7,0x4B,0xC7,0x48,0xDE,0x78, +0x00,0x21,0x05,0x96,0x9C,0x78,0x07,0xE0,0x01,0x3B,0xDB,0xB2,0xEE,0x18,0x76,0x00, +0x31,0x52,0x00,0x2B,0xF8,0xD1,0x05,0x92,0x05,0x9A,0x05,0x9E,0x01,0x3A,0xD2,0xB2, +0x00,0x2E,0x02,0xD0,0x23,0x1C,0x55,0x01,0xF3,0xE7,0x04,0x9F,0x00,0x2F,0x05,0xD0, +0xBB,0x4B,0x05,0x9E,0x5B,0x7B,0x06,0x96,0x03,0x93,0x04,0xE0,0xB9,0x4B,0x02,0x27, +0x9B,0x78,0x06,0x97,0x03,0x93,0x68,0x46,0x0C,0x21,0x0B,0x56,0xB2,0x4C,0x0B,0x93, +0x5B,0x42,0x09,0x93,0xAA,0xE0,0x6A,0x46,0x18,0x23,0x9A,0x56,0xE6,0x7A,0x27,0x1C, +0x02,0x92,0x0D,0xE0,0x30,0x1C,0x00,0x21,0x2A,0x1C,0x02,0x9B,0x02,0xF0,0x4C,0xF9, +0x30,0x1C,0x01,0x21,0x2A,0x1C,0x02,0x9B,0x02,0xF0,0x46,0xF9,0x01,0x36,0xF6,0xB2, +0xBB,0x7A,0xFA,0x7A,0xD2,0x18,0x3B,0x1C,0x96,0x42,0xEB,0xDB,0x04,0x9E,0x00,0x2E, +0x00,0xD1,0x0E,0x3D,0x68,0x46,0x18,0x21,0x08,0x56,0x5E,0x7B,0x9E,0x4F,0x02,0x90, +0x0D,0xE0,0x30,0x1C,0x00,0x21,0x2A,0x1C,0x02,0x9B,0x02,0xF0,0x2D,0xF9,0x30,0x1C, +0x01,0x21,0x2A,0x1C,0x02,0x9B,0x02,0xF0,0x27,0xF9,0x01,0x36,0xF6,0xB2,0x7A,0x7B, +0x3B,0x7B,0xD3,0x18,0x9E,0x42,0xEC,0xDB,0xFF,0xF7,0xAE,0xFC,0x96,0x4B,0x1B,0x78, +0x00,0x2B,0x06,0xD0,0x01,0x23,0x18,0x1C,0x19,0x1C,0x0B,0xAA,0x00,0x93,0x02,0xF0, +0xAD,0xFB,0x00,0x25,0x8C,0x4E,0x90,0x4F,0x0E,0xE0,0x3B,0x78,0x00,0x2B,0x09,0xD0, +0x8E,0x4B,0xEA,0x01,0xD2,0x18,0x00,0x23,0xB1,0x78,0x01,0x20,0x00,0x93,0x02,0x23, +0x02,0xF0,0x9C,0xFB,0x01,0x35,0xED,0xB2,0xF3,0x78,0x9D,0x42,0xED,0xD3,0x0B,0x9A, +0xB6,0x78,0xD2,0xB2,0x02,0x96,0x07,0x92,0x80,0x4D,0x39,0xE0,0x01,0x3B,0xDB,0xB2, +0x08,0x9E,0x99,0x1C,0x71,0x18,0x82,0x4F,0x49,0x00,0xCE,0x5B,0xD1,0x18,0x48,0x00, +0x40,0x5B,0xB7,0xB2,0xB8,0x42,0x14,0xDC,0xC0,0x1B,0x01,0x1C,0x80,0x31,0x01,0xDA, +0x80,0x20,0x40,0x42,0xD7,0x18,0x7F,0x28,0x00,0xDD,0x7F,0x20,0x79,0x49,0x78,0x54, +0xD1,0x18,0x48,0x00,0x2E,0x52,0x1C,0x27,0x6E,0x46,0x77,0x48,0xBE,0x5D,0x0E,0x54, +0x13,0xE0,0x04,0x9E,0x00,0x2E,0x10,0xD0,0x74,0x4E,0xB0,0x42,0x08,0xD0,0x71,0x4E, +0x8E,0x57,0x80,0x19,0x87,0x42,0x03,0xDA,0x6F,0x48,0x0E,0x5C,0x01,0x36,0x0E,0x54, +0xD1,0x18,0x01,0x27,0x49,0x00,0x7F,0x42,0x6F,0x52,0x00,0x2B,0xC6,0xD1,0x63,0x46, +0x5E,0x1E,0xF6,0xB2,0x00,0x2B,0x06,0xD0,0x72,0x1C,0x92,0x01,0x08,0x92,0x02,0x9B, +0x72,0x01,0xB4,0x46,0xF1,0xE7,0x0B,0x9B,0x01,0x3B,0x0B,0x93,0x0B,0x9D,0x09,0x9E, +0xB5,0x42,0x00,0xDB,0x4F,0xE7,0x04,0x9F,0x00,0x2F,0x45,0xD0,0xA0,0x78,0xE3,0x78, +0x04,0x90,0x61,0x78,0x56,0x4A,0x06,0x91,0x24,0x78,0x02,0x94,0x11,0x7C,0xD0,0x7A, +0x5B,0x4C,0x08,0x18,0xC0,0xB2,0x07,0x90,0x12,0x7B,0x89,0x18,0xC9,0xB2,0x08,0x91, +0x55,0x4A,0x28,0xE0,0x03,0x9E,0x01,0x3B,0xDB,0xB2,0x00,0x2E,0x01,0xD1,0xC7,0x18, +0xD6,0x55,0x06,0x9E,0xB1,0x42,0x02,0xD2,0x02,0x9F,0xBB,0x42,0x0C,0xD3,0xEF,0x18, +0xC6,0x18,0x09,0x97,0x97,0x5D,0xBC,0x46,0x09,0x9F,0xE7,0x5D,0xBC,0x44,0x08,0x9F, +0xBC,0x44,0x67,0x46,0x97,0x55,0x0B,0xE0,0xEF,0x18,0xC6,0x18,0x09,0x97,0x97,0x5D, +0xBC,0x46,0x09,0x9F,0xE7,0x5D,0xBC,0x44,0x07,0x9F,0xBC,0x44,0x67,0x46,0x97,0x55, +0x00,0x2B,0xD7,0xD1,0x0B,0x1C,0x59,0x1E,0xC9,0xB2,0x00,0x2B,0x3E,0xD0,0x26,0x25, +0x04,0x9B,0x48,0x01,0x4D,0x43,0xF3,0xE7,0x63,0x7C,0xE2,0x79,0x07,0x25,0x9A,0x18, +0x03,0x92,0x34,0x4A,0xA0,0x7B,0x02,0x21,0x52,0x5E,0x26,0x79,0xAD,0x1A,0x6D,0x00, +0x86,0x19,0xED,0xB2,0x34,0x49,0x84,0x46,0x09,0xE0,0xB8,0x18,0x44,0x5C,0x01,0x32, +0x2C,0x19,0x44,0x54,0xD2,0xB2,0xB2,0x42,0xF7,0xDB,0x01,0x33,0xDB,0xB2,0x03,0x9A, +0x93,0x42,0x02,0xDA,0x62,0x46,0x5F,0x01,0xF5,0xE7,0x23,0x4A,0x2A,0x49,0x10,0x7C, +0xD3,0x7B,0x56,0x79,0x95,0x79,0x9E,0x19,0x45,0x19,0x84,0x46,0x09,0xE0,0xB8,0x18, +0x44,0x5C,0x01,0x32,0x0E,0x3C,0x44,0x54,0xD2,0xB2,0xAA,0x42,0xF7,0xDB,0x01,0x33, +0xDB,0xB2,0xB3,0x42,0x02,0xDA,0x62,0x46,0x5F,0x01,0xF6,0xE7,0x1A,0x4B,0x1B,0x78, +0x00,0x2B,0x13,0xD0,0x05,0x20,0x1F,0x49,0x02,0xF0,0x10,0xFB,0x0E,0xE0,0x2B,0x78, +0x00,0x2B,0x08,0xD0,0x18,0x4B,0x72,0x01,0xA1,0x78,0xD2,0x18,0x05,0x20,0x01,0x23, +0x00,0x93,0x02,0xF0,0xAB,0xFA,0x01,0x36,0xF6,0xB2,0x02,0xE0,0x0A,0x4C,0x0E,0x4D, +0x05,0x9E,0xE3,0x78,0xB3,0x42,0xEA,0xD8,0x00,0x21,0x01,0x20,0x0A,0x1C,0x40,0x42, +0x02,0x23,0x02,0xF0,0x01,0xF8,0x01,0x20,0x40,0x42,0x01,0x21,0x00,0x22,0x02,0x23, +0x01,0xF0,0xFA,0xFF,0xA4,0x78,0x25,0xE0,0x0A,0x03,0x00,0x20,0xF8,0x03,0x00,0x20, +0x48,0x0D,0x00,0x20,0x04,0x02,0x00,0x20,0xEB,0x01,0x00,0x20,0x84,0x40,0x00,0x40, +0x00,0x40,0x00,0x40,0x64,0x0E,0x00,0x20,0xB3,0x0A,0x00,0x20,0xFF,0xFF,0x00,0x00, +0x36,0x75,0x00,0x00,0x2E,0x59,0x00,0x00,0x01,0x3C,0x00,0x21,0xE4,0xB2,0x0A,0x1C, +0x20,0x1C,0x01,0x23,0x01,0xF0,0xD8,0xFF,0x01,0x21,0x20,0x1C,0x00,0x22,0x0B,0x1C, +0x01,0xF0,0xD2,0xFF,0x00,0x2C,0xEF,0xD1,0xFF,0xF7,0x30,0xFE,0x0D,0xB0,0xF0,0xBD, +0x08,0xB5,0x03,0xF0,0xC5,0xFD,0x05,0x4B,0x01,0x20,0x1B,0x68,0x98,0x47,0x01,0x20, +0x04,0xF0,0x22,0xF9,0x01,0xF0,0xD6,0xFD,0x08,0xBD,0xC0,0x46,0xF8,0x01,0x00,0x20, +0xF7,0xB5,0x2C,0x4A,0x00,0x20,0x10,0x60,0x2B,0x4A,0x2C,0x4E,0x11,0x8C,0x2C,0x4A, +0x11,0x60,0x72,0x1D,0xD2,0x7F,0xF1,0x7D,0x50,0x1E,0x44,0x42,0x60,0x41,0x29,0x4C, +0x08,0x1A,0x00,0x90,0x20,0x60,0xB0,0x1D,0xC5,0x7F,0x37,0x7E,0x6B,0x1E,0x58,0x42, +0x58,0x41,0x3B,0x1A,0x01,0x93,0x63,0x60,0x01,0x2A,0x02,0xD1,0x00,0x20,0x20,0x81, +0x05,0xE0,0x26,0x23,0xF0,0x5E,0x49,0x00,0x03,0xF0,0xBA,0xFE,0x20,0x81,0x01,0x2D, +0x02,0xD1,0x00,0x23,0x63,0x81,0x05,0xE0,0x28,0x23,0xF0,0x5E,0x79,0x00,0x03,0xF0, +0xAF,0xFE,0x60,0x81,0x15,0x4F,0x01,0x9B,0x28,0x20,0x3E,0x5E,0x59,0x00,0x70,0x00, +0x80,0x19,0x03,0xF0,0xA5,0xFE,0x40,0x43,0x12,0x4C,0x43,0x00,0x80,0x00,0xE3,0x60, +0xC3,0x18,0x23,0x61,0x26,0x20,0x3D,0x5E,0x00,0x9B,0x68,0x00,0x59,0x00,0x40,0x19, +0x03,0xF0,0x96,0xFE,0x2C,0x37,0x60,0x61,0xA0,0x61,0x3B,0x78,0x00,0x2B,0x02,0xD1, +0xE6,0x61,0x25,0x62,0x01,0xE0,0xE5,0x61,0x26,0x62,0x07,0x4B,0x01,0x22,0x52,0x42, +0x5A,0x60,0xF7,0xBD,0x9C,0x0D,0x00,0x20,0x48,0x0D,0x00,0x20,0xAE,0x09,0x00,0x20, +0x20,0x02,0x00,0x20,0x24,0x09,0x00,0x20,0xCC,0x00,0x00,0x20,0xF0,0xB5,0x24,0x4B, +0x87,0xB0,0x1E,0x7E,0xDB,0x7D,0x72,0x1C,0xD9,0x1C,0x02,0x33,0x03,0x93,0x05,0x92, +0x00,0x23,0x20,0x4A,0x04,0x91,0x18,0x1C,0x05,0x9C,0xE5,0x1A,0xEF,0x01,0x01,0x97, +0xBC,0x5A,0xB8,0x52,0x04,0x9C,0xAD,0x01,0x29,0x19,0x4F,0x00,0xBC,0x5A,0x1A,0x4C, +0xB8,0x52,0x00,0x27,0x2F,0x55,0x0F,0x55,0x01,0x99,0x18,0x4F,0x01,0x33,0xCF,0x19, +0x02,0x97,0x39,0x88,0x38,0x80,0x03,0x99,0x6F,0x18,0x79,0x00,0x01,0x91,0x89,0x5A, +0x01,0x99,0x88,0x52,0x12,0x49,0x6D,0x18,0x00,0x21,0x29,0x70,0x39,0x55,0xF7,0x1A, +0x0C,0x4D,0x01,0x37,0xD8,0xDA,0x00,0x22,0x01,0x36,0x03,0x9B,0x11,0x1C,0xB6,0x01, +0x58,0x00,0x2F,0x5A,0x2A,0x52,0xF0,0x18,0x47,0x00,0xEC,0x5B,0xEA,0x53,0x06,0x4F, +0xF9,0x54,0x01,0x3B,0x39,0x54,0x01,0x2B,0xF2,0xD1,0x07,0xB0,0xF0,0xBD,0xC0,0x46, +0xAE,0x09,0x00,0x20,0x00,0x40,0x00,0x40,0x00,0x20,0x00,0x40,0x02,0x40,0x00,0x40, +0x01,0x20,0x00,0x40,0xF7,0xB5,0x0D,0x4B,0x19,0x7E,0xDE,0x7D,0x48,0x1C,0x01,0x36, +0x00,0x23,0x01,0x90,0x01,0x9C,0x32,0x1C,0xE7,0x1A,0xBF,0x01,0x95,0x1C,0xAC,0x46, +0xBC,0x44,0x07,0x4C,0x00,0x25,0x60,0x46,0x01,0x3A,0x05,0x55,0x50,0x1C,0xF5,0xDA, +0x01,0x33,0xCA,0x1A,0x01,0x32,0xED,0xDA,0xF7,0xBD,0xC0,0x46,0xAE,0x09,0x00,0x20, +0x00,0x20,0x00,0x40,0x00,0xB5,0x0D,0x4B,0x08,0x22,0x9B,0x5E,0x0C,0x4A,0x11,0x1C, +0x35,0x31,0x09,0x78,0x12,0x7F,0x4B,0x43,0x52,0xB2,0x9B,0x11,0x93,0x42,0x00,0xDA, +0x13,0x1C,0x08,0x4A,0x13,0x60,0x80,0x22,0xD2,0x05,0x1B,0x05,0x19,0x09,0x90,0x69, +0x05,0x4B,0x03,0x40,0x0B,0x43,0x93,0x61,0x00,0xBD,0xC0,0x46,0x70,0x01,0x00,0x20, +0x48,0x0D,0x00,0x20,0x38,0x0D,0x00,0x20,0xFF,0xFF,0x00,0xF0,0xF0,0xB5,0xA9,0x4A, +0xA9,0x48,0x11,0x68,0x07,0x68,0x93,0xB0,0x8C,0x46,0x0D,0x22,0x00,0x21,0x7F,0x25, +0xFF,0x24,0x01,0x97,0x90,0x00,0x83,0x18,0xA4,0x4E,0x5B,0x00,0xF3,0x18,0x99,0x87, +0x00,0x27,0x38,0x33,0x1F,0x72,0x67,0x46,0x39,0x50,0x01,0x3A,0x01,0x9F,0xD2,0xB2, +0x39,0x50,0x00,0x26,0xDD,0x72,0x5D,0x72,0x1C,0x73,0x9C,0x72,0xD9,0x80,0xFF,0x2A, +0xE8,0xD1,0x9B,0x4A,0x9B,0x4B,0x11,0x7E,0x98,0x68,0x9B,0x4C,0x97,0x4D,0x01,0x39, +0x04,0x90,0xA6,0x81,0x2E,0x60,0x88,0x42,0x02,0xDA,0x01,0x30,0x04,0x90,0x98,0x60, +0xDE,0x68,0x11,0x96,0x00,0x2E,0x02,0xDD,0x01,0x3E,0x11,0x96,0xDE,0x60,0xD1,0x7D, +0x1A,0x68,0x01,0x39,0x8A,0x42,0x01,0xDA,0x01,0x32,0x1A,0x60,0x5A,0x68,0x00,0x2A, +0x01,0xDD,0x01,0x3A,0x5A,0x60,0x04,0x9F,0x11,0x98,0x87,0x42,0x00,0xDA,0xA3,0xE0, +0x19,0x68,0x5B,0x68,0x84,0x4A,0x06,0x93,0x88,0x4B,0x12,0x68,0x1B,0x68,0x86,0x4C, +0x0D,0x93,0x80,0x4B,0x10,0x91,0x1B,0x68,0x09,0x92,0x0A,0x93,0xA4,0x89,0x84,0x48, +0x0C,0x94,0x06,0x9D,0x10,0x9E,0xB5,0x42,0x00,0xDD,0x81,0xE0,0x04,0x9A,0x6F,0x46, +0x10,0x21,0x01,0x32,0xCF,0x5D,0x92,0x01,0x33,0x1C,0x02,0x92,0x07,0x97,0x05,0xE0, +0x00,0x27,0x2F,0x54,0x06,0x9F,0x01,0x3B,0x9F,0x42,0x71,0xDC,0x02,0x99,0x9C,0x1C, +0x0D,0x19,0x2A,0x5C,0x77,0x4E,0x69,0x00,0x89,0x5B,0x0E,0x2A,0xF0,0xD8,0x0D,0x9D, +0x49,0x1B,0x00,0x2A,0x00,0xD1,0x71,0xE0,0x01,0x3A,0xD4,0xB2,0x09,0x9E,0x04,0x9F, +0xA2,0x00,0xB5,0x18,0x4F,0x43,0x2E,0x68,0xB4,0x46,0x67,0x44,0x2F,0x60,0x0A,0x9D, +0x0E,0x1C,0xAF,0x18,0x3D,0x68,0x5E,0x43,0xAC,0x46,0x15,0x19,0x6D,0x00,0x01,0x95, +0x62,0x4D,0x66,0x44,0xAC,0x46,0x01,0x9D,0x3E,0x60,0xAC,0x44,0x65,0x46,0xAF,0x8F, +0x38,0x35,0x2E,0x7A,0xCF,0x19,0x03,0x96,0x09,0x26,0xAE,0x57,0xAF,0x80,0x01,0x96, +0x0C,0x9E,0x6F,0x46,0xB4,0x46,0x01,0x26,0xB4,0x44,0x03,0x9E,0x01,0x36,0x03,0x96, +0x66,0x46,0xB6,0xB2,0x0C,0x96,0x0C,0x26,0xF7,0x5D,0x04,0x9E,0x2F,0x72,0x01,0x9F, +0xBE,0x42,0x00,0xDA,0x6E,0x72,0x51,0x4E,0x15,0x19,0x6D,0x00,0x75,0x19,0x38,0x35, +0x0A,0x26,0xAE,0x57,0x04,0x9F,0xB7,0x42,0x00,0xDD,0xAF,0x72,0x4B,0x4E,0x15,0x19, +0x6D,0x00,0x75,0x19,0x38,0x35,0x0B,0x26,0xAE,0x57,0xB3,0x42,0x00,0xDA,0xEB,0x72, +0x15,0x19,0x46,0x4F,0x6D,0x00,0x7D,0x19,0x38,0x35,0x0C,0x26,0xAE,0x57,0xB3,0x42, +0x00,0xDD,0x2B,0x73,0x12,0x19,0x41,0x4C,0x52,0x00,0xA2,0x18,0x3E,0x25,0x54,0x5F, +0x38,0x32,0xA1,0x42,0x8E,0xDD,0x06,0x9F,0x01,0x3B,0xD1,0x80,0x9F,0x42,0x8D,0xDD, +0x04,0x99,0x11,0x9A,0x01,0x39,0x04,0x91,0x91,0x42,0x00,0xDB,0x71,0xE7,0x6B,0x46, +0x30,0x24,0xE4,0x5A,0x38,0x4B,0x9C,0x81,0x13,0xB0,0xF0,0xBD,0x02,0x39,0xCA,0x43, +0xD2,0x17,0x11,0x40,0x03,0x91,0x04,0x9E,0x03,0x9F,0x71,0x43,0x5F,0x43,0x0E,0x91, +0x00,0x25,0xD9,0xB2,0x0F,0x97,0x05,0x91,0x03,0x22,0x01,0x95,0x9C,0x46,0x08,0x94, +0x31,0x4E,0x32,0x4F,0x07,0x9C,0xB1,0x5C,0x05,0x9D,0xBB,0x5C,0x61,0x18,0xEB,0x18, +0x49,0xB2,0x01,0x31,0x5B,0xB2,0x89,0x01,0x02,0x33,0xCB,0x18,0x1C,0x5C,0x65,0xB2, +0x69,0x1E,0x0D,0x29,0x27,0xD8,0x08,0x9B,0x02,0x9F,0x8E,0x00,0xFF,0x18,0x0B,0x97, +0x09,0x9F,0x71,0x18,0xBB,0x19,0x0A,0x9F,0x49,0x00,0xBF,0x19,0x1B,0x4E,0x00,0x97, +0x01,0x9F,0x71,0x18,0x38,0x31,0x00,0x2F,0x1A,0xD1,0xE4,0xB2,0x01,0x94,0x0B,0x9D, +0x0E,0x34,0xE4,0xB2,0x2C,0x54,0x1C,0x68,0x0E,0x9E,0x00,0x9F,0xA4,0x19,0x1C,0x60, +0x3B,0x68,0x0F,0x9C,0x03,0x9D,0x1B,0x19,0x3B,0x60,0x8C,0x88,0x0B,0x7A,0x2C,0x19, +0x01,0x33,0x8C,0x80,0x0B,0x72,0x53,0x1E,0x00,0x2A,0x10,0xD0,0xDA,0xB2,0xBF,0xE7, +0x02,0x9E,0x08,0x99,0x01,0x9C,0x73,0x18,0x1F,0x2C,0xF4,0xD0,0xAC,0x42,0xF2,0xD0, +0x1F,0x25,0x1F,0x26,0x1D,0x54,0x01,0x96,0x53,0x1E,0x00,0x2A,0xEE,0xD1,0x63,0x46, +0x18,0xE7,0xC0,0x46,0x44,0x00,0x00,0x20,0x48,0x00,0x00,0x20,0x24,0x02,0x00,0x20, +0xAE,0x09,0x00,0x20,0xE4,0x10,0x00,0x20,0x70,0x01,0x00,0x20,0x38,0x0D,0x00,0x20, +0x00,0x20,0x00,0x40,0x00,0x40,0x00,0x40,0xF8,0x59,0x00,0x00,0xF4,0x59,0x00,0x00, +0xF0,0xB5,0x89,0xB0,0x0F,0x23,0x46,0x49,0xFF,0x22,0x02,0xE0,0x58,0x18,0x01,0x38, +0x02,0x70,0x01,0x3B,0x00,0x2B,0xF9,0xD1,0x42,0x4B,0xD8,0x68,0x19,0x68,0x9A,0x68, +0x5B,0x68,0x01,0x90,0x03,0x93,0x40,0x4B,0x02,0x91,0x1B,0x68,0x04,0x93,0x3F,0x4B, +0x5B,0x7F,0x06,0x93,0x68,0xE0,0x07,0x9B,0x88,0x1C,0x3D,0x4A,0x18,0x18,0x83,0x5C, +0x5B,0xB2,0x1F,0x2B,0x5A,0xD1,0x3B,0x4A,0x40,0x00,0x82,0x5A,0x04,0x9D,0x04,0x20, +0x52,0x1B,0x05,0x92,0x38,0x4A,0x01,0x38,0xC0,0xB2,0x14,0x56,0x37,0x4A,0x64,0x44, +0x12,0x56,0x01,0x34,0x8A,0x18,0xA4,0x01,0x02,0x32,0x31,0x4E,0xA2,0x18,0xB4,0x5C, +0x0E,0x2C,0x41,0xD8,0x1F,0x2B,0x3E,0xD0,0xA3,0x42,0x3D,0xD0,0x00,0x2C,0x3B,0xD0, +0x0A,0x27,0x5D,0x1E,0x7D,0x43,0x2E,0x4A,0x2D,0x4E,0x55,0x19,0x62,0x1E,0x7A,0x43, +0xB2,0x18,0x3E,0x27,0xEE,0x5F,0x3E,0x27,0xD5,0x5F,0x1A,0x1C,0xAE,0x42,0x00,0xDD, +0x22,0x1C,0x0A,0x25,0x01,0x3A,0x6A,0x43,0x25,0x4E,0x06,0x9D,0xB2,0x18,0x3E,0x27, +0xD2,0x5F,0x05,0x9E,0x6A,0x43,0x92,0x11,0x96,0x42,0x1D,0xDD,0x9C,0x42,0x02,0xD9, +0x1A,0x1C,0x23,0x1C,0x14,0x1C,0x5E,0x1E,0x15,0x4A,0xF6,0xB2,0x97,0x5D,0x00,0x25, +0x00,0x97,0x6F,0x46,0x7D,0x57,0x01,0x3C,0xE4,0xB2,0x6F,0x1C,0x09,0xD0,0xA5,0x42, +0x03,0xDA,0x6D,0x46,0x2D,0x78,0x15,0x55,0x06,0xE0,0xA5,0x42,0x04,0xDD,0xE4,0xB2, +0x54,0x55,0x94,0x55,0x00,0xE0,0x23,0x1C,0x00,0x28,0xAB,0xD1,0x01,0x39,0x03,0x9E, +0xB1,0x42,0x98,0xDA,0x62,0x46,0x01,0x3A,0x01,0x9F,0xBA,0x42,0x05,0xDB,0x53,0x1C, +0x9B,0x01,0x02,0x99,0x07,0x93,0x94,0x46,0xF1,0xE7,0x09,0xB0,0xF0,0xBD,0xC0,0x46, +0xEC,0x02,0x00,0x20,0xE4,0x10,0x00,0x20,0x38,0x0D,0x00,0x20,0x48,0x0D,0x00,0x20, +0x00,0x20,0x00,0x40,0x00,0x40,0x00,0x40,0xF8,0x59,0x00,0x00,0xF4,0x59,0x00,0x00, +0x24,0x02,0x00,0x20,0xF0,0xB5,0xD4,0x4A,0x8D,0xB0,0x11,0x68,0x00,0x23,0xD0,0x18, +0xBE,0x30,0x00,0x24,0x00,0x5F,0x0A,0x3B,0x44,0x1E,0xA0,0x41,0x1D,0x1C,0x09,0x18, +0x8C,0x35,0xF4,0xD1,0xCD,0x4B,0x11,0x60,0x1B,0x68,0xBE,0x32,0x03,0x93,0xCC,0x4B, +0x0E,0x24,0x1B,0x68,0x05,0x93,0xCB,0x4E,0x01,0x3C,0x33,0x57,0x5F,0x1C,0x01,0xD1, +0x73,0xE0,0x03,0x1C,0xC7,0x4D,0xE8,0x56,0x46,0x1C,0xFA,0xD1,0x2B,0x55,0x5F,0x1C, +0x6B,0xD0,0x03,0x98,0x9D,0x00,0x46,0x19,0x37,0x68,0xA0,0x00,0xBC,0x46,0x03,0x9F, +0x3F,0x58,0xBC,0x44,0x67,0x46,0x37,0x60,0x05,0x9E,0x05,0x9F,0x75,0x19,0x2E,0x68, +0x38,0x58,0xB9,0x4F,0x30,0x18,0x0A,0x26,0x28,0x60,0x30,0x1C,0x58,0x43,0x38,0x18, +0x38,0x30,0x09,0x27,0xC7,0x57,0x55,0x79,0xBC,0x46,0x6F,0xB2,0xBC,0x45,0x00,0xDD, +0x45,0x72,0x5E,0x43,0xB0,0x4D,0x90,0x79,0xAE,0x19,0x38,0x36,0x0A,0x27,0xF7,0x57, +0x45,0xB2,0xAF,0x42,0x00,0xDA,0xB0,0x72,0xD6,0x79,0xAB,0x4F,0x06,0x96,0x0A,0x26, +0x30,0x1C,0x58,0x43,0x38,0x18,0x38,0x30,0x0B,0x25,0x45,0x57,0xAC,0x46,0x6D,0x46, +0x18,0x35,0x2D,0x78,0x6D,0xB2,0xAC,0x45,0x03,0xDD,0x6F,0x46,0x18,0x25,0xEF,0x5D, +0xC7,0x72,0x5E,0x43,0xA0,0x4D,0x10,0x7A,0xAF,0x19,0x38,0x37,0x0C,0x26,0xBE,0x57, +0x45,0xB2,0xAE,0x42,0x00,0xDA,0x38,0x73,0x0A,0x20,0x58,0x43,0x56,0x88,0x9A,0x4F, +0x06,0x96,0x38,0x18,0x3E,0x26,0x85,0x5F,0x18,0x26,0xAC,0x46,0x6D,0x46,0x75,0x5F, +0x38,0x30,0x0A,0x26,0xAC,0x45,0x03,0xDA,0x6F,0x46,0x18,0x25,0xEF,0x5B,0xC7,0x80, +0x5E,0x43,0x91,0x48,0x01,0x39,0x87,0x19,0xBB,0x8F,0x10,0x88,0xC3,0x18,0xBB,0x87, +0x38,0x37,0x10,0x79,0x3B,0x7A,0xC3,0x18,0x3B,0x72,0x0A,0x3A,0x00,0x2C,0x00,0xD0, +0x81,0xE7,0x89,0x4F,0x26,0x1C,0x3D,0x1C,0x3C,0x35,0x03,0x95,0x39,0x60,0x25,0x1C, +0x88,0x48,0x00,0x22,0x33,0x18,0x9A,0x56,0x01,0x32,0x19,0xD1,0x1D,0x70,0xB5,0x42, +0x12,0xD0,0x82,0x4B,0xB1,0x00,0x1A,0x68,0xAB,0x00,0x50,0x58,0xD0,0x50,0x80,0x4A, +0x7D,0x48,0x12,0x68,0x51,0x58,0xD1,0x50,0x0A,0x22,0x13,0x1C,0x6B,0x43,0xC0,0x18, +0x3C,0x30,0x03,0x99,0x03,0xF0,0x7E,0xFB,0x3B,0x68,0x01,0x35,0x9D,0x42,0x05,0xDA, +0x03,0x99,0x01,0x36,0x0A,0x31,0x03,0x91,0x0E,0x2E,0xD9,0xD1,0x76,0x4B,0x1B,0x68, +0xDA,0x06,0x3B,0xD5,0x75,0x4B,0x1B,0x78,0x00,0x2B,0x03,0xD0,0x04,0x20,0x74,0x49, +0x01,0xF0,0xD4,0xFE,0x00,0x25,0x73,0x4E,0x2C,0xE0,0x69,0x1C,0x89,0x01,0x33,0x68, +0x77,0x68,0x71,0x4A,0x03,0x91,0xA4,0x46,0x12,0xE0,0x03,0x9C,0x99,0x1C,0x61,0x18, +0x88,0x5C,0x40,0xB2,0x44,0x1E,0x0D,0x2C,0x09,0xD8,0x66,0x4C,0x20,0x18,0x01,0x38, +0x00,0x78,0x40,0xB2,0x44,0x1C,0x02,0xD0,0x01,0x30,0xC0,0xB2,0x88,0x54,0x01,0x3B, +0xBB,0x42,0xEA,0xDA,0x61,0x4B,0x64,0x46,0x1B,0x78,0x00,0x2B,0x09,0xD0,0x63,0x4B, +0x63,0x4F,0xAA,0x01,0xD9,0x7D,0xD2,0x19,0x01,0x23,0x04,0x20,0x00,0x93,0x01,0xF0, +0x4D,0xFE,0x01,0x35,0x5D,0x4F,0x3B,0x7E,0x9D,0x42,0xCE,0xDB,0x5D,0x4B,0x1B,0x68, +0x00,0x2B,0x10,0xDD,0x5C,0x4B,0x5D,0x4A,0x99,0x89,0x11,0x80,0x1B,0x89,0x53,0x80, +0x52,0x4B,0x1B,0x78,0x00,0x2B,0x06,0xD0,0x01,0x23,0x02,0x21,0x00,0x93,0x17,0x20, +0x0B,0x1C,0x01,0xF0,0x33,0xFE,0x48,0x4B,0x55,0x48,0x1D,0x1C,0x40,0xCD,0x4F,0x49, +0x07,0x96,0x47,0x89,0x08,0x97,0x0A,0x8D,0x47,0x68,0x16,0xB2,0x05,0x96,0x86,0x69, +0x09,0x97,0xB7,0xB2,0xD2,0x1B,0x04,0x97,0x92,0xB2,0x31,0x31,0x09,0x78,0x0A,0x92, +0x3E,0x4A,0x00,0x20,0x06,0x91,0x17,0x68,0x03,0x90,0x2F,0xE0,0x03,0x9A,0x0A,0x23, +0x53,0x43,0x01,0xCF,0x05,0x99,0x48,0x43,0x37,0x49,0xCB,0x18,0x3C,0x22,0x99,0x5E, +0x09,0x9B,0x59,0x43,0x03,0xF0,0x94,0xFA,0x08,0x99,0x42,0x4A,0x08,0x18,0x13,0x78, +0x80,0xB2,0x28,0x80,0x00,0x2B,0x15,0xD1,0x00,0xB2,0xB0,0x42,0x07,0xDA,0x06,0x9B, +0x80,0x1B,0x58,0x43,0x04,0x99,0x80,0x11,0x08,0x18,0x28,0x80,0x0A,0xE0,0x05,0x9A, +0x10,0x1A,0xB0,0x42,0x06,0xDA,0x06,0x9B,0x80,0x1B,0x58,0x43,0x0A,0x99,0x80,0x11, +0x08,0x1A,0x28,0x80,0x03,0x9A,0x02,0x35,0x01,0x32,0x03,0x92,0x03,0x9B,0x07,0x98, +0x83,0x42,0xCB,0xDB,0x20,0x4D,0x2E,0x49,0x2D,0x68,0x28,0x4A,0x05,0x95,0x0E,0x89, +0x0D,0x68,0x07,0x96,0xD3,0x8C,0x08,0x95,0x4D,0x69,0x1F,0xB2,0xAE,0xB2,0x11,0x1C, +0x04,0x97,0x06,0x96,0x2F,0x31,0x09,0x78,0x9B,0x1B,0x9B,0xB2,0x09,0x91,0x30,0x32, +0x12,0x78,0x15,0x4E,0x0B,0x93,0x16,0x4B,0x00,0x20,0x0A,0x92,0x1F,0x68,0x20,0x36, +0x03,0x90,0x50,0xE0,0x03,0x9A,0x0A,0x23,0x53,0x43,0x01,0xCF,0x04,0x99,0x48,0x43, +0x0D,0x49,0x5B,0x18,0x3C,0x22,0x99,0x5E,0x08,0x9B,0x59,0x43,0x03,0xF0,0x40,0xFA, +0x07,0x99,0x18,0x4A,0x08,0x18,0x13,0x78,0x80,0xB2,0x30,0x80,0x00,0x2B,0x36,0xD1, +0x00,0xB2,0xA8,0x42,0x28,0xDA,0x09,0x9B,0x40,0x1B,0x58,0x43,0x06,0x99,0x80,0x11, +0x08,0x18,0x30,0x80,0x2B,0xE0,0xC0,0x46,0x24,0x02,0x00,0x20,0x48,0x00,0x00,0x20, +0x44,0x00,0x00,0x20,0xEC,0x02,0x00,0x20,0x58,0x00,0x00,0x20,0xEB,0x01,0x00,0x20, +0x64,0x59,0x00,0x00,0xE4,0x10,0x00,0x20,0x00,0x20,0x00,0x40,0xAE,0x09,0x00,0x20, +0x42,0x20,0x00,0x40,0x9C,0x0D,0x00,0x20,0x70,0x01,0x00,0x20,0x54,0x11,0x00,0x20, +0x24,0x09,0x00,0x20,0xDF,0x01,0x00,0x20,0x04,0x9A,0x10,0x1A,0xA8,0x42,0x06,0xDA, +0x0A,0x9B,0x40,0x1B,0x58,0x43,0x0B,0x99,0x80,0x11,0x08,0x1A,0x30,0x80,0x03,0x9A, +0x02,0x36,0x01,0x32,0x03,0x92,0x03,0x9B,0x05,0x98,0x83,0x42,0xAA,0xDB,0x1B,0x4B, +0x1A,0x1C,0x2A,0x32,0x17,0x78,0x1A,0x1C,0x2B,0x32,0x12,0x78,0x28,0x21,0x5E,0x5E, +0x03,0x92,0x26,0x25,0x5A,0x5F,0x2C,0x33,0x04,0x92,0x1B,0x78,0x14,0x49,0x06,0x93, +0x00,0x25,0xB4,0x46,0x1D,0xE0,0x00,0x26,0x8B,0x5F,0x00,0x2B,0x16,0xD0,0x11,0x4A, +0xA8,0x18,0x04,0x23,0xC2,0x5E,0x20,0x26,0x83,0x5F,0x00,0x2F,0x01,0xD0,0x66,0x46, +0xB2,0x1A,0x03,0x9E,0x00,0x2E,0x01,0xD0,0x04,0x9E,0xF3,0x1A,0x06,0x9E,0x00,0x2E, +0x02,0xD0,0x16,0x1C,0x1A,0x1C,0x33,0x1C,0x82,0x80,0x03,0x84,0x01,0x34,0x0A,0x31, +0x02,0x35,0x05,0x9E,0xB4,0x42,0xDE,0xDB,0x0D,0xB0,0xF0,0xBD,0xAE,0x09,0x00,0x20, +0x60,0x02,0x00,0x20,0x24,0x02,0x00,0x20,0x30,0xB5,0x0A,0x4B,0x00,0x21,0x04,0x33, +0xDB,0x7F,0x09,0x4A,0x0A,0x24,0x08,0x1C,0x07,0xE0,0x01,0x3B,0xDB,0xB2,0x25,0x1C, +0x5D,0x43,0x55,0x19,0xA9,0x87,0x05,0x4D,0xE8,0x54,0x00,0x2B,0xF5,0xD1,0x13,0x60, +0x30,0xBD,0xC0,0x46,0xAE,0x09,0x00,0x20,0x9C,0x0D,0x00,0x20,0x64,0x01,0x00,0x20, +0x00,0xB5,0x08,0x4A,0x01,0x23,0x5B,0x42,0x53,0x60,0x07,0x4B,0x00,0x21,0x11,0x60, +0x1B,0x78,0x04,0xE0,0x01,0x3B,0xDB,0xB2,0x18,0x1D,0x40,0x00,0x81,0x52,0x00,0x2B, +0xF8,0xD1,0x00,0xBD,0xE0,0x00,0x00,0x20,0x7C,0x09,0x00,0x20,0x49,0x43,0x40,0x43, +0x40,0x18,0x70,0x47,0x70,0x47,0xF0,0xB5,0x83,0x4B,0x00,0x22,0x04,0x33,0xD9,0x7F, +0x87,0xB0,0x0B,0x1C,0x81,0x48,0x0A,0x26,0x15,0x1C,0x07,0xE0,0x01,0x3B,0xDB,0xB2, +0x34,0x1C,0x5C,0x43,0x04,0x19,0xA2,0x87,0x38,0x34,0x25,0x72,0x04,0x1C,0x00,0x2B, +0xF4,0xD1,0x7B,0x4B,0x1A,0x68,0x0B,0x1C,0x91,0x42,0x00,0xDD,0x13,0x1C,0x23,0x60, +0x78,0x48,0x79,0x4A,0x79,0x4B,0x0E,0x24,0xFF,0x21,0x01,0x3C,0xE4,0xB2,0xA5,0x00, +0x01,0x55,0xAB,0x50,0x00,0x2C,0xF8,0xD1,0x6F,0x4B,0x25,0x1C,0x04,0x33,0xDB,0x7F, +0x26,0x1C,0x03,0x93,0x72,0x4B,0x1B,0x69,0x04,0x93,0x6D,0x4B,0x1B,0x68,0x05,0x93, +0x47,0xE0,0x70,0x4C,0x63,0x5D,0x00,0x2B,0x42,0xD0,0x6F,0x4C,0xAB,0x00,0xE3,0x58, +0x04,0x9C,0x1B,0x01,0x1B,0x19,0x01,0x93,0x6C,0x4B,0x6A,0x00,0x01,0x27,0xD3,0x18, +0x00,0x24,0x7F,0x42,0x02,0x93,0x20,0xE0,0x0A,0x23,0x63,0x43,0x60,0x48,0xC3,0x18, +0x3C,0x21,0x5B,0x5E,0x00,0x2B,0x16,0xD0,0x02,0x9A,0x63,0x00,0xC3,0x18,0x98,0x88, +0x93,0x88,0x5B,0x4A,0xC0,0x1A,0x23,0x1C,0x10,0x33,0x5B,0x00,0x99,0x5A,0x02,0x9A, +0x00,0xB2,0x13,0x8B,0xC9,0x1A,0x09,0xB2,0xFF,0xF7,0x98,0xFF,0x01,0x9B,0x98,0x42, +0x01,0xDA,0x27,0x1C,0x01,0x90,0x01,0x34,0xE4,0xB2,0x05,0x98,0x84,0x42,0xDB,0xDB, +0x79,0x1C,0x0D,0xD0,0x4F,0x4B,0x50,0x49,0xD8,0x57,0xBA,0x00,0x01,0x30,0x04,0xD0, +0x88,0x58,0x01,0x9C,0xA0,0x42,0x03,0xDD,0x00,0xE0,0x01,0x9C,0x8C,0x50,0xDD,0x55, +0x01,0x35,0x03,0x9C,0xEB,0xB2,0xA3,0x42,0xB3,0xD3,0x34,0x1C,0x00,0x25,0x44,0x4E, +0x28,0xE0,0x44,0x48,0x47,0x5D,0x7B,0xB2,0x01,0x33,0x21,0xD0,0x69,0x00,0xFF,0xB2, +0x3E,0x4B,0x71,0x18,0x89,0x88,0x7A,0x00,0x9A,0x18,0x91,0x80,0x29,0x1C,0x10,0x31, +0x3A,0x1C,0x49,0x00,0x89,0x5B,0x10,0x32,0x52,0x00,0xD1,0x52,0x0A,0x22,0x10,0x1C, +0x78,0x43,0x11,0x1C,0x69,0x43,0x1B,0x18,0x18,0x1C,0x71,0x18,0x3C,0x30,0x3C,0x31, +0x03,0xF0,0x40,0xF9,0x34,0x4B,0xAA,0x00,0xD2,0x58,0x37,0x4B,0xBF,0x00,0xFA,0x50, +0x01,0x35,0xED,0xB2,0x33,0x68,0x9D,0x42,0xD3,0xDB,0x3D,0xE0,0x2D,0x4E,0x33,0x57, +0x01,0x33,0x36,0xD1,0x0A,0x23,0x63,0x43,0xEB,0x18,0x3C,0x20,0x1B,0x5E,0x00,0x2B, +0x2F,0xD0,0x25,0x4B,0x2E,0x4A,0x04,0x33,0xDF,0x7F,0x00,0x23,0x26,0xE0,0x29,0x4E, +0xF6,0x5C,0x00,0x2E,0x20,0xD1,0x00,0x26,0x90,0x5F,0x00,0x28,0x1C,0xD1,0x21,0x4A, +0x67,0x00,0x11,0x55,0x1E,0x49,0x1D,0x48,0xCF,0x19,0xBF,0x88,0x5A,0x00,0x82,0x18, +0x97,0x80,0x27,0x1C,0x10,0x37,0x1A,0x1C,0x7F,0x00,0x7F,0x5A,0x10,0x32,0x52,0x00, +0x17,0x52,0x0A,0x22,0x53,0x43,0xC0,0x18,0x13,0x1C,0x63,0x43,0xC9,0x18,0x3C,0x31, +0x3C,0x30,0x03,0xF0,0xFF,0xF8,0x04,0xE0,0x01,0x33,0x0A,0x32,0xD9,0xB2,0xB9,0x42, +0xD5,0xD3,0x01,0x34,0xE4,0xB2,0x00,0xE0,0x0D,0x4D,0x2B,0x68,0x9C,0x42,0xBD,0xDB, +0x09,0x4B,0x0C,0x49,0x04,0x33,0xDD,0x7F,0x12,0x4B,0xFF,0x20,0x1C,0x1C,0x0E,0x34, +0x1A,0x78,0xAA,0x42,0x02,0xD2,0x8A,0x5C,0x1A,0x70,0x00,0xE0,0x18,0x70,0x01,0x33, +0xA3,0x42,0xF5,0xD1,0x07,0xB0,0xF0,0xBD,0xAE,0x09,0x00,0x20,0x9C,0x0D,0x00,0x20, +0x24,0x02,0x00,0x20,0xE8,0x03,0x00,0x20,0xF8,0x10,0x00,0x20,0xFF,0xFF,0xFF,0x7F, +0x24,0x09,0x00,0x20,0xEC,0x01,0x00,0x20,0xF8,0x00,0x00,0x20,0x80,0x09,0x00,0x20, +0xD8,0x0D,0x00,0x20,0xEC,0x02,0x00,0x20,0xF7,0xB5,0x42,0x4B,0x00,0x21,0x19,0x60, +0x41,0x4B,0x0A,0x24,0x19,0x60,0x41,0x4B,0x08,0x1C,0x04,0x33,0xDB,0x7F,0x40,0x4D, +0x1A,0x1C,0xA4,0x46,0x11,0xE0,0x01,0x3A,0xD2,0xB2,0x26,0x1C,0x56,0x43,0xAE,0x19, +0x38,0x36,0x36,0x7A,0xB0,0x42,0x00,0xDA,0x30,0x1C,0x66,0x46,0x56,0x43,0xAE,0x19, +0x3C,0x27,0xF6,0x5F,0xB1,0x42,0x00,0xDA,0x31,0x1C,0x00,0x2A,0xEB,0xD1,0x32,0x4A, +0x50,0x60,0x11,0x60,0x2F,0x4A,0x0A,0x20,0x11,0x68,0x31,0x4A,0x07,0xE0,0x01,0x3B, +0xDB,0xB2,0x04,0x1C,0x5C,0x43,0x14,0x19,0x38,0x34,0x24,0x7A,0x09,0x19,0x14,0x1C, +0x00,0x2B,0xF4,0xD1,0x27,0x4B,0x19,0x60,0x13,0x68,0x00,0x2B,0x0F,0xDD,0x26,0x4B, +0x28,0x4A,0x5B,0x68,0x11,0x80,0x53,0x80,0x27,0x4B,0x1B,0x78,0x00,0x2B,0x06,0xD0, +0x01,0x23,0x02,0x21,0x00,0x93,0x1D,0x20,0x0B,0x1C,0x01,0xF0,0x8F,0xFB,0x23,0x68, +0x00,0x2B,0x19,0xDD,0x21,0x4A,0x08,0x23,0xD1,0x5E,0x21,0x4B,0x0C,0x24,0x12,0x5F, +0x18,0x1C,0x3D,0x33,0x1B,0x78,0x3C,0x30,0x53,0x43,0x00,0x78,0x9B,0x11,0xC3,0x18, +0x99,0x42,0x09,0xDC,0x18,0x4B,0x1B,0x78,0x00,0x2B,0x03,0xD0,0x00,0x20,0x19,0x49, +0x01,0xF0,0xCC,0xFB,0xFF,0xF7,0x40,0xFE,0x11,0x4B,0x17,0x4A,0x1B,0x68,0x12,0x78, +0x93,0x42,0x12,0xDB,0x0B,0x4B,0x12,0x4A,0x18,0x68,0xD1,0x8E,0x0A,0x4B,0x88,0x42, +0x03,0xDB,0x11,0x8F,0x58,0x68,0x88,0x42,0x03,0xDA,0x52,0x8F,0x5B,0x68,0x93,0x42, +0x07,0xDB,0x0E,0x4B,0x01,0x22,0x1A,0x70,0x03,0xE0,0x00,0x2B,0x01,0xD1,0x0B,0x4A, +0x13,0x70,0xF7,0xBD,0x4C,0x11,0x00,0x20,0x0C,0x02,0x00,0x20,0xAE,0x09,0x00,0x20, +0x9C,0x0D,0x00,0x20,0x54,0x11,0x00,0x20,0xEB,0x01,0x00,0x20,0x70,0x01,0x00,0x20, +0x48,0x0D,0x00,0x20,0x6C,0x59,0x00,0x00,0x40,0x00,0x00,0x20,0xF5,0x00,0x00,0x20, +0x38,0xB5,0x04,0x1C,0x08,0x1C,0x00,0x2A,0x07,0xD0,0x54,0x43,0x58,0x43,0xD1,0x18, +0x20,0x18,0x4D,0x10,0x40,0x19,0x02,0xF0,0xBB,0xFF,0x38,0xBD,0x10,0xB5,0x43,0x1A, +0xDC,0x17,0x1B,0x19,0x63,0x40,0xFF,0xF7,0xEB,0xFF,0x10,0xBD,0xF0,0xB5,0xA9,0x4B, +0x00,0x25,0x04,0x33,0x87,0xB0,0xDC,0x7F,0x2E,0x1C,0x46,0xE0,0x01,0x3C,0xE4,0xB2, +0x0A,0x22,0x62,0x43,0x99,0x18,0x38,0x31,0x88,0x88,0x00,0x28,0x3D,0xD0,0xA2,0x4F, +0x3F,0x5D,0x00,0x2F,0x2A,0xD1,0xA1,0x49,0x09,0x78,0x00,0x29,0x07,0xD0,0x9A,0x18, +0x01,0x21,0x3C,0x32,0x1D,0x20,0x02,0x23,0x00,0x91,0x01,0xF0,0x07,0xFB,0x0A,0x20, +0x60,0x43,0x9B,0x4B,0x9B,0x49,0x18,0x18,0x3C,0x27,0xC2,0x5F,0x38,0x30,0x94,0x46, +0x26,0x27,0xCA,0x5F,0x1F,0x1C,0x94,0x45,0x08,0xDB,0x4E,0x31,0x0A,0x78,0x96,0x49, +0x00,0x7A,0x49,0x68,0x4A,0x43,0x92,0x11,0x90,0x42,0x16,0xDA,0x0A,0x22,0x62,0x43, +0xBA,0x18,0xD5,0x87,0x38,0x32,0x16,0x72,0x95,0x80,0x08,0xE0,0x8D,0x4A,0x00,0xB2, +0x28,0x27,0xD2,0x5F,0x82,0x42,0x08,0xDD,0xCD,0x80,0x0E,0x72,0x8D,0x80,0x8B,0x4A, +0xA1,0x00,0x8D,0x50,0x1A,0x68,0x01,0x3A,0x1A,0x60,0x85,0x4B,0x00,0x2C,0xB5,0xD1, +0x1C,0x60,0x87,0x4B,0x9C,0x73,0x7F,0x4B,0x04,0x33,0xDC,0x7F,0xC7,0xE0,0x01,0x3C, +0xE4,0xB2,0x0A,0x23,0x63,0x43,0xED,0x18,0xAA,0x8F,0x38,0x35,0x00,0x2A,0x00,0xD1, +0x93,0xE0,0x7C,0x4B,0x12,0xB2,0x1B,0x8D,0x19,0xB2,0x52,0x1A,0x52,0x10,0x5B,0x00, +0xD3,0x18,0xAB,0x80,0x7A,0x4B,0x9A,0x7B,0x00,0x2A,0x0D,0xD1,0x79,0x4A,0x12,0x57, +0x00,0x2A,0x09,0xD1,0x78,0x4A,0x01,0x21,0x11,0x70,0x80,0x22,0xD2,0x05,0x50,0x69, +0x00,0x0E,0x00,0x06,0x01,0x43,0x51,0x61,0x01,0x22,0x9A,0x73,0x73,0x4E,0x71,0x4B, +0x1A,0x57,0x33,0x78,0x9A,0x42,0x70,0xDB,0x6F,0x4B,0x1A,0x78,0x00,0x2A,0x01,0xD0, +0x00,0x22,0x1A,0x70,0x66,0x4D,0x62,0x00,0x2B,0x68,0x01,0x33,0x2B,0x60,0xAB,0x18, +0x04,0x27,0xD9,0x5F,0x6A,0x4B,0x9A,0x18,0x04,0x26,0x90,0x5F,0x22,0x1C,0x10,0x32, +0x52,0x00,0x57,0x5F,0x03,0x97,0xD7,0x5E,0x0A,0x1A,0xD3,0x17,0x03,0x9E,0xD2,0x18, +0x5A,0x40,0xF3,0x1B,0xDE,0x17,0x9B,0x19,0x73,0x40,0xD3,0x18,0x04,0x93,0x59,0x4B, +0x2E,0x22,0x9E,0x5E,0x04,0x9B,0x32,0x1C,0x05,0x96,0xFF,0xF7,0x39,0xFF,0x05,0x9A, +0x04,0x9B,0x06,0x1C,0x03,0x99,0x38,0x1C,0xFF,0xF7,0x32,0xFF,0x4D,0x4A,0x13,0x1C, +0x2D,0x33,0x1B,0x78,0x2A,0x1C,0x5B,0xB2,0x9E,0x42,0x07,0xDD,0x55,0x49,0xC9,0x69, +0xCF,0x1A,0xBE,0x42,0x03,0xDB,0x4E,0x1E,0xF6,0x1A,0x00,0xE0,0x1E,0x1C,0x45,0x4B, +0x2E,0x33,0x1B,0x78,0x5B,0xB2,0x98,0x42,0x07,0xDD,0x4E,0x49,0x09,0x6A,0xCF,0x1A, +0xB8,0x42,0x03,0xDB,0x48,0x1E,0xC0,0x1A,0x00,0xE0,0x18,0x1C,0x63,0x00,0xD3,0x18, +0x9E,0x80,0x23,0x1C,0x10,0x33,0x5B,0x00,0xE8,0x52,0x0A,0x25,0x65,0x43,0x3D,0x4B, +0x43,0x4E,0x30,0x20,0x1F,0x5E,0x76,0x19,0x55,0x19,0x3C,0x21,0x70,0x5E,0x3C,0x22, +0xA9,0x5E,0x3A,0x1C,0xFF,0xF7,0x0A,0xFF,0x38,0x36,0xA8,0x87,0x38,0x35,0x30,0x7A, +0x29,0x7A,0x3A,0x1C,0xFF,0xF7,0x02,0xFF,0x28,0x72,0x31,0x4B,0x62,0x00,0x99,0x18, +0x37,0x48,0x89,0x88,0x82,0x18,0x91,0x80,0x22,0x1C,0x10,0x32,0x52,0x00,0xD1,0x5A, +0x11,0x52,0x0A,0x22,0x11,0x1C,0x61,0x43,0x40,0x18,0x59,0x18,0x0D,0x1C,0x3C,0x30, +0x3C,0x31,0x02,0xF0,0x07,0xFF,0x3C,0x23,0xEA,0x5E,0x38,0x35,0x29,0x4B,0x00,0x2A, +0x0C,0xD0,0x24,0x49,0x1A,0x5D,0x32,0x31,0x09,0x78,0x50,0xB2,0x88,0x42,0x06,0xDA, +0x01,0x32,0x1A,0x55,0x01,0x23,0x5B,0x42,0xAB,0x80,0x00,0xE0,0x1A,0x55,0x1C,0x4D, +0x00,0x2C,0x00,0xD0,0x33,0xE7,0x22,0x4E,0x29,0x68,0x32,0x68,0x22,0x4B,0x91,0x42, +0x25,0xDA,0x19,0x68,0x17,0x48,0x01,0x31,0x19,0x60,0x3E,0x30,0x00,0x78,0x40,0xB2, +0x81,0x42,0x1C,0xDA,0x0F,0x4B,0x2A,0x60,0x04,0x33,0xDC,0x7F,0x14,0xE0,0x01,0x3C, +0xE4,0xB2,0x63,0x00,0xF2,0x18,0x92,0x88,0xEB,0x18,0x9A,0x80,0x23,0x1C,0x10,0x33, +0x5B,0x00,0x9A,0x5B,0x5A,0x53,0x0A,0x22,0x11,0x1C,0x61,0x43,0x68,0x18,0x71,0x18, +0x3C,0x30,0x3C,0x31,0x02,0xF0,0xC6,0xFE,0x00,0x2C,0xE8,0xD1,0x00,0xE0,0x1C,0x60, +0x07,0xB0,0xF0,0xBD,0xAE,0x09,0x00,0x20,0xEC,0x01,0x00,0x20,0xEB,0x01,0x00,0x20, +0x9C,0x0D,0x00,0x20,0x48,0x0D,0x00,0x20,0x0C,0x02,0x00,0x20,0xF8,0x00,0x00,0x20, +0x70,0x01,0x00,0x20,0x3E,0x11,0x00,0x20,0xE2,0x01,0x00,0x20,0x7A,0x0D,0x00,0x20, +0x20,0x03,0x00,0x20,0x24,0x09,0x00,0x20,0x60,0x01,0x00,0x20,0xF0,0xB5,0x31,0x4B, +0x31,0x4D,0x1E,0x78,0x31,0x4B,0x00,0x27,0x1A,0x1C,0x2F,0x60,0x2B,0x32,0x12,0x78, +0x89,0xB0,0x04,0x92,0x50,0x00,0x1A,0x1C,0x06,0x90,0x32,0x32,0x12,0x78,0x07,0x92, +0x30,0x22,0x99,0x5E,0x6B,0x68,0x05,0x91,0x02,0x93,0x03,0x97,0x42,0xE0,0x01,0x3E, +0xF6,0xB2,0x33,0x1D,0x5B,0x00,0x01,0x93,0xEB,0x5A,0x00,0x2B,0x34,0xD0,0x04,0x98, +0x1B,0xB2,0x1B,0x1A,0x06,0x99,0x5B,0x10,0xCB,0x18,0x01,0x9A,0x20,0x48,0x9B,0xB2, +0xAB,0x52,0xF2,0x00,0x81,0x58,0x84,0x18,0x07,0x98,0x1B,0xB2,0x81,0x42,0x07,0xDA, +0x1B,0x48,0x01,0x31,0x81,0x50,0x01,0x99,0x00,0x22,0x63,0x60,0x6A,0x52,0x21,0xE0, +0x60,0x68,0x01,0x37,0x1A,0x1A,0xD1,0x17,0x84,0x46,0x50,0x18,0x05,0x9A,0x48,0x40, +0x11,0x18,0x00,0x90,0x60,0x46,0x42,0x43,0x94,0x46,0x00,0x9A,0x53,0x43,0x62,0x46, +0xD0,0x18,0x4B,0x10,0xC0,0x18,0x02,0xF0,0xF3,0xFD,0x01,0x9B,0x03,0x99,0x60,0x60, +0xE8,0x52,0x81,0x42,0x04,0xDB,0x05,0xE0,0x09,0x48,0xF2,0x00,0x83,0x50,0x01,0xE0, +0x02,0x96,0x03,0x90,0x00,0x2E,0xBA,0xD1,0x02,0x99,0x09,0xB0,0x2F,0x60,0x69,0x60, +0xF0,0xBD,0xC0,0x46,0x7C,0x09,0x00,0x20,0xE0,0x00,0x00,0x20,0x48,0x0D,0x00,0x20, +0x48,0x09,0x00,0x20,0xF7,0xB5,0x27,0x4B,0x27,0x49,0x04,0x33,0xDB,0x7F,0x27,0x4A, +0x27,0x48,0x42,0xE0,0x01,0x3B,0xDB,0xB2,0x1C,0x1C,0x14,0x34,0x64,0x00,0x04,0x19, +0x04,0x25,0x64,0x5F,0x00,0x2C,0x27,0xD0,0x0A,0x24,0x5C,0x43,0x0C,0x19,0x3C,0x26, +0xA4,0x5F,0x00,0x2C,0x20,0xD0,0x5C,0x00,0x0E,0x19,0xB6,0x88,0x05,0x19,0x37,0xB2, +0xBC,0x46,0x04,0x27,0xEF,0x5F,0x65,0x46,0xED,0x1B,0x6F,0x10,0xBE,0x19,0x14,0x19, +0xA6,0x80,0x1C,0x1C,0x10,0x34,0x64,0x00,0x0E,0x5B,0x1C,0x1C,0x0C,0x34,0x37,0xB2, +0x64,0x00,0xBC,0x46,0x25,0x5E,0x67,0x46,0x7F,0x1B,0x7F,0x10,0xBE,0x19,0xA6,0x52, +0x10,0x4C,0x01,0x26,0xE6,0x54,0x10,0xE0,0x0B,0x4D,0x5C,0x00,0x2E,0x19,0xB6,0x88, +0x14,0x19,0xA6,0x80,0x1E,0x1C,0x10,0x36,0x1C,0x1C,0x76,0x00,0x76,0x5B,0x0C,0x34, +0x64,0x00,0x16,0x53,0x07,0x4C,0x00,0x26,0xE6,0x54,0x00,0x2B,0xBA,0xD1,0x0B,0x68, +0x13,0x60,0xF7,0xBD,0xAE,0x09,0x00,0x20,0x9C,0x0D,0x00,0x20,0x80,0x09,0x00,0x20, +0x20,0x01,0x00,0x20,0xEC,0x01,0x00,0x20,0xF7,0xB5,0x35,0x4A,0x35,0x4B,0x11,0x1C, +0x33,0x31,0x34,0x32,0x0E,0x78,0x12,0x78,0x04,0x33,0xDB,0x7F,0x32,0x49,0x01,0x92, +0xB4,0x46,0x32,0x4A,0x4B,0xE0,0x32,0x48,0x01,0x3B,0xDB,0xB2,0xC4,0x5C,0x01,0x98, +0x00,0x2C,0x00,0xD1,0x60,0x46,0x5E,0x00,0x8D,0x19,0x96,0x19,0x04,0x27,0xF6,0x5F, +0xAD,0x88,0x00,0x96,0x00,0x9F,0x2E,0xB2,0xBE,0x1B,0xF7,0x17,0xF6,0x19,0x7E,0x40, +0x86,0x42,0x10,0xDA,0x1E,0x1C,0x0C,0x36,0x76,0x00,0xB6,0x5E,0x1F,0x1C,0x10,0x37, +0x00,0x96,0x7F,0x00,0xCF,0x5F,0x00,0x9E,0xF7,0x1B,0xFE,0x17,0xBF,0x19,0x77,0x40, +0x00,0x97,0x87,0x42,0x18,0xDB,0x58,0x00,0x10,0x18,0x1E,0x1C,0x85,0x80,0x10,0x36, +0x19,0x4D,0x18,0x1C,0x76,0x00,0x0C,0x30,0x75,0x5B,0x40,0x00,0x15,0x52,0x18,0x1C, +0x14,0x30,0x40,0x00,0x10,0x18,0x04,0x27,0xC0,0x5F,0x00,0x28,0x04,0xDD,0x00,0x2C, +0x02,0xD1,0x13,0x48,0x01,0x24,0xC4,0x54,0x0A,0x24,0x5C,0x43,0x0E,0x4D,0x18,0x1C, +0x2C,0x19,0x14,0x30,0x0D,0x4D,0x40,0x00,0xA4,0x8F,0x28,0x18,0x84,0x80,0x00,0x2B, +0xB1,0xD1,0x0A,0x68,0x09,0x4B,0x0B,0x49,0x1A,0x60,0x0B,0x4B,0x1A,0x78,0x0B,0x4B, +0x1A,0x70,0x0B,0x4A,0x0B,0x1C,0x31,0xCA,0x31,0xC3,0xC0,0xCA,0xC0,0xC3,0xF7,0xBD, +0x48,0x0D,0x00,0x20,0xAE,0x09,0x00,0x20,0x9C,0x0D,0x00,0x20,0x20,0x01,0x00,0x20, +0x64,0x01,0x00,0x20,0xCC,0x00,0x00,0x20,0xF5,0x00,0x00,0x20,0xF4,0x00,0x00,0x20, +0xE0,0x00,0x00,0x20,0xF7,0xB5,0x19,0x48,0x01,0x23,0x5B,0x42,0x43,0x60,0x18,0x4B, +0x1A,0x78,0x18,0x4B,0x19,0x1C,0x2B,0x33,0x1E,0x78,0x2A,0x31,0x0F,0x78,0x00,0x23, +0xB4,0x46,0x1E,0xE0,0x01,0x3A,0xD2,0xB2,0x13,0x4C,0x51,0x00,0x61,0x5A,0x0E,0xB2, +0xF6,0x43,0xF6,0x17,0x0E,0x40,0x11,0x1D,0x49,0x00,0xB5,0xB2,0x0E,0x52,0x00,0x2D, +0x0F,0xD0,0x0E,0x4E,0x2D,0xB2,0x8E,0x5F,0x00,0x2E,0x04,0xDC,0xBD,0x42,0x07,0xDA, +0x00,0x25,0x0D,0x52,0x05,0xE0,0x65,0x45,0x02,0xDA,0x00,0x26,0x0E,0x52,0x00,0xE0, +0x01,0x33,0x00,0x2A,0xDE,0xD1,0x01,0x4A,0x13,0x60,0xF7,0xBD,0xE0,0x00,0x00,0x20, +0x7C,0x09,0x00,0x20,0x48,0x0D,0x00,0x20,0x3C,0x0D,0x00,0x20,0xCC,0x00,0x00,0x20, +0xEF,0xF3,0x08,0x80,0x70,0x47,0x00,0xBA,0x70,0x47,0x40,0xBA,0x70,0x47,0xC0,0xBA, +0x70,0x47,0x70,0xB5,0x00,0x28,0x16,0xDA,0xC0,0xB2,0x0F,0x23,0x03,0x40,0x08,0x3B, +0x12,0x4A,0x9B,0x08,0x9B,0x00,0x9B,0x18,0x03,0x22,0x10,0x40,0x90,0x40,0xFF,0x22, +0x5D,0x68,0x14,0x1C,0x84,0x40,0x89,0x01,0xA5,0x43,0x0A,0x40,0x82,0x40,0x28,0x1C, +0x10,0x43,0x58,0x60,0x11,0xE0,0x03,0x24,0x82,0x08,0x09,0x4B,0x20,0x40,0xC0,0x32, +0xA0,0x40,0x92,0x00,0xFF,0x24,0xD5,0x58,0x26,0x1C,0x86,0x40,0x89,0x01,0xB5,0x43, +0x0C,0x40,0x84,0x40,0x28,0x1C,0x20,0x43,0xD0,0x50,0x70,0xBD,0x18,0xED,0x00,0xE0, +0x00,0xE1,0x00,0xE0,0x08,0x4B,0x40,0x22,0x19,0x68,0x7F,0x20,0x49,0x06,0x49,0x0E, +0x11,0x43,0x1A,0x68,0x82,0x43,0x0A,0x43,0x1A,0x60,0x1A,0x68,0x80,0x23,0xDB,0x05, +0x19,0x69,0x1A,0x61,0x70,0x47,0xC0,0x46,0x08,0x00,0x00,0x20,0x07,0x4B,0x3F,0x22, +0x19,0x68,0x7F,0x20,0x11,0x40,0x1A,0x68,0x82,0x43,0x0A,0x43,0x1A,0x60,0x1A,0x68, +0x80,0x23,0xDB,0x05,0x19,0x69,0x1A,0x61,0x70,0x47,0xC0,0x46,0x08,0x00,0x00,0x20, +0x07,0x4B,0x08,0x4A,0x19,0x68,0x18,0x68,0x89,0x04,0x89,0x0E,0x09,0x02,0x02,0x40, +0x0A,0x43,0x1A,0x60,0x1A,0x68,0x80,0x23,0xDB,0x05,0x19,0x69,0x1A,0x61,0x70,0x47, +0x08,0x00,0x00,0x20,0xFF,0x80,0xFF,0xFF,0x08,0x4B,0x40,0x22,0x19,0x68,0x18,0x68, +0x49,0x04,0x49,0x0E,0x11,0x43,0x06,0x4A,0x09,0x02,0x02,0x40,0x0A,0x43,0x1A,0x60, +0x1A,0x68,0x80,0x23,0xDB,0x05,0x19,0x69,0x1A,0x61,0x70,0x47,0x08,0x00,0x00,0x20, +0xFF,0x80,0xFF,0xFF,0x08,0x4B,0x20,0x22,0x19,0x68,0x7F,0x20,0x49,0x06,0x49,0x0E, +0x11,0x43,0x1A,0x68,0x82,0x43,0x0A,0x43,0x1A,0x60,0x1A,0x68,0x80,0x23,0xDB,0x05, +0x19,0x69,0x1A,0x61,0x70,0x47,0xC0,0x46,0x08,0x00,0x00,0x20,0x07,0x4B,0x5F,0x22, +0x19,0x68,0x7F,0x20,0x11,0x40,0x1A,0x68,0x82,0x43,0x0A,0x43,0x1A,0x60,0x1A,0x68, +0x80,0x23,0xDB,0x05,0x19,0x69,0x1A,0x61,0x70,0x47,0xC0,0x46,0x08,0x00,0x00,0x20, +0x07,0x4B,0xBE,0x21,0x1A,0x68,0xC9,0x01,0x18,0x68,0x11,0x40,0x05,0x4A,0x02,0x40, +0x0A,0x43,0x1A,0x60,0x1A,0x68,0x80,0x23,0xDB,0x05,0x19,0x69,0x1A,0x61,0x70,0x47, +0x08,0x00,0x00,0x20,0xFF,0x80,0xFF,0xFF,0x08,0x4B,0x20,0x22,0x19,0x68,0x18,0x68, +0x49,0x04,0x49,0x0E,0x11,0x43,0x06,0x4A,0x09,0x02,0x02,0x40,0x0A,0x43,0x1A,0x60, +0x1A,0x68,0x80,0x23,0xDB,0x05,0x19,0x69,0x1A,0x61,0x70,0x47,0x08,0x00,0x00,0x20, +0xFF,0x80,0xFF,0xFF,0x80,0x23,0xDB,0x05,0x18,0x6C,0x80,0x00,0xC0,0x0F,0x70,0x47, +0x08,0x4B,0x10,0x22,0x19,0x68,0x7F,0x20,0x49,0x06,0x49,0x0E,0x11,0x43,0x1A,0x68, +0x82,0x43,0x0A,0x43,0x1A,0x60,0x1A,0x68,0x80,0x23,0xDB,0x05,0x19,0x69,0x1A,0x61, +0x70,0x47,0xC0,0x46,0x08,0x00,0x00,0x20,0x07,0x4B,0x6F,0x22,0x19,0x68,0x7F,0x20, +0x11,0x40,0x1A,0x68,0x82,0x43,0x0A,0x43,0x1A,0x60,0x1A,0x68,0x80,0x23,0xDB,0x05, +0x19,0x69,0x1A,0x61,0x70,0x47,0xC0,0x46,0x08,0x00,0x00,0x20,0x00,0xB5,0x0B,0x4B, +0x19,0x68,0x00,0x28,0x04,0xD0,0x49,0x06,0x49,0x0E,0x10,0x22,0x11,0x43,0x01,0xE0, +0x6F,0x22,0x11,0x40,0x1A,0x68,0x7F,0x20,0x82,0x43,0x0A,0x43,0x1A,0x60,0x1A,0x68, +0x80,0x23,0xDB,0x05,0x19,0x69,0x1A,0x61,0x00,0xBD,0xC0,0x46,0x08,0x00,0x00,0x20, +0x07,0x4B,0xDE,0x21,0x1A,0x68,0xC9,0x01,0x18,0x68,0x11,0x40,0x05,0x4A,0x02,0x40, +0x0A,0x43,0x1A,0x60,0x1A,0x68,0x80,0x23,0xDB,0x05,0x19,0x69,0x1A,0x61,0x70,0x47, +0x08,0x00,0x00,0x20,0xFF,0x80,0xFF,0xFF,0x08,0x4B,0x10,0x22,0x19,0x68,0x18,0x68, +0x49,0x04,0x49,0x0E,0x11,0x43,0x06,0x4A,0x09,0x02,0x02,0x40,0x0A,0x43,0x1A,0x60, +0x1A,0x68,0x80,0x23,0xDB,0x05,0x19,0x69,0x1A,0x61,0x70,0x47,0x08,0x00,0x00,0x20, +0xFF,0x80,0xFF,0xFF,0x80,0x23,0xDB,0x05,0x18,0x6C,0xC0,0x00,0xC0,0x0F,0x70,0x47, +0x08,0x4B,0x01,0x22,0x19,0x68,0x7F,0x20,0x49,0x06,0x49,0x0E,0x11,0x43,0x1A,0x68, +0x82,0x43,0x0A,0x43,0x1A,0x60,0x1A,0x68,0x80,0x23,0xDB,0x05,0x19,0x69,0x1A,0x61, +0x70,0x47,0xC0,0x46,0x08,0x00,0x00,0x20,0x07,0x4B,0x7E,0x22,0x19,0x68,0x7F,0x20, +0x11,0x40,0x1A,0x68,0x82,0x43,0x0A,0x43,0x1A,0x60,0x1A,0x68,0x80,0x23,0xDB,0x05, +0x19,0x69,0x1A,0x61,0x70,0x47,0xC0,0x46,0x08,0x00,0x00,0x20,0x07,0x4B,0xFC,0x21, +0x1A,0x68,0xC9,0x01,0x18,0x68,0x11,0x40,0x05,0x4A,0x02,0x40,0x0A,0x43,0x1A,0x60, +0x1A,0x68,0x80,0x23,0xDB,0x05,0x19,0x69,0x1A,0x61,0x70,0x47,0x08,0x00,0x00,0x20, +0xFF,0x80,0xFF,0xFF,0x08,0x4B,0x01,0x22,0x19,0x68,0x18,0x68,0x49,0x04,0x49,0x0E, +0x11,0x43,0x06,0x4A,0x09,0x02,0x02,0x40,0x0A,0x43,0x1A,0x60,0x1A,0x68,0x80,0x23, +0xDB,0x05,0x19,0x69,0x1A,0x61,0x70,0x47,0x08,0x00,0x00,0x20,0xFF,0x80,0xFF,0xFF, +0x80,0x23,0xDB,0x05,0x18,0x6C,0xC0,0x01,0xC0,0x0F,0x70,0x47,0x08,0x4B,0x02,0x22, +0x19,0x68,0x7F,0x20,0x49,0x06,0x49,0x0E,0x11,0x43,0x1A,0x68,0x82,0x43,0x0A,0x43, +0x1A,0x60,0x1A,0x68,0x80,0x23,0xDB,0x05,0x19,0x69,0x1A,0x61,0x70,0x47,0xC0,0x46, +0x08,0x00,0x00,0x20,0x07,0x4B,0x7D,0x22,0x19,0x68,0x7F,0x20,0x11,0x40,0x1A,0x68, +0x82,0x43,0x0A,0x43,0x1A,0x60,0x1A,0x68,0x80,0x23,0xDB,0x05,0x19,0x69,0x1A,0x61, +0x70,0x47,0xC0,0x46,0x08,0x00,0x00,0x20,0x07,0x4B,0xFA,0x21,0x1A,0x68,0xC9,0x01, +0x18,0x68,0x11,0x40,0x05,0x4A,0x02,0x40,0x0A,0x43,0x1A,0x60,0x1A,0x68,0x80,0x23, +0xDB,0x05,0x19,0x69,0x1A,0x61,0x70,0x47,0x08,0x00,0x00,0x20,0xFF,0x80,0xFF,0xFF, +0x08,0x4B,0x02,0x22,0x19,0x68,0x18,0x68,0x49,0x04,0x49,0x0E,0x11,0x43,0x06,0x4A, +0x09,0x02,0x02,0x40,0x0A,0x43,0x1A,0x60,0x1A,0x68,0x80,0x23,0xDB,0x05,0x19,0x69, +0x1A,0x61,0x70,0x47,0x08,0x00,0x00,0x20,0xFF,0x80,0xFF,0xFF,0x80,0x23,0xDB,0x05, +0x18,0x6C,0x80,0x01,0xC0,0x0F,0x70,0x47,0x08,0x4B,0x04,0x22,0x19,0x68,0x7F,0x20, +0x49,0x06,0x49,0x0E,0x11,0x43,0x1A,0x68,0x82,0x43,0x0A,0x43,0x1A,0x60,0x1A,0x68, +0x80,0x23,0xDB,0x05,0x19,0x69,0x1A,0x61,0x70,0x47,0xC0,0x46,0x08,0x00,0x00,0x20, +0x07,0x4B,0x7B,0x22,0x19,0x68,0x7F,0x20,0x11,0x40,0x1A,0x68,0x82,0x43,0x0A,0x43, +0x1A,0x60,0x1A,0x68,0x80,0x23,0xDB,0x05,0x19,0x69,0x1A,0x61,0x70,0x47,0xC0,0x46, +0x08,0x00,0x00,0x20,0x00,0xB5,0x0B,0x4B,0x19,0x68,0x00,0x28,0x04,0xD0,0x49,0x06, +0x49,0x0E,0x04,0x22,0x11,0x43,0x01,0xE0,0x7B,0x22,0x11,0x40,0x1A,0x68,0x7F,0x20, +0x82,0x43,0x0A,0x43,0x1A,0x60,0x1A,0x68,0x80,0x23,0xDB,0x05,0x19,0x69,0x1A,0x61, +0x00,0xBD,0xC0,0x46,0x08,0x00,0x00,0x20,0x07,0x4B,0xF6,0x21,0x1A,0x68,0xC9,0x01, +0x18,0x68,0x11,0x40,0x05,0x4A,0x02,0x40,0x0A,0x43,0x1A,0x60,0x1A,0x68,0x80,0x23, +0xDB,0x05,0x19,0x69,0x1A,0x61,0x70,0x47,0x08,0x00,0x00,0x20,0xFF,0x80,0xFF,0xFF, +0x08,0x4B,0x04,0x22,0x19,0x68,0x18,0x68,0x49,0x04,0x49,0x0E,0x11,0x43,0x06,0x4A, +0x09,0x02,0x02,0x40,0x0A,0x43,0x1A,0x60,0x1A,0x68,0x80,0x23,0xDB,0x05,0x19,0x69, +0x1A,0x61,0x70,0x47,0x08,0x00,0x00,0x20,0xFF,0x80,0xFF,0xFF,0x80,0x23,0xDB,0x05, +0x18,0x6C,0x40,0x01,0xC0,0x0F,0x70,0x47,0x10,0xB5,0x80,0x23,0xDB,0x05,0x04,0x1D, +0x98,0x69,0x3F,0x22,0x14,0x40,0x90,0x43,0x20,0x43,0x01,0x24,0x98,0x61,0x88,0x1C, +0x21,0x40,0x41,0x18,0x0A,0x40,0x11,0x02,0x98,0x69,0x02,0x4A,0x02,0x40,0x0A,0x43, +0x9A,0x61,0x10,0xBD,0xFF,0xC0,0xFF,0xFF,0x06,0x4B,0x7F,0x22,0x19,0x68,0x80,0x23, +0xDB,0x05,0x18,0x6C,0x01,0x39,0x90,0x43,0x11,0x40,0x02,0x1C,0x0A,0x43,0x1A,0x64, +0x70,0x47,0xC0,0x46,0x18,0x09,0x00,0x20,0x80,0x23,0xDB,0x05,0x1A,0x6C,0x7F,0x21, +0x8A,0x43,0x01,0x21,0x0A,0x43,0x1A,0x64,0x70,0x47,0x80,0x23,0xDB,0x05,0xDA,0x69, +0x0F,0x21,0x8A,0x43,0x02,0x21,0x0A,0x43,0xDA,0x61,0xDA,0x69,0xF0,0x21,0x8A,0x43, +0x30,0x21,0x0A,0x43,0xDA,0x61,0x0C,0x4A,0x11,0x79,0x01,0x39,0xC9,0xB2,0x59,0x77, +0xD8,0x69,0x0A,0x49,0x01,0x40,0x80,0x20,0xC0,0x02,0x01,0x43,0xD9,0x61,0xD8,0x69, +0x07,0x49,0x01,0x40,0xA0,0x20,0xC0,0x03,0x01,0x43,0xD9,0x61,0x92,0x79,0x01,0x3A, +0xD2,0xB2,0xDA,0x77,0x70,0x47,0xC0,0x46,0x04,0x02,0x00,0x20,0xFF,0xFF,0xF0,0xFF, +0xFF,0xFF,0x0F,0xFF,0x30,0xB5,0x1A,0x4A,0x1A,0x4B,0x11,0x88,0x1A,0x4C,0xC9,0x18, +0x80,0x23,0xDB,0x05,0x89,0xB2,0x18,0x8C,0x19,0x84,0x59,0x8C,0x00,0x21,0x59,0x84, +0x50,0x88,0x16,0x4D,0x01,0x19,0x89,0xB2,0x9A,0x8C,0x99,0x84,0x42,0x1E,0xDC,0x8C, +0x92,0xB2,0x44,0x19,0xDA,0x84,0xA4,0xB2,0x1D,0x8D,0x1C,0x85,0x10,0x4C,0x00,0x19, +0x80,0xB2,0x5C,0x8D,0x58,0x85,0x98,0x8D,0x99,0x85,0xD8,0x8D,0xDA,0x85,0x18,0x8E, +0x19,0x86,0x58,0x8E,0x5A,0x86,0x98,0x8E,0x99,0x86,0xD8,0x8E,0xDA,0x86,0x18,0x8F, +0x19,0x87,0x58,0x8F,0x5A,0x87,0x98,0x8F,0x99,0x87,0xD9,0x8F,0xDA,0x87,0x30,0xBD, +0x04,0x02,0x00,0x20,0xFF,0x07,0x00,0x00,0xFF,0x03,0x00,0x00,0xFF,0x05,0x00,0x00, +0xFF,0x01,0x00,0x00,0x30,0xB5,0x22,0x4B,0xEE,0x24,0x1A,0x68,0xE4,0x01,0x14,0x40, +0x20,0x48,0x1A,0x68,0x7F,0x21,0x02,0x40,0x22,0x43,0x1A,0x60,0x1C,0x68,0x80,0x22, +0xD2,0x05,0x15,0x69,0x14,0x61,0x1C,0x4C,0xA4,0x7C,0x00,0x2C,0x16,0xD0,0x1C,0x68, +0x04,0x25,0x64,0x04,0x64,0x0E,0x2C,0x43,0x1D,0x68,0x0C,0x40,0x24,0x02,0x28,0x40, +0x20,0x43,0x18,0x60,0x18,0x68,0x14,0x69,0x10,0x61,0x1C,0x68,0x7B,0x20,0x20,0x40, +0x1C,0x68,0x8C,0x43,0x21,0x1C,0x01,0x43,0x19,0x60,0x15,0xE0,0x1C,0x68,0x04,0x25, +0x64,0x06,0x64,0x0E,0x2C,0x43,0x1D,0x68,0x0C,0x40,0x8D,0x43,0x29,0x1C,0x21,0x43, +0x19,0x60,0x19,0x68,0x14,0x69,0x11,0x61,0x1C,0x68,0xF6,0x21,0xC9,0x01,0x21,0x40, +0x1C,0x68,0x20,0x40,0x08,0x43,0x18,0x60,0x1B,0x68,0x11,0x69,0x13,0x61,0x30,0xBD, +0x08,0x00,0x00,0x20,0xFF,0x80,0xFF,0xFF,0xAE,0x09,0x00,0x20,0x00,0xB5,0x72,0xB6, +0x0F,0x4B,0x01,0x22,0x1A,0x70,0x0F,0x4B,0x9A,0x7C,0x0F,0x4B,0x00,0x2A,0x07,0xD0, +0x1A,0x68,0xF6,0x21,0xC9,0x01,0x11,0x40,0x18,0x68,0x0C,0x4A,0x02,0x40,0x05,0xE0, +0x19,0x68,0x7B,0x22,0x11,0x40,0x1A,0x68,0x7F,0x20,0x82,0x43,0x0A,0x43,0x1A,0x60, +0x1A,0x68,0x80,0x23,0xDB,0x05,0x19,0x69,0x1A,0x61,0x62,0xB6,0x00,0xBD,0xC0,0x46, +0x64,0x00,0x00,0x20,0xAE,0x09,0x00,0x20,0x08,0x00,0x00,0x20,0xFF,0x80,0xFF,0xFF, +0x00,0xB5,0x72,0xB6,0x10,0x4B,0x00,0x22,0x1A,0x70,0x10,0x4B,0x9A,0x7C,0x10,0x4B, +0x19,0x68,0x00,0x2A,0x08,0xD0,0x49,0x04,0x04,0x22,0x49,0x0E,0x11,0x43,0x18,0x68, +0x0C,0x4A,0x09,0x02,0x02,0x40,0x06,0xE0,0x49,0x06,0x04,0x22,0x49,0x0E,0x11,0x43, +0x1A,0x68,0x7F,0x20,0x82,0x43,0x0A,0x43,0x1A,0x60,0x1A,0x68,0x80,0x23,0xDB,0x05, +0x19,0x69,0x1A,0x61,0x62,0xB6,0x00,0xBD,0x64,0x00,0x00,0x20,0xAE,0x09,0x00,0x20, +0x08,0x00,0x00,0x20,0xFF,0x80,0xFF,0xFF,0x01,0x4B,0x18,0x78,0x70,0x47,0xC0,0x46, +0x64,0x00,0x00,0x20,0x00,0xB5,0x80,0x23,0xDB,0x05,0x19,0x6C,0x80,0x22,0xD2,0x01, +0x0A,0x43,0x1A,0x64,0x23,0x4A,0x80,0x21,0x10,0x68,0x49,0x00,0x01,0x43,0x11,0x60, +0x12,0x68,0x99,0x68,0x9A,0x60,0x19,0x6C,0x80,0x22,0x12,0x02,0x0A,0x43,0x1A,0x64, +0x19,0x6C,0x1D,0x4A,0x0A,0x40,0x1A,0x64,0x1C,0x4B,0x7F,0x22,0x59,0x7B,0x1C,0x4B, +0x11,0x40,0x18,0x68,0x1B,0x4A,0x09,0x04,0x02,0x40,0x0A,0x43,0x1A,0x60,0x19,0x68, +0xA0,0x22,0xD2,0x05,0x90,0x68,0x91,0x60,0x18,0x68,0x17,0x49,0x01,0x40,0x84,0x20, +0xC0,0x05,0x01,0x43,0x19,0x60,0x19,0x68,0x90,0x68,0x91,0x60,0x13,0x49,0x09,0x78, +0x49,0xB2,0x00,0x29,0x02,0xD0,0x01,0x29,0x0C,0xD1,0x03,0xE0,0x18,0x68,0x10,0x49, +0x01,0x40,0x03,0xE0,0x18,0x68,0x80,0x21,0x09,0x04,0x01,0x43,0x19,0x60,0x1B,0x68, +0x91,0x68,0x93,0x60,0x80,0x23,0xDB,0x05,0x19,0x6C,0x0A,0x4A,0x0A,0x40,0x1A,0x64, +0x00,0xBD,0xC0,0x46,0x14,0x00,0x00,0x20,0xFF,0x7F,0xFF,0xFF,0xAE,0x09,0x00,0x20, +0x0C,0x00,0x00,0x20,0xFF,0xFF,0x80,0xFF,0xFF,0xFF,0xFF,0x80,0xFA,0x02,0x00,0x20, +0xFF,0xFF,0x7F,0xFF,0xFF,0xBF,0xFF,0xFF,0x04,0x4B,0x01,0x22,0x1A,0x70,0x80,0x23, +0xDB,0x05,0x99,0x6C,0x91,0x43,0x99,0x64,0x1A,0x70,0x70,0x47,0x00,0x00,0x00,0x20, +0x03,0x4A,0x01,0x23,0x13,0x70,0x80,0x22,0xD2,0x05,0x53,0x70,0x70,0x47,0xC0,0x46, +0x02,0x00,0x00,0x20,0x00,0xB5,0x06,0x4B,0x72,0xB6,0x1A,0x78,0x00,0x2A,0x04,0xD0, +0xC0,0x46,0xC0,0x46,0x62,0xB6,0x30,0xBF,0xF6,0xE7,0x62,0xB6,0x00,0xBD,0xC0,0x46, +0x02,0x00,0x00,0x20,0x38,0xB5,0x09,0x4B,0x09,0x49,0x9A,0x78,0x1C,0x79,0x51,0x43, +0x08,0x4B,0x05,0x1C,0xC9,0x18,0x08,0x48,0x02,0xF0,0x7A,0xF8,0x06,0x4B,0x29,0x1C, +0x01,0x34,0x58,0x43,0xA1,0x40,0x02,0xF0,0x73,0xF8,0x38,0xBD,0xAA,0x0A,0x00,0x20, +0x44,0xFE,0xFF,0xFF,0xFE,0x24,0x02,0x00,0x40,0x42,0x0F,0x00,0x05,0x4B,0x19,0x68, +0x80,0x23,0xDB,0x05,0x5A,0x69,0x09,0x02,0x12,0x0E,0x09,0x0A,0x12,0x06,0x0A,0x43, +0x5A,0x61,0x70,0x47,0x04,0x00,0x00,0x20,0x01,0x4B,0x18,0x60,0x70,0x47,0xC0,0x46, +0x04,0x00,0x00,0x20,0x05,0x4B,0x01,0x22,0x1A,0x70,0x80,0x23,0xDB,0x05,0x59,0x69, +0x80,0x22,0x52,0x04,0x0A,0x43,0x5A,0x61,0x70,0x47,0xC0,0x46,0x01,0x00,0x00,0x20, +0x00,0xB5,0x05,0x4B,0x72,0xB6,0x1A,0x78,0x00,0x2A,0x03,0xD0,0xC0,0x46,0xC0,0x46, +0x62,0xB6,0xF7,0xE7,0x62,0xB6,0x00,0xBD,0x00,0x00,0x00,0x20,0x00,0xB5,0x10,0x4B, +0x1B,0x68,0x9A,0x05,0x0C,0xD5,0x0F,0x4A,0x0F,0x4B,0x72,0xB6,0x11,0x78,0x00,0x29, +0x02,0xD1,0x19,0x78,0x00,0x29,0x11,0xD0,0xC0,0x46,0xC0,0x46,0x62,0xB6,0xF4,0xE7, +0x08,0x4A,0x09,0x4B,0x72,0xB6,0x11,0x78,0x00,0x29,0x02,0xD1,0x19,0x78,0x00,0x29, +0x04,0xD0,0xC0,0x46,0xC0,0x46,0x62,0xB6,0x30,0xBF,0xF3,0xE7,0x62,0xB6,0x00,0xBD, +0x58,0x00,0x00,0x20,0x01,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x70,0xB5,0x13,0x49, +0x13,0x4B,0x04,0x24,0x19,0x60,0x13,0x4B,0x13,0x4D,0x1A,0x68,0x22,0x43,0x1A,0x60, +0x1A,0x68,0x02,0x24,0xA2,0x43,0x1A,0x60,0x1A,0x68,0x01,0x24,0x22,0x43,0x0F,0x4C, +0x1A,0x60,0x00,0x22,0x22,0x60,0x0E,0x4A,0x11,0x60,0x2E,0x78,0x2D,0x79,0x70,0x43, +0x01,0x35,0xE8,0x40,0x09,0x1A,0x11,0x60,0x20,0x68,0x11,0x68,0x88,0x42,0xFB,0xD2, +0x1A,0x68,0x01,0x21,0x8A,0x43,0x1A,0x60,0x70,0xBD,0xC0,0x46,0xFF,0xFF,0xFF,0x00, +0x14,0xE0,0x00,0xE0,0x10,0xE0,0x00,0xE0,0xAA,0x0A,0x00,0x20,0x18,0xE0,0x00,0xE0, +0xFC,0x01,0x00,0x20,0x00,0xB5,0x00,0x23,0x06,0x4A,0x98,0x42,0x02,0xDB,0xD3,0x1C, +0xDB,0x7F,0x43,0x43,0x02,0x32,0xD2,0x7F,0x01,0x30,0x52,0xB2,0x90,0x40,0x18,0x18, +0x40,0x18,0x00,0xBD,0xAE,0x09,0x00,0x20,0xF0,0xB5,0x85,0xB0,0x05,0x1C,0x0C,0x1C, +0x16,0x1C,0x00,0x29,0x05,0xD0,0x2B,0x4B,0x02,0x33,0xDB,0x7F,0x5B,0xB2,0x00,0x2B, +0x4E,0xD0,0x21,0x1C,0x28,0x1C,0xFF,0xF7,0xDD,0xFF,0x27,0x49,0x27,0x4F,0x4A,0x7A, +0x09,0x7A,0x13,0x19,0x51,0x18,0x02,0x91,0x41,0x01,0xCF,0x19,0x00,0x22,0x03,0x97, +0x84,0x46,0x13,0xE0,0x22,0x48,0xC1,0x56,0x58,0x1C,0xC0,0xB2,0xCF,0x0F,0x01,0x90, +0x7F,0x18,0x03,0x98,0x7F,0x10,0xC7,0x19,0x08,0x37,0x00,0x97,0x6F,0x46,0x38,0x79, +0x00,0x9F,0x02,0x33,0xB8,0x70,0x01,0x27,0x8F,0x40,0x3A,0x43,0x02,0x98,0x83,0x42, +0xE8,0xDB,0x15,0x4B,0x60,0x46,0xDF,0x79,0x61,0x42,0x61,0x41,0x5B,0x7C,0x79,0x18, +0x1C,0x19,0x49,0x10,0x01,0x39,0x01,0x34,0x89,0x06,0x24,0x05,0x0C,0x43,0x22,0x43, +0x0E,0x49,0x10,0x4C,0x40,0x01,0x43,0x18,0x0F,0x4F,0x01,0x19,0x4C,0x68,0x4A,0x60, +0xAA,0x1C,0xD2,0xB2,0xC0,0x19,0x02,0x71,0x00,0x2E,0x07,0xD0,0x0B,0x4A,0x01,0x21, +0x52,0x57,0x91,0x40,0x0A,0x1C,0x99,0x69,0x9A,0x61,0x01,0xE0,0x9A,0x69,0x9E,0x61, +0x05,0xB0,0xF0,0xBD,0xAE,0x09,0x00,0x20,0x0A,0x03,0x00,0x20,0x00,0x10,0x00,0x40, +0x10,0x75,0x00,0x00,0x18,0x10,0x00,0x40,0x10,0x10,0x00,0x40,0xEA,0x74,0x00,0x00, +0x10,0xB5,0x08,0x4B,0x00,0x21,0x1B,0x68,0x01,0x3B,0x08,0xE0,0x06,0x4C,0x58,0x01, +0x09,0x22,0x00,0x19,0x84,0x18,0xA1,0x72,0x01,0x3A,0xFB,0xD2,0x01,0x3B,0x00,0x2B, +0xF4,0xDA,0x10,0xBD,0x18,0x09,0x00,0x20,0x00,0x10,0x00,0x40,0x38,0xB5,0xFF,0xF7, +0xE7,0xFF,0x00,0x21,0x01,0x20,0x0A,0x1C,0x40,0x42,0xFF,0xF7,0x75,0xFF,0x01,0x20, +0x40,0x42,0x01,0x21,0x00,0x22,0xFF,0xF7,0x6F,0xFF,0x0A,0x4D,0xAC,0x7B,0x0B,0xE0, +0x20,0x1C,0x00,0x21,0x01,0x22,0xFF,0xF7,0x67,0xFF,0x01,0x21,0x20,0x1C,0x0A,0x1C, +0xFF,0xF7,0x62,0xFF,0x01,0x34,0xE4,0xB2,0xAA,0x7B,0x2B,0x79,0xD3,0x18,0x9C,0x42, +0xEE,0xDB,0x38,0xBD,0x0A,0x03,0x00,0x20,0xF0,0xB5,0x85,0xB0,0x05,0x1C,0x0E,0x1C, +0x02,0x92,0x1F,0x1C,0x00,0x29,0x05,0xD0,0x21,0x4B,0x02,0x33,0xDB,0x7F,0x5B,0xB2, +0x00,0x2B,0x3B,0xD0,0x31,0x1C,0x28,0x1C,0xFF,0xF7,0x34,0xFF,0x1D,0x4A,0xC0,0xB2, +0x01,0x90,0x53,0x7A,0x12,0x7A,0xF6,0x18,0x9A,0x18,0x1B,0x4B,0xB9,0x1E,0x1B,0x7C, +0x48,0x1E,0x81,0x41,0x49,0x42,0xF6,0xB2,0x03,0x91,0x9C,0x46,0x24,0xE0,0x00,0x2F, +0x07,0xD1,0x26,0x21,0x71,0x43,0x15,0x4B,0x49,0x19,0xCC,0x5C,0x64,0x44,0xE4,0xB2, +0x08,0xE0,0x01,0x2F,0x04,0xD1,0x73,0x01,0x11,0x49,0x5B,0x19,0x5C,0x5C,0x01,0xE0, +0x03,0x9B,0x1C,0x40,0x0F,0x4B,0x02,0x99,0x9B,0x57,0x02,0x36,0xD8,0x0F,0xC0,0x18, +0x63,0x18,0xDB,0xB2,0x00,0x93,0x01,0x9B,0x40,0x10,0x59,0x01,0x6B,0x46,0x08,0x18, +0x1B,0x78,0x09,0x49,0xF6,0xB2,0x43,0x54,0x96,0x42,0xD8,0xDB,0x05,0xB0,0xF0,0xBD, +0xAE,0x09,0x00,0x20,0x0A,0x03,0x00,0x20,0x48,0x0D,0x00,0x20,0x36,0x75,0x00,0x00, +0xB3,0x0A,0x00,0x20,0x10,0x75,0x00,0x00,0x00,0x10,0x00,0x40,0x70,0xB5,0x2A,0x4B, +0x2A,0x4A,0x19,0x68,0x80,0x24,0x0A,0x40,0x1A,0x60,0x1A,0x68,0xE4,0x05,0x28,0x4D, +0xA1,0x68,0xA2,0x60,0x69,0x7A,0x03,0x22,0x18,0x68,0x11,0x40,0x25,0x4A,0x89,0x04, +0x02,0x40,0x0A,0x43,0x1A,0x60,0x1A,0x68,0xA1,0x68,0xA2,0x60,0x19,0x68,0x80,0x22, +0x52,0x03,0x0A,0x43,0x1A,0x60,0x1A,0x68,0xA1,0x68,0xA2,0x60,0x29,0x7A,0x18,0x68, +0x07,0x26,0x1D,0x4A,0x31,0x40,0x49,0x05,0x02,0x40,0x0A,0x43,0x1A,0x60,0x1A,0x68, +0xA1,0x68,0xA2,0x60,0xA9,0x7B,0x0F,0x29,0x25,0xD8,0xEA,0x7B,0x0F,0x2A,0x22,0xD8, +0x18,0x68,0x09,0x07,0x00,0x01,0x00,0x09,0x01,0x43,0x19,0x60,0x0F,0x21,0x0A,0x40, +0x18,0x68,0x11,0x06,0x11,0x4A,0x02,0x40,0x0A,0x43,0x1A,0x60,0x1B,0x68,0xA2,0x68, +0xA3,0x60,0xFF,0xF7,0x49,0xFC,0x0E,0x4A,0x63,0x6C,0x13,0x43,0x63,0x64,0xFF,0xF7, +0x5C,0xFC,0xFF,0xF7,0x87,0xFC,0xEB,0x79,0x0A,0x4A,0x1E,0x40,0x33,0x02,0x26,0x6C, +0x16,0x40,0x1E,0x43,0x26,0x64,0x70,0xBD,0x14,0x00,0x00,0x20,0xFF,0xFF,0xFC,0xFF, +0x48,0x0D,0x00,0x20,0xFF,0xFF,0xF3,0xFF,0xFF,0xFF,0x1F,0xFF,0xFF,0xFF,0xFF,0xF0, +0xFF,0xFF,0x0F,0x00,0xFF,0xF8,0xFF,0xFF,0x00,0xB5,0x80,0x21,0xC9,0x05,0x0B,0x79, +0x5A,0x1E,0xD2,0xB2,0x98,0x42,0x09,0xDD,0x00,0xE0,0x0B,0x71,0x01,0x33,0xDB,0xB2, +0x83,0x42,0xFA,0xDD,0x04,0xE0,0x0A,0x71,0x01,0x3A,0xD2,0xB2,0x82,0x42,0xFA,0xDA, +0x00,0xBD,0x38,0xB5,0x17,0x4C,0xA0,0x78,0xFF,0xF7,0xE6,0xFF,0x80,0x23,0xDB,0x05, +0x21,0x79,0x5A,0x68,0xC9,0x07,0x52,0x00,0x52,0x08,0x0A,0x43,0x5A,0x60,0x60,0x79, +0x03,0x22,0x5D,0x68,0x10,0x49,0x10,0x40,0x80,0x03,0x29,0x40,0x01,0x43,0x59,0x60, +0xA0,0x79,0x0E,0x49,0x5D,0x68,0x10,0x40,0x00,0x03,0x29,0x40,0x01,0x43,0x59,0x60, +0xE0,0x79,0x0B,0x49,0x5D,0x68,0x10,0x40,0x29,0x40,0x80,0x02,0x01,0x43,0x59,0x60, +0x21,0x7A,0x58,0x68,0x0A,0x40,0x11,0x02,0x06,0x4A,0x02,0x40,0x0A,0x43,0x5A,0x60, +0x38,0xBD,0xC0,0x46,0xAA,0x0A,0x00,0x20,0xFF,0x3F,0xFF,0xFF,0xFF,0xCF,0xFF,0xFF, +0xFF,0xF3,0xFF,0xFF,0xFF,0xFC,0xFF,0xFF,0xF8,0xB5,0x80,0x23,0xDB,0x05,0x1A,0x68, +0x7A,0x4A,0x00,0x21,0x08,0x20,0x19,0x60,0x10,0x60,0x14,0x68,0x9D,0x68,0x9C,0x60, +0x77,0x4C,0x21,0x60,0x24,0x68,0xDD,0x68,0xDC,0x60,0xFE,0x25,0x75,0x4C,0xED,0x01, +0x25,0x60,0x24,0x68,0x1D,0x69,0x1C,0x61,0x5C,0x69,0x59,0x61,0x9C,0x69,0x99,0x61, +0xDC,0x69,0xD9,0x61,0x1C,0x6C,0x80,0x24,0xE4,0x01,0x1C,0x64,0x5C,0x6C,0x59,0x64, +0x9C,0x6C,0x6D,0x4C,0x99,0x64,0x21,0x60,0xA0,0x24,0xE4,0x05,0xA5,0x68,0xA1,0x60, +0x1C,0x6C,0x6A,0x49,0x21,0x40,0x19,0x64,0x1C,0x68,0x80,0x21,0x49,0x05,0x21,0x43, +0x19,0x60,0x67,0x49,0x01,0x31,0xC9,0x7F,0x00,0x29,0x03,0xD0,0x11,0x68,0x08,0x43, +0x10,0x60,0x02,0xE0,0x11,0x68,0x81,0x43,0x11,0x60,0x11,0x68,0x98,0x68,0x99,0x60, +0x13,0x68,0x04,0x26,0x33,0x43,0x13,0x60,0x13,0x68,0x80,0x25,0xED,0x05,0xA9,0x68, +0xAB,0x60,0x13,0x68,0x02,0x27,0x3B,0x43,0x13,0x60,0x13,0x68,0xA9,0x68,0xAB,0x60, +0x13,0x68,0x01,0x20,0x83,0x43,0x13,0x60,0x13,0x68,0xAA,0x68,0xAB,0x60,0xFF,0xF7, +0xED,0xFE,0x54,0x4B,0x1C,0x22,0x9A,0x56,0xA9,0x69,0x53,0x4B,0x12,0x05,0xF2,0x40, +0x0B,0x40,0x13,0x43,0xAB,0x61,0xFF,0xF7,0x61,0xFE,0x50,0x4A,0x50,0x4B,0x01,0x21, +0x1A,0x60,0x50,0x4B,0x08,0x24,0x1A,0x68,0x10,0x20,0x32,0x43,0x1A,0x60,0x1A,0x68, +0xBA,0x43,0x1A,0x60,0x4C,0x4B,0xC0,0x22,0x52,0x00,0x99,0x50,0x20,0x21,0x9F,0x50, +0x9E,0x50,0x9C,0x50,0x98,0x50,0x99,0x50,0x40,0x21,0x99,0x50,0xC0,0x22,0xBA,0x40, +0x98,0x58,0xFF,0x24,0xA0,0x43,0xC0,0x24,0x20,0x43,0x98,0x50,0x9C,0x58,0x43,0x48, +0x04,0x40,0x9C,0x50,0x9C,0x58,0x42,0x48,0x20,0x40,0x80,0x24,0x24,0x04,0x04,0x43, +0x9C,0x50,0x9C,0x58,0x24,0x02,0x24,0x0A,0x2C,0x43,0x9C,0x50,0xC1,0x22,0xBA,0x40, +0x98,0x58,0x04,0x1C,0xFF,0x20,0x84,0x43,0x0C,0x43,0x9C,0x50,0x9C,0x58,0x37,0x48, +0x20,0x40,0x80,0x24,0x24,0x02,0x20,0x43,0x98,0x50,0x98,0x58,0x34,0x4C,0x20,0x40, +0x98,0x50,0x34,0x4A,0x10,0x69,0x30,0x43,0x10,0x61,0x62,0xB6,0x08,0x22,0x01,0x20, +0x1E,0x60,0x18,0x60,0x1F,0x60,0x1A,0x60,0x2F,0x4B,0x20,0x20,0x10,0x24,0xDC,0x67, +0xD8,0x67,0xD9,0x67,0xFF,0xF7,0x46,0xFC,0x21,0x4C,0xE0,0x7D,0x21,0x7E,0xFF,0xF7, +0xFB,0xFA,0xE3,0x7C,0x00,0x2B,0x26,0xD0,0x1A,0x4B,0x01,0x21,0x18,0x68,0x27,0x4A, +0x40,0x00,0x40,0x0E,0x08,0x43,0x19,0x68,0x00,0x06,0x11,0x40,0x01,0x43,0x19,0x60, +0x19,0x68,0x28,0x69,0x29,0x61,0x19,0x68,0x49,0x00,0x49,0x0E,0x0F,0x43,0x39,0x06, +0x1F,0x68,0x17,0x40,0x0F,0x43,0x1F,0x60,0x19,0x68,0x28,0x69,0x29,0x61,0x19,0x68, +0x49,0x00,0x49,0x0E,0x0E,0x43,0x19,0x68,0x36,0x06,0x0A,0x40,0x32,0x43,0x1A,0x60, +0x1B,0x68,0x2A,0x69,0x2B,0x61,0xFF,0xF7,0xD4,0xFE,0xFF,0xF7,0xC1,0xF8,0xFF,0xF7, +0x0F,0xF9,0xFF,0xF7,0x7D,0xF9,0xFF,0xF7,0x65,0xFB,0xF8,0xBD,0x14,0x00,0x00,0x20, +0x10,0x00,0x00,0x20,0x08,0x00,0x00,0x20,0x0C,0x00,0x00,0x20,0xFF,0xFF,0x7F,0xFF, +0xAE,0x09,0x00,0x20,0x48,0x0D,0x00,0x20,0xFF,0xFF,0x00,0xF0,0xFF,0xFF,0xFF,0x00, +0x14,0xE0,0x00,0xE0,0x10,0xE0,0x00,0xE0,0x00,0xE1,0x00,0xE0,0xFF,0x00,0xFF,0xFF, +0xFF,0xFF,0x00,0xFF,0x00,0xED,0x00,0xE0,0x04,0xE1,0x00,0xE0,0xFF,0xFF,0xFF,0x80, +0x08,0xB5,0x0C,0x4A,0x0C,0x4B,0x0D,0x49,0x01,0xE0,0x01,0xCA,0x01,0xC3,0x8B,0x42, +0xFB,0xD3,0x0B,0x4B,0x0B,0x49,0x00,0x22,0x00,0xE0,0x04,0xC3,0x8B,0x42,0xFC,0xD3, +0xFF,0xF7,0x26,0xF8,0x08,0x4B,0x00,0x22,0x00,0xE0,0x04,0xC3,0x83,0x42,0xFC,0xD3, +0x08,0xBD,0xC0,0x46,0xFC,0x59,0x00,0x00,0x3C,0x00,0x00,0x20,0x5C,0x00,0x00,0x20, +0x5C,0x00,0x00,0x20,0xEC,0x11,0x00,0x20,0x0C,0x1E,0x00,0x20,0x00,0xB5,0x13,0x4B, +0x1B,0x68,0x01,0x2B,0x02,0xD0,0x08,0x2B,0x1E,0xD1,0x0F,0xE0,0x10,0x4B,0x11,0x4A, +0x1A,0x60,0x11,0x4A,0x5A,0x60,0x11,0x4A,0x11,0x4B,0x1A,0x60,0x11,0x4B,0x12,0x4A, +0x1A,0x60,0x12,0x4A,0x5A,0x60,0x12,0x4A,0x9A,0x60,0x0D,0xE0,0x09,0x4B,0x08,0x4A, +0x09,0x49,0x13,0x60,0x51,0x60,0x0A,0x4A,0x13,0x60,0x0A,0x4A,0x13,0x60,0x53,0x60, +0x93,0x60,0x0C,0x4B,0x01,0x22,0x1A,0x70,0x00,0xBD,0xC0,0x46,0x50,0x11,0x00,0x20, +0x68,0x00,0x00,0x20,0xF9,0x03,0x00,0x00,0x7D,0x3F,0x00,0x00,0xB5,0x3F,0x00,0x00, +0x00,0x02,0x00,0x20,0x18,0x00,0x00,0x20,0xC1,0x40,0x00,0x00,0xA9,0x42,0x00,0x00, +0x0D,0x44,0x00,0x00,0xE4,0x01,0x00,0x20,0x00,0xB5,0x00,0x23,0xC2,0x5C,0x01,0x33, +0x00,0x2A,0xFB,0xD1,0x01,0x3B,0xD8,0xB2,0x00,0xBD,0xC0,0x46,0xF7,0xB5,0x1C,0x1C, +0x08,0xAB,0x1F,0x78,0x26,0x4B,0x0E,0x1C,0x1B,0x68,0x01,0x21,0x81,0x40,0x0B,0x42, +0x44,0xD0,0x00,0x2F,0x07,0xD0,0x04,0x2C,0x32,0xD8,0x22,0x4B,0x19,0x5D,0x05,0x33, +0x00,0x91,0x1F,0x5D,0x08,0xE0,0x04,0x2C,0x2E,0xD8,0x1E,0x4B,0x19,0x1C,0x0A,0x31, +0x09,0x5D,0x0F,0x33,0x1F,0x5D,0x00,0x91,0x03,0x2C,0x28,0xD0,0x00,0x2C,0x28,0xD0, +0x28,0xE0,0x3A,0x20,0x21,0x1C,0x01,0xF0,0x63,0xFC,0x86,0x42,0x05,0xDD,0x6B,0x46, +0x1B,0x78,0xC0,0xB2,0x2B,0x70,0x68,0x70,0x02,0xE0,0x2F,0x70,0x30,0x1C,0x6E,0x70, +0x36,0x1A,0x60,0x43,0x01,0x99,0x00,0x23,0x69,0x60,0xAB,0x60,0x09,0x18,0xF6,0xB2, +0x01,0x91,0xFF,0xF7,0xE3,0xFA,0xFF,0xF7,0x37,0xFB,0x00,0x28,0xFB,0xD1,0x0B,0xE0, +0x0F,0x23,0x00,0x27,0x00,0x93,0x05,0xE0,0x0F,0x21,0x00,0x91,0x02,0xE0,0x02,0x24, +0x00,0xE0,0x01,0x24,0x04,0x4D,0x01,0x92,0x00,0x2E,0xD2,0xD1,0xF7,0xBD,0xC0,0x46, +0x58,0x00,0x00,0x20,0x73,0x59,0x00,0x00,0x70,0x00,0x00,0x20,0x38,0xB5,0x11,0x4B, +0x01,0x22,0x1B,0x68,0x82,0x40,0x0D,0x1C,0x13,0x42,0x19,0xD0,0x0E,0x4C,0x0B,0x23, +0x23,0x70,0x08,0x1C,0xFF,0xF7,0x90,0xFF,0x60,0x70,0x63,0x78,0x07,0x22,0x02,0x33, +0x13,0x40,0x93,0x42,0x03,0xD1,0x63,0x78,0x01,0x3B,0xDB,0xB2,0x63,0x70,0x00,0x23, +0x65,0x60,0xA3,0x60,0xFF,0xF7,0xAA,0xFA,0xFF,0xF7,0xFE,0xFA,0x00,0x28,0xFB,0xD1, +0x38,0xBD,0xC0,0x46,0x58,0x00,0x00,0x20,0x70,0x00,0x00,0x20,0x1F,0xB5,0x0B,0x4C, +0x6B,0x46,0xD8,0x73,0x23,0x78,0x00,0x2B,0x03,0xD0,0x00,0x20,0x08,0x49,0xFF,0xF7, +0xCD,0xFF,0x23,0x78,0x00,0x2B,0x07,0xD0,0x6A,0x46,0x01,0x21,0x00,0x20,0x0F,0x32, +0x04,0x23,0x00,0x91,0xFF,0xF7,0x6A,0xFF,0x1F,0xBD,0xC0,0x46,0xEB,0x01,0x00,0x20, +0x87,0x59,0x00,0x00,0xF8,0xB5,0xFF,0xF7,0xD7,0xFA,0x00,0x28,0x70,0xD1,0x39,0x4B, +0x1A,0x68,0x00,0x2A,0x03,0xDC,0x38,0x4B,0x1B,0x68,0x00,0x2B,0x3E,0xDD,0x37,0x49, +0x03,0x23,0x0B,0x70,0x36,0x4B,0x04,0x33,0xDB,0x7F,0x1C,0x1C,0x9A,0x42,0x00,0xDA, +0xD3,0xB2,0x4B,0x70,0x0A,0x21,0x8C,0x46,0x32,0x4A,0x00,0x23,0x2D,0x49,0x1F,0xE0, +0x01,0x33,0x03,0xE0,0x66,0x46,0x5E,0x43,0x00,0x20,0x76,0x18,0x0A,0x30,0x37,0x18, +0x32,0x25,0x7F,0x5F,0x00,0x2F,0xF3,0xD0,0xA3,0x42,0x13,0xDA,0x58,0x00,0x08,0x18, +0x80,0x88,0xDE,0x00,0x10,0x70,0x00,0xB2,0x00,0x12,0x80,0x19,0x50,0x70,0x18,0x1C, +0x10,0x30,0x40,0x00,0x08,0x5A,0x01,0x33,0x90,0x70,0x00,0x0A,0xD0,0x70,0x04,0x32, +0xA3,0x42,0xDF,0xDB,0x1D,0x4B,0x1F,0x4A,0x5A,0x60,0x00,0x22,0x9A,0x60,0xFF,0xF7, +0x3D,0xFA,0xFF,0xF7,0x91,0xFA,0x00,0x28,0xFB,0xD1,0x29,0xE0,0x1A,0x4A,0x53,0x68, +0x01,0x33,0x25,0xD0,0x15,0x4B,0x13,0x21,0x19,0x70,0x11,0x68,0x94,0x46,0x59,0x70, +0x16,0x4B,0x14,0x49,0x1D,0x78,0x03,0x1C,0x0D,0xE0,0x23,0x1C,0x01,0xE0,0x5E,0x00, +0x66,0x44,0x02,0x30,0x34,0x18,0x06,0x22,0xA7,0x5E,0x5C,0x1C,0x00,0x2F,0xF4,0xD0, +0x0B,0x70,0x23,0x1C,0x01,0x31,0x00,0x20,0xAB,0x42,0xF0,0xDB,0x07,0x4B,0x09,0x4A, +0x98,0x60,0x5A,0x60,0xFF,0xF7,0x12,0xFA,0xFF,0xF7,0x66,0xFA,0x00,0x28,0xFB,0xD1, +0xF8,0xBD,0xC0,0x46,0x9C,0x0D,0x00,0x20,0x20,0x01,0x00,0x20,0x70,0x00,0x00,0x20, +0xAE,0x09,0x00,0x20,0xF0,0x09,0x00,0x20,0xE0,0x00,0x00,0x20,0x7C,0x09,0x00,0x20, +0x08,0xB5,0x64,0x4B,0x1B,0x88,0x1D,0x2B,0x47,0xD0,0x1A,0xD8,0x05,0x2B,0x00,0xD1, +0x96,0xE0,0x0D,0xD8,0x02,0x2B,0x63,0xD0,0x03,0xD8,0x01,0x2B,0x00,0xD0,0xB7,0xE0, +0x57,0xE0,0x03,0x2B,0x00,0xD1,0x87,0xE0,0x04,0x2B,0x00,0xD0,0xB0,0xE0,0x8F,0xE0, +0x07,0x2B,0x65,0xD0,0x5C,0xD3,0x1B,0x2B,0x1C,0xD0,0x1C,0x2B,0x00,0xD0,0xA7,0xE0, +0x22,0xE0,0x22,0x2B,0x40,0xD0,0x08,0xD8,0x1F,0x2B,0x5D,0xD0,0x2A,0xD3,0x20,0x2B, +0x5E,0xD0,0x21,0x2B,0x00,0xD0,0x9B,0xE0,0x5E,0xE0,0x41,0x2B,0x64,0xD0,0x03,0xD8, +0x40,0x2B,0x00,0xD0,0x94,0xE0,0x5B,0xE0,0x42,0x2B,0x61,0xD0,0x60,0x2B,0x00,0xD0, +0x8E,0xE0,0x72,0xE0,0x48,0x4A,0x49,0x4B,0x12,0x78,0x01,0x20,0x19,0x68,0x90,0x40, +0x02,0x1C,0x0A,0x43,0x1A,0x60,0x83,0xE0,0x43,0x49,0x44,0x4B,0x09,0x78,0x1A,0x68, +0x01,0x20,0x88,0x40,0x82,0x43,0x1A,0x60,0x7A,0xE0,0x3F,0x4B,0x1A,0x78,0x40,0x4B, +0x1A,0x70,0x75,0xE0,0x3C,0x4B,0x0D,0x21,0x1A,0x78,0x3E,0x4B,0x1A,0x70,0x3C,0x4A, +0x11,0x70,0x1A,0x78,0x3C,0x4B,0x00,0x2A,0x02,0xD0,0x00,0x22,0x5A,0x70,0x67,0xE0, +0x3A,0x4A,0x52,0x78,0x5A,0x70,0x63,0xE0,0x33,0x4B,0x1A,0x78,0x38,0x4B,0x1A,0x70, +0x5E,0xE0,0x31,0x4B,0x1A,0x78,0x37,0x4B,0x1A,0x60,0xFD,0xF7,0x09,0xFC,0x57,0xE0, +0x2D,0x4B,0x1A,0x78,0x34,0x4B,0x9A,0x70,0x98,0x78,0xFF,0xF7,0x8D,0xFC,0x4F,0xE0, +0x29,0x4B,0x1A,0x78,0x30,0x4B,0x9A,0x70,0x29,0x4B,0x0F,0x22,0x1A,0x70,0x47,0xE0, +0x2E,0x4B,0x01,0x22,0x1A,0x70,0x43,0xE0,0x2D,0x4B,0x01,0x22,0x1A,0x70,0x3F,0xE0, +0x0C,0x20,0xFD,0xF7,0x85,0xF9,0x3B,0xE0,0x0D,0x20,0xFD,0xF7,0x81,0xF9,0x37,0xE0, +0x28,0x4B,0x01,0x22,0x1A,0x70,0x33,0xE0,0x27,0x4B,0x01,0x22,0x1A,0x70,0x2F,0xE0, +0x26,0x4B,0x01,0x22,0x1A,0x70,0x2B,0xE0,0x25,0x4B,0x01,0x22,0x1A,0x70,0x27,0xE0, +0x24,0x4B,0x01,0x22,0x1A,0x70,0x14,0x4B,0x1A,0x78,0x23,0x4B,0x1A,0x70,0x1F,0xE0, +0x11,0x4B,0x1A,0x78,0x1E,0x4B,0x9A,0x70,0x1A,0xE0,0x0F,0x4B,0x1A,0x78,0x1F,0x4B, +0x1A,0x70,0x1A,0x78,0x10,0x4B,0x01,0x3A,0x01,0x2A,0x03,0xD8,0x40,0x33,0x0F,0x22, +0x1A,0x70,0x0D,0xE0,0x1A,0x4A,0x40,0x33,0x12,0x78,0x00,0x2A,0x04,0xD0,0x19,0x4A, +0x40,0x32,0x12,0x78,0x1A,0x70,0x03,0xE0,0x08,0x4A,0x40,0x32,0x12,0x78,0x1A,0x70, +0x08,0xBD,0xC0,0x46,0x28,0x00,0x00,0x20,0x0C,0x00,0x00,0x50,0x58,0x00,0x00,0x20, +0x1D,0x03,0x00,0x20,0xE3,0x01,0x00,0x20,0x48,0x0D,0x00,0x20,0x4A,0x74,0x00,0x00, +0xDE,0x01,0x00,0x20,0x50,0x11,0x00,0x20,0xAA,0x0A,0x00,0x20,0xE4,0x01,0x00,0x20, +0xDC,0x01,0x00,0x20,0xE8,0x01,0x00,0x20,0xE7,0x01,0x00,0x20,0xE5,0x01,0x00,0x20, +0x8B,0x01,0x00,0x20,0xE6,0x01,0x00,0x20,0x92,0x01,0x00,0x20,0xE0,0x01,0x00,0x20, +0xDD,0x01,0x00,0x20,0x9A,0x74,0x00,0x00,0x30,0xB5,0x4A,0x4B,0x1B,0x88,0x34,0x2B, +0x47,0xD0,0x0C,0xD8,0x2E,0x2B,0x4F,0xD0,0x04,0xD8,0x00,0x2B,0x14,0xD0,0x1D,0x2B, +0x78,0xD1,0x16,0xE0,0x2F,0x2B,0x51,0xD0,0x30,0x2B,0x73,0xD1,0x56,0xE0,0x38,0x2B, +0x66,0xD0,0x04,0xD8,0x35,0x2B,0x39,0xD0,0x37,0x2B,0x6B,0xD1,0x5B,0xE0,0x39,0x2B, +0x63,0xD0,0x86,0x2B,0x66,0xD1,0x09,0xE0,0x3B,0x4B,0x5A,0x7B,0x3B,0x4B,0x1A,0x70, +0x6F,0xE0,0x3B,0x4B,0x1A,0x78,0x39,0x4B,0x1A,0x70,0x6A,0xE0,0x39,0x49,0x3A,0x4A, +0x0B,0x78,0x00,0x2B,0x0F,0xD1,0x10,0x78,0x34,0x49,0x08,0x70,0x50,0x78,0x37,0x49, +0x08,0x70,0x52,0x68,0xD1,0x18,0x36,0x4C,0x08,0x78,0x19,0x19,0x01,0x33,0x08,0x70, +0x06,0x2B,0xF7,0xD1,0x55,0xE0,0x52,0x68,0x00,0x23,0x08,0x78,0x2B,0x4D,0xC0,0x18, +0x02,0x38,0x10,0x18,0x04,0x78,0x58,0x19,0x01,0x33,0x04,0x70,0x08,0x2B,0xF4,0xD1, +0x47,0xE0,0x2C,0x4B,0x1A,0x68,0x25,0x4B,0x1A,0x60,0x42,0xE0,0x80,0x23,0xDB,0x05, +0x1A,0x79,0x22,0x4B,0x1A,0x70,0x3C,0xE0,0x22,0x4B,0x27,0x4A,0x1B,0x78,0x1F,0x49, +0xD3,0x18,0x1A,0x68,0x5B,0x68,0x0A,0x60,0x4B,0x60,0x32,0xE0,0x1A,0x4B,0x1A,0x1C, +0x2C,0x32,0x11,0x78,0x19,0x4A,0x00,0x29,0x07,0xD1,0x09,0xE0,0x16,0x4B,0x1A,0x1C, +0x2C,0x32,0x11,0x78,0x15,0x4A,0x00,0x29,0x02,0xD1,0xDB,0x8C,0x13,0x80,0x20,0xE0, +0x1B,0x8D,0x13,0x80,0x1D,0xE0,0x19,0x4B,0x1A,0x78,0x10,0x4B,0x1A,0x70,0x18,0xE0, +0x17,0x4B,0x1A,0x78,0x0D,0x4B,0x1A,0x70,0x13,0xE0,0x16,0x4B,0x1A,0x78,0x0B,0x4B, +0x1A,0x70,0x0E,0xE0,0x90,0x3B,0x9A,0xB2,0x13,0x2A,0x0A,0xD8,0x09,0x4A,0x5B,0x01, +0x12,0x78,0x06,0x49,0x9B,0x18,0x10,0x4A,0x9B,0x18,0x1A,0x68,0x5B,0x68,0x0A,0x60, +0x4B,0x60,0x30,0xBD,0x28,0x00,0x00,0x20,0xAE,0x09,0x00,0x20,0x0C,0x00,0x00,0x50, +0x1D,0x03,0x00,0x20,0x2A,0x00,0x00,0x20,0x70,0x00,0x00,0x20,0x0D,0x00,0x00,0x50, +0x0E,0x00,0x00,0x50,0x1C,0x09,0x00,0x20,0xB1,0x09,0x00,0x20,0xFF,0x5B,0x00,0x00, +0xFF,0x73,0x00,0x00,0xFF,0x7B,0x00,0x00,0xB3,0x0A,0x00,0x20,0x08,0xB5,0x08,0x4B, +0x1B,0x88,0x86,0x2B,0x0B,0xD1,0x07,0x4B,0x9A,0x68,0x01,0x2A,0x02,0xDC,0x9A,0x68, +0x01,0x32,0x9A,0x60,0x9B,0x68,0x02,0x2B,0x01,0xD1,0xFF,0xF7,0x71,0xF8,0x08,0xBD, +0x28,0x00,0x00,0x20,0x70,0x00,0x00,0x20,0x7F,0xB5,0x31,0x4C,0x03,0x90,0x23,0x78, +0x0D,0x1C,0x16,0x1C,0x00,0x2B,0x03,0xD0,0x01,0x20,0x2E,0x49,0xFF,0xF7,0x6E,0xFD, +0x23,0x78,0x00,0x2B,0x06,0xD0,0x01,0x21,0x08,0x1C,0x03,0xAA,0x04,0x23,0x00,0x91, +0xFF,0xF7,0x0C,0xFD,0x28,0x4B,0x03,0x99,0x1B,0x78,0x28,0x4A,0x00,0x2B,0x15,0xD1, +0x13,0x1C,0x4A,0x33,0x00,0x20,0x1B,0x5E,0x8E,0x1B,0x9E,0x42,0x05,0xDC,0x13,0x1C, +0x4C,0x33,0x00,0x20,0x1B,0x5E,0x9E,0x42,0x08,0xDA,0x21,0x48,0x01,0x23,0x03,0x70, +0x20,0x48,0x03,0x70,0x20,0x48,0x03,0x70,0x20,0x48,0x03,0x70,0x53,0x78,0x00,0x2B, +0x04,0xD0,0x1F,0x4B,0x5B,0x5D,0x59,0x43,0x89,0x11,0x03,0x91,0x1D,0x4B,0x6A,0x00, +0xD0,0x5A,0x1D,0x4B,0x03,0x99,0xD4,0x5E,0xC0,0x08,0x14,0x4A,0x89,0xB2,0x04,0x1B, +0x64,0x1A,0x56,0x7C,0x24,0xB2,0x19,0x4B,0xB4,0x42,0x02,0xDC,0x76,0x42,0xB4,0x42, +0x02,0xDA,0x00,0x24,0x5C,0x55,0x05,0xE0,0x5C,0x5D,0x96,0x7C,0xA6,0x42,0x01,0xD0, +0x01,0x34,0x5C,0x55,0x43,0x1A,0x9B,0xB2,0x92,0x7E,0x19,0xB2,0x91,0x42,0x02,0xDB, +0x09,0x4A,0x01,0x21,0x11,0x70,0x0C,0x4A,0x6D,0x00,0xAB,0x52,0x7F,0xBD,0xC0,0x46, +0xEB,0x01,0x00,0x20,0x8B,0x59,0x00,0x00,0xE4,0x01,0x00,0x20,0x48,0x0D,0x00,0x20, +0x48,0x11,0x00,0x20,0x14,0x09,0x00,0x20,0x30,0x11,0x00,0x20,0xC4,0x01,0x00,0x20, +0x92,0x7B,0x00,0x00,0x14,0x02,0x00,0x20,0x3C,0x0D,0x00,0x20,0xA4,0x0A,0x00,0x20, +0xF0,0xB5,0x48,0x4B,0x89,0xB0,0x1B,0x78,0x00,0x2B,0x03,0xD0,0x00,0x20,0x46,0x49, +0xFF,0xF7,0xF4,0xFC,0x45,0x4A,0x00,0x23,0x13,0x70,0x45,0x4A,0x0C,0x20,0x01,0x38, +0xC0,0xB2,0x81,0x00,0x8B,0x50,0x00,0x28,0xF9,0xD1,0x42,0x4B,0x42,0x4A,0x18,0x70, +0x01,0x23,0x13,0x70,0x41,0x4A,0x13,0x70,0x41,0x4B,0x19,0x7E,0x04,0x91,0xDA,0x7D, +0x05,0x92,0x1B,0x7D,0x06,0x93,0x0B,0x1C,0x2D,0xE0,0x01,0x3B,0xDB,0xB2,0x5D,0x1C, +0x3C,0x4C,0xEA,0x01,0x12,0x19,0x16,0x88,0x3B,0x49,0x5A,0x00,0x5C,0x01,0x56,0x52, +0xAD,0x01,0x05,0x9A,0x07,0x94,0x9C,0x46,0x1A,0xE0,0x01,0x3A,0xD2,0xB2,0x93,0x1C, +0xEB,0x18,0x36,0x4C,0x5B,0x00,0x19,0x5B,0x06,0x9B,0x00,0x2B,0x05,0xD0,0xD3,0x1C, +0xEB,0x18,0x5B,0x00,0x1B,0x5B,0xC9,0x18,0x49,0x10,0x07,0x9C,0xA7,0x18,0x7B,0x00, +0x1C,0x1C,0x2F,0x4B,0xE1,0x52,0x2F,0x4C,0x01,0x23,0x89,0x1B,0x3B,0x55,0x40,0x18, +0x00,0x2A,0xE2,0xD1,0x63,0x46,0x00,0x2B,0xCF,0xD1,0x25,0x4B,0x04,0x9C,0xD9,0x7D, +0x61,0x43,0x01,0xF0,0xD5,0xF8,0x28,0x4B,0x05,0x1C,0x58,0x8C,0x27,0x4C,0x00,0x28, +0x02,0xD1,0x40,0x23,0x23,0x60,0x07,0xE0,0x80,0x01,0x29,0x1C,0x01,0xF0,0xC8,0xF8, +0x6E,0x28,0x00,0xDD,0x6E,0x20,0x20,0x60,0x12,0x4C,0x23,0x78,0x00,0x2B,0x03,0xD0, +0x00,0x20,0x1F,0x49,0xFF,0xF7,0x8A,0xFC,0x1B,0x4B,0x1E,0x4A,0x5B,0x8C,0x55,0x80, +0x13,0x80,0x23,0x78,0x00,0x2B,0x06,0xD0,0x01,0x23,0x02,0x21,0x00,0x93,0x00,0x20, +0x0B,0x1C,0xFF,0xF7,0x23,0xFC,0x18,0x4B,0x18,0x48,0x1B,0x78,0x00,0x22,0x18,0x49, +0x04,0xE0,0x01,0x3B,0xDB,0xB2,0x5C,0x00,0xC2,0x54,0x62,0x52,0x00,0x2B,0xF8,0xD1, +0x09,0xB0,0xF0,0xBD,0xEB,0x01,0x00,0x20,0x91,0x59,0x00,0x00,0x1C,0x03,0x00,0x20, +0xBC,0x11,0x00,0x20,0xF4,0x10,0x00,0x20,0x20,0x09,0x00,0x20,0x3C,0x11,0x00,0x20, +0xAE,0x09,0x00,0x20,0x02,0x40,0x00,0x40,0x94,0x11,0x00,0x20,0x00,0x40,0x00,0x40, +0xF8,0x03,0x00,0x20,0xB3,0x0A,0x00,0x20,0x48,0x0D,0x00,0x20,0x78,0x09,0x00,0x20, +0x9A,0x59,0x00,0x00,0x54,0x11,0x00,0x20,0x7C,0x09,0x00,0x20,0xA4,0x0A,0x00,0x20, +0x14,0x02,0x00,0x20,0xF0,0xB5,0xA0,0x4A,0x00,0x23,0x13,0x70,0x9F,0x4A,0x85,0xB0, +0x13,0x70,0x9F,0x4A,0x13,0x70,0x9F,0x4A,0x13,0x70,0x9F,0x4B,0x1B,0x78,0x00,0x2B, +0x03,0xD0,0x01,0x20,0x9D,0x49,0xFF,0xF7,0x31,0xFC,0x00,0x24,0x9C,0x4D,0x9A,0x4E, +0x11,0xE0,0x33,0x78,0x00,0x2B,0x0C,0xD0,0xEB,0x7D,0x29,0x7D,0x99,0x48,0xC9,0x18, +0xE2,0x01,0x00,0x23,0x12,0x18,0x00,0x93,0xC9,0xB2,0x01,0x20,0x02,0x23,0xFF,0xF7, +0xC5,0xFB,0x01,0x34,0xE4,0xB2,0x29,0x7E,0x8C,0x42,0xEA,0xD3,0x92,0x4B,0x1B,0x78, +0x00,0x2B,0x00,0xD1,0x0D,0xE1,0x91,0x4B,0x1A,0x78,0x00,0x2A,0x1F,0xD1,0x90,0x4B, +0x1B,0x78,0x00,0x2B,0x1B,0xD0,0xEB,0x7D,0x8E,0x4C,0x07,0xE0,0x01,0x3B,0xDB,0xB2, +0x5D,0x01,0x2D,0x18,0x2A,0x55,0x00,0x2B,0xF8,0xD1,0x03,0x1C,0x58,0x1E,0xC0,0xB2, +0x00,0x2B,0x01,0xD0,0x0B,0x1C,0xF6,0xE7,0x87,0x4A,0x86,0x48,0x12,0x78,0x49,0x01, +0x03,0xE0,0x01,0x3A,0xD2,0xB2,0x8C,0x18,0x23,0x54,0x00,0x2A,0xF9,0xD1,0x80,0x4B, +0x7E,0x4A,0x19,0x78,0x1B,0x78,0x11,0x70,0x00,0x2B,0x70,0xD0,0x78,0x4B,0x1A,0x7E, +0xD9,0x7D,0x02,0x92,0x1B,0x7D,0x03,0x93,0x22,0xE0,0x01,0x3B,0xDB,0xB2,0x59,0x1C, +0x89,0x01,0xC8,0x19,0x79,0x4C,0x03,0x9D,0x40,0x00,0x00,0x5B,0x00,0x2D,0x04,0xD0, +0x89,0x19,0x49,0x00,0x09,0x5B,0x40,0x18,0x40,0x10,0x59,0x01,0x89,0x18,0x74,0x4D, +0x4C,0x00,0x65,0x5B,0x6F,0x4C,0xED,0x08,0x0C,0x5D,0x28,0x1A,0x84,0x42,0x04,0xDA, +0xFF,0x28,0x00,0xDD,0xFF,0x20,0x6B,0x4D,0x68,0x54,0x00,0x2B,0xDD,0xD1,0x11,0x1C, +0x4A,0x1E,0xD2,0xB2,0x00,0x29,0x03,0xD0,0x02,0x9B,0x97,0x1C,0xD6,0x1C,0xF4,0xE7, +0x5F,0x4A,0x65,0x4B,0x17,0x7E,0x1B,0x78,0x62,0x49,0x7F,0x01,0x10,0xE0,0x01,0x3B, +0xDB,0xB2,0x64,0x4E,0x5A,0x00,0x94,0x5B,0xF8,0x18,0x45,0x56,0x26,0xB2,0x2A,0x1C, +0xB5,0x42,0x00,0xDA,0x22,0x1C,0x12,0xB2,0xFF,0x2A,0x00,0xDD,0xFF,0x22,0x42,0x54, +0x00,0x2B,0xEC,0xD1,0x50,0x4B,0x1B,0x78,0x00,0x2B,0x03,0xD0,0x03,0x20,0x5A,0x49, +0xFF,0xF7,0x94,0xFB,0x00,0x24,0x4E,0x4D,0x4B,0x4E,0x0E,0xE0,0x33,0x78,0x00,0x2B, +0x09,0xD0,0x50,0x4B,0x62,0x01,0xD2,0x18,0x00,0x23,0xE9,0x7D,0x03,0x20,0x00,0x93, +0x01,0x23,0xFF,0xF7,0x2B,0xFB,0x01,0x34,0xE4,0xB2,0x2B,0x7E,0xA3,0x42,0xED,0xD8, +0x40,0x4A,0x01,0x23,0x13,0x70,0x3D,0x4A,0x13,0x70,0x3B,0x4A,0x13,0x70,0x3E,0x4B, +0x1B,0x78,0x00,0x2B,0x6D,0xD0,0x49,0x4B,0x1B,0x68,0x58,0x02,0x69,0xD5,0x3C,0x4A, +0x80,0x24,0x16,0x7D,0x13,0x7E,0xD2,0x7D,0x45,0x4D,0xB6,0x18,0xF6,0xB2,0x24,0x06, +0xB4,0x46,0x18,0xE0,0x01,0x3B,0xDB,0xB2,0x42,0x49,0x5A,0x00,0x5F,0x1C,0x56,0x5A, +0xBF,0x01,0x62,0x46,0x0D,0xE0,0x01,0x3A,0xD2,0xB2,0x91,0x1C,0x79,0x18,0x37,0x48, +0x49,0x00,0x09,0x5A,0x89,0x1B,0x8C,0x42,0x00,0xDA,0x0C,0x1C,0x8D,0x42,0x00,0xDD, +0x0D,0x1C,0x00,0x2A,0xEF,0xD1,0x00,0x2B,0xE4,0xD1,0x16,0x20,0x36,0x49,0xFF,0xF7, +0x45,0xFB,0x25,0x4B,0x35,0x4A,0x1B,0x78,0x14,0x80,0x55,0x80,0x00,0x2B,0x06,0xD0, +0x01,0x23,0x02,0x21,0x00,0x93,0x16,0x20,0x0B,0x1C,0xFF,0xF7,0xDF,0xFA,0x26,0x4B, +0x80,0x20,0x1B,0x78,0x2A,0x49,0x00,0x06,0x2D,0x4E,0x2E,0x4D,0x19,0xE0,0x01,0x3B, +0xDB,0xB2,0xF7,0x5C,0x7A,0x1C,0x94,0x46,0x64,0x46,0xEA,0x5C,0xA4,0x01,0xA4,0x46, +0x02,0x32,0x62,0x44,0x1D,0x4C,0x52,0x00,0x12,0x5B,0x22,0x4C,0x7F,0x00,0x94,0x46, +0x3A,0x5B,0x64,0x46,0xA2,0x1A,0x90,0x42,0x00,0xDA,0x10,0x1C,0x91,0x42,0x00,0xDD, +0x11,0x1C,0x00,0x2B,0xE3,0xD1,0x0C,0x4B,0x1C,0x4A,0x1B,0x78,0x10,0x80,0x51,0x80, +0x00,0x2B,0x06,0xD0,0x01,0x23,0x02,0x21,0x00,0x93,0x16,0x20,0x0B,0x1C,0xFF,0xF7, +0xAD,0xFA,0x05,0xB0,0xF0,0xBD,0xC0,0x46,0xAC,0x09,0x00,0x20,0x14,0x09,0x00,0x20, +0x30,0x11,0x00,0x20,0x48,0x11,0x00,0x20,0xEB,0x01,0x00,0x20,0xAB,0x59,0x00,0x00, +0xAE,0x09,0x00,0x20,0x84,0x40,0x00,0x40,0x1C,0x03,0x00,0x20,0xE1,0x01,0x00,0x20, +0xE3,0x01,0x00,0x20,0x64,0x0E,0x00,0x20,0x7C,0x09,0x00,0x20,0x00,0x40,0x00,0x40, +0xF8,0x03,0x00,0x20,0x3C,0x0D,0x00,0x20,0xAF,0x59,0x00,0x00,0x58,0x00,0x00,0x20, +0xFF,0xFF,0xFF,0x7F,0x94,0x11,0x00,0x20,0xB5,0x59,0x00,0x00,0x54,0x11,0x00,0x20, +0x30,0x75,0x00,0x00,0x2A,0x75,0x00,0x00,0xF0,0xB5,0xB3,0x4B,0xA5,0xB0,0x1B,0x78, +0x00,0x2B,0x00,0xD0,0x01,0xE2,0xB1,0x4A,0xB1,0x4C,0x12,0x78,0xB1,0x4D,0xB2,0x4E, +0x64,0x7C,0x52,0xB2,0x6B,0x60,0x2B,0x60,0x6B,0x82,0x6B,0x81,0x2B,0x82,0x2B,0x81, +0x33,0x60,0xB3,0x60,0x1B,0x92,0xAD,0x4F,0xFF,0x22,0xAD,0x4B,0x72,0x60,0xF2,0x60, +0x11,0x94,0x3F,0x7E,0x1B,0x78,0xA9,0x4C,0x09,0x97,0x0B,0x93,0xE4,0x7D,0xA4,0x4D, +0x08,0x94,0x46,0x23,0xED,0x5E,0xA2,0x4F,0x0E,0x95,0x48,0x23,0xFF,0x5E,0xA3,0x4C, +0x0F,0x97,0x24,0x7D,0x2D,0x23,0x0C,0x94,0x9D,0x4D,0xA2,0x4E,0x11,0x9F,0x6D,0x78, +0x36,0x68,0x7F,0x42,0x9A,0x4C,0x0D,0x95,0x12,0x96,0x1D,0x97,0xA4,0x7C,0x98,0x4D, +0x22,0x94,0xEB,0x5C,0x1B,0x9E,0x13,0x93,0x10,0x23,0x9B,0x1B,0x1E,0x93,0x18,0x27, +0xEF,0x57,0x1C,0x20,0x14,0x97,0x28,0x56,0x19,0x21,0x18,0x90,0x69,0x56,0x00,0x23, +0x00,0x22,0x00,0x24,0x23,0x91,0x05,0x93,0x00,0x25,0x00,0x26,0x00,0x27,0xFF,0x20, +0x00,0x21,0xFF,0x23,0x06,0x92,0x17,0x94,0x10,0x95,0x1A,0x96,0x15,0x97,0x19,0x90, +0x21,0x91,0x1F,0x92,0x16,0x93,0x1C,0x94,0x09,0x9C,0x00,0x2C,0x00,0xD1,0x27,0xE1, +0x09,0x9B,0x89,0x4D,0x01,0x3B,0xDB,0xB2,0x09,0x93,0x5B,0x00,0x5B,0x5B,0x08,0x9E, +0x0A,0x93,0x00,0x2E,0xF0,0xD0,0x09,0x9F,0x84,0x48,0x01,0x37,0xFB,0x01,0x1B,0x18, +0x1B,0x88,0x0A,0x99,0x0E,0x9C,0x5A,0x1A,0x94,0x42,0x00,0xDA,0x92,0xE1,0x0F,0x9D, +0x95,0x42,0x00,0xDD,0x8B,0xE1,0x09,0x9E,0xBF,0x01,0x01,0x21,0x02,0x25,0x00,0x22, +0x70,0x01,0x03,0x97,0x2C,0xE0,0x7A,0x4D,0x84,0x18,0x64,0x00,0x6E,0x46,0x18,0x27, +0x2C,0x5B,0xBD,0x5F,0xE4,0x1A,0xAC,0x42,0x01,0xDD,0xA7,0xB2,0x06,0x97,0x6E,0x46, +0x14,0x27,0xBD,0x5F,0xAC,0x42,0x01,0xDA,0xA4,0xB2,0x05,0x94,0x82,0x18,0x70,0x4F, +0x52,0x00,0xBB,0x52,0x08,0x9A,0xCB,0xB2,0x9A,0x42,0xBD,0xD9,0x03,0x9A,0x8D,0x1C, +0x53,0x19,0x6C,0x4C,0x5B,0x00,0x1B,0x5B,0x0A,0x9E,0x0E,0x9F,0x0A,0x1C,0x9C,0x1B, +0xBC,0x42,0x00,0xDD,0x38,0xE1,0x0F,0x9E,0x01,0x31,0xB4,0x42,0x00,0xDA,0xD1,0xE0, +0x0C,0x9F,0x00,0x2F,0x07,0xD0,0x03,0x9E,0xD4,0x1C,0x34,0x19,0x61,0x4F,0x64,0x00, +0xE4,0x5B,0xE3,0x18,0x5B,0x10,0x0D,0x9C,0x00,0x2C,0x06,0xD0,0x5E,0x4E,0x84,0x18, +0xA4,0x5D,0x12,0x9F,0x63,0x43,0x7B,0x43,0x1B,0x13,0x0B,0x9C,0x00,0x2C,0xBA,0xD0, +0x86,0x18,0x57,0x4F,0x74,0x00,0x3F,0x5B,0xBC,0x46,0x58,0x4F,0xBC,0x57,0x66,0x46, +0xF6,0x08,0x34,0x1B,0x07,0x94,0x6F,0x46,0x18,0x24,0x04,0x96,0xE7,0x5F,0x07,0x9E, +0xF4,0x1A,0xBC,0x42,0x01,0xDD,0xA7,0xB2,0x06,0x97,0x6E,0x46,0x14,0x27,0xBE,0x5F, +0xB4,0x42,0x01,0xDA,0xA6,0xB2,0x05,0x96,0x11,0x9F,0xBC,0x42,0x5D,0xDD,0x84,0x18, +0xA4,0x46,0x4B,0x4C,0x00,0x27,0x66,0x46,0x37,0x55,0x04,0x9F,0x13,0x9E,0xFC,0x1A, +0x00,0x2E,0x08,0xD0,0x1B,0x9F,0x07,0x9C,0x1E,0x9E,0x7B,0x43,0x74,0x43,0x04,0x9F, +0x1C,0x19,0x24,0x11,0x3C,0x1B,0x23,0x1C,0x7F,0x33,0x17,0xDA,0x3F,0x4E,0x82,0x18, +0x80,0x23,0xB3,0x54,0x23,0x9A,0x21,0x9E,0xA3,0x1A,0xF6,0x18,0x21,0x96,0x1F,0xAF, +0x00,0x23,0xFB,0x5E,0x9C,0x42,0x01,0xDC,0xA4,0xB2,0x1F,0x94,0x03,0x9A,0x35,0x4C, +0x55,0x19,0x6D,0x00,0x00,0x27,0x2B,0x5B,0x2F,0x53,0x83,0xE7,0x83,0x18,0x7E,0x2C, +0x36,0xDD,0x32,0x4E,0x7F,0x27,0xF7,0x54,0x14,0x9F,0xBC,0x42,0x03,0xDB,0x17,0x9E, +0xE3,0x1B,0xF6,0x18,0x17,0x96,0x10,0xAF,0x00,0x23,0xFB,0x5E,0x9C,0x42,0x24,0xDC, +0xA3,0xB2,0x18,0x9E,0xB4,0x42,0x11,0xDB,0x1A,0x9F,0x09,0x9C,0xA7,0x42,0x00,0xDA, +0x1A,0x94,0x16,0x9E,0x09,0x9C,0xA6,0x42,0x00,0xDD,0x16,0x94,0x15,0x9E,0x96,0x42, +0x00,0xDA,0x15,0x92,0x19,0x9F,0xBA,0x42,0x00,0xDA,0x19,0x92,0x03,0x9A,0x1D,0x4C, +0x55,0x19,0x6D,0x00,0x2A,0x5B,0x2B,0x53,0x54,0xE7,0x1D,0x9E,0x87,0x18,0xB4,0x42, +0x0E,0xDA,0x1B,0x4C,0x00,0x26,0x3E,0x55,0x9F,0xE7,0xA3,0xB2,0x10,0x93,0xD8,0xE7, +0x16,0x4E,0xF4,0x54,0x00,0x2C,0xC7,0xDA,0x23,0x9F,0xBC,0x42,0xAF,0xDC,0xA9,0xE7, +0x13,0x4E,0x20,0x97,0xBC,0x5D,0x22,0x9E,0x67,0xB2,0xB7,0x42,0x8D,0xD0,0x20,0x9F, +0x0F,0x4E,0x01,0x34,0xBC,0x55,0x88,0xE7,0xAC,0x09,0x00,0x20,0x4C,0x00,0x00,0x20, +0x48,0x0D,0x00,0x20,0x70,0x01,0x00,0x20,0xE4,0x10,0x00,0x20,0xAE,0x09,0x00,0x20, +0x1C,0x03,0x00,0x20,0x78,0x09,0x00,0x20,0x94,0x11,0x00,0x20,0x04,0x40,0x00,0x40, +0xF8,0x03,0x00,0x20,0x00,0x40,0x00,0x40,0x12,0x79,0x00,0x00,0x64,0x0E,0x00,0x20, +0xB3,0x0A,0x00,0x20,0x09,0x9C,0x01,0x27,0x1C,0x97,0x00,0x2C,0x00,0xD0,0xD7,0xE6, +0x6D,0x46,0x6F,0x46,0x18,0x26,0x14,0x20,0x76,0x5B,0xC0,0x5B,0x41,0x4D,0x17,0x99, +0x10,0xAC,0x2F,0x1C,0x2E,0x82,0x68,0x82,0x29,0x60,0x25,0x88,0x21,0x9B,0x3C,0x1C, +0x3D,0x81,0x1A,0x9E,0x3C,0x4F,0x63,0x60,0x1F,0xAC,0x25,0x88,0xBE,0x60,0x16,0x98, +0x15,0x99,0x19,0x9A,0x37,0x4C,0x0B,0x9E,0xF8,0x60,0x39,0x60,0x7A,0x60,0x65,0x81, +0x00,0x2E,0x24,0xD0,0x35,0x4B,0x1B,0x78,0x00,0x2B,0x03,0xD0,0x34,0x4B,0x1B,0x68, +0x00,0x2B,0x1C,0xDD,0x33,0x4C,0x23,0x78,0x00,0x2B,0x56,0xD1,0x32,0x4F,0x3B,0x7E, +0x00,0x2B,0x14,0xD0,0x31,0x4D,0x09,0x9F,0x01,0x26,0x23,0x78,0x00,0x2B,0x08,0xD0, +0x2D,0x48,0x7A,0x01,0xC1,0x7D,0x52,0x19,0x03,0x20,0x01,0x23,0x00,0x96,0xFF,0xF7, +0xAD,0xF8,0x29,0x49,0x01,0x37,0x0B,0x7E,0xFF,0xB2,0xBB,0x42,0xED,0xD8,0x26,0x4C, +0x23,0x7D,0x00,0x2B,0x13,0xD0,0x22,0x7E,0xE4,0x7D,0x01,0x3A,0x24,0x49,0xD2,0xB2, +0x02,0x34,0x00,0x20,0x53,0x1C,0x9B,0x01,0x1B,0x19,0x5B,0x00,0x01,0x3A,0x5D,0x5A, +0xD2,0xB2,0x5D,0x5A,0x58,0x52,0xF5,0xE7,0x01,0x26,0x1C,0x96,0x74,0xE6,0x1D,0x4D, +0x1D,0x4E,0xAB,0x7E,0x32,0x68,0x13,0x4F,0x53,0x43,0x08,0x21,0x79,0x5E,0x1B,0x48, +0x9B,0x11,0x1B,0x4A,0xCD,0x17,0xDC,0x0F,0x00,0x78,0x99,0x42,0x65,0x41,0x15,0x70, +0x00,0x28,0x0A,0xD1,0x1C,0x9C,0x00,0x2C,0x07,0xD0,0x01,0x23,0x13,0x70,0x15,0x4A, +0x15,0x49,0x13,0x70,0x15,0x4A,0x0B,0x70,0x13,0x70,0x25,0xB0,0xF0,0xBD,0x01,0x25, +0x1C,0x95,0x51,0xE6,0x01,0x24,0x1C,0x94,0x4E,0xE6,0x03,0x20,0x10,0x49,0xFF,0xF7, +0xBD,0xF8,0xA3,0xE7,0x70,0x01,0x00,0x20,0xE4,0x10,0x00,0x20,0xDE,0x01,0x00,0x20, +0x20,0x01,0x00,0x20,0xEB,0x01,0x00,0x20,0xAE,0x09,0x00,0x20,0x64,0x0E,0x00,0x20, +0x00,0x40,0x00,0x40,0x48,0x0D,0x00,0x20,0x78,0x09,0x00,0x20,0xE4,0x01,0x00,0x20, +0x14,0x09,0x00,0x20,0x30,0x11,0x00,0x20,0x48,0x11,0x00,0x20,0xC4,0x01,0x00,0x20, +0xF0,0x59,0x00,0x00,0xF0,0xB5,0x2F,0x4B,0x85,0xB0,0x1C,0x78,0x2E,0x4D,0x2F,0x4E, +0x10,0xE0,0x01,0x3C,0xE4,0xB2,0x2B,0x57,0x32,0x57,0x59,0x1C,0x02,0x32,0x89,0x01, +0x89,0x18,0x2B,0x4A,0x49,0x00,0x88,0x5A,0x2A,0x4A,0x5B,0x00,0x9A,0x5A,0x21,0x1C, +0xFF,0xF7,0x0A,0xFB,0x00,0x2C,0xEC,0xD1,0x27,0x4B,0x1B,0x78,0x00,0x2B,0x08,0xD0, +0x20,0x4B,0x03,0x20,0x19,0x78,0x01,0x23,0x00,0x93,0x24,0x4A,0x02,0x23,0xFF,0xF7, +0x1D,0xF8,0x23,0x4B,0x1E,0x49,0x18,0x78,0x9A,0x78,0x84,0x1C,0x03,0x92,0xDE,0x78, +0x00,0x23,0x02,0x94,0x0D,0xE0,0xA4,0x01,0xE4,0x19,0x64,0x00,0x65,0x5A,0x00,0x25, +0x65,0x52,0x01,0x32,0x02,0xE0,0x02,0x9C,0x00,0x22,0xE7,0x18,0xB4,0x1A,0xF2,0xD1, +0x01,0x33,0x03,0x9D,0x1A,0x18,0xAA,0x42,0xF5,0xDB,0x15,0x4B,0x10,0x49,0x58,0x78, +0xDE,0x78,0x42,0x1C,0x01,0x23,0x5B,0x42,0x02,0x92,0x00,0x22,0x9F,0x1C,0x08,0xE0, +0x02,0x9D,0xAC,0x18,0xA4,0x01,0xE4,0x19,0x64,0x00,0x65,0x5A,0x00,0x25,0x65,0x52, +0x01,0x32,0x14,0x18,0xB4,0x42,0xF3,0xDB,0x03,0x9A,0x01,0x33,0x93,0x42,0xEC,0xDB, +0x05,0xB0,0xF0,0xBD,0x7C,0x09,0x00,0x20,0x30,0x75,0x00,0x00,0x2A,0x75,0x00,0x00, +0x00,0x40,0x00,0x40,0x94,0x11,0x00,0x20,0xEB,0x01,0x00,0x20,0x3C,0x0D,0x00,0x20, +0x0A,0x03,0x00,0x20,0x30,0xB5,0x0C,0x4B,0x0C,0x4C,0xDB,0x78,0x0C,0x49,0x10,0xE0, +0x01,0x3B,0xDB,0xB2,0x5A,0x1C,0x0B,0x4D,0xD2,0x01,0x52,0x19,0x45,0x1C,0x03,0xD1, +0x15,0x88,0x5A,0x00,0x55,0x52,0x04,0xE0,0x15,0x88,0x5A,0x01,0x12,0x18,0x52,0x00, +0x15,0x53,0x00,0x2B,0xEC,0xD1,0x30,0xBD,0x0A,0x03,0x00,0x20,0xF8,0x03,0x00,0x20, +0x94,0x11,0x00,0x20,0x02,0x40,0x00,0x40,0xF0,0xB5,0x8D,0xB0,0x0A,0x91,0x0B,0x92, +0x63,0x4B,0x41,0x1C,0x0C,0xD1,0x63,0x4A,0x63,0x49,0x12,0x7E,0x01,0x3A,0x03,0x92, +0xDA,0x78,0x5E,0x78,0x54,0x00,0x00,0x23,0x55,0x1C,0x64,0x18,0x94,0x46,0x0E,0xE0, +0xDC,0x7B,0x5A,0x79,0xA2,0x18,0x01,0x3A,0x10,0xE0,0x5C,0x4A,0xE9,0x18,0xC9,0x01, +0x89,0x18,0x0A,0x88,0x5F,0x00,0xE2,0x53,0x0A,0x88,0x00,0x22,0x0A,0x80,0x01,0x3B, +0x67,0x46,0xDA,0x19,0xB2,0x42,0xF0,0xDA,0x03,0x9A,0x00,0x24,0x56,0x01,0x54,0x4D, +0x36,0x18,0x00,0x23,0x76,0x00,0x11,0x1C,0x08,0x93,0x07,0x93,0x06,0x93,0x05,0x93, +0x03,0x95,0x09,0x96,0xA4,0x46,0x55,0xE0,0x44,0x1C,0x04,0xD1,0x4A,0x4C,0x56,0x00, +0x34,0x19,0xE4,0x5A,0x04,0xE0,0x4B,0x4C,0x09,0x9F,0x3E,0x19,0x5C,0x01,0x34,0x5B, +0x4E,0x1C,0x46,0x4F,0x04,0x96,0xF6,0x01,0xF6,0x19,0x37,0x88,0x24,0xB2,0x3E,0xB2, +0x45,0x4F,0xA6,0x1B,0x54,0x00,0xE7,0x19,0xF4,0x17,0xFE,0x52,0x36,0x19,0x66,0x40, +0x0F,0x1C,0x01,0x24,0xA7,0x43,0xB9,0x42,0x09,0xD1,0x07,0x9C,0xA4,0x19,0x07,0x94, +0xB5,0x42,0x00,0xDD,0x35,0x1C,0x06,0x9F,0xB7,0x42,0x0B,0xDB,0x0D,0xE0,0x08,0x9C, +0x03,0x9F,0xA4,0x19,0x08,0x94,0xB7,0x42,0x00,0xDD,0x03,0x96,0x05,0x9C,0xB4,0x42, +0x02,0xDB,0x02,0xE0,0x06,0x96,0x00,0xE0,0x05,0x96,0x04,0x9E,0xF4,0x01,0x2F,0x4E, +0xA4,0x19,0x47,0x1C,0x0E,0xD1,0x27,0x88,0x2B,0x4E,0x04,0x97,0x57,0x00,0xBE,0x19, +0x02,0x96,0x10,0x27,0x6E,0x46,0xBF,0x5B,0x02,0x9E,0xF7,0x52,0x26,0x88,0x00,0x26, +0x26,0x80,0x05,0xE0,0x27,0x88,0x27,0x4E,0x09,0x9C,0xA6,0x19,0x5C,0x01,0x37,0x53, +0x01,0x39,0x02,0x3B,0x61,0x45,0xA7,0xDA,0x01,0x30,0x13,0xD1,0x23,0x4C,0x23,0x78, +0x00,0x2B,0x03,0xD0,0x01,0x20,0x22,0x49,0xFE,0xF7,0x70,0xFF,0x23,0x78,0x00,0x2B, +0x08,0xD0,0x17,0x4B,0x01,0x20,0xD9,0x78,0x00,0x23,0x00,0x93,0x16,0x4A,0x02,0x23, +0xFE,0xF7,0x0C,0xFF,0x07,0x9E,0x08,0x9F,0x0A,0x9C,0xF3,0x19,0x23,0x60,0x05,0x9E, +0x03,0x9F,0x06,0x9C,0xF3,0x1B,0x65,0x1B,0x9D,0x42,0x00,0xDA,0x1D,0x1C,0x0B,0x9E, +0x12,0x4C,0x35,0x60,0x23,0x78,0x00,0x2B,0x03,0xD0,0x0B,0x20,0x11,0x49,0xFE,0xF7, +0x4D,0xFF,0x23,0x78,0x00,0x2B,0x08,0xD0,0x06,0x4B,0x0B,0x20,0x19,0x7E,0x01,0x23, +0x00,0x93,0x09,0x4A,0x02,0x23,0xFE,0xF7,0xE9,0xFE,0x0D,0xB0,0xF0,0xBD,0xC0,0x46, +0x0A,0x03,0x00,0x20,0xAE,0x09,0x00,0x20,0x94,0x11,0x00,0x20,0x02,0x40,0x00,0x40, +0xFF,0xFF,0x00,0x00,0xF8,0x03,0x00,0x20,0x54,0x11,0x00,0x20,0xEB,0x01,0x00,0x20, +0xC6,0x59,0x00,0x00,0xCD,0x59,0x00,0x00,0xF0,0xB5,0xA6,0x4B,0x85,0xB0,0x1D,0x78, +0x00,0x2D,0x29,0xD0,0xA4,0x4B,0xA5,0x4C,0x18,0x78,0xA5,0x4B,0x46,0xB2,0x19,0x68, +0x5B,0x68,0xB2,0x00,0xCB,0x18,0x13,0x51,0x82,0x1D,0xD2,0xB2,0x00,0x25,0x06,0x23, +0x01,0x3B,0xDB,0xB2,0xF1,0x1A,0x00,0xD5,0x0C,0x31,0x89,0x00,0x09,0x59,0x6D,0x18, +0x11,0x1C,0x0B,0x2A,0x01,0xD9,0x0C,0x39,0xC9,0xB2,0x89,0x00,0x61,0x58,0x01,0x3A, +0x6D,0x1A,0xD2,0xB2,0x00,0x2B,0xEB,0xD1,0x01,0x30,0x93,0x4A,0xC0,0xB2,0x10,0x70, +0x40,0xB2,0x0B,0x28,0x00,0xDD,0x13,0x70,0x92,0x4B,0x1B,0x78,0x00,0x2B,0x00,0xD0, +0x15,0xE1,0x91,0x4B,0x14,0x21,0x5B,0x5E,0x9D,0x42,0x02,0xDA,0x8F,0x4B,0x01,0x22, +0x1A,0x70,0x8B,0x4B,0x10,0x22,0x9E,0x5E,0x12,0x24,0x1B,0x5F,0xF6,0x1A,0x85,0x4B, +0x18,0x78,0x00,0x28,0x16,0xD1,0x8A,0x4B,0x8A,0x4F,0x1B,0x68,0x8A,0x4C,0xBB,0x80, +0x23,0x78,0x3E,0x80,0x00,0x2B,0x02,0xD0,0x88,0x49,0xFE,0xF7,0xD7,0xFE,0x23,0x78, +0x00,0x2B,0x07,0xD0,0x01,0x23,0x02,0x21,0x00,0x93,0x00,0x20,0x3A,0x1C,0x0B,0x1C, +0xFE,0xF7,0x74,0xFE,0x7C,0x4B,0x9A,0x7D,0x96,0x42,0x07,0xDC,0x80,0x4B,0x1A,0x78, +0x51,0xB2,0x02,0x29,0x08,0xDC,0x01,0x32,0x1A,0x70,0x05,0xE0,0xDB,0x7D,0x9E,0x42, +0x02,0xDB,0x7B,0x4B,0x00,0x22,0x1A,0x70,0x71,0x4B,0x76,0x4A,0x59,0x68,0x1B,0x68, +0x15,0x80,0xCB,0x18,0x53,0x80,0x74,0x4B,0x96,0x80,0x1B,0x78,0x00,0x2B,0x06,0xD0, +0x01,0x23,0x00,0x93,0x19,0x20,0x03,0x21,0x02,0x23,0xFE,0xF7,0x4F,0xFE,0x6B,0x4B, +0x64,0x4C,0x1B,0x78,0x00,0x2B,0x61,0xD0,0x6B,0x4D,0x2B,0x78,0x00,0x2B,0x03,0xD0, +0x19,0x20,0x6C,0x49,0xFE,0xF7,0x9A,0xFE,0x69,0x4B,0x1B,0x78,0x00,0x2B,0x05,0xD1, +0x22,0x78,0x00,0x2A,0x52,0xD0,0x61,0x4A,0x13,0x70,0x4F,0xE0,0x03,0x2B,0x4D,0xD1, +0x2B,0x78,0x00,0x2B,0x03,0xD0,0x00,0x20,0x63,0x49,0xFE,0xF7,0x87,0xFE,0x55,0x4B, +0x62,0x4A,0x19,0x78,0x00,0x29,0x1A,0xD1,0x01,0x20,0x18,0x70,0x13,0x7E,0xD6,0x7D, +0x5F,0x4D,0x60,0x4A,0x0B,0xE0,0x01,0x3B,0xDB,0xB2,0xF8,0x18,0x44,0x00,0xA1,0x5A, +0xC9,0x00,0xA1,0x52,0x00,0x21,0x41,0x55,0x00,0x2B,0xF4,0xD1,0x63,0x46,0x59,0x1E, +0xC9,0xB2,0x00,0x2B,0x23,0xD0,0x33,0x1C,0x4F,0x01,0x8C,0x46,0xF4,0xE7,0x13,0x7E, +0xD6,0x7D,0x54,0x4A,0x0E,0xE0,0x01,0x3B,0x51,0x4D,0xDB,0xB2,0xFC,0x18,0x60,0x00, +0x64,0x57,0xE4,0x00,0x02,0x94,0x84,0x5A,0x02,0x9D,0x64,0x1B,0x84,0x52,0x00,0x2B, +0xF1,0xD1,0x0B,0x1C,0x59,0x1E,0xC9,0xB2,0x00,0x2B,0x02,0xD0,0x33,0x1C,0x4F,0x01, +0xF5,0xE7,0x3A,0x4A,0x11,0x1C,0x30,0x31,0x08,0xC2,0x8A,0x42,0xFC,0xD1,0x3B,0x4B, +0x00,0x22,0x1A,0x70,0x44,0x4B,0x01,0x22,0x1A,0x70,0x60,0xE0,0x22,0x78,0x43,0x4B, +0x00,0x2A,0x06,0xD1,0x40,0x4A,0x01,0x21,0x11,0x70,0x1A,0x68,0x52,0x18,0x1A,0x60, +0x55,0xE0,0x00,0x22,0x1A,0x60,0x39,0x4B,0x3D,0x48,0x1C,0x7E,0xDB,0x7D,0x39,0x49, +0x02,0x93,0x2D,0x4B,0x9B,0x7C,0x03,0x93,0x11,0xE0,0x01,0x3B,0xDB,0xB2,0xF2,0x18, +0x14,0x56,0x03,0x9D,0xAC,0x42,0x07,0xD1,0x31,0x4D,0x54,0x00,0x57,0x57,0x65,0x5A, +0xEF,0x1B,0x67,0x52,0x00,0x24,0x14,0x54,0x00,0x2B,0xEE,0xD1,0x64,0x46,0x65,0x1E, +0xED,0xB2,0x00,0x2C,0x03,0xD0,0x02,0x9B,0x6E,0x01,0xAC,0x46,0xF4,0xE7,0x2D,0x4B, +0x1B,0x68,0x5D,0x07,0x2B,0xD5,0x20,0x4B,0x1B,0x78,0x00,0x2B,0x22,0xD0,0x02,0x20, +0x29,0x49,0xFE,0xF7,0x03,0xFE,0x1D,0xE0,0xE9,0x7D,0x62,0x01,0x0B,0x1C,0x21,0x48, +0x02,0x92,0x08,0xE0,0x01,0x3B,0x02,0x9A,0xDB,0xB2,0xD2,0x18,0x52,0x00,0x12,0x5A, +0x5F,0x00,0xD2,0x08,0xBA,0x53,0x00,0x2B,0xF4,0xD1,0x13,0x4A,0x12,0x78,0x00,0x2A, +0x05,0xD0,0x02,0x20,0x00,0x93,0x0F,0x4A,0x03,0x1C,0xFE,0xF7,0x8F,0xFD,0x01,0x34, +0xE4,0xB2,0x01,0xE0,0x11,0x4D,0x0B,0x4E,0x2B,0x7E,0xA3,0x42,0xDC,0xD8,0x05,0xB0, +0xF0,0xBD,0xC0,0x46,0x1C,0x03,0x00,0x20,0xF4,0x10,0x00,0x20,0xBC,0x11,0x00,0x20, +0x70,0x01,0x00,0x20,0x14,0x09,0x00,0x20,0x48,0x0D,0x00,0x20,0x3C,0x11,0x00,0x20, +0x34,0x11,0x00,0x20,0x54,0x11,0x00,0x20,0xEB,0x01,0x00,0x20,0xD2,0x59,0x00,0x00, +0x20,0x09,0x00,0x20,0xD9,0x59,0x00,0x00,0xE2,0x59,0x00,0x00,0xAE,0x09,0x00,0x20, +0x64,0x0E,0x00,0x20,0xF8,0x03,0x00,0x20,0x48,0x11,0x00,0x20,0xBC,0x01,0x00,0x20, +0xB3,0x0A,0x00,0x20,0x58,0x00,0x00,0x20,0xEB,0x59,0x00,0x00,0xF0,0xB5,0x25,0x4B, +0x87,0xB0,0x1B,0x78,0x00,0x2B,0x2B,0xD1,0x23,0x4A,0x24,0x4B,0x90,0x7C,0x1B,0x78, +0x04,0x90,0xD2,0x7E,0x22,0x4D,0x52,0xB2,0x92,0xB2,0x05,0x92,0x21,0x4A,0x1D,0xE0, +0x01,0x3B,0x21,0x4C,0xDB,0xB2,0xE1,0x5C,0x04,0x9F,0xB9,0x42,0x16,0xD1,0x59,0x00, +0x88,0x5A,0x00,0x28,0x07,0xD0,0x6E,0x5A,0x6F,0x46,0x34,0xB2,0xA4,0x46,0x14,0x24, +0xE7,0x5F,0xBC,0x45,0x05,0xDA,0x59,0x00,0x6E,0x5A,0xF6,0x00,0x80,0x1B,0x50,0x52, +0x01,0xE0,0x80,0x1B,0x88,0x52,0x14,0x4F,0x00,0x21,0xF9,0x54,0x00,0x2B,0xDF,0xD1, +0x0E,0x4B,0x12,0x4C,0x19,0x78,0x0F,0x48,0x0B,0x1C,0x05,0xE0,0x01,0x3B,0xDB,0xB2, +0x5A,0x00,0x15,0x5A,0xED,0x08,0x15,0x53,0x00,0x2B,0xF7,0xD1,0x0C,0x4A,0x12,0x78, +0x00,0x2A,0x05,0xD0,0x02,0x20,0x00,0x93,0x08,0x4A,0x03,0x1C,0xFE,0xF7,0x0E,0xFD, +0x07,0xB0,0xF0,0xBD,0x30,0x11,0x00,0x20,0x48,0x0D,0x00,0x20,0x7C,0x09,0x00,0x20, +0x3C,0x0D,0x00,0x20,0x14,0x02,0x00,0x20,0xA4,0x0A,0x00,0x20,0x54,0x11,0x00,0x20, +0xEB,0x01,0x00,0x20,0x10,0xB5,0x09,0x49,0x50,0x22,0x09,0x48,0x00,0xF0,0xE2,0xF9, +0x08,0x4C,0x09,0x49,0x20,0x1C,0x42,0x22,0x00,0xF0,0xDC,0xF9,0x07,0x4B,0xA2,0x7B, +0x1A,0x60,0xE3,0x7D,0xE3,0x76,0x23,0x7E,0x23,0x77,0x10,0xBD,0x4A,0x74,0x00,0x00, +0x48,0x0D,0x00,0x20,0xAE,0x09,0x00,0x20,0x08,0x74,0x00,0x00,0x50,0x11,0x00,0x20, +0x08,0xB5,0x04,0x49,0x04,0x4B,0x41,0x43,0x04,0x48,0xC9,0x18,0x00,0xF0,0x60,0xF9, +0xC0,0xB2,0x08,0xBD,0x44,0xFE,0xFF,0xFF,0xFE,0x24,0x02,0x00,0x40,0x42,0x0F,0x00, +0x10,0xB5,0x15,0x4C,0x00,0x23,0x23,0x71,0x03,0x23,0x63,0x71,0x02,0x23,0x23,0x72, +0x12,0x4B,0x98,0x78,0x02,0x38,0x03,0x28,0x1D,0xD8,0x00,0xF0,0xE7,0xF8,0x0B,0x04, +0x02,0x14,0xC7,0x20,0x00,0xE0,0xD7,0x20,0xE0,0x70,0xFF,0xF7,0xD9,0xFF,0x02,0x23, +0x20,0x70,0x0E,0xE0,0xF4,0x20,0xE0,0x70,0xFF,0xF7,0xD2,0xFF,0x02,0x23,0x20,0x70, +0xA3,0x71,0x01,0x23,0x06,0xE0,0xF4,0x20,0xE0,0x70,0xFF,0xF7,0xC9,0xFF,0x01,0x23, +0x20,0x70,0xA3,0x71,0xE3,0x71,0x10,0xBD,0xAA,0x0A,0x00,0x20,0x48,0x0D,0x00,0x20, +0xF0,0xB5,0x59,0x4B,0x87,0xB0,0x1A,0x68,0x58,0x4B,0x08,0x2A,0x01,0xD1,0x01,0x22, +0x00,0xE0,0x00,0x22,0x1A,0x70,0x56,0x4B,0x56,0x4C,0x01,0x33,0xDB,0x7F,0x00,0x2B, +0x00,0xD1,0xE3,0x71,0x23,0x78,0x01,0x25,0xA2,0x79,0x28,0x1C,0xD9,0x00,0x90,0x40, +0x82,0xB2,0xCB,0x1A,0x53,0x43,0x50,0x4E,0xDB,0x10,0xDB,0xB2,0x33,0x80,0x22,0x78, +0xFA,0x23,0xA0,0x79,0x9B,0x00,0x53,0x43,0x4C,0x4F,0x29,0x1C,0x81,0x40,0x88,0xB2, +0xB9,0x88,0x58,0x43,0x09,0x01,0x00,0xF0,0xFB,0xF8,0xC1,0xB2,0x71,0x80,0x23,0x78, +0x2D,0x22,0xA0,0x79,0x53,0x43,0x2A,0x1C,0x82,0x40,0x90,0xB2,0x58,0x43,0x6B,0x46, +0x19,0x81,0x09,0x01,0x00,0xF0,0xEC,0xF8,0xC0,0xB2,0xB0,0x80,0x23,0x7A,0xB9,0x79, +0xD8,0x00,0x18,0x1A,0xA9,0x40,0xC0,0x00,0x49,0x19,0xE0,0x30,0x48,0x43,0xA2,0x79, +0x6C,0x46,0x08,0x21,0x61,0x5E,0x90,0x40,0x49,0x01,0x00,0xF0,0x8B,0xF8,0x34,0x4A, +0xF0,0x80,0x11,0x7D,0xD0,0x7D,0x36,0x4B,0x08,0x18,0xC0,0xB2,0x18,0x70,0x17,0x7E, +0x5F,0x70,0x56,0x7E,0x01,0x96,0x96,0x7F,0x01,0x9C,0x66,0x43,0xF4,0xB2,0x20,0x18, +0xC0,0xB2,0x98,0x70,0x02,0x90,0x96,0x7E,0x03,0x96,0x03,0x98,0xD6,0x7F,0x46,0x43, +0xF0,0xB2,0xC7,0x19,0xFF,0xB2,0xDF,0x70,0xD6,0x7E,0xB4,0x46,0x61,0x44,0x61,0x18, +0xC9,0xB2,0x19,0x71,0x16,0x7F,0x80,0x19,0x02,0x9E,0xC0,0xB2,0x74,0x1A,0x3F,0x1A, +0xE6,0xB2,0xFF,0xB2,0x58,0x71,0x9E,0x71,0xDF,0x71,0xBC,0x46,0x57,0x7D,0xEC,0x1B, +0x04,0x97,0x27,0x1C,0x77,0x43,0xFF,0xB2,0x05,0x97,0x9F,0x73,0x97,0x7D,0x64,0x46, +0xED,0x1B,0x65,0x43,0x47,0x43,0x04,0x9C,0x5F,0x74,0x4C,0x43,0x18,0x72,0x6F,0x46, +0x14,0x20,0xC7,0x5D,0xED,0xB2,0xE4,0xB2,0xDD,0x73,0x1C,0x74,0x5D,0x72,0x99,0x72, +0xDF,0x72,0x1E,0x73,0x5C,0x73,0x51,0x7F,0x12,0x4B,0x00,0x29,0x03,0xD0,0x69,0x46, +0x09,0x79,0x19,0x70,0x03,0xE0,0x01,0x9C,0x03,0x9E,0x74,0x43,0x1C,0x70,0x93,0x1C, +0x03,0x32,0x02,0x9F,0xD2,0x7F,0xDB,0x7F,0xBA,0x18,0x5B,0xB2,0x01,0x32,0x9A,0x40, +0x09,0x4B,0x07,0xB0,0x1A,0x60,0xF0,0xBD,0x50,0x11,0x00,0x20,0xFA,0x02,0x00,0x20, +0xAE,0x09,0x00,0x20,0xAA,0x0A,0x00,0x20,0x04,0x02,0x00,0x20,0x48,0x0D,0x00,0x20, +0x0A,0x03,0x00,0x20,0x7C,0x09,0x00,0x20,0x18,0x09,0x00,0x20,0x02,0xB4,0x71,0x46, +0x49,0x08,0x49,0x00,0x09,0x5C,0x49,0x00,0x8E,0x44,0x02,0xBC,0x70,0x47,0xC0,0x46, +0x03,0xB4,0x71,0x46,0x49,0x08,0x40,0x00,0x49,0x00,0x09,0x5A,0x49,0x00,0x8E,0x44, +0x03,0xBC,0x70,0x47,0x00,0x29,0x34,0xD0,0x01,0x23,0x00,0x22,0x10,0xB4,0x88,0x42, +0x2C,0xD3,0x01,0x24,0x24,0x07,0xA1,0x42,0x04,0xD2,0x81,0x42,0x02,0xD2,0x09,0x01, +0x1B,0x01,0xF8,0xE7,0xE4,0x00,0xA1,0x42,0x04,0xD2,0x81,0x42,0x02,0xD2,0x49,0x00, +0x5B,0x00,0xF8,0xE7,0x88,0x42,0x01,0xD3,0x40,0x1A,0x1A,0x43,0x4C,0x08,0xA0,0x42, +0x02,0xD3,0x00,0x1B,0x5C,0x08,0x22,0x43,0x8C,0x08,0xA0,0x42,0x02,0xD3,0x00,0x1B, +0x9C,0x08,0x22,0x43,0xCC,0x08,0xA0,0x42,0x02,0xD3,0x00,0x1B,0xDC,0x08,0x22,0x43, +0x00,0x28,0x03,0xD0,0x1B,0x09,0x01,0xD0,0x09,0x09,0xE3,0xE7,0x10,0x1C,0x10,0xBC, +0x70,0x47,0x00,0x28,0x01,0xD0,0x00,0x20,0xC0,0x43,0x07,0xB4,0x02,0x48,0x02,0xA1, +0x40,0x18,0x02,0x90,0x03,0xBD,0xC0,0x46,0xD9,0x00,0x00,0x00,0x00,0x29,0xF0,0xD0, +0x03,0xB5,0xFF,0xF7,0xB9,0xFF,0x0E,0xBC,0x42,0x43,0x89,0x1A,0x18,0x47,0xC0,0x46, +0x00,0x29,0x41,0xD0,0x10,0xB4,0x04,0x1C,0x4C,0x40,0xA4,0x46,0x01,0x23,0x00,0x22, +0x00,0x29,0x00,0xD5,0x49,0x42,0x00,0x28,0x00,0xD5,0x40,0x42,0x88,0x42,0x2C,0xD3, +0x01,0x24,0x24,0x07,0xA1,0x42,0x04,0xD2,0x81,0x42,0x02,0xD2,0x09,0x01,0x1B,0x01, +0xF8,0xE7,0xE4,0x00,0xA1,0x42,0x04,0xD2,0x81,0x42,0x02,0xD2,0x49,0x00,0x5B,0x00, +0xF8,0xE7,0x88,0x42,0x01,0xD3,0x40,0x1A,0x1A,0x43,0x4C,0x08,0xA0,0x42,0x02,0xD3, +0x00,0x1B,0x5C,0x08,0x22,0x43,0x8C,0x08,0xA0,0x42,0x02,0xD3,0x00,0x1B,0x9C,0x08, +0x22,0x43,0xCC,0x08,0xA0,0x42,0x02,0xD3,0x00,0x1B,0xDC,0x08,0x22,0x43,0x00,0x28, +0x03,0xD0,0x1B,0x09,0x01,0xD0,0x09,0x09,0xE3,0xE7,0x10,0x1C,0x64,0x46,0x00,0x2C, +0x00,0xD5,0x40,0x42,0x10,0xBC,0x70,0x47,0x00,0x28,0x06,0xD0,0x03,0xDB,0x00,0x20, +0xC0,0x43,0x40,0x08,0x01,0xE0,0x80,0x20,0x00,0x06,0x07,0xB4,0x02,0x48,0x02,0xA1, +0x40,0x18,0x02,0x90,0x03,0xBD,0xC0,0x46,0x19,0x00,0x00,0x00,0x00,0x29,0xEB,0xD0, +0x03,0xB5,0xFF,0xF7,0xA7,0xFF,0x0E,0xBC,0x42,0x43,0x89,0x1A,0x18,0x47,0xC0,0x46, +0x70,0x47,0xC0,0x46,0xF0,0xB5,0x05,0x1C,0x0F,0x2A,0x2F,0xD9,0x0B,0x1C,0x03,0x43, +0x05,0x1C,0x9C,0x07,0x2C,0xD1,0x0C,0x1C,0x03,0x1C,0x15,0x1C,0x26,0x68,0x10,0x3D, +0x1E,0x60,0x66,0x68,0x5E,0x60,0xA6,0x68,0x9E,0x60,0xE6,0x68,0x10,0x34,0xDE,0x60, +0x10,0x33,0x0F,0x2D,0xF2,0xD8,0x13,0x1C,0x10,0x3B,0x1B,0x09,0x01,0x33,0x1B,0x01, +0xC5,0x18,0xC9,0x18,0x0F,0x23,0x1A,0x40,0x03,0x2A,0x0F,0xD9,0x0E,0x1C,0x2C,0x1C, +0x13,0x1C,0x80,0xCE,0x04,0x3B,0x80,0xC4,0x03,0x2B,0xFA,0xD8,0x13,0x1F,0x9B,0x08, +0x01,0x33,0x9B,0x00,0x03,0x24,0x22,0x40,0xC9,0x18,0xED,0x18,0x00,0x2A,0x05,0xD0, +0x00,0x23,0xCC,0x5C,0xEC,0x54,0x01,0x33,0x93,0x42,0xFA,0xD1,0xF0,0xBD,0xC0,0x46, +0x50,0x61,0x6C,0x6D,0x20,0x49,0x6E,0x69,0x74,0x00,0x27,0x45,0x6E,0x74,0x65,0x72, +0x27,0x20,0x4E,0x00,0x4E,0x2D,0x6C,0x65,0x73,0x73,0x21,0x00,0x27,0x45,0x78,0x69, +0x74,0x27,0x20,0x4E,0x00,0x4E,0x20,0x53,0x2F,0x50,0x00,0x53,0x6C,0x65,0x65,0x70, +0x00,0x53,0x2D,0x72,0x65,0x73,0x65,0x74,0x00,0x46,0x41,0x53,0x54,0x00,0x49,0x64, +0x6C,0x65,0x00,0x41,0x63,0x74,0x69,0x76,0x65,0x00,0x53,0x70,0x65,0x63,0x74,0x00, +0x53,0x74,0x61,0x63,0x6B,0x21,0x00,0x52,0x45,0x47,0x56,0x41,0x4C,0x00,0x44,0x65, +0x6C,0x61,0x79,0x00,0x4F,0x53,0x43,0x00,0x4E,0x4F,0x49,0x53,0x45,0x00,0x54,0x6F, +0x75,0x63,0x68,0x20,0x4F,0x6E,0x00,0x54,0x6F,0x75,0x63,0x68,0x20,0x4F,0x46,0x46, +0x00,0x4C,0x54,0x5F,0x50,0x52,0x4F,0x46,0x49,0x4C,0x49,0x4E,0x47,0x00,0x46,0x69, +0x78,0x65,0x64,0x00,0x47,0x2D,0x41,0x66,0x74,0x65,0x72,0x00,0x3D,0x48,0x6F,0x76, +0x6F,0x72,0x00,0x12,0x0E,0x07,0x0D,0x0A,0x12,0x04,0x06,0x0C,0x09,0x12,0x0F,0x05, +0x11,0x08,0x12,0x00,0x01,0x10,0x02,0x45,0x72,0x72,0x00,0x4B,0x65,0x79,0x20,0x52, +0x00,0x52,0x45,0x46,0x20,0x49,0x4E,0x49,0x54,0x00,0x43,0x6D,0x44,0x65,0x6C,0x74, +0x61,0x20,0x52,0x65,0x66,0x2F,0x52,0x65,0x61,0x6C,0x00,0x52,0x61,0x77,0x00,0x4D, +0x41,0x58,0x20,0x49,0x00,0x43,0x4D,0x5F,0x44,0x45,0x4C,0x54,0x41,0x5F,0x4D,0x41, +0x58,0x5F,0x4D,0x49,0x4E,0x00,0x54,0x78,0x6C,0x65,0x73,0x73,0x00,0x44,0x69,0x66, +0x66,0x00,0x44,0x49,0x46,0x46,0x2F,0x4E,0x00,0x42,0x69,0x67,0x20,0x47,0x72,0x61, +0x64,0x00,0x4E,0x65,0x67,0x2D,0x45,0x64,0x67,0x65,0x00,0x52,0x65,0x66,0x00,0x00, +0x2D,0x49,0x00,0x00,0xFF,0x00,0x00,0x01,0x00,0xFF,0x01,0x00,0xFF,0x00,0x00,0x00, +0x01,0x00,0x00,0x00,0xA0,0x0D,0x00,0x20,0x28,0x02,0x00,0x20,0x0C,0x00,0x00,0x00, +0x54,0x11,0x00,0x20,0x01,0x02,0xFF,0x00,0x01,0x04,0x00,0x04,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x02,0x45, +0x4D,0x31,0x48,0x30,0x50,0x52,0x34,0x35,0x08,0xB5,0x00,0x28,0x02,0xD0,0x01,0x28, +0x24,0xD1,0x07,0xE0,0x12,0x4B,0x13,0x4A,0x1A,0x60,0x13,0x4B,0x58,0x60,0x98,0x60, +0xD8,0x60,0x1B,0xE0,0x11,0x4B,0x1B,0x68,0x10,0x2B,0x15,0xD1,0x10,0x4A,0x11,0x4B, +0x1A,0x60,0x11,0x4A,0x11,0x4B,0x1A,0x60,0x11,0x4A,0x12,0x4B,0x1A,0x60,0x12,0x4A, +0x12,0x4B,0x1A,0x60,0x12,0x4A,0x13,0x4B,0x1A,0x60,0x13,0x4A,0x13,0x4B,0x1A,0x60, +0x13,0x4A,0x14,0x4B,0x1A,0x60,0x01,0xE0,0xFE,0xF7,0xC8,0xF8,0x08,0xBD,0xC0,0x46, +0xF8,0x01,0x00,0x20,0xC1,0x68,0x00,0x00,0xF8,0x08,0x00,0x20,0x50,0x11,0x00,0x20, +0xA9,0x5C,0x00,0x00,0x68,0x00,0x00,0x20,0x81,0x68,0x00,0x00,0x6C,0x00,0x00,0x20, +0x2D,0x66,0x00,0x00,0x00,0x02,0x00,0x20,0x9D,0x71,0x00,0x00,0x18,0x00,0x00,0x20, +0x05,0x62,0x00,0x00,0x1C,0x00,0x00,0x20,0xE9,0x61,0x00,0x00,0x20,0x00,0x00,0x20, +0xAB,0x5C,0x00,0x00,0x24,0x00,0x00,0x20,0x70,0x47,0xA0,0x23,0xDB,0x05,0x01,0x22, +0x1A,0x72,0x09,0x49,0x10,0x22,0x1A,0x72,0x00,0x22,0x0A,0x70,0x1A,0x72,0x07,0x4B, +0x80,0x22,0x19,0x68,0x52,0x00,0x0A,0x43,0x1A,0x60,0x1A,0x68,0x80,0x23,0xDB,0x05, +0x99,0x68,0x9A,0x60,0x70,0x47,0xC0,0x46,0x0C,0x00,0x00,0x20,0x14,0x00,0x00,0x20, +0x00,0xB5,0x5A,0x28,0x07,0xD0,0x05,0x4B,0x59,0x28,0x01,0xDD,0xB4,0x22,0x10,0x1A, +0x40,0x00,0x18,0x5A,0x00,0xE0,0x02,0x48,0x00,0xBD,0xC0,0x46,0xE4,0x72,0x00,0x00, +0xFF,0xFF,0x00,0x00,0x00,0xB5,0x00,0x28,0x0E,0xD0,0xB4,0x28,0x0E,0xD0,0x08,0x4B, +0x5A,0x28,0x04,0xDC,0x5A,0x22,0x10,0x1A,0x40,0x00,0x18,0x5A,0x07,0xE0,0x5A,0x38, +0x40,0x00,0x18,0x5A,0x40,0x42,0x02,0xE0,0x02,0x48,0x00,0xE0,0x02,0x48,0x00,0xBD, +0xE4,0x72,0x00,0x00,0xFF,0xFF,0x00,0x00,0x01,0x00,0xFF,0xFF,0xF0,0xB5,0x9B,0xB0, +0x0E,0x93,0x11,0x90,0x0B,0x91,0x08,0x78,0xC9,0x4B,0x03,0x90,0x49,0x78,0x16,0x1C, +0x49,0xB2,0x12,0x91,0x0A,0x20,0x1A,0x5E,0x00,0x25,0x13,0x92,0xC5,0x4A,0x2C,0x1C, +0x28,0x20,0x11,0x5E,0x2F,0x1C,0x14,0x91,0x59,0x68,0x15,0x91,0xC2,0x49,0x09,0x68, +0x0D,0x91,0x08,0x21,0x58,0x5E,0x1B,0x68,0x17,0x90,0x26,0x21,0x50,0x5E,0x19,0x93, +0x18,0x90,0x04,0x95,0x06,0x95,0x05,0x95,0x09,0x95,0x0A,0x95,0x08,0x95,0x95,0xE0, +0x03,0x9A,0x14,0x98,0x15,0x99,0x50,0x43,0xFF,0xF7,0xFA,0xFC,0x13,0x9B,0x00,0xB2, +0x18,0x18,0x33,0x68,0x0B,0x99,0xC3,0x1A,0x0B,0x98,0x0C,0x93,0x80,0x78,0x03,0x9A, +0x02,0x90,0xC9,0x78,0x01,0x32,0x49,0xB2,0x93,0x01,0x16,0x91,0x0F,0x92,0x10,0x93, +0x75,0xE0,0x02,0x9A,0x10,0x99,0x02,0x32,0x88,0x18,0xAC,0x49,0x43,0x5C,0x0E,0x2B, +0x27,0xD9,0x04,0x23,0x94,0x46,0xAA,0x48,0x01,0x3B,0xDB,0xB2,0xC2,0x56,0x03,0x99, +0x8A,0x18,0xA8,0x49,0x01,0x32,0xC8,0x56,0x02,0x99,0x92,0x01,0x08,0x18,0x02,0x30, +0xA2,0x49,0x10,0x18,0x0A,0x5C,0x01,0x3A,0xD2,0xB2,0x0D,0x2A,0x0E,0xD8,0xA2,0x48, +0x0E,0x99,0x82,0x56,0x8A,0x42,0x09,0xD1,0x10,0x9B,0x62,0x46,0x9A,0x18,0x9F,0x48, +0x52,0x00,0x13,0x5A,0x0D,0x99,0x5B,0x1A,0x07,0x93,0x12,0xE0,0x00,0x2B,0xDA,0xD1, +0x41,0xE0,0x00,0x2B,0x3F,0xD0,0x98,0x4A,0x0E,0x99,0xD3,0x18,0x01,0x3B,0x1B,0x78, +0x5B,0xB2,0x8B,0x42,0x37,0xD1,0x95,0x4A,0x40,0x00,0x83,0x5A,0x0D,0x98,0x1B,0x1A, +0x07,0x93,0x07,0x99,0x00,0x29,0x2E,0xD0,0x02,0x9A,0x18,0x98,0x19,0x99,0x50,0x43, +0xFF,0xF7,0x9E,0xFC,0x07,0x9A,0x17,0x9B,0x08,0x99,0x00,0xB2,0x89,0x18,0x18,0x18, +0x73,0x68,0x08,0x91,0x0C,0x99,0xC0,0x1A,0x13,0x1C,0x4B,0x43,0x42,0x43,0x00,0x28, +0x0B,0xDC,0x00,0x29,0x04,0xDD,0xFF,0x18,0x0A,0x9B,0x9B,0x1A,0x0A,0x93,0x12,0xE0, +0x09,0x98,0xE4,0x1A,0x80,0x1A,0x09,0x90,0x0D,0xE0,0x0C,0x99,0x00,0x29,0x06,0xDC, +0x05,0x98,0x06,0x99,0xC0,0x1A,0x89,0x18,0x05,0x90,0x06,0x91,0x03,0xE0,0x04,0x98, +0xAD,0x18,0xC0,0x18,0x04,0x90,0x02,0x9B,0x01,0x33,0xDB,0xB2,0x02,0x93,0x02,0x99, +0x16,0x9A,0x91,0x42,0x85,0xDD,0x0F,0xAB,0x1B,0x78,0x03,0x93,0x03,0x98,0x12,0x99, +0x88,0x42,0x00,0xDC,0x64,0xE7,0x05,0x9A,0x04,0x98,0x94,0x46,0x63,0x46,0x3A,0x1B, +0x19,0x1A,0x02,0x97,0xD1,0x42,0x02,0xD4,0x00,0x21,0x07,0x91,0x0D,0xE0,0x06,0x9A, +0x06,0x95,0x15,0x1C,0x04,0x9A,0x09,0x99,0x04,0x93,0x0A,0x9B,0x05,0x92,0x27,0x1C, +0x01,0x22,0x02,0x9C,0x0A,0x91,0x09,0x93,0x07,0x92,0x05,0x9B,0x04,0x99,0xF8,0x18, +0x00,0x19,0x40,0x18,0x08,0x99,0xFF,0xF7,0x43,0xFC,0x02,0x90,0x00,0x28,0x64,0xD0, +0x0A,0x9A,0x06,0x9B,0x09,0x99,0xD0,0x18,0x40,0x18,0x40,0x19,0x08,0x99,0xFF,0xF7, +0x37,0xFC,0x03,0x90,0x03,0x9A,0x5A,0x20,0x00,0x2A,0x56,0xD0,0x02,0x9B,0x2D,0x20, +0x9A,0x42,0x52,0xD0,0x93,0x42,0x24,0xDA,0x11,0x1C,0x98,0x01,0xFF,0xF7,0x28,0xFC, +0x05,0x1C,0x05,0x98,0x04,0x99,0x3F,0x1B,0x3F,0x18,0x78,0x1A,0xC3,0x43,0xDB,0x17, +0x18,0x40,0x08,0x99,0xFF,0xF7,0x1C,0xFC,0x03,0x99,0x80,0x01,0xFF,0xF7,0x18,0xFC, +0x4B,0x4B,0x1A,0x1C,0x3F,0x28,0x00,0xDD,0x3F,0x20,0x1B,0x5C,0x3F,0x2D,0x00,0xDD, +0x3F,0x25,0x51,0x5D,0x2D,0x20,0x41,0x1A,0xC9,0x18,0x58,0x43,0xFF,0xF7,0x08,0xFC, +0x2B,0xE0,0x03,0x9A,0x02,0x99,0x90,0x01,0xFF,0xF7,0x02,0xFC,0x3F,0x28,0x00,0xDD, +0x3F,0x20,0x3F,0x4B,0x09,0x99,0x1C,0x5C,0x0A,0x9B,0x06,0x9A,0x58,0x1A,0x80,0x18, +0x40,0x1B,0xC3,0x43,0xDB,0x17,0x08,0x99,0x18,0x40,0xFF,0xF7,0xF1,0xFB,0x02,0x99, +0x80,0x01,0xFF,0xF7,0xED,0xFB,0x3F,0x28,0x00,0xDD,0x3F,0x20,0x34,0x4B,0x5A,0x22, +0x1B,0x5C,0x2D,0x20,0xD1,0x1A,0x00,0x1B,0x12,0x1B,0x48,0x43,0x5A,0x43,0x87,0x23, +0x1C,0x1B,0x80,0x18,0x61,0x1A,0xFF,0xF7,0xDB,0xFB,0x07,0x9B,0x00,0x2B,0x00,0xD0, +0x40,0x42,0x11,0x99,0x5A,0x24,0x24,0x1A,0x08,0x70,0x20,0x1C,0xFF,0xF7,0x8A,0xFE, +0x09,0x90,0x20,0x1C,0xFF,0xF7,0x74,0xFE,0x0B,0x9A,0x0A,0x90,0x01,0x23,0xD3,0x56, +0x17,0x78,0x0F,0x93,0x1A,0x4B,0x1B,0x4A,0x0A,0x21,0x58,0x5E,0x00,0x24,0x10,0x90, +0x28,0x21,0x50,0x5E,0x18,0x49,0x12,0x90,0x09,0x68,0x58,0x68,0x07,0x91,0x13,0x90, +0x08,0x20,0x19,0x5E,0x1B,0x68,0x15,0x91,0x26,0x20,0x11,0x5E,0x17,0x93,0x16,0x91, +0x05,0x94,0x04,0x94,0x02,0x94,0xA8,0xE0,0x12,0x98,0x13,0x99,0x78,0x43,0xFF,0xF7, +0xA7,0xFB,0x10,0x99,0x00,0xB2,0x33,0x68,0x08,0x18,0xC3,0x1A,0x03,0x93,0x0B,0x9A, +0x03,0x99,0x03,0x23,0x0A,0x98,0xD3,0x56,0x95,0x78,0x09,0x9A,0x48,0x43,0x4A,0x43, +0x14,0x93,0x7B,0x1C,0x18,0x90,0x98,0x01,0x19,0x92,0x0C,0x93,0x0D,0x90,0x87,0xE0, +0x24,0x09,0x00,0x20,0xAE,0x09,0x00,0x20,0x38,0x0D,0x00,0x20,0x00,0x20,0x00,0x40, +0xF8,0x59,0x00,0x00,0xF4,0x59,0x00,0x00,0xEC,0x02,0x00,0x20,0x00,0x40,0x00,0x40, +0xA4,0x72,0x00,0x00,0x0D,0x99,0xAA,0x1C,0x88,0x18,0x4E,0x49,0x43,0x5C,0x0E,0x2B, +0x25,0xD9,0x04,0x23,0x94,0x46,0x4C,0x48,0x01,0x3B,0xDB,0xB2,0x4B,0x49,0xC2,0x56, +0xC8,0x56,0xBA,0x18,0x01,0x32,0x28,0x18,0x92,0x01,0x02,0x30,0x45,0x49,0x10,0x18, +0x0A,0x5C,0x01,0x3A,0xD2,0xB2,0x0D,0x2A,0x0E,0xD8,0x45,0x48,0x0E,0x99,0x82,0x56, +0x8A,0x42,0x09,0xD1,0x0D,0x9B,0x62,0x46,0x9A,0x18,0x42,0x48,0x52,0x00,0x13,0x5A, +0x07,0x99,0x5B,0x1A,0x06,0x93,0x12,0xE0,0x00,0x2B,0xDC,0xD1,0x46,0xE0,0x00,0x2B, +0x44,0xD0,0x3B,0x4A,0x0E,0x99,0xD3,0x18,0x01,0x3B,0x1B,0x78,0x5B,0xB2,0x8B,0x42, +0x3C,0xD1,0x38,0x4A,0x40,0x00,0x83,0x5A,0x07,0x98,0x1B,0x1A,0x06,0x93,0x06,0x99, +0x00,0x29,0x33,0xD0,0x16,0x98,0x17,0x99,0x68,0x43,0xFF,0xF7,0x39,0xFB,0x15,0x9A, +0x00,0xB2,0x73,0x68,0x10,0x18,0x1B,0x1A,0x01,0x93,0x01,0x98,0x03,0x9B,0x06,0x9A, +0x09,0x99,0x5A,0x43,0x41,0x43,0x06,0x9B,0x43,0x43,0x18,0x98,0x09,0x1A,0x00,0x29, +0x04,0xDD,0x05,0x99,0xE4,0x18,0x89,0x18,0x05,0x91,0x03,0xE0,0x05,0x98,0xE4,0x1A, +0x80,0x1A,0x05,0x90,0x01,0x99,0x0A,0x98,0x48,0x43,0x19,0x99,0x40,0x18,0x00,0x28, +0x06,0xDD,0x02,0x98,0x04,0x99,0x80,0x18,0xC9,0x18,0x02,0x90,0x04,0x91,0x05,0xE0, +0x02,0x98,0x04,0x99,0x80,0x1A,0xC9,0x1A,0x02,0x90,0x04,0x91,0x01,0x35,0xED,0xB2, +0x14,0x9A,0x95,0x42,0x86,0xDD,0x0C,0xAB,0x1F,0x78,0x0F,0x98,0x87,0x42,0x00,0xDC, +0x52,0xE7,0x08,0x99,0x02,0x98,0xFF,0xF7,0xFB,0xFA,0x08,0x99,0x07,0x1C,0x04,0x98, +0xFF,0xF7,0xF6,0xFA,0x08,0x99,0x05,0x1C,0x05,0x98,0xFF,0xF7,0xF1,0xFA,0x08,0x99, +0x06,0x1C,0x20,0x1C,0xFF,0xF7,0xEC,0xFA,0x7F,0x43,0x76,0x43,0x6D,0x43,0x40,0x43, +0x11,0x99,0x7D,0x19,0x30,0x18,0xAD,0x11,0x80,0x11,0x1B,0xB0,0x4D,0x60,0x88,0x60, +0xF0,0xBD,0xC0,0x46,0x00,0x20,0x00,0x40,0xF8,0x59,0x00,0x00,0xF4,0x59,0x00,0x00, +0xEC,0x02,0x00,0x20,0x00,0x40,0x00,0x40,0x08,0xB5,0x05,0x4B,0x1B,0x88,0xDB,0xB2, +0x10,0x2B,0x01,0xD0,0xAF,0x2B,0x01,0xD1,0xFD,0xF7,0x8A,0xF9,0x08,0xBD,0xC0,0x46, +0x28,0x00,0x00,0x20,0x38,0xB5,0xC1,0x4A,0x13,0x88,0x1B,0xB2,0xAE,0x2B,0x00,0xD1, +0x59,0xE1,0x3B,0xDC,0x0C,0x2B,0x00,0xD1,0xD2,0xE0,0x1B,0xDC,0x05,0x2B,0x00,0xD1, +0xA6,0xE0,0x08,0xDC,0x03,0x2B,0x00,0xD1,0x8F,0xE0,0x00,0xDD,0x96,0xE0,0x02,0x2B, +0x00,0xD0,0xA5,0xE1,0x7C,0xE0,0x09,0x2B,0x00,0xD1,0xA4,0xE0,0x03,0xDC,0x06,0x2B, +0x00,0xD0,0x9D,0xE1,0x99,0xE0,0x0A,0x2B,0x00,0xD1,0xAC,0xE0,0x0B,0x2B,0x00,0xD0, +0x96,0xE1,0xAD,0xE0,0x31,0x2B,0x00,0xD1,0x95,0xE0,0x08,0xDC,0x10,0x2B,0x5A,0xD0, +0x30,0x2B,0x00,0xD1,0x9A,0xE0,0x0F,0x2B,0x00,0xD0,0x89,0xE1,0x48,0xE0,0x62,0x2B, +0x00,0xD1,0x81,0xE1,0x03,0xDC,0x61,0x2B,0x00,0xD0,0x81,0xE1,0x77,0xE1,0x64,0x2B, +0x00,0xD1,0x6F,0xE1,0xA8,0x2B,0x00,0xD0,0x7A,0xE1,0x5B,0xE1,0xF4,0x2B,0x00,0xD1, +0xBC,0xE0,0x19,0xDC,0xEF,0x2B,0x00,0xD1,0x2E,0xE1,0x09,0xDC,0xBF,0x2B,0x00,0xD1, +0x50,0xE1,0xEE,0x2B,0x00,0xD1,0x23,0xE1,0xAF,0x2B,0x00,0xD0,0x68,0xE1,0x11,0xE1, +0xF1,0x2B,0x00,0xD1,0x91,0xE0,0x00,0xDA,0x8C,0xE0,0xF2,0x2B,0x00,0xD1,0x94,0xE0, +0xF3,0x2B,0x00,0xD0,0x5C,0xE1,0x99,0xE0,0xF9,0x2B,0x00,0xD1,0xCD,0xE0,0x0B,0xDC, +0xF6,0x2B,0x00,0xD1,0xAD,0xE0,0x00,0xDA,0xA1,0xE0,0xF7,0x2B,0x00,0xD1,0xAF,0xE0, +0xF8,0x2B,0x00,0xD0,0x4C,0xE1,0xB7,0xE0,0xFB,0x2B,0x00,0xD1,0xCF,0xE0,0x00,0xDA, +0xC4,0xE0,0xFC,0x2B,0x00,0xD1,0xD3,0xE0,0xFD,0x2B,0x00,0xD0,0x40,0xE1,0xD8,0xE0, +0x83,0x4C,0x23,0x68,0x00,0x2B,0x01,0xD1,0xFD,0xF7,0x02,0xF9,0x22,0x68,0x81,0x4B, +0xD2,0x00,0x1A,0x70,0x34,0xE1,0x80,0x49,0x80,0x4A,0x00,0x23,0x08,0x78,0x7D,0x4D, +0xC0,0x18,0x14,0x5C,0x58,0x19,0x01,0x33,0x04,0x70,0x08,0x2B,0xF6,0xD1,0x27,0xE1, +0x7B,0x4A,0x0F,0x23,0x26,0x20,0x11,0x5E,0x28,0x25,0x52,0x5F,0x09,0x11,0x12,0x12, +0x99,0x43,0x13,0x40,0x73,0x4A,0xCB,0x18,0x13,0x70,0x70,0x4B,0x1A,0x88,0x03,0x23, +0x12,0xB2,0x9A,0x1A,0x72,0x4B,0x19,0x8D,0x6E,0x4B,0xD1,0x54,0x6B,0x4B,0x1A,0x88, +0x04,0x23,0x12,0xB2,0x9A,0x1A,0x6E,0x4B,0xD9,0x8C,0x6A,0x4B,0xD1,0x54,0x07,0xE1, +0x6C,0x4B,0xDA,0x8C,0x67,0x4B,0x1A,0x70,0x02,0xE1,0x6A,0x4B,0x34,0x33,0x1A,0x78, +0x64,0x4B,0x1A,0x70,0xFC,0xE0,0x68,0x4B,0x1A,0x78,0x62,0x4B,0x00,0x2A,0x02,0xD0, +0x02,0x22,0x1A,0x70,0xF4,0xE0,0x01,0x22,0x1A,0x70,0xF1,0xE0,0x62,0x4B,0x1A,0x78, +0x5C,0x4B,0x1A,0x70,0xEC,0xE0,0x61,0x4B,0x1A,0x78,0x5A,0x4B,0x1A,0x70,0xE7,0xE0, +0x12,0x88,0x5F,0x4B,0x12,0xB2,0x19,0x78,0x0B,0x23,0x9A,0x1A,0x55,0x4B,0xD1,0x54, +0x52,0x4B,0x1A,0x88,0x5A,0x4B,0x12,0xB2,0x59,0x78,0x0C,0x23,0x9A,0x1A,0x51,0x4B, +0xD1,0x54,0xD5,0xE0,0x4F,0x4B,0x42,0x22,0x1A,0x70,0x4C,0x4B,0x01,0x21,0x1A,0x88, +0xF1,0x23,0x12,0xB2,0x9A,0x1A,0x4B,0x4B,0xD1,0x54,0x48,0x4B,0x1A,0x88,0x4C,0x4B, +0x12,0xB2,0x59,0x78,0xF2,0x23,0x9A,0x1A,0x46,0x4B,0xD1,0x54,0x43,0x4B,0xBD,0x21, +0x1A,0x88,0xF3,0x23,0x12,0xB2,0x9A,0x1A,0x42,0x4B,0xD1,0x54,0x3F,0x4B,0x1A,0x88, +0x48,0x4B,0x12,0xB2,0x19,0x78,0xF4,0x23,0x9A,0x1A,0x3E,0x4B,0xD1,0x54,0x3B,0x4B, +0x1A,0x88,0x45,0x4B,0x12,0xB2,0x19,0x78,0xF5,0x23,0x9A,0x1A,0x39,0x4B,0xD1,0x54, +0xA6,0xE0,0x39,0x4B,0x3A,0x4A,0x1B,0x78,0xD3,0x18,0xDA,0x78,0x35,0x4B,0x1A,0x70, +0x32,0x4B,0x37,0x49,0x1A,0x88,0x34,0x4B,0x12,0xB2,0x1B,0x78,0xCB,0x18,0x19,0x79, +0xF7,0x23,0x9A,0x1A,0x2F,0x4B,0xD1,0x54,0x2C,0x4B,0x1A,0x88,0x30,0x4B,0x12,0xB2, +0x59,0x79,0xF8,0x23,0x9A,0x1A,0x2B,0x4B,0xD1,0x54,0x28,0x4B,0x1A,0x88,0x2C,0x4B, +0x12,0xB2,0x99,0x79,0xF9,0x23,0x9A,0x1A,0x26,0x4B,0xD1,0x54,0x23,0x4B,0x1A,0x88, +0x27,0x4B,0x12,0xB2,0xD9,0x79,0xFA,0x23,0x9A,0x1A,0x22,0x4B,0xD1,0x54,0x1F,0x4B, +0x1A,0x88,0x23,0x4B,0x12,0xB2,0x19,0x7A,0xFB,0x23,0x9A,0x1A,0x1D,0x4B,0xD1,0x54, +0x1A,0x4B,0x1A,0x88,0x1E,0x4B,0x12,0xB2,0x59,0x7A,0xFC,0x23,0x9A,0x1A,0x19,0x4B, +0xD1,0x54,0x16,0x4B,0x1A,0x88,0x1A,0x4B,0x12,0xB2,0x99,0x7A,0xFD,0x23,0x9A,0x1A, +0x14,0x4B,0xD1,0x54,0x5C,0xE0,0x1D,0x4B,0x1A,0x78,0x12,0x4B,0x1A,0x70,0xFD,0xF7, +0x1F,0xF8,0x55,0xE0,0x1A,0x49,0x10,0x4A,0x00,0x23,0x0C,0x68,0x10,0x78,0x0D,0x4D, +0x20,0x18,0xC4,0x5C,0x58,0x19,0x01,0x33,0x04,0x70,0x08,0x2B,0xF5,0xD1,0x47,0xE0, +0x0B,0x4B,0x1A,0x7E,0x07,0x4B,0x1A,0x70,0x04,0x4B,0x1A,0x88,0x08,0x4B,0x12,0xB2, +0xD9,0x7D,0xEF,0x23,0x9A,0x1A,0x03,0x4B,0xD1,0x54,0x39,0xE0,0x28,0x00,0x00,0x20, +0x98,0x0D,0x00,0x20,0x0C,0x00,0x00,0x50,0x2A,0x00,0x00,0x20,0xEC,0x11,0x00,0x20, +0xAE,0x09,0x00,0x20,0x48,0x0D,0x00,0x20,0xDD,0x01,0x00,0x20,0xDF,0x01,0x00,0x20, +0x0A,0x03,0x00,0x20,0xFF,0x73,0x00,0x00,0xFF,0x7B,0x00,0x00,0xF6,0x03,0x00,0x20, +0x34,0x0D,0x00,0x20,0x0F,0x49,0x10,0x4A,0x00,0x23,0x0C,0x68,0x10,0x78,0x0F,0x4D, +0x20,0x18,0xC4,0x5C,0x58,0x19,0x01,0x33,0x04,0x70,0x08,0x2B,0xF5,0xD1,0xFC,0xF7, +0xD7,0xFF,0x0D,0xE0,0x0A,0x4B,0x1A,0x78,0x08,0x4B,0x1A,0x70,0x08,0xE0,0x09,0x4B, +0x9A,0x78,0x06,0x4B,0x1A,0x70,0x03,0xE0,0x06,0x4B,0xDA,0x78,0x03,0x4B,0x1A,0x70, +0x38,0xBD,0xC0,0x46,0x34,0x0D,0x00,0x20,0x2A,0x00,0x00,0x20,0x0C,0x00,0x00,0x50, +0xFF,0x5B,0x00,0x00,0x35,0x00,0x00,0x20,0x08,0xB5,0x03,0x1C,0x50,0x1E,0x06,0x28, +0x35,0xD8,0xFF,0xF7,0x93,0xF8,0x04,0x0A,0x2A,0x1B,0x15,0x2A,0x2A,0x00,0x18,0x4A, +0x01,0x23,0x13,0x70,0x17,0x4A,0x13,0x70,0x29,0xE0,0x16,0x4A,0x9B,0x01,0x59,0x18, +0x02,0x20,0x15,0x4B,0x10,0x70,0x49,0x00,0x14,0x4A,0xC9,0x18,0x11,0x60,0x1E,0xE0, +0xFC,0xF7,0x9E,0xFF,0x0E,0x4B,0x00,0x22,0x1A,0x70,0x18,0xE0,0x0D,0x4A,0x5B,0x01, +0x59,0x18,0x01,0x20,0x0E,0x4B,0x10,0x70,0x5A,0x56,0x0E,0x4B,0x00,0x2A,0x00,0xDC, +0x00,0x22,0x1A,0x80,0x09,0x4A,0x13,0x60,0x09,0xE0,0x06,0x4A,0x02,0x20,0x5B,0x01, +0x10,0x70,0xC9,0x18,0x08,0x4A,0x49,0x00,0x89,0x18,0x04,0x4A,0x11,0x60,0x08,0xBD, +0xE5,0x01,0x00,0x20,0xF6,0x03,0x00,0x20,0x84,0x40,0x00,0x40,0x34,0x0D,0x00,0x20, +0x64,0x0E,0x00,0x20,0x08,0x03,0x00,0x20,0xF8,0x03,0x00,0x20,0xF0,0xB5,0x87,0x4C, +0x23,0x23,0xE3,0x5C,0x8D,0xB0,0x00,0x2B,0x12,0xD0,0x01,0x3B,0xDB,0xB2,0x84,0x4D, +0x84,0x49,0x00,0xE0,0x13,0x1C,0x9A,0x00,0xD2,0x18,0x52,0x00,0x8A,0x18,0x3C,0x26, +0x90,0x5F,0x5A,0x1E,0x46,0x1E,0xB0,0x41,0xE8,0x54,0xD2,0xB2,0x00,0x2B,0xF1,0xD1, +0xFC,0xF7,0x82,0xFF,0x00,0x28,0xFB,0xD1,0x23,0x23,0xE4,0x5C,0x07,0x94,0x00,0x2C, +0x00,0xD1,0xA3,0xE0,0x78,0x4B,0x60,0x22,0x19,0x78,0x78,0x4B,0x09,0x01,0x1B,0x78, +0x52,0x42,0x0A,0x43,0x76,0x4C,0x20,0x21,0x1B,0x01,0x0B,0x43,0x34,0x21,0x61,0x5C, +0x74,0x48,0x09,0x91,0x00,0x21,0x74,0x4F,0x08,0x91,0x6E,0x49,0xD2,0xB2,0xDB,0xB2, +0x0A,0x92,0x0B,0x93,0xC4,0x19,0x00,0x23,0x01,0x22,0x01,0x91,0x3E,0xE0,0x01,0x99, +0x6E,0x4D,0x6F,0x4F,0xC9,0x18,0x8C,0x46,0x79,0x5D,0x6E,0x4F,0xFD,0x18,0x67,0x46, +0xBF,0x88,0x04,0x97,0xAF,0x88,0x06,0x97,0x67,0x46,0x3F,0x8C,0xBC,0x46,0x2F,0x8B, +0x03,0x97,0x00,0x29,0x22,0xD1,0x61,0x46,0x09,0xB2,0x6F,0x46,0x05,0x91,0x0C,0x37, +0x00,0x21,0x79,0x5E,0x05,0x9F,0x79,0x1A,0xCF,0x17,0xC9,0x19,0x79,0x40,0x09,0x9F, +0xB9,0x42,0x65,0xDA,0x10,0x27,0x69,0x46,0x79,0x5E,0x03,0x91,0x69,0x46,0x18,0x31, +0x00,0x27,0xCF,0x5F,0x03,0x99,0xCF,0x1B,0xF9,0x17,0x7F,0x18,0x4F,0x40,0x09,0x99, +0xB9,0x42,0x55,0xDD,0x2C,0x27,0xED,0x5F,0x00,0x2D,0x57,0xDD,0x07,0x9E,0x55,0x1C, +0x02,0x33,0x01,0x30,0x0C,0x34,0x96,0x42,0x45,0xDD,0x2A,0x1C,0x01,0x9D,0x9E,0x00, +0xF6,0x18,0xAE,0x19,0x3C,0x27,0xF5,0x5F,0x00,0x2D,0xB8,0xDC,0x4D,0x4E,0xF5,0x18, +0x2C,0x27,0xEE,0x5F,0x00,0x2E,0xE9,0xDD,0x06,0x78,0x00,0x2E,0xE6,0xD0,0x05,0x21, +0x69,0x56,0x2E,0x8B,0x8C,0x46,0x08,0x99,0xAD,0x88,0xC9,0x00,0x37,0xB2,0x03,0x91, +0x04,0x95,0x61,0x46,0x0F,0x25,0x0D,0x40,0x3F,0x11,0x0F,0x21,0x8F,0x43,0x03,0x99, +0x2F,0x43,0x8C,0x46,0x3E,0x49,0x08,0x9D,0x8C,0x44,0x0B,0x99,0x01,0x35,0x11,0x43, +0x05,0x95,0x65,0x46,0x29,0x70,0x6F,0x70,0x6D,0x46,0x10,0x27,0x7F,0x5D,0x00,0x21, +0x65,0x46,0xEE,0x70,0xAF,0x70,0x29,0x71,0x69,0x71,0xA9,0x71,0xE9,0x71,0x14,0x26, +0x6D,0x46,0x75,0x5D,0x07,0x9E,0x08,0x95,0x01,0x70,0x55,0x1C,0x02,0x33,0x01,0x30, +0x0C,0x34,0x96,0x42,0xB9,0xDC,0x08,0x9F,0x00,0x2F,0x42,0xD1,0x0D,0xB0,0xF0,0xBD, +0x2D,0x4F,0xD7,0x19,0x01,0x3F,0x3F,0x78,0x00,0x2F,0xA3,0xD0,0x69,0x46,0x10,0x27, +0x7D,0x5E,0x08,0x99,0x2D,0x12,0x03,0x95,0xC9,0x00,0x05,0x9D,0x02,0x91,0x03,0x99, +0x2F,0x11,0x0F,0x25,0x0D,0x40,0x40,0x36,0x03,0x95,0x36,0x78,0x0F,0x25,0xAF,0x43, +0x05,0x97,0x06,0x96,0x02,0x9F,0x1E,0x4E,0x05,0x99,0xF5,0x19,0x0A,0x9F,0x03,0x9E, +0x17,0x43,0x0E,0x43,0x2F,0x70,0x6E,0x70,0x10,0x27,0x6E,0x46,0xBE,0x5D,0x69,0x46, +0xAE,0x70,0x18,0x26,0x71,0x5C,0x67,0x46,0xEF,0x70,0x29,0x71,0x26,0x78,0x6E,0x71, +0x66,0x68,0xFF,0x2E,0x00,0xDD,0xFF,0x26,0xAE,0x71,0xA6,0x68,0xFF,0x2E,0x00,0xDD, +0xFF,0x26,0x08,0x9F,0xEE,0x71,0x01,0x37,0xFF,0xB2,0x01,0x25,0x08,0x97,0x05,0x70, +0x6C,0xE7,0x0E,0x4B,0x1F,0x60,0xFC,0xF7,0x39,0xFE,0xB7,0xE7,0xAE,0x09,0x00,0x20, +0xEC,0x01,0x00,0x20,0x9C,0x0D,0x00,0x20,0xF5,0x00,0x00,0x20,0xF4,0x00,0x00,0x20, +0x48,0x0D,0x00,0x20,0xF4,0x16,0x00,0x20,0x38,0xFC,0xFF,0xFF,0x04,0x05,0x00,0x00, +0xEC,0x11,0x00,0x20,0x20,0x01,0x00,0x20,0x64,0x01,0x00,0x20,0x98,0x0D,0x00,0x20, +0x10,0xB5,0x04,0x1C,0xFC,0xF7,0x70,0xFE,0x00,0x28,0xFB,0xD1,0x0A,0x4B,0x01,0x2C, +0x02,0xD0,0x02,0x2C,0x05,0xD1,0x02,0xE0,0x0F,0x22,0x1A,0x70,0x01,0xE0,0x0E,0x22, +0x1A,0x70,0x00,0x22,0xDA,0x70,0x9A,0x70,0x5A,0x70,0x04,0x4B,0x01,0x22,0x1A,0x60, +0xFC,0xF7,0x04,0xFE,0x10,0xBD,0xC0,0x46,0xEC,0x11,0x00,0x20,0x98,0x0D,0x00,0x20, +0xF0,0xB5,0x8B,0xB0,0x14,0x28,0x00,0xD9,0xC2,0xE3,0xFE,0xF7,0x09,0xFF,0x15,0x00, +0xC1,0x03,0x45,0x00,0xC1,0x03,0x7B,0x00,0xC1,0x03,0x86,0x00,0xAA,0x00,0xC1,0x03, +0x1D,0x01,0xC1,0x03,0xC1,0x03,0x6A,0x01,0xC1,0x03,0x76,0x01,0x73,0x03,0xDF,0x02, +0xC1,0x03,0xC1,0x03,0xAB,0x03,0xBC,0x03,0xCA,0x4B,0xCB,0x4C,0x1B,0x78,0x00,0x2B, +0x27,0xD1,0x01,0x23,0xF2,0x20,0x23,0x72,0xE0,0x70,0xFE,0xF7,0xD9,0xFD,0xC7,0x4B, +0x20,0x70,0x1B,0x78,0xAA,0x2B,0x00,0xD0,0x9A,0xE3,0xC5,0x4A,0xC5,0x4B,0x11,0x78, +0xC5,0x4A,0x1B,0x78,0x12,0x78,0xC9,0x18,0x91,0x42,0x00,0xD0,0x90,0xE3,0xC3,0x4A, +0xE0,0x78,0x40,0x32,0x12,0x78,0x59,0xB2,0x41,0x18,0x89,0x18,0xFF,0x29,0x03,0xDD, +0xD2,0x43,0xD2,0xB2,0xE2,0x70,0x83,0xE3,0xE2,0x78,0xD3,0x18,0xDB,0xB2,0xE3,0x70, +0x7E,0xE3,0xE3,0x78,0xA3,0x70,0x7B,0xE3,0xE0,0x23,0xB9,0x49,0xDB,0x01,0x00,0x22, +0x01,0xCB,0x12,0x18,0x8B,0x42,0xFB,0xD1,0x19,0x68,0x00,0x23,0x8A,0x42,0x03,0xD0, +0xB4,0x4B,0xFF,0x22,0x9A,0x70,0x01,0x23,0xF0,0x22,0xB3,0x48,0xD2,0x01,0x00,0x21, +0x10,0xCA,0x09,0x19,0x82,0x42,0xFB,0xD1,0x12,0x68,0x91,0x42,0x03,0xD0,0xAD,0x4B, +0xFF,0x22,0xDA,0x70,0x01,0xE0,0x00,0x2B,0x00,0xD0,0xFE,0xE7,0xAB,0x4A,0xA0,0x21, +0x13,0x70,0xAB,0x4A,0xC9,0x00,0x53,0x54,0xAA,0x49,0xA1,0x20,0x53,0x54,0xAA,0x49, +0xC0,0x00,0x53,0x54,0x0A,0x21,0x12,0x18,0x01,0x39,0xC9,0xB2,0x53,0x54,0x00,0x29, +0xFA,0xD1,0x45,0xE3,0xA5,0x49,0x00,0x23,0x0A,0x68,0x9A,0x42,0x02,0xDD,0x4B,0x68, +0xD3,0x18,0xDB,0x0F,0xA2,0x4A,0x13,0x70,0x3A,0xE3,0xA2,0x4B,0x9C,0x49,0x9B,0x69, +0x9C,0x4A,0x00,0x2B,0x0D,0xD1,0x8B,0x5C,0x19,0x20,0x01,0x2B,0x11,0xD0,0x9E,0x4B, +0x1B,0x78,0x01,0x2B,0x02,0xD1,0x9D,0x4B,0x98,0x7E,0x0A,0xE0,0x9C,0x4B,0x98,0x7E, +0x07,0xE0,0x8A,0x5C,0x08,0x20,0x01,0x2A,0x03,0xD1,0x19,0x20,0x03,0x2B,0x00,0xD0, +0x08,0x20,0x98,0x4B,0x80,0x01,0x19,0x68,0xFE,0xF7,0xBA,0xFE,0x87,0x4B,0x98,0x76, +0x16,0xE3,0x90,0x4B,0x00,0x22,0x1A,0x60,0x8F,0x4A,0x11,0x78,0x92,0x4A,0x00,0x29, +0x03,0xD0,0x02,0x21,0x11,0x70,0x08,0x27,0x08,0xE0,0x01,0x21,0x11,0x70,0x87,0x4A, +0x06,0x27,0x08,0x21,0x52,0x5E,0x22,0x2A,0x00,0xDC,0x03,0x27,0x5D,0x69,0x1C,0x69, +0x1B,0x68,0x00,0x26,0x05,0x95,0x04,0x94,0x03,0x93,0x02,0x96,0x1A,0x25,0x47,0xE0, +0x00,0x20,0x0E,0x23,0xAE,0x1C,0x01,0x3B,0xDB,0xB2,0x5A,0x1C,0x92,0x01,0x83,0x49, +0x92,0x19,0x52,0x00,0x52,0x5A,0x0C,0x1C,0x12,0xB2,0x80,0x18,0x00,0x2B,0xF2,0xD1, +0x1C,0x21,0xFE,0xF7,0x85,0xFE,0xFA,0x0F,0x06,0x90,0x0E,0x23,0x07,0x92,0x01,0x3B, +0xDB,0xB2,0x58,0x1C,0x82,0x01,0x92,0x19,0x00,0x90,0x52,0x00,0xA2,0x5A,0x90,0xB2, +0x11,0xB2,0x02,0x9A,0x8A,0x42,0x03,0xDA,0xC1,0xB2,0x02,0x91,0x05,0x95,0x04,0x93, +0x06,0x9A,0x80,0x1A,0x80,0xB2,0x01,0x90,0x68,0x46,0x04,0x22,0x82,0x5E,0x00,0x98, +0x81,0x01,0x89,0x19,0x49,0x00,0x00,0x2A,0x0D,0xDD,0x00,0x91,0x68,0x46,0x61,0x5A, +0x81,0x88,0x00,0x98,0x21,0x52,0x07,0x98,0xD1,0x17,0xBA,0x42,0x41,0x41,0x03,0x9A, +0x52,0x18,0x03,0x92,0x02,0xE0,0x00,0x20,0x62,0x5A,0x60,0x52,0x00,0x2B,0xCE,0xD1, +0x01,0x3D,0xED,0xB2,0xFF,0x2D,0xB3,0xD1,0x5A,0x4B,0x04,0x9C,0x05,0x9D,0x03,0x9E, +0x1C,0x61,0x5D,0x61,0x1E,0x60,0xA3,0xE2,0x5D,0x4B,0x5E,0x48,0x00,0x24,0x1C,0x60, +0x82,0x68,0xC3,0x68,0x9A,0x42,0x00,0xDA,0x9A,0xE2,0x0C,0x25,0xD6,0x0F,0x95,0x42, +0x66,0x41,0x92,0x19,0xDE,0x17,0x41,0x68,0xF6,0x1A,0x00,0x68,0xF6,0x0F,0x9B,0x1B, +0x18,0x27,0xC6,0x0F,0x87,0x42,0x66,0x41,0x80,0x19,0xCE,0x17,0x76,0x1A,0xF6,0x0F, +0x89,0x1B,0x41,0x1A,0xC8,0x0F,0x8D,0x42,0x44,0x41,0xE4,0xB2,0x00,0x2C,0x08,0xD1, +0xD3,0x1A,0xD9,0x0F,0x0B,0x22,0x9A,0x42,0x4C,0x41,0xE4,0xB2,0x00,0x2C,0x00,0xD1, +0x76,0xE2,0x49,0x4B,0x1A,0x78,0x0E,0x23,0x00,0x2A,0x13,0xD1,0x70,0xE2,0x5F,0x1C, +0x1A,0x22,0xBF,0x01,0x01,0x3A,0xD2,0xB2,0x91,0x1C,0x79,0x18,0x0D,0x5D,0x00,0x2D, +0x02,0xD0,0x01,0x25,0x0D,0x55,0x02,0xE0,0x49,0x00,0x0E,0x5A,0x0D,0x52,0x00,0x2A, +0xF0,0xD1,0x01,0xE0,0x3D,0x4C,0x39,0x48,0x01,0x3B,0xDB,0xB2,0xFF,0x2B,0xE6,0xD1, +0x56,0xE2,0x3B,0x4B,0x34,0x33,0x1A,0x78,0x00,0x2A,0x00,0xD0,0x50,0xE2,0x01,0x22, +0x1A,0x70,0x02,0x20,0xFF,0xF7,0x64,0xFE,0x4A,0xE2,0x2A,0x4B,0x27,0x4A,0x99,0x69, +0x01,0x29,0x79,0xD0,0x28,0x48,0x04,0x78,0xFF,0x20,0x01,0x2C,0x00,0xD0,0x10,0x20, +0x14,0x89,0x25,0x1C,0x0B,0x3D,0xAD,0xB2,0x09,0x2D,0x00,0xD9,0x88,0xE0,0x0C,0x27, +0xD2,0x5F,0x05,0x2A,0x00,0xDD,0x83,0xE0,0x2A,0x4A,0x24,0xB2,0x40,0x32,0x12,0x78, +0xA2,0x42,0x00,0xDB,0x7C,0xE0,0x28,0x4A,0x12,0x68,0x82,0x42,0x78,0xDA,0x00,0x29, +0x03,0xD1,0x18,0x4B,0x03,0x22,0x9A,0x61,0x74,0xE0,0x03,0x29,0x72,0xD1,0x11,0x4A, +0x0F,0x4B,0x99,0x5C,0xA0,0x22,0xD2,0x00,0x01,0x29,0x3F,0xD1,0x99,0x5C,0x01,0x31, +0x99,0x54,0x3E,0xE0,0xE5,0x01,0x00,0x20,0xAA,0x0A,0x00,0x20,0x28,0x7C,0x00,0x00, +0x29,0x7C,0x00,0x00,0x2A,0x7C,0x00,0x00,0x2B,0x7C,0x00,0x00,0x48,0x0D,0x00,0x20, +0xF8,0x73,0x00,0x00,0x2D,0x00,0x00,0x20,0xF8,0x7B,0x00,0x00,0x54,0x00,0x00,0x20, +0xEC,0x11,0x00,0x20,0x0C,0x05,0x00,0x00,0x04,0x05,0x00,0x00,0x70,0x01,0x00,0x20, +0x3D,0x11,0x00,0x20,0xF8,0x08,0x00,0x20,0xDD,0x01,0x00,0x20,0x9A,0x74,0x00,0x00, +0x4A,0x74,0x00,0x00,0x78,0x09,0x00,0x20,0x40,0x00,0x00,0x20,0x00,0x40,0x00,0x40, +0x38,0x0D,0x00,0x20,0xE4,0x10,0x00,0x20,0xF5,0x00,0x00,0x20,0x00,0x20,0x00,0x40, +0xAE,0x09,0x00,0x20,0x9C,0x0D,0x00,0x20,0x4C,0x11,0x00,0x20,0x99,0x5C,0x02,0x31, +0x99,0x54,0x9A,0x5C,0x01,0x2A,0x25,0xD9,0xB5,0x4A,0x01,0x21,0x91,0x61,0xA0,0x22, +0x00,0x21,0xD2,0x00,0x99,0x54,0x1D,0xE0,0x10,0x89,0xB2,0x49,0x04,0x1C,0x0A,0x3C, +0xA4,0xB2,0x0A,0x2C,0x0B,0xD8,0x0C,0x24,0x12,0x5F,0x05,0x2A,0x07,0xDC,0x0A,0x1C, +0x40,0x32,0x12,0x78,0x00,0xB2,0x82,0x42,0x01,0xDA,0x00,0x22,0xDA,0x60,0xDA,0x68, +0x59,0x2A,0x05,0xDC,0x09,0x68,0x00,0x29,0x04,0xD1,0x01,0x32,0xDA,0x60,0x01,0xE0, +0x00,0x22,0x9A,0x61,0xA4,0x4B,0x1A,0x78,0xA1,0x4B,0x00,0x2A,0x08,0xD1,0x99,0x69, +0x01,0x29,0x05,0xD1,0xA1,0x49,0x08,0x25,0x49,0x5F,0x21,0x29,0x00,0xDD,0x9A,0x61, +0x99,0x69,0x9F,0x4B,0x01,0x29,0x06,0xD1,0x3C,0x22,0xDA,0x85,0x0F,0x22,0xDA,0x84, +0x0A,0x22,0x1A,0x85,0x0A,0xE0,0x2D,0x20,0xD8,0x85,0x28,0x21,0x00,0x2A,0x02,0xD0, +0xD8,0x84,0x19,0x85,0x02,0xE0,0x23,0x22,0xD9,0x84,0x1A,0x85,0x92,0x4B,0x19,0x78, +0x00,0x29,0x68,0xD1,0x8F,0x4B,0x1B,0x68,0x00,0x2B,0x64,0xDD,0x90,0x4A,0x8C,0x4B, +0x12,0x7F,0x18,0x7D,0x52,0xB2,0x02,0x92,0x1A,0x69,0x02,0x38,0x02,0x3A,0x02,0x24, +0xC0,0xB2,0xD2,0xB2,0x64,0x42,0x0F,0x1C,0x0B,0x1C,0x04,0x90,0x21,0xE0,0x1E,0x1C, +0x19,0x22,0x82,0x42,0x5E,0x41,0xF6,0xB2,0x00,0x2E,0x0F,0xD0,0x66,0x46,0x00,0x2E, +0x0C,0xD0,0x03,0x9A,0x86,0x1C,0x96,0x19,0x82,0x4A,0x76,0x00,0xB6,0x5A,0x02,0x9A, +0x96,0x42,0x03,0xDB,0xF7,0x19,0x01,0x31,0xBF,0xB2,0xC9,0xB2,0x01,0x30,0x01,0x35, +0xC0,0xB2,0x03,0x2D,0xE3,0xD1,0x05,0x9A,0x01,0x34,0x01,0x32,0xD2,0xB2,0x03,0x2C, +0x0D,0xD0,0x0D,0x25,0x18,0x1C,0x95,0x42,0x58,0x41,0x56,0x1C,0xC0,0xB2,0x02,0x25, +0xB6,0x01,0x84,0x46,0x6D,0x42,0x04,0x98,0x03,0x96,0x05,0x92,0xCF,0xE7,0x6F,0x4B, +0x1E,0x89,0x6B,0x4B,0x9C,0x69,0x00,0x2C,0x1D,0xD1,0xF5,0x01,0x7D,0x19,0x2D,0xB2, +0x01,0x31,0x28,0x1C,0xFE,0xF7,0xD4,0xFC,0x6B,0x4B,0x80,0xB2,0x27,0x1C,0x83,0x42, +0x67,0x41,0xFB,0xB2,0x00,0x2B,0x0E,0xD0,0x68,0x4B,0xEA,0x0F,0xAB,0x42,0x54,0x41, +0xE4,0xB2,0x00,0x2C,0x07,0xD0,0x5F,0x4B,0x36,0xB2,0x40,0x33,0x1B,0x78,0xB3,0x42, +0x01,0xDD,0xFB,0xF7,0x01,0xFB,0x62,0x4B,0x0A,0x24,0x1A,0x78,0x59,0x4D,0x53,0x42, +0x5A,0x41,0x5B,0x4B,0x52,0x00,0x32,0x33,0x1A,0x70,0x27,0x1C,0x01,0x3C,0xE4,0xB2, +0x39,0x1C,0x61,0x43,0x6B,0x18,0x3C,0x20,0x1B,0x5E,0x00,0x2B,0x15,0xD0,0x63,0x00, +0xEB,0x18,0x04,0x22,0x9B,0x5E,0x0C,0x20,0x08,0x93,0x23,0x1C,0x10,0x33,0x60,0x43, +0x5B,0x00,0x5B,0x5F,0x41,0x30,0x09,0x93,0x52,0x4B,0xFF,0x30,0x69,0x18,0xC0,0x18, +0x41,0x31,0x08,0xAA,0x23,0x1C,0xFE,0xF7,0x69,0xFF,0x3B,0x1C,0x63,0x43,0x45,0x4E, +0x43,0x4A,0xF6,0x18,0x38,0x36,0x33,0x7A,0x10,0x68,0x58,0x43,0x4A,0x4B,0x19,0x68, +0xFE,0xF7,0x86,0xFC,0x30,0x72,0x00,0x2C,0xD0,0xD1,0xE1,0xE0,0x3E,0x4B,0x1B,0x78, +0x00,0x2B,0x00,0xD0,0xDC,0xE0,0x3E,0x4B,0x42,0x49,0x32,0x33,0x18,0x78,0x38,0x4B, +0x42,0x4C,0x9B,0x69,0x47,0x1E,0x02,0x93,0x0B,0x5D,0xBC,0x46,0x0A,0x22,0x01,0x3A, +0xD2,0xB2,0x0C,0x21,0x51,0x43,0x3B,0x4C,0x32,0x4D,0x61,0x18,0x0C,0x1C,0x05,0x31, +0xFF,0x31,0x4E,0x6C,0x0A,0x21,0x51,0x43,0xFC,0x34,0x69,0x18,0xA7,0x6C,0x3C,0x25, +0x4C,0x5F,0x38,0x31,0x00,0x2C,0x22,0xD0,0xBC,0x1B,0xE5,0x17,0x64,0x19,0x6C,0x40, +0x33,0x4D,0xE4,0xB2,0xAD,0x56,0x65,0x45,0x0F,0xD1,0x11,0x2C,0x16,0xD8,0x02,0x9C, +0x00,0x2C,0x14,0xD0,0x28,0x2F,0x11,0xDC,0x28,0x2E,0x0F,0xDC,0x06,0x25,0x4C,0x5F, +0x09,0x7A,0x02,0x34,0x8C,0x42,0x0A,0xDA,0x08,0xE0,0x85,0x42,0x07,0xDB,0x00,0x2B, +0x05,0xD1,0x14,0x23,0xA3,0x42,0x9B,0x41,0x5B,0x42,0x00,0xE0,0x01,0x23,0x00,0x2A, +0xC5,0xD1,0x18,0x4C,0x0A,0x21,0x01,0x39,0xC9,0xB2,0x00,0x2B,0x0D,0xD0,0x0A,0x25, +0x4D,0x43,0x65,0x19,0x3E,0x27,0xEE,0x5F,0x00,0x20,0x02,0x96,0x02,0x9F,0x14,0x25, +0xF6,0x0F,0xBD,0x42,0x46,0x41,0x75,0x42,0x2B,0x40,0x0A,0x25,0x4D,0x43,0x65,0x19, +0x3C,0x20,0x2D,0x5E,0x00,0x2D,0x01,0xD0,0x01,0x32,0xD2,0xB2,0x00,0x29,0xE2,0xD1, +0x10,0x49,0x12,0x4C,0x0B,0x55,0x00,0x2A,0x72,0xD1,0x11,0x48,0x0A,0x23,0x01,0x3B, +0xDB,0xB2,0xC2,0x54,0x00,0x2B,0xFA,0xD1,0x0C,0x4D,0x4B,0x55,0x68,0xE0,0xC0,0x46, +0xF8,0x08,0x00,0x20,0x9C,0x0D,0x00,0x20,0xDD,0x01,0x00,0x20,0x70,0x01,0x00,0x20, +0x48,0x0D,0x00,0x20,0x00,0x40,0x00,0x40,0x8F,0x01,0x00,0x00,0x5F,0x09,0x00,0x00, +0xF5,0x00,0x00,0x20,0xEC,0x11,0x00,0x20,0x4C,0x11,0x00,0x20,0x04,0x05,0x00,0x00, +0x3E,0x11,0x00,0x20,0x27,0x4B,0x9A,0x69,0x00,0x2A,0x10,0xD0,0x26,0x4A,0x12,0x68, +0x00,0x2A,0x0C,0xDD,0x25,0x4A,0x12,0x68,0x01,0x2A,0x08,0xD1,0x24,0x4A,0x12,0x78, +0x00,0x2A,0x04,0xD0,0x23,0x4A,0x12,0x68,0x00,0x2A,0x00,0xD1,0x9A,0x61,0x9A,0x69, +0x00,0x2A,0x04,0xD1,0xA0,0x21,0x20,0x48,0xC9,0x00,0x42,0x54,0xDA,0x60,0x9A,0x68, +0x01,0x2A,0x2D,0xD1,0x00,0x22,0x9A,0x60,0x5B,0x68,0x01,0x2B,0x07,0xD1,0x1B,0x4A, +0x13,0x70,0x1B,0x4A,0x34,0x32,0x13,0x70,0x1A,0x4A,0x13,0x70,0x20,0xE0,0x00,0x2B, +0x1E,0xD1,0x16,0x4A,0x13,0x70,0x16,0x4A,0x34,0x32,0x13,0x70,0x15,0x4B,0x02,0x22, +0x1A,0x70,0x15,0xE0,0x14,0x4B,0x04,0x22,0x9A,0x70,0xDC,0x22,0x52,0x00,0x9A,0x80, +0x40,0x22,0x9A,0x71,0x06,0x22,0xDA,0x71,0x01,0x22,0x1A,0x72,0x03,0x22,0x5A,0x72, +0x00,0x22,0x1A,0x70,0x04,0xE0,0x0C,0x48,0x0C,0x49,0x50,0x22,0xFE,0xF7,0x02,0xFC, +0x0B,0xB0,0xF0,0xBD,0xF8,0x08,0x00,0x20,0x20,0x01,0x00,0x20,0x9C,0x0D,0x00,0x20, +0x48,0x11,0x00,0x20,0xBC,0x11,0x00,0x20,0xEC,0x11,0x00,0x20,0xDD,0x01,0x00,0x20, +0xAE,0x09,0x00,0x20,0xB3,0x01,0x00,0x20,0x48,0x0D,0x00,0x20,0x4A,0x74,0x00,0x00, +0x38,0xB5,0x50,0x28,0x05,0xD1,0x3B,0x4B,0x01,0x20,0x18,0x60,0xFE,0xF7,0xBC,0xFD, +0x6F,0xE0,0x39,0x4B,0x40,0x28,0x01,0xD1,0x01,0x24,0x1C,0x70,0x1B,0x78,0x00,0x2B, +0x67,0xD0,0x41,0x38,0x0E,0x28,0x64,0xD8,0xFE,0xF7,0x10,0xFB,0x08,0x12,0x08,0x2D, +0x08,0x47,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x5E,0x00,0x2F,0x4B,0x01,0x22, +0x1A,0x70,0x2F,0x4B,0x1A,0x80,0x2F,0x4A,0x13,0x60,0xFC,0xF7,0xF7,0xF9,0x50,0xE0, +0x2A,0x48,0x2C,0x4B,0xFF,0x2A,0x0B,0xD1,0x2B,0x4A,0xC9,0x01,0x12,0x78,0x52,0x00, +0xD2,0xB2,0x02,0x70,0x29,0x4A,0x89,0x18,0x19,0x60,0xFC,0xF7,0xE7,0xF9,0x40,0xE0, +0x89,0x01,0x8A,0x18,0x25,0x49,0x52,0x00,0x02,0x24,0x52,0x18,0x04,0x70,0x1A,0x60, +0xFC,0xF7,0xDC,0xF9,0x35,0xE0,0x1D,0x4C,0x1E,0x4B,0x21,0x48,0xFF,0x2A,0x0A,0xD1, +0x1D,0x4A,0x89,0x01,0x12,0x78,0x40,0x18,0x52,0x00,0xD2,0xB2,0x22,0x70,0x18,0x60, +0xFC,0xF7,0xCC,0xF9,0x25,0xE0,0x49,0x01,0x52,0x18,0x52,0x00,0x02,0x25,0x80,0x18, +0x25,0x70,0x18,0x60,0xFC,0xF7,0xC2,0xF9,0x1B,0xE0,0x10,0x4C,0x11,0x4B,0x15,0x48, +0xFF,0x2A,0x08,0xD1,0x10,0x4A,0x49,0x01,0x92,0x78,0x40,0x18,0x22,0x70,0x18,0x60, +0xFC,0xF7,0xB4,0xF9,0x0D,0xE0,0x49,0x01,0x52,0x18,0x01,0x25,0x80,0x18,0x25,0x70, +0x18,0x60,0xFC,0xF7,0xAB,0xF9,0x04,0xE0,0x0B,0x4A,0x00,0x23,0x13,0x70,0x02,0x4A, +0x13,0x70,0x38,0xBD,0x50,0x11,0x00,0x20,0xE5,0x01,0x00,0x20,0xF6,0x03,0x00,0x20, +0x08,0x03,0x00,0x20,0x34,0x0D,0x00,0x20,0x0A,0x03,0x00,0x20,0x84,0x40,0x00,0x40, +0xF8,0x03,0x00,0x20,0xB3,0x0A,0x00,0x20,0x1D,0x03,0x00,0x20,0x08,0xB5,0x35,0x4B, +0x1B,0x88,0x33,0x2B,0x29,0xD0,0x06,0xD8,0x0A,0x2B,0x2F,0xD0,0x30,0x2B,0x11,0xD0, +0x01,0x2B,0x5D,0xD1,0x06,0xE0,0xA0,0x2B,0x32,0xD0,0xB0,0x2B,0x4C,0xD0,0x5F,0x2B, +0x56,0xD1,0x3F,0xE0,0x2C,0x4A,0x11,0x78,0x0E,0x22,0x11,0x42,0x50,0xD1,0x2B,0x4A, +0x13,0x70,0x4D,0xE0,0x28,0x4B,0x2A,0x4A,0x1B,0x78,0x12,0x78,0x01,0x2B,0x05,0xD1, +0x00,0x2A,0x45,0xD1,0x27,0x4A,0x53,0x60,0x93,0x60,0x41,0xE0,0x01,0x2A,0x3F,0xD1, +0x24,0x4B,0x00,0x21,0x59,0x60,0x9A,0x60,0x3A,0xE0,0x1F,0x4B,0x22,0x4A,0x19,0x78, +0x22,0x4B,0x01,0x29,0x00,0xD0,0x00,0x21,0xD1,0x54,0x31,0xE0,0x20,0x4B,0x1A,0x78, +0x00,0x2A,0x02,0xD1,0x01,0x22,0x1A,0x70,0x2A,0xE0,0x00,0x22,0x1A,0x70,0x27,0xE0, +0x15,0x4B,0x1C,0x4A,0x18,0x78,0x1C,0x4B,0x1A,0x28,0x06,0xD1,0x19,0x78,0x1B,0x4B, +0x10,0x78,0x1A,0x78,0xFF,0xF7,0xB0,0xF9,0x1A,0xE0,0x11,0x78,0x1A,0x78,0xFF,0xF7, +0x1F,0xFF,0x15,0xE0,0x0C,0x4B,0x1B,0x78,0x00,0x2B,0x11,0xD0,0x14,0x4B,0x08,0x22, +0x1A,0x60,0xFA,0xF7,0xAD,0xFB,0x0B,0xE0,0x07,0x4B,0x1B,0x78,0x1A,0x2B,0x07,0xD1, +0x0C,0x4B,0x18,0x78,0x0C,0x4B,0x19,0x78,0x0C,0x4B,0x1A,0x78,0xFF,0xF7,0x94,0xF9, +0x08,0xBD,0xC0,0x46,0x28,0x00,0x00,0x20,0x0C,0x00,0x00,0x50,0xE8,0x01,0x00,0x20, +0xDD,0x01,0x00,0x20,0xF8,0x08,0x00,0x20,0xEC,0x11,0x00,0x20,0x0C,0x05,0x00,0x00, +0xDF,0x01,0x00,0x20,0x0E,0x00,0x00,0x50,0x0D,0x00,0x00,0x50,0x10,0x00,0x00,0x50, +0x50,0x11,0x00,0x20,0x00,0x01,0x02,0x03,0x04,0x04,0x05,0x06,0x07,0x08,0x09,0x0A, +0x0B,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x11,0x12,0x13,0x14,0x15,0x15,0x16,0x17, +0x18,0x18,0x19,0x1A,0x1B,0x1B,0x1C,0x1D,0x1D,0x1E,0x1F,0x1F,0x20,0x21,0x21,0x22, +0x23,0x23,0x24,0x24,0x25,0x25,0x26,0x27,0x27,0x28,0x28,0x29,0x29,0x2A,0x2A,0x2B, +0x2B,0x2C,0x2C,0x2D,0x00,0x00,0x78,0x04,0xEF,0x08,0x66,0x0D,0xDB,0x11,0x50,0x16, +0xC2,0x1A,0x33,0x1F,0xA1,0x23,0x0C,0x28,0x74,0x2C,0xD9,0x30,0x39,0x35,0x96,0x39, +0xEE,0x3D,0x42,0x42,0x90,0x46,0xD9,0x4A,0x1B,0x4F,0x58,0x53,0x8E,0x57,0xBE,0x5B, +0xE6,0x5F,0x07,0x64,0x1F,0x68,0x30,0x6C,0x39,0x70,0x38,0x74,0x2F,0x78,0x1C,0x7C, +0xFF,0x7F,0xD9,0x83,0xA8,0x87,0x6D,0x8B,0x27,0x8F,0xD5,0x92,0x79,0x96,0x10,0x9A, +0x9B,0x9D,0x1B,0xA1,0x8D,0xA4,0xF3,0xA7,0x4B,0xAB,0x97,0xAE,0xD4,0xB1,0x04,0xB5, +0x26,0xB8,0x39,0xBB,0x3E,0xBE,0x34,0xC1,0x1B,0xC4,0xF2,0xC6,0xBA,0xC9,0x73,0xCC, +0x1B,0xCF,0xB3,0xD1,0x3B,0xD4,0xB2,0xD6,0x19,0xD9,0x6E,0xDB,0xB3,0xDD,0xE6,0xDF, +0x08,0xE2,0x18,0xE4,0x16,0xE6,0x03,0xE8,0xDD,0xE9,0xA5,0xEB,0x5B,0xED,0xFE,0xEE, +0x8F,0xF0,0x0D,0xF2,0x77,0xF3,0xCF,0xF4,0x14,0xF6,0x46,0xF7,0x64,0xF8,0x6F,0xF9, +0x67,0xFA,0x4B,0xFB,0x1B,0xFC,0xD8,0xFC,0x81,0xFD,0x17,0xFE,0x98,0xFE,0x06,0xFF, +0x5F,0xFF,0xA5,0xFF,0xD7,0xFF,0xF5,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x87,0xD2,0x63,0x68,0x00,0x00,0x45,0x22, +0x4D,0x31,0x48,0x30,0x50,0x42,0x34,0x35,0x25,0x44,0x01,0x34,0x38,0x30,0x47,0x59, +0x30,0x31,0x00,0x00,0x00,0x48,0x10,0x5A,0x28,0x1E,0x01,0x01,0x00,0x00,0x00,0x1A, +0x0E,0x00,0x00,0x1A,0x0E,0x00,0x00,0x00,0x01,0x01,0x00,0x0A,0x00,0x00,0x00,0x05, +0xD0,0x02,0x00,0x00,0x00,0x01,0x01,0x50,0x50,0x50,0x01,0x01,0x00,0x00,0x62,0x00, +0x4B,0x00,0x23,0x00,0x04,0x03,0x32,0x32,0x10,0x00,0x01,0x01,0x04,0x00,0x08,0x02, +0x18,0x03,0x03,0x03,0x00,0x00,0x00,0x04,0x05,0x0F,0x00,0x07,0x05,0x00,0xC0,0xF9, +0x14,0x1E,0x0A,0xF6,0x0F,0x00,0x05,0x14,0x1E,0x00,0xA2,0x29,0xDE,0x01,0x00,0x00, +0x28,0x00,0x23,0x00,0x0F,0x0A,0x3C,0x01,0x2D,0x00,0x00,0x00,0x02,0x01,0x01,0x14, +0x32,0x00,0x32,0x00,0xFF,0x7F,0x00,0x01,0x01,0x07,0x0B,0x00,0x32,0x00,0x0A,0x05, +0xD0,0x03,0xB3,0x00,0xFF,0x7F,0x00,0x80,0x01,0x00,0x01,0x01,0x04,0x00,0x08,0x02, +0x30,0x04,0x03,0x03,0x00,0x00,0x00,0x04,0x05,0x0F,0x00,0x08,0x06,0x00,0xC0,0xF9, +0x14,0x1E,0x0A,0xF6,0x19,0x00,0x08,0x23,0x1E,0x00,0xA2,0x29,0xDE,0x01,0x00,0x00, +0x2D,0x00,0x28,0x00,0x0F,0x0A,0x3C,0x01,0x2D,0x00,0x1E,0x00,0x02,0x01,0x01,0x14, +0x96,0x00,0x32,0x00,0xFF,0x7F,0x01,0x01,0x01,0x07,0x0A,0x00,0x32,0x00,0x0A,0x05, +0xD0,0x03,0xB3,0x00,0xFF,0x7F,0x00,0x80,0x19,0x00,0x1F,0x1E,0x1D,0x1C,0x1B,0x1A, +0x19,0x15,0x14,0x13,0x12,0x11,0x10,0x0F,0x0E,0x0D,0x0C,0x0B,0x0A,0x06,0x05,0x04, +0x03,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x11,0x10,0x0F,0x0E,0x0D,0x0C,0x0B,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x02,0x02,0x02,0x02, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01, +0x01,0x02,0x02,0x02,0x02,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x02,0x02,0x02,0x02,0x03,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x01,0x01,0x01,0x02,0x02,0x02, +0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01, +0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01, +0x01,0x01,0x02,0x02,0x02,0x03,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01, +0x00,0x01,0x01,0x01,0x01,0x01,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01, +0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x02,0x02, +0x03,0x03,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x01,0x01,0x01,0x01,0x00,0x01,0x00,0x01,0x01,0x01,0x00,0x01,0x01,0x01,0x01,0x01, +0x01,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x04,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00, +0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x04, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x02,0x02,0x02,0x02, +0x03,0x03,0x03,0x04,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, +0x01,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x04,0x04,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x01,0x01,0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x01,0x01,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x04, +0x04,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02, +0x02,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x01,0x02,0x01,0x02,0x02,0x02,0x02,0x02, +0x02,0x03,0x03,0x03,0x04,0x04,0x04,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x02,0x02,0x01,0x02,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, +0x01,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x04,0x04,0x04,0x05,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x59,0x4E,0x4E,0x4E,0x4D,0x4D,0x4B,0x4B,0x4B,0x4B,0x4B,0x4A,0x4B,0x4B, +0x4A,0x47,0x4A,0x48,0x47,0x47,0x47,0x47,0x45,0x45,0x48,0x4B,0x00,0x00,0x00,0x00, +0x00,0x00,0x50,0x47,0x48,0x45,0x47,0x45,0x45,0x45,0x45,0x45,0x43,0x43,0x45,0x46, +0x46,0x43,0x41,0x42,0x42,0x41,0x41,0x41,0x3E,0x40,0x42,0x48,0x00,0x00,0x00,0x00, +0x00,0x00,0x52,0x48,0x47,0x48,0x48,0x47,0x46,0x48,0x47,0x46,0x48,0x45,0x45,0x43, +0x42,0x43,0x42,0x41,0x42,0x45,0x43,0x42,0x42,0x43,0x41,0x47,0x00,0x00,0x00,0x00, +0x00,0x00,0x50,0x4A,0x4A,0x48,0x47,0x47,0x47,0x48,0x48,0x48,0x48,0x48,0x45,0x43, +0x43,0x43,0x42,0x42,0x42,0x42,0x42,0x43,0x43,0x45,0x41,0x4A,0x00,0x00,0x00,0x00, +0x00,0x00,0x53,0x4D,0x4B,0x4A,0x4B,0x4A,0x48,0x47,0x48,0x48,0x46,0x47,0x48,0x4A, +0x47,0x42,0x45,0x46,0x42,0x46,0x45,0x43,0x45,0x45,0x46,0x4B,0x00,0x00,0x00,0x00, +0x00,0x00,0x55,0x4E,0x4B,0x4B,0x4B,0x4A,0x48,0x4A,0x47,0x47,0x48,0x48,0x48,0x46, +0x43,0x45,0x46,0x43,0x45,0x46,0x42,0x43,0x45,0x46,0x46,0x4E,0x00,0x00,0x00,0x00, +0x00,0x00,0x52,0x4E,0x4D,0x4B,0x48,0x4A,0x4A,0x4A,0x48,0x4A,0x4A,0x4A,0x4A,0x45, +0x46,0x45,0x46,0x46,0x45,0x46,0x43,0x46,0x45,0x46,0x46,0x4D,0x00,0x00,0x00,0x00, +0x00,0x00,0x52,0x50,0x4D,0x4D,0x47,0x48,0x47,0x47,0x48,0x48,0x48,0x48,0x48,0x46, +0x45,0x46,0x46,0x45,0x43,0x45,0x45,0x43,0x46,0x46,0x46,0x4B,0x00,0x00,0x00,0x00, +0x00,0x00,0x52,0x4D,0x4A,0x4A,0x48,0x4A,0x47,0x46,0x48,0x48,0x48,0x47,0x45,0x45, +0x46,0x45,0x46,0x45,0x41,0x43,0x43,0x45,0x41,0x46,0x47,0x4B,0x00,0x00,0x00,0x00, +0x00,0x00,0x52,0x4D,0x4B,0x4A,0x47,0x48,0x46,0x46,0x46,0x46,0x46,0x45,0x45,0x45, +0x46,0x46,0x42,0x42,0x42,0x42,0x42,0x41,0x43,0x45,0x45,0x4B,0x00,0x00,0x00,0x00, +0x00,0x00,0x50,0x4B,0x4A,0x48,0x48,0x46,0x45,0x45,0x46,0x47,0x46,0x45,0x43,0x42, +0x42,0x41,0x41,0x40,0x41,0x41,0x40,0x42,0x41,0x42,0x43,0x48,0x00,0x00,0x00,0x00, +0x00,0x00,0x50,0x4B,0x48,0x48,0x47,0x47,0x45,0x46,0x43,0x45,0x45,0x43,0x41,0x3F, +0x3F,0x41,0x40,0x40,0x40,0x42,0x3F,0x42,0x42,0x40,0x42,0x47,0x00,0x00,0x00,0x00, +0x00,0x00,0x4E,0x4B,0x4A,0x47,0x45,0x45,0x43,0x46,0x45,0x45,0x45,0x42,0x42,0x41, +0x3E,0x42,0x41,0x41,0x41,0x40,0x3E,0x40,0x41,0x40,0x40,0x43,0x00,0x00,0x00,0x00, +0x00,0x00,0x43,0x4B,0x4D,0x4D,0x4B,0x4A,0x4A,0x4A,0x4A,0x4A,0x4A,0x48,0x48,0x47, +0x45,0x45,0x46,0x45,0x45,0x46,0x43,0x46,0x46,0x46,0x46,0x4A,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xD0,0x01,0x43,0x43,0x00,0x00,0x45,0x22 }; - --- a/drivers/input/touchscreen/mms_ts_fw.h +++ b/drivers/input/touchscreen/mms_ts_fw.h @@ -37,7 +37,7 @@ const u8 MELFAS_binary[] = { || defined(CONFIG_MACH_SUPERIORLTE_SKT)\ || defined(CONFIG_MACH_K2_KDI) /* 4.8" OCTA LCD */ -#define FW_VERSION 0xBB +#define FW_VERSION 0xBD #include "d2_fw.h" /* 4.65" OCTA LCD */ #define FW_465_VERSION 0xA8 --- a/drivers/input/touchscreen/msm_ts.c +++ b/drivers/input/touchscreen/msm_ts.c @@ -387,6 +387,7 @@ static int __devinit msm_ts_probe(struct input_set_capability(ts->input_dev, EV_KEY, BTN_TOUCH); set_bit(EV_ABS, ts->input_dev->evbit); + set_bit(INPUT_PROP_DIRECT, ts->input_dev->propbit); input_set_abs_params(ts->input_dev, ABS_X, pdata->min_x, pdata->max_x, 0, 0); --- a/drivers/media/radio/radio-iris.c +++ b/drivers/media/radio/radio-iris.c @@ -1588,8 +1588,8 @@ static void hci_cc_fm_disable_rsp(struct if (status) return; - - iris_q_event(radio, IRIS_EVT_RADIO_DISABLED); + if (radio->mode != FM_CALIB) + iris_q_event(radio, IRIS_EVT_RADIO_DISABLED); radio_hci_req_complete(hdev, status); } @@ -1627,8 +1627,8 @@ static void hci_cc_fm_enable_rsp(struct if (rsp->status) return; - - iris_q_event(radio, IRIS_EVT_RADIO_READY); + if (radio->mode != FM_CALIB) + iris_q_event(radio, IRIS_EVT_RADIO_READY); radio_hci_req_complete(hdev, rsp->status); } @@ -1879,6 +1879,7 @@ static inline void hci_cmd_complete_even switch (opcode) { case hci_recv_ctrl_cmd_op_pack(HCI_OCF_FM_ENABLE_RECV_REQ): + case hci_trans_ctrl_cmd_op_pack(HCI_OCF_FM_ENABLE_TRANS_REQ): hci_cc_fm_enable_rsp(hdev, skb); break; case hci_recv_ctrl_cmd_op_pack(HCI_OCF_FM_GET_RECV_CONF_REQ): @@ -1886,6 +1887,7 @@ static inline void hci_cmd_complete_even break; case hci_recv_ctrl_cmd_op_pack(HCI_OCF_FM_DISABLE_RECV_REQ): + case hci_trans_ctrl_cmd_op_pack(HCI_OCF_FM_DISABLE_TRANS_REQ): hci_cc_fm_disable_rsp(hdev, skb); break; @@ -1900,8 +1902,6 @@ static inline void hci_cmd_complete_even case hci_recv_ctrl_cmd_op_pack(HCI_OCF_FM_EN_WAN_AVD_CTRL): case hci_recv_ctrl_cmd_op_pack(HCI_OCF_FM_EN_NOTCH_CTRL): case hci_recv_ctrl_cmd_op_pack(HCI_OCF_FM_SET_CH_DET_THRESHOLD): - case hci_trans_ctrl_cmd_op_pack(HCI_OCF_FM_ENABLE_TRANS_REQ): - case hci_trans_ctrl_cmd_op_pack(HCI_OCF_FM_DISABLE_TRANS_REQ): case hci_trans_ctrl_cmd_op_pack(HCI_OCF_FM_RDS_RT_REQ): case hci_trans_ctrl_cmd_op_pack(HCI_OCF_FM_RDS_PS_REQ): case hci_common_cmd_op_pack(HCI_OCF_FM_DEFAULT_DATA_WRITE): @@ -2461,23 +2461,27 @@ static int iris_do_calibration(struct ir int retval = 0x00; cal_mode = PROCS_CALIB_MODE; + radio->mode = FM_CALIB; retval = hci_cmd(HCI_FM_ENABLE_RECV_CMD, radio->fm_hdev); if (retval < 0) { FMDERR("Enable failed before calibration %x", retval); + radio->mode = FM_OFF; return retval; } retval = radio_hci_request(radio->fm_hdev, hci_fm_do_cal_req, (unsigned long)cal_mode, RADIO_HCI_TIMEOUT); if (retval < 0) { FMDERR("Do Process calibration failed %x", retval); + radio->mode = FM_RECV; return retval; } retval = hci_cmd(HCI_FM_DISABLE_RECV_CMD, radio->fm_hdev); if (retval < 0) FMDERR("Disable Failed after calibration %d", retval); - return retval; + radio->mode = FM_OFF; + return retval; } static int iris_vidioc_g_ctrl(struct file *file, void *priv, struct v4l2_control *ctrl) @@ -2850,12 +2854,12 @@ static int iris_vidioc_s_ctrl(struct fil case FM_TRANS: retval = hci_cmd(HCI_FM_ENABLE_TRANS_CMD, radio->fm_hdev); - radio->mode = FM_TRANS; if (retval < 0) { FMDERR("Error while enabling TRANS FM" " %d\n", retval); return retval; } + radio->mode = FM_TRANS; retval = hci_cmd(HCI_FM_GET_TX_CONFIG, radio->fm_hdev); if (retval < 0) FMDERR("get frequency failed %d\n", retval); @@ -2865,17 +2869,23 @@ static int iris_vidioc_s_ctrl(struct fil case FM_RECV: retval = hci_cmd(HCI_FM_DISABLE_RECV_CMD, radio->fm_hdev); - if (retval < 0) + if (retval < 0) { FMDERR("Err on disable recv FM" " %d\n", retval); + return retval; + } + radio->mode = FM_OFF; break; case FM_TRANS: retval = hci_cmd(HCI_FM_DISABLE_TRANS_CMD, radio->fm_hdev); - if (retval < 0) + if (retval < 0) { FMDERR("Err disabling trans FM" " %d\n", retval); + return retval; + } + radio->mode = FM_OFF; break; default: retval = -EINVAL; --- a/drivers/media/radio/radio-tavarua.c +++ b/drivers/media/radio/radio-tavarua.c @@ -3155,7 +3155,7 @@ static int tavarua_vidioc_s_ctrl(struct * queue the READY event from the host side * in case of FM off */ - tavarua_q_event(radio, TAVARUA_EVT_RADIO_READY); + tavarua_q_event(radio, TAVARUA_EVT_RADIO_DISABLED); FMDBG("%s, Disable All Interrupts\n", __func__); /* disable irq */ --- a/drivers/media/video/msm/gemini/msm_gemini_sync.c +++ b/drivers/media/video/msm/gemini/msm_gemini_sync.c @@ -473,11 +473,12 @@ int msm_gemini_input_buf_enqueue(struct } else { buf_p->y_buffer_addr = msm_gemini_platform_v2p(buf_cmd.fd, buf_cmd.y_len + buf_cmd.cbcr_len, &buf_p->file, - &buf_p->handle) + buf_cmd.offset; + &buf_p->handle) + buf_cmd.offset + buf_cmd.y_off; } buf_p->y_len = buf_cmd.y_len; - buf_p->cbcr_buffer_addr = buf_p->y_buffer_addr + buf_cmd.y_len; + buf_p->cbcr_buffer_addr = buf_p->y_buffer_addr + buf_cmd.y_len + + buf_cmd.cbcr_off; buf_p->cbcr_len = buf_cmd.cbcr_len; buf_p->num_of_mcu_rows = buf_cmd.num_of_mcu_rows; --- a/drivers/media/video/msm/msm.c +++ b/drivers/media/video/msm/msm.c @@ -131,6 +131,7 @@ static int msm_server_control(struct msm struct msm_ctrl_cmd *ctrlcmd; struct msm_device_queue *queue = &server_dev->ctrl_q; void *ctrlcmd_data; + uint8_t wait_count; struct v4l2_event v4l2_evt; struct msm_isp_event_ctrl *isp_event; @@ -156,6 +157,7 @@ static int msm_server_control(struct msm ctrlcmd_data = kzalloc(out->length, GFP_KERNEL); if (!ctrlcmd_data) { kfree(isp_event); + *((uint32_t *)v4l2_evt.u.data) = NULL; //MSM.C_DOUBLE_FREE pr_err("%s Insufficient memory. return", __func__); return -ENOMEM; } @@ -171,20 +173,29 @@ static int msm_server_control(struct msm /* wait for config return status */ D("Waiting for config status\n"); - rc = wait_event_interruptible_timeout(queue->wait, - !list_empty_careful(&queue->list), - msecs_to_jiffies(out->timeout_ms)); + wait_count = 2; + do { + rc = wait_event_interruptible_timeout(queue->wait, + !list_empty_careful(&queue->list), + msecs_to_jiffies(out->timeout_ms)); + wait_count--; + if (rc != -ERESTARTSYS) + break; + D("%s: wait_event interrupted by signal, remain_count = %d", + __func__, wait_count); + } while (wait_count > 0); D("Waiting is over for config status\n"); if (list_empty_careful(&queue->list)) { if (!rc) rc = -ETIMEDOUT; if (rc < 0) { rcmd = msm_dequeue(queue, list_control); - if (!rcmd) { + if (rcmd) { free_qcmd(rcmd); rcmd = NULL; } kfree(isp_event); + *((uint32_t *)v4l2_evt.u.data) = NULL; //MSM.C_DOUBLE_FREE if (g_server_dev.server_evt_id == 0) g_server_dev.server_evt_id++; pr_err("%s: wait_event error %d\n", __func__, rc); @@ -243,7 +254,7 @@ static int msm_send_close_server(int vno { int rc = 0; struct msm_ctrl_cmd ctrlcmd; - D("%s\n", __func__); + pr_err("%s\n", __func__); ctrlcmd.type = MSM_V4L2_CLOSE; ctrlcmd.timeout_ms = 10000; ctrlcmd.length = strnlen(g_server_dev.config_info.config_dev_name[0], @@ -2025,6 +2036,7 @@ static long msm_ioctl_server(struct file break; } kfree(k_isp_event); + (*((uint32_t *)ev.u.data)) = NULL; //MSM.C_DOUBLE_FREE k_isp_event = NULL; break; } @@ -2127,7 +2139,7 @@ static long msm_v4l2_evt_notify(struct m ERR_COPY_FROM_USER(); return -EFAULT; } - + pr_err("%s: Sending event to HAL with type %x\n", __func__, v4l2_ev.type); pcam = mctl->sync.pcam_sync; ktime_get_ts(&v4l2_ev.timestamp); v4l2_event_queue(pcam->pvdev, &v4l2_ev); @@ -2281,6 +2293,15 @@ static long msm_ioctl_config(struct file rc = -EINVAL; break; + case MCTL_CAM_IOCTL_SET_FOCUS: + if (copy_from_user(&config_cam->p_mctl->sync.focus_state, + (void __user *)arg, sizeof(uint32_t))) { + ERR_COPY_FROM_USER(); + rc = -EINVAL; + break; + } + break; + default:{ /* For the rest of config command, forward to media controller*/ struct msm_cam_media_controller *p_mctl = config_cam->p_mctl; --- a/drivers/media/video/msm/msm_vfe32.c +++ b/drivers/media/video/msm/msm_vfe32.c @@ -370,7 +370,7 @@ static void vfe32_stop(void) unsigned long flags; atomic_set(&vfe32_ctrl->vstate, 0); - + mutex_lock(&vfe32_ctrl->vfe_lock); /* for reset hw modules, and send msg when reset_irq comes.*/ spin_lock_irqsave(&vfe32_ctrl->stop_flag_lock, flags); vfe32_ctrl->stop_ack_pending = TRUE; @@ -422,6 +422,7 @@ static void vfe32_stop(void) to the command register using the barrier */ msm_io_w_mb(VFE_RESET_UPON_STOP_CMD, vfe32_ctrl->vfebase + VFE_GLOBAL_RESET); + mutex_unlock(&vfe32_ctrl->vfe_lock); } static void vfe32_subdev_notify(int id, int path) @@ -745,6 +746,7 @@ static int vfe32_zsl(void) struct msm_sync *sync = vfe_syncdata; uint32_t irq_comp_mask = 0; /* capture command is valid for both idle and active state. */ + mutex_lock(&vfe32_ctrl->vfe_lock); irq_comp_mask = msm_io_r(vfe32_ctrl->vfebase + VFE_IRQ_COMP_MASK); @@ -808,6 +810,7 @@ static int vfe32_zsl(void) msm_io_w(1, vfe32_ctrl->vfebase + 0x18C); msm_io_w(1, vfe32_ctrl->vfebase + 0x188); + mutex_unlock(&vfe32_ctrl->vfe_lock); return 0; } static int vfe32_capture_raw(uint32_t num_frames_capture) @@ -904,6 +907,7 @@ static int vfe32_start(void) uint32_t irq_comp_mask = 0; struct msm_sync *sync = vfe_syncdata; + mutex_lock(&vfe32_ctrl->vfe_lock); irq_comp_mask = msm_io_r(vfe32_ctrl->vfebase + VFE_IRQ_COMP_MASK); @@ -968,6 +972,7 @@ static int vfe32_start(void) msm_camio_bus_scale_cfg( sync->sdata->pdata->cam_bus_scale_table, S_PREVIEW); vfe32_start_common(); + mutex_unlock(&vfe32_ctrl->vfe_lock); return 0; } @@ -2744,6 +2749,14 @@ static void vfe32_process_reset_irq(void static void vfe32_process_camif_sof_irq(void) { + struct msm_sync *sync; + sync = v4l2_get_subdev_hostdata(&vfe32_ctrl->subdev); + /*first zero out focus bit*/ + vfe32_ctrl->vfeFrameId = vfe32_ctrl->vfeFrameId & + CLEAR_FOCUS_BIT; + /*now set correct focus value*/ + vfe32_ctrl->vfeFrameId = vfe32_ctrl->vfeFrameId | + get_focus_in_position(sync->focus_state); if (vfe32_ctrl->operation_mode == VFE_OUTPUTS_RAW) { if (vfe32_ctrl->start_ack_pending) { @@ -2761,12 +2774,22 @@ static void vfe32_process_camif_sof_irq( } /* if raw snapshot mode. */ if ((vfe32_ctrl->hfr_mode != HFR_MODE_OFF) && (vfe32_ctrl->operation_mode == VFE_MODE_OF_OPERATION_VIDEO) && - (vfe32_ctrl->vfeFrameId % vfe32_ctrl->hfr_mode != 0)) { - vfe32_ctrl->vfeFrameId++; + ((get_frame_num(vfe32_ctrl->vfeFrameId)) + % vfe32_ctrl->hfr_mode != 0)) { + if ((get_frame_num(vfe32_ctrl->vfeFrameId)) + == VFE_FRAME_NUM_MAX) + vfe32_ctrl->vfeFrameId = vfe32_ctrl->vfeFrameId & + ZERO_OUT_FRAME; + vfe32_ctrl->vfeFrameId = + increment_frame_num(vfe32_ctrl->vfeFrameId); CDBG("Skip the SOF notification when HFR enabled\n"); return; } - vfe32_ctrl->vfeFrameId++; + if ((get_frame_num(vfe32_ctrl->vfeFrameId)) + == VFE_FRAME_NUM_MAX) + vfe32_ctrl->vfeFrameId = vfe32_ctrl->vfeFrameId & + ZERO_OUT_FRAME; + vfe32_ctrl->vfeFrameId = increment_frame_num(vfe32_ctrl->vfeFrameId); vfe32_send_isp_msg(vfe32_ctrl, MSG_ID_SOF_ACK); CDBG("camif_sof_irq, frameId = %d\n", vfe32_ctrl->vfeFrameId); @@ -3361,7 +3384,8 @@ static void vfe32_process_stats_irq(uint uint32_t status_bits = VFE_COM_STATUS & *irqstatus; if ((vfe32_ctrl->hfr_mode != HFR_MODE_OFF) && - (vfe32_ctrl->vfeFrameId % vfe32_ctrl->hfr_mode != 0)) { + ((get_frame_num(vfe32_ctrl->vfeFrameId)) + % vfe32_ctrl->hfr_mode != 0)) { CDBG("Skip the stats when HFR enabled\n"); return; } @@ -3895,6 +3919,7 @@ int msm_vfe_subdev_init(struct v4l2_subd spin_lock_init(&vfe32_ctrl->cs_ack_lock); spin_lock_init(&vfe32_ctrl->comp_stats_ack_lock); spin_lock_init(&vfe32_ctrl->sd_notify_lock); + mutex_init(&vfe32_ctrl->vfe_lock); INIT_LIST_HEAD(&vfe32_ctrl->tasklet_q); vfe32_ctrl->update_linear = false; --- a/drivers/media/video/msm/msm_vfe32.h +++ b/drivers/media/video/msm/msm_vfe32.h @@ -919,6 +919,7 @@ struct vfe32_ctrl_type { uint32_t extlen; void *extdata; + struct mutex vfe_lock; int8_t start_ack_pending; int8_t stop_ack_pending; --- a/drivers/media/video/msm/sensors/msm_sensor.c +++ b/drivers/media/video/msm/sensors/msm_sensor.c @@ -143,7 +143,7 @@ int32_t msm_sensor_set_fps(struct msm_se total_lines_per_frame = (uint16_t) ((s_ctrl->curr_frame_length_lines) * s_ctrl->fps_divider/Q10); - + total_lines_per_frame += (total_lines_per_frame & 0x1); rc = msm_camera_i2c_write(s_ctrl->sensor_i2c_client, s_ctrl->sensor_output_reg_addr->frame_length_lines, total_lines_per_frame, MSM_CAMERA_I2C_WORD_DATA); --- a/drivers/media/video/msm/wfd/wfd-ioctl.c +++ b/drivers/media/video/msm/wfd/wfd-ioctl.c @@ -148,7 +148,7 @@ static int wfd_allocate_ion_buffer(struc bool secure, struct mem_region *mregion) { struct ion_handle *handle; - void *kvaddr, *phys_addr; + void *kvaddr = NULL, *phys_addr = NULL; unsigned long size; unsigned int alloc_regions = 0; int rc; @@ -194,7 +194,9 @@ static int wfd_allocate_ion_buffer(struc return rc; alloc_fail: if (!IS_ERR_OR_NULL(handle)) { - ion_unmap_kernel(client, handle); + if (!IS_ERR_OR_NULL(kvaddr)) + ion_unmap_kernel(client, handle); + ion_free(client, handle); mregion->kvaddr = NULL; --- a/drivers/media/video/msm_zsl/msm.c +++ b/drivers/media/video/msm_zsl/msm.c @@ -35,6 +35,7 @@ static struct msm_cam_server_dev g_serve static struct class *msm_class; static dev_t msm_devno; static int vnode_count; +unsigned int open_fail_flag; module_param(msm_camera_v4l2_nr, uint, 0644); MODULE_PARM_DESC(msm_camera_v4l2_nr, "videoX start number, -1 is autodetect"); @@ -1417,6 +1418,7 @@ static int msm_open_init(struct msm_cam_ struct msm_cam_v4l2_dev_inst *pcam_inst) { int rc; + open_fail_flag = 0; rc = msm_cam_server_open_session(&g_server_dev, pcam); if (rc < 0) { @@ -1467,6 +1469,7 @@ static int msm_open_init(struct msm_cam_ rc = msm_send_open_server(pcam->vnode_id); if (rc < 0) { + open_fail_flag = 1; pr_err("%s failed\n", __func__); goto fail5; } @@ -1489,6 +1492,7 @@ fail1: fail: msm_cam_server_close_session(&g_server_dev, pcam); end: + open_fail_flag = 0; return rc; } --- a/drivers/media/video/msm_zsl/msm_vfe32.c +++ b/drivers/media/video/msm_zsl/msm_vfe32.c @@ -30,6 +30,7 @@ #include "msm_ispif.h" /*aswoogi_zsl */ atomic_t irq_cnt; +extern unsigned int open_fail_flag; #define QC_TEST @@ -1445,7 +1446,7 @@ static int vfe32_proc_general(struct msm CDBG("vfe32_proc_general: cmdID = %s, length = %d\n", vfe32_general_cmd[cmd->id], cmd->length); - if (vfe32_ctrl->vfebase == NULL) { + if (vfe32_ctrl->vfebase == NULL || open_fail_flag) { pr_err("Error : vfe32_ctrl->vfebase is NULL!!\n"); pr_err("vfe32_proc_general: cmdID = %s, length = %d\n", vfe32_general_cmd[cmd->id], cmd->length); --- a/drivers/media/video/msm_zsl/sensors/s5c73m3.c +++ b/drivers/media/video/msm_zsl/sensors/s5c73m3.c @@ -1095,6 +1095,11 @@ static int s5c73m3_set_effect(int effect S5C73M3_IMAGE_EFFECT_POINT_COLOR_4); break; + case CAMERA_EFFECT_CARTOONIZE: + rc = s5c73m3_writeb(S5C73M3_IMAGE_EFFECT, + S5C73M3_IMAGE_EFFECT_CARTOONIZE); + break; + default: CAM_DBG_M("default effect\n"); rc = s5c73m3_writeb(S5C73M3_IMAGE_EFFECT, --- a/drivers/media/video/msm_zsl/sensors/s5c73m3.h +++ b/drivers/media/video/msm_zsl/sensors/s5c73m3.h @@ -316,7 +316,7 @@ enum s5c73m3_fw_path { #define S5C73M3_IMAGE_EFFECT_POINT_COLOR_2 0x000D #define S5C73M3_IMAGE_EFFECT_POINT_COLOR_3 0x000E #define S5C73M3_IMAGE_EFFECT_POINT_COLOR_4 0x000F - +#define S5C73M3_IMAGE_EFFECT_CARTOONIZE 0x001A #define S5C73M3_IMAGE_QUALITY 0x0B0C #define S5C73M3_IMAGE_QUALITY_SUPERFINE 0x0000 @@ -336,7 +336,12 @@ enum s5c73m3_fw_path { #define S5C73M3_FLASH_TORCH 0x0B12 #define S5C73M3_FLASH_TORCH_OFF 0x0000 + +#if defined(CONFIG_MACH_M2_DCM) +#define S5C73M3_FLASH_TORCH_ON 0x0004 +#else #define S5C73M3_FLASH_TORCH_ON 0x0001 +#endif #define S5C73M3_AE_ISNEEDFLASH 0x0CBA #define S5C73M3_AE_ISNEEDFLASH_OFF 0x0000 --- a/drivers/misc/a2220_firmware.h +++ b/drivers/misc/a2220_firmware.h @@ -23,7 +23,7 @@ #include "a2220_firmware_aegis2.h" #elif defined(CONFIG_MACH_JASPER) #include "a2220_firmware_jasper.h" -#elif defined(_d2tmo_) +#elif defined(_d2tmo_) || defined(_d2ltetmo_) #include "a2220_firmware_t999.h" #else #include "a2220_firmware_i747.h" --- a/drivers/misc/fsa9485.c +++ b/drivers/misc/fsa9485.c @@ -154,7 +154,10 @@ struct fsa9485_usbsw { struct input_dev *input; int previous_key; + int dock_ready; + struct delayed_work init_work; + struct delayed_work audio_work; struct mutex mutex; int adc; int deskdock; @@ -210,6 +213,38 @@ static void EnableFSA9480Interrupts(void } +#if defined(CONFIG_MACH_AEGIS2) +void fsa9485_checkandhookaudiodockfornoise(int value) +{ + struct i2c_client *client = local_usbsw->client; + int ret = 0; + + if (isDeskdockconnected) { + ret = i2c_smbus_write_byte_data(client, + FSA9485_REG_MANSW1, value); + + if (ret < 0) + dev_err(&client->dev, "%s: err %d\n", + __func__, ret); + + ret = i2c_smbus_read_byte_data(client, + FSA9485_REG_CTRL); + + if (ret < 0) + dev_err(&client->dev, "%s: err %d\n", + __func__, ret); + + ret = i2c_smbus_write_byte_data(client, + FSA9485_REG_CTRL, + ret & ~CON_MANUAL_SW & ~CON_RAW_DATA); + if (ret < 0) + dev_err(&client->dev, + "%s: err %d\n", __func__, ret); + } else + pr_info("Dock is not connect\n"); +} +#endif + void FSA9485_CheckAndHookAudioDock(int value) { struct i2c_client *client = local_usbsw->client; @@ -633,12 +668,14 @@ static int fsa9485_detect_dev(struct fsa if (usbsw->dock_attached) pdata->dock_cb(FSA9485_DETACHED_DOCK); - if (adc == 0x10) - val2 = DEV_SMARTDOCK; - else if (adc == 0x12) - val2 = DEV_AUDIO_DOCK; + if (local_usbsw->dock_ready == 1) + if (adc == 0x10) + val2 = DEV_SMARTDOCK; + else if (adc == 0x12) + val2 = DEV_AUDIO_DOCK; - dev_info(&client->dev, "dev1: 0x%x, dev2: 0x%x adc : 0x%x\n", val1, val2, adc); + dev_info(&client->dev, "dev1: 0x%x, dev2: 0x%x adc : 0x%x\n", + val1, val2, adc); /* Attached */ if (val1 || val2) { @@ -819,7 +856,7 @@ static int fsa9485_detect_dev(struct fsa dev_err(&client->dev, "%s: err %d\n", __func__, ret); - if (pdata->smartdock_cb) + if (pdata->audio_dock_cb) pdata->audio_dock_cb(FSA9485_ATTACHED); } /* Detached */ @@ -928,7 +965,7 @@ static int fsa9485_detect_dev(struct fsa dev_err(&client->dev, "%s: err %d\n", __func__, ret); - if (pdata->smartdock_cb) + if (pdata->audio_dock_cb) pdata->audio_dock_cb(FSA9485_DETACHED); usbsw->adc = 0; } @@ -1122,7 +1159,6 @@ static irqreturn_t fsa9485_irq_thread(in } return IRQ_HANDLED; } - return IRQ_HANDLED; } @@ -1167,6 +1203,20 @@ static void fsa9485_init_detect(struct w "failed to enable irq init %s\n", __func__); } +static void fsa9485_delayed_audio(struct work_struct *work) +{ + struct fsa9485_usbsw *usbsw = container_of(work, + struct fsa9485_usbsw, audio_work.work); + + dev_info(&usbsw->client->dev, "%s\n", __func__); + + local_usbsw->dock_ready = 1; + + mutex_lock(&usbsw->mutex); + fsa9485_detect_dev(usbsw); + mutex_unlock(&usbsw->mutex); +} + static int __devinit fsa9485_probe(struct i2c_client *client, const struct i2c_device_id *id) { @@ -1278,10 +1328,13 @@ static int __devinit fsa9485_probe(struc if (usbsw->pdata->set_init_flag) usbsw->pdata->set_init_flag(); + + local_usbsw->dock_ready = 0; /* initial cable detection */ INIT_DELAYED_WORK(&usbsw->init_work, fsa9485_init_detect); schedule_delayed_work(&usbsw->init_work, msecs_to_jiffies(2700)); - + INIT_DELAYED_WORK(&usbsw->audio_work, fsa9485_delayed_audio); + schedule_delayed_work(&usbsw->audio_work, msecs_to_jiffies(20000)); return 0; err_create_file_reset_switch: @@ -1306,6 +1359,7 @@ static int __devexit fsa9485_remove(stru struct fsa9485_usbsw *usbsw = i2c_get_clientdata(client); cancel_delayed_work(&usbsw->init_work); + cancel_delayed_work(&usbsw->audio_work); if (client->irq) { disable_irq_wake(client->irq); free_irq(client->irq, usbsw); --- a/drivers/mmc/card/Kconfig +++ b/drivers/mmc/card/Kconfig @@ -76,3 +76,9 @@ config MMC_TEST This driver is only of interest to those developing or testing a host driver. Most people should say N here. + +config MMC_CPRM + tristate "MMC CPRM driver" + default y + help + Say Y here to enable the MMC cprm driver --- a/drivers/mmc/card/Makefile +++ b/drivers/mmc/card/Makefile @@ -4,15 +4,9 @@ obj-$(CONFIG_MMC_BLOCK) += mmc_block.o mmc_block-objs := block.o queue.o - -ifeq ($(CONFIG_MACH_M2_DCM),y) +ifeq ($(CONFIG_MMC_CPRM),y) mmc_block-objs += cprmdrv_samsung.o endif - -ifeq ($(CONFIG_MACH_K2_KDI),y) -mmc_block-objs += cprmdrv_samsung.o -endif - obj-$(CONFIG_MMC_TEST) += mmc_test.o obj-$(CONFIG_SDIO_UART) += sdio_uart.o --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c @@ -47,11 +47,8 @@ #include "queue.h" MODULE_ALIAS("mmc:block"); -#if defined(CONFIG_MACH_M2_DCM) || defined(CONFIG_MACH_K2_KDI) -#define MMC_ENABLE_CPRM -#endif -#ifdef MMC_ENABLE_CPRM +#if defined(CONFIG_MMC_CPRM) #include "cprmdrv_samsung.h" #include #define MMC_IOCTL_BASE 0xB3 /* Same as MMC block device major number */ @@ -423,7 +420,7 @@ cmd_done: static int mmc_blk_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, unsigned long arg) { -#ifdef MMC_ENABLE_CPRM +#if defined(CONFIG_MMC_CPRM) struct mmc_blk_data *md = bdev->bd_disk->private_data; struct mmc_card *card = md->queue.card; @@ -434,7 +431,7 @@ static int mmc_blk_ioctl(struct block_de if (cmd == MMC_IOC_CMD) ret = mmc_blk_ioctl_cmd(bdev, (struct mmc_ioc_cmd __user *)arg); -#ifdef MMC_ENABLE_CPRM +#if defined(CONFIG_MMC_CPRM) printk(KERN_DEBUG " %s ], %x ", __func__, cmd); switch (cmd) { @@ -447,7 +444,7 @@ static int mmc_blk_ioctl(struct block_de int size = 0; size = (int)get_capacity(md->disk) << 9; - printk(KERN_DEBUG "%s:GET_SECTOR_COUNT size = %d\n", + printk(KERN_DEBUG "[%s]:MMC_IOCTL_GET_SECTOR_COUNT size = %d\n", __func__, size); return copy_to_user((void *)arg, &size, sizeof(u64)); @@ -461,25 +458,22 @@ static int mmc_blk_ioctl(struct block_de case ACMD45: case ACMD46: case ACMD47: - case ACMD48: - { - struct cprm_request *req = (struct cprm_request *)arg; - - printk(KERN_DEBUG "%s:cmd [%x]\n", - __func__, cmd); - - if (cmd == ACMD43) { - printk(KERN_DEBUG"storing acmd43 arg[%d] = %ul\n" - , i, req->arg); - temp_arg[i] = req->arg; - i++; - if (i >= 16) { - printk(KERN_DEBUG"reset acmd43 i = %d\n", - i); + case ACMD48: { + struct cprm_request *req = (struct cprm_request *)arg; + + printk(KERN_DEBUG "%s:cmd [%x]\n", + __func__, cmd); + + if (cmd == ACMD43) { + printk(KERN_DEBUG"storing acmd43 arg[%d] = %ul\n", + i, (unsigned int)req->arg); + temp_arg[i] = req->arg; + i++; + if (i >= 16) { + printk(KERN_DEBUG"reset acmd43 i = %d\n", i); i = 0; - } } - + } if (cmd == ACMD45 && cprm_ake_retry_flag == 1) { cprm_ake_retry_flag = 0; @@ -487,21 +481,17 @@ static int mmc_blk_ioctl(struct block_de for (i = 0; i < 16; i++) { printk(KERN_DEBUG"calling ACMD43 with arg[%d] = %ul\n", - i, temp_arg[i]); - if (stub_sendcmd(card, - ACMD43, temp_arg[i], - 512, NULL) < 0) { - - printk(KERN_DEBUG"error ACMD43 %d\n", - i); - return -EINVAL; - } + i, (unsigned int)temp_arg[i]); + if (stub_sendcmd(card, ACMD43, temp_arg[i], + 512, NULL) < 0) { + printk(KERN_DEBUG"error ACMD43 %d\n", + i); + return -EINVAL; } + } - - printk(KERN_DEBUG"calling ACMD44\n"); - if (stub_sendcmd(card, ACMD44, NULL, - 8, NULL) < 0) { + printk(KERN_DEBUG"calling ACMD44\n"); + if (stub_sendcmd(card, ACMD44, 0, 8, NULL) < 0) { printk(KERN_DEBUG"error in ACMD44 %d\n", i); @@ -1581,9 +1571,6 @@ static int mmc_blk_probe(struct mmc_card md->disk->disk_name, mmc_card_id(card), mmc_card_name(card), cap_str, md->read_only ? "(ro)" : ""); - if (mmc_blk_alloc_parts(card, md)) - goto out; - mmc_set_drvdata(card, md); mmc_fixup_device(card, blk_fixups); --- a/drivers/mmc/card/cprmdrv_samsung.c +++ b/drivers/mmc/card/cprmdrv_samsung.c @@ -55,9 +55,12 @@ static int mmc_wait_busy(struct mmc_card } static int CPRM_CMD_SecureRW(struct mmc_card *card, - unsigned int command, unsigned int dir, - unsigned long arg , unsigned char *buff, unsigned int length) -{ + unsigned int command, + unsigned int dir, + unsigned long arg, + unsigned char *buff, + unsigned int length) { + int err; int i = 0; struct mmc_request mrq; @@ -98,8 +101,8 @@ static int CPRM_CMD_SecureRW(struct mmc_ memset(&data, 0, sizeof(struct mmc_data)); - data.timeout_ns = 100000000; - data.timeout_clks = 0; + data.timeout_ns = 100000000; + data.timeout_clks = 0; data.blksz = length; data.blocks = 1; data.flags = dir; @@ -139,15 +142,12 @@ static int CPRM_CMD_SecureRW(struct mmc_ printk(KERN_DEBUG"\n"); if (cmd.error) { - printk(KERN_ERR - "%s ] :: cmd.error = [ %d ]\n ", - __func__, cmd.error); + printk(KERN_DEBUG "%s]cmd.error=%d\n ", __func__, cmd.error); return cmd.error; } - if (data.error) { - printk(KERN_ERR - "%s ] :: data.error = [ %d ]\n ", - __func__, data.error); + + if (data.error) { + printk(KERN_DEBUG "%s]data.error=%d\n ", __func__, data.error); return data.error; } @@ -161,9 +161,12 @@ static int CPRM_CMD_SecureRW(struct mmc_ } static int CPRM_CMD_SecureMultiRW(struct mmc_card *card, - unsigned int command, unsigned int dir, - unsigned long arg , unsigned char *buff, unsigned int length) -{ + unsigned int command, + unsigned int dir, + unsigned long arg, + unsigned char *buff, + unsigned int length) { + int err; struct mmc_request mrq; @@ -222,7 +225,7 @@ static int CPRM_CMD_SecureMultiRW(struct mrq.stop = &stop; - printk(KERN_INFO"CPRM_CMD_SecureRW: 2\n"); + printk(KERN_DEBUG "CPRM_CMD_SecureRW: 2\n"); sg_init_one(&sg, buff, length); @@ -231,26 +234,24 @@ static int CPRM_CMD_SecureMultiRW(struct sg_copy_from_buffer(&sg, data.sg_len, buff, length); local_irq_restore(flags); } - printk(KERN_INFO"CPRM_CMD_SecureRW: 3\n"); - + printk(KERN_DEBUG "CPRM_CMD_SecureRW: 3\n"); mmc_wait_for_req(card->host, &mrq); - printk(KERN_INFO"CPRM_CMD_SecureRW: 4\n"); + printk(KERN_DEBUG "CPRM_CMD_SecureRW: 4\n"); if (cmd.error) { - printk(KERN_INFO"%s ] :: cmd.error = [ %d ]\n ", - __func__, cmd.error); + printk(KERN_DEBUG "%s]cmd.error=%d\n", __func__, cmd.error); return cmd.error; } + if (data.error) { - printk(KERN_INFO"%s ] :: data.error = [ %d ]\n ", - __func__, data.error); + printk(KERN_DEBUG "%s]data.error=%d\n", __func__, data.error); return data.error; } err = mmc_wait_busy(card); - printk(KERN_INFO"CPRM_CMD_SecureRW: 5\n"); + printk(KERN_DEBUG "CPRM_CMD_SecureRW: 5\n"); if (dir == MMC_DATA_READ) { local_irq_save(flags); @@ -266,28 +267,30 @@ static int CPRM_CMD_SecureMultiRW(struct int stub_sendcmd(struct mmc_card *card, - unsigned int cmd, unsigned long arg, unsigned int len, - unsigned char *buff) -{ + unsigned int cmd, + unsigned long arg, + unsigned int len, + unsigned char *buff) { + int returnVal = -1; unsigned char *kbuffer = NULL; int direction = 0; int result = 0; if (card == NULL) { - printk(KERN_INFO"stub_sendcmd: card is null error\n"); + printk(KERN_DEBUG "stub_sendcmd: card is null error\n"); return -ENXIO; } kbuffer = kmalloc(len, GFP_KERNEL); if (kbuffer == NULL) { - printk(KERN_INFO"malloc failed\n"); + printk(KERN_DEBUG "malloc failed\n"); return -ENOMEM; } + memset(kbuffer, 0x00, len); - printk(KERN_INFO" === %s ] cmd = [ %x ] len = [ %d ]\n ", - __func__, cmd, len); + printk(KERN_DEBUG "%s]cmd=0x%x,len=%d\n ", __func__, cmd, len); mmc_claim_host(card->host); @@ -295,74 +298,105 @@ int stub_sendcmd(struct mmc_card *card, case ACMD43: direction = MMC_DATA_READ; - returnVal = CPRM_CMD_SecureRW(card, SD_ACMD43_GET_MKB, - direction, arg, kbuffer, len); + returnVal = CPRM_CMD_SecureRW(card, + SD_ACMD43_GET_MKB, + direction, + arg, + kbuffer, + len); - printk(KERN_INFO"SD_ACMD43_GET_MKB [0x%x]\n ", returnVal); + printk(KERN_DEBUG "SD_ACMD43_GET_MKB:0x%x\n", returnVal); break; case ACMD44: direction = MMC_DATA_READ; - returnVal = CPRM_CMD_SecureRW(card, SD_ACMD44_GET_MID, - direction, 0, kbuffer, len); + returnVal = CPRM_CMD_SecureRW(card, + SD_ACMD44_GET_MID, + direction, + 0, + kbuffer, + len); - printk(KERN_INFO"SD_ACMD44_GET_MID [0x%x]\n ", returnVal); + printk(KERN_DEBUG "SD_ACMD44_GET_MID:0x%x\n", returnVal); break; case ACMD45: direction = MMC_DATA_WRITE; result = copy_from_user((void *)kbuffer, (void *)buff, len); - returnVal = CPRM_CMD_SecureRW(card, SD_ACMD45_SET_CER_RN1, - direction, 0, kbuffer, len); + returnVal = CPRM_CMD_SecureRW(card, + SD_ACMD45_SET_CER_RN1, + direction, + 0, + kbuffer, + len); printk(KERN_INFO"SD_ACMD45_SET_CER_RN1 [0x%x]\n ", returnVal); break; case ACMD46: direction = MMC_DATA_READ; - returnVal = CPRM_CMD_SecureRW(card, SD_ACMD46_GET_CER_RN2, - direction, 0, kbuffer, len); + returnVal = CPRM_CMD_SecureRW(card, + SD_ACMD46_GET_CER_RN2, + direction, + 0, + kbuffer, + len); - printk(KERN_INFO"SD_ACMD46_GET_CER_RN2 [0x%x]\n ", returnVal); + printk(KERN_DEBUG "SD_ACMD46_GET_CER_RN2:0x%x\n", + returnVal); break; case ACMD47: direction = MMC_DATA_WRITE; result = copy_from_user((void *)kbuffer, (void *)buff, len); - returnVal = CPRM_CMD_SecureRW(card, SD_ACMD47_SET_CER_RES2, - direction, 0, kbuffer, len); + returnVal = CPRM_CMD_SecureRW(card, + SD_ACMD47_SET_CER_RES2, + direction, + 0, + kbuffer, + len); - printk(KERN_INFO"SD_ACMD47_SET_CER_RES2 [0x%x]\n ", returnVal); + printk(KERN_DEBUG "SD_ACMD47_SET_CER_RES2:0x%x\n", + returnVal); break; case ACMD48: direction = MMC_DATA_READ; - returnVal = CPRM_CMD_SecureRW(card, SD_ACMD48_GET_CER_RES1, - direction, 0, kbuffer, len); + returnVal = CPRM_CMD_SecureRW(card, + SD_ACMD48_GET_CER_RES1, + direction, + 0, + kbuffer, + len); - printk(KERN_INFO"SD_ACMD48_GET_CER_RES1 [0x%x]\n ", returnVal); + printk(KERN_DEBUG "SD_ACMD48_GET_CER_RES1:0x%x\n", + returnVal); break; case ACMD25: direction = MMC_DATA_WRITE; result = copy_from_user((void *)kbuffer, (void *)buff, len); returnVal = CPRM_CMD_SecureMultiRW(card, - SD_ACMD25_SECURE_WRITE_MULTI_BLOCK, - direction, 0, kbuffer, len); + SD_ACMD25_SECURE_WRITE_MULTI_BLOCK, + direction, + 0, + kbuffer, + len); - printk(KERN_INFO - "SD_ACMD25_SECURE_WRITE_MULTI_BLOCK[%d]=%d\n", + printk(KERN_DEBUG "SD_ACMD25_SECURE_WRITE_MULTI_BLOCK[%d]=%d\n", len, returnVal); break; case ACMD18: direction = MMC_DATA_READ; returnVal = CPRM_CMD_SecureMultiRW(card, - SD_ACMD18_SECURE_READ_MULTI_BLOCK, - direction, 0, kbuffer, len); + SD_ACMD18_SECURE_READ_MULTI_BLOCK, + direction, + 0, + kbuffer, + len); - printk(KERN_INFO - "SD_ACMD18_SECURE_READ_MULTI_BLOCK [%d]=%d\n", + printk(KERN_DEBUG "SD_ACMD18_SECURE_READ_MULTI_BLOCK [%d]=%d\n", len, returnVal); break; @@ -370,20 +404,20 @@ int stub_sendcmd(struct mmc_card *card, break; default: - printk(KERN_INFO" %s ] : CMD [ %x ] ERROR", - __func__, cmd); + printk(KERN_DEBUG " %s ] : CMD [ %x ] ERROR", __func__, cmd); break; } if (returnVal == 0) { if (direction == MMC_DATA_READ) result = copy_to_user((void *)buff, - (void *)kbuffer, len); + (void *)kbuffer, + len); result = returnVal; - printk(KERN_INFO"stub_sendcmd SDAS_E_SUCCESS\n"); + printk(KERN_DEBUG "stub_sendcmd SDAS_E_SUCCESS\n"); } else { - printk(KERN_INFO"stub_sendcmd SDAS_E_FAIL\n"); + printk(KERN_DEBUG "stub_sendcmd SDAS_E_FAIL\n"); result = -EIO; } --- a/drivers/mmc/card/cprmdrv_samsung.h +++ b/drivers/mmc/card/cprmdrv_samsung.h @@ -81,7 +81,9 @@ struct cprm_request { }; int stub_sendcmd(struct mmc_card *card, - unsigned int cmd, unsigned long arg, - unsigned int len, unsigned char *buff); + unsigned int cmd, + unsigned long arg, + unsigned int len, + unsigned char *buff); #endif /* __CPRM_API_SAMSUNG */ --- a/drivers/mmc/host/msm_sdcc.c +++ b/drivers/mmc/host/msm_sdcc.c @@ -756,31 +756,13 @@ msmsdcc_dma_complete_func(struct msm_dmo tasklet_schedule(&host->dma_tlet); } -static int msmsdcc_check_dma_op_req(struct msmsdcc_host *host, - struct mmc_data *data) +static int msmsdcc_check_dma_op_req(struct mmc_data *data) { - int ret = 0; - u32 xfer_size = data->blksz * data->blocks; - - if (host->is_sps_mode) { - /* - * BAM Mode: Fail back on PIO if size is less - * than or equal to four bytes - */ - if (xfer_size <= 4) - ret = -EINVAL; - } else if (!host->is_dma_mode) { - /* - * ADM Mode: Fall back on PIO if size is less than FIFO size - * or not integer multiple of FIFO size - */ - if (xfer_size % MCI_FIFOSIZE) - ret = -EINVAL; - } else { - /* PIO Mode */ - ret = -EINVAL; - } - return ret; + if (((data->blksz * data->blocks) < MCI_FIFOSIZE) || + ((data->blksz * data->blocks) % MCI_FIFOSIZE)) + return -EINVAL; + else + return 0; } static int msmsdcc_config_dma(struct msmsdcc_host *host, struct mmc_data *data) @@ -1087,7 +1069,7 @@ msmsdcc_start_data(struct msmsdcc_host * if (host->curr.wait_for_auto_prog_done) datactrl |= MCI_AUTO_PROG_DONE; - if (!msmsdcc_check_dma_op_req(host, data)) { + if (!msmsdcc_check_dma_op_req(data)) { if (host->is_dma_mode && !msmsdcc_config_dma(host, data)) { datactrl |= MCI_DPSM_DMAENABLE; } else if (host->is_sps_mode) { @@ -1214,9 +1196,11 @@ msmsdcc_data_err(struct msmsdcc_host *ho */ if (!(data->mrq->cmd->opcode == MMC_BUS_TEST_W || data->mrq->cmd->opcode == MMC_BUS_TEST_R)) { - pr_err("%s: CMD%d: Data timeout\n", + pr_err("%s: CMD%d: Data timeout. DAT0 => %d\n", mmc_hostname(host->mmc), - data->mrq->cmd->opcode); + data->mrq->cmd->opcode, + (readl_relaxed(host->base + + MCI_TEST_INPUT) & 0x2) ? 1 : 0); data->error = -ETIMEDOUT; msmsdcc_dump_sdcc_state(host); } @@ -4240,45 +4224,49 @@ void msmsdcc_print_regs(const char *name if (!base) return; - pr_info("===== %s: Register Dumps @base=0x%x =====\n", + pr_err("===== %s: Register Dumps @base=0x%x =====\n", name, (u32)base); for (i = 0; i < no_of_regs; i = i + 4) { - pr_info("Reg=0x%.2x: 0x%.8x, 0x%.8x, 0x%.8x, 0x%.8x.\n", i*4, - (u32)readl_relaxed(base + i*4), - (u32)readl_relaxed(base + ((i+1)*4)), - (u32)readl_relaxed(base + ((i+2)*4)), - (u32)readl_relaxed(base + ((i+3)*4))); + pr_err("Reg=0x%.2x: 0x%.8x, 0x%.8x, 0x%.8x, 0x%.8x\n", i*4, + (u32)readl_relaxed(base + i*4), + (u32)readl_relaxed(base + ((i+1)*4)), + (u32)readl_relaxed(base + ((i+2)*4)), + (u32)readl_relaxed(base + ((i+3)*4))); } } static void msmsdcc_dump_sdcc_state(struct msmsdcc_host *host) { /* Dump current state of SDCC clocks, power and irq */ - pr_info("%s: SDCC PWR is %s\n", mmc_hostname(host->mmc), - (host->pwr ? "ON" : "OFF")); - pr_info("%s: SDCC clks are %s, MCLK rate=%d\n", - mmc_hostname(host->mmc), - (host->clks_on ? "ON" : "OFF"), - (u32)clk_get_rate(host->clk)); - pr_info("%s: SDCC irq is %s\n", mmc_hostname(host->mmc), + pr_err("%s: SDCC PWR is %s\n", mmc_hostname(host->mmc), + (host->pwr ? "ON" : "OFF")); + pr_err("%s: SDCC clks are %s, MCLK rate=%d\n", + mmc_hostname(host->mmc), + (host->clks_on ? "ON" : "OFF"), + (u32)clk_get_rate(host->clk)); + pr_err("%s: SDCC irq is %s\n", mmc_hostname(host->mmc), (host->sdcc_irq_disabled ? "disabled" : "enabled")); /* Now dump SDCC registers. Don't print FIFO registers */ - if (host->clks_on) + if (host->clks_on) { msmsdcc_print_regs("SDCC-CORE", host->base, 28); + pr_err("%s: MCI_TEST_INPUT = 0x%.8x\n", + mmc_hostname(host->mmc), + readl_relaxed(host->base + MCI_TEST_INPUT)); + } if (host->curr.data) { - if (msmsdcc_check_dma_op_req(host, host->curr.data)) - pr_info("%s: PIO mode\n", mmc_hostname(host->mmc)); + if (msmsdcc_check_dma_op_req(host->curr.data)) + pr_err("%s: PIO mode\n", mmc_hostname(host->mmc)); else if (host->is_dma_mode) - pr_info("%s: ADM mode: busy=%d, chnl=%d, crci=%d\n", + pr_err("%s: ADM mode: busy=%d, chnl=%d, crci=%d\n", mmc_hostname(host->mmc), host->dma.busy, host->dma.channel, host->dma.crci); else if (host->is_sps_mode) - pr_info("%s: SPS mode: busy=%d\n", + pr_err("%s: SPS mode: busy=%d\n", mmc_hostname(host->mmc), host->sps.busy); - pr_info("%s: xfer_size=%d, data_xfered=%d, xfer_remain=%d\n", + pr_err("%s: xfer_size=%d, data_xfered=%d, xfer_remain=%d\n", mmc_hostname(host->mmc), host->curr.xfer_size, host->curr.data_xfered, host->curr.xfer_remain); pr_info("%s: got_dataend=%d, prog_enable=%d," @@ -5260,8 +5248,8 @@ msmsdcc_runtime_suspend(struct device *d { struct mmc_host *mmc = dev_get_drvdata(dev); struct msmsdcc_host *host = mmc_priv(mmc); - unsigned long flags; int rc = 0; + unsigned long flags; if (host->plat->is_sdio_al_client) { rc = 0; --- a/drivers/net/wireless/bcmdhd/Makefile +++ b/drivers/net/wireless/bcmdhd/Makefile @@ -21,6 +21,9 @@ DHDCFLAGS += -DBLOCK_IPV6_PACKET -DPASS_ DHDCFLAGS += -DSUPPORT_DEEP_SLEEP DHDCFLAGS += -DSIMPLE_MAC_PRINT +# Print out kernel panic point of file and line info when assertion happened +DHDCFLAGS += -DBCMASSERT_LOG + # For p2p connection issue DHDCFLAGS += -DWL_CFG80211_GON_COLLISION DHDCFLAGS += -DWL_SCB_TIMEOUT=10 @@ -65,6 +68,15 @@ DHDCFLAGS += -DCUSTOM_DPC_PRIO_SETTING=9 # WiFi turn off delay DHDCFLAGS += -DWIFI_TURNOFF_DELAY=100 +# DTIM listen interval in suspend mode(0 means follow AP's DTIM period) +DHDCFLAGS += -DCUSTOM_SUSPEND_BCN_LI_DTIM=0 + +# Priority mismatch fix with kernel stack +DHDCFLAGS += -DPKTPRIO_OVERRIDE + +# Ioctl timeout 5000ms +DHDCFLAGS += -DIOCTL_RESP_TIMEOUT=5000 + # WiFi Kernel thread type DHDCFLAGS += -DUSE_KTHREAD_API @@ -82,14 +94,13 @@ DHDCFLAGS += -DWL_CFG80211_STA_EVENT ifneq ($(CONFIG_BCM4334),) DHDCFLAGS += -DBCM4334_CHIP -DHW_OOB -DSUPPORT_MULTIPLE_REVISION DHDCFLAGS += -DUSE_CID_CHECK -DCONFIG_CONTROL_PM - DHDCFLAGS += -DPROP_TXSTATUS + DHDCFLAGS += -DPROP_TXSTATUS -DPROP_TXSTATUS_VSDB DHDCFLAGS += -DVSDB -DHT40_GO DHDCFLAGS += -DWL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST DHDCFLAGS += -DDHD_USE_IDLECOUNT DHDCFLAGS += -DSUPPORT_AMPDU_MPDU_CMD - DHDCFLAGS += -DVSDB_DYNAMIC_F2_BLKSIZE -DSDIO_F2_BLKSIZE=512 -DVSDB_F2_BLKSIZE=64 + DHDCFLAGS += -DUSE_DYNAMIC_F2_BLKSIZE -DDYNAMIC_F2_BLKSIZE_FOR_NONLEGACY=64 DHDCFLAGS += -DCUSTOM_GLOM_SETTING=5 -DENABLE_BCN_LI_BCN_WAKEUP -# DHDCFLAGS += -DUSE_WEP_AUTH_SHARED_OPEN DHDCFLAGS += -DROAM_AP_ENV_DETECTION DHDCFLAGS += -DWES_SUPPORT endif @@ -100,19 +111,21 @@ ifneq ($(CONFIG_BCM4330),) DHDCFLAGS += -DCONFIG_CONTROL_PM DHDCFLAGS += -DCUSTOM_GLOM_SETTING=0 DHDCFLAGS += -DPASS_ARP_PACKET + DHDCFLAGS += -DWL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST endif ifneq ($(CONFIG_BCM43241),) DHDCFLAGS += -DBCM43241_CHIP -DHW_OOB - DHDCFLAGS += -DMCAST_LIST_ACCUMULATION - DHDCFLAGS += -DMIMO_ANT_SETTING -DCONFIG_CONTROL_PM - DHDCFLAGS += -DAMPDU_HOSTREORDER -DDHD_USE_IDLECOUNT - DHDCFLAGS += -DCUSTOM_GLOM_SETTING=1 + DHDCFLAGS += -DCONFIG_CONTROL_PM DHDCFLAGS += -DPROP_TXSTATUS DHDCFLAGS += -DVSDB -DHT40_GO DHDCFLAGS += -DWL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST + DHDCFLAGS += -DDHD_USE_IDLECOUNT DHDCFLAGS += -DSUPPORT_AMPDU_MPDU_CMD + DHDCFLAGS += -DMIMO_ANT_SETTING -DAMPDU_HOSTREORDER + DHDCFLAGS += -DCUSTOM_GLOM_SETTING=1 -DCUSTOM_SDIO_F2_BLKSIZE=128 DHDCFLAGS += -DROAM_AP_ENV_DETECTION + DHDCFLAGS += -DSDIO_CRC_ERROR_FIX ifeq ($(CONFIG_BCM43241),m) DHDCFLAGS += -fno-pic endif @@ -123,16 +136,17 @@ endif ############################# ifeq ($(CONFIG_SPI_SC8810),y) -DHDCFLAGS += -DREAD_MACADDR -DBCMSPI -DBCMSPI_ANDROID -DSPI_PIO_32BIT_RW -DSPI_PIO_RW_BIGENDIAN -DDISABLE_11N + DHDCFLAGS += -DREAD_MACADDR -DBCMSPI -DBCMSPI_ANDROID -DSPI_PIO_32BIT_RW -DSPI_PIO_RW_BIGENDIAN + DHDCFLAGS += -UCUSTOM_DPC_PRIO_SETTING -#Remove defines for SDMMC -DHDCFLAGS :=$(filter-out -DOOB_INTR_ONLY,$(DHDCFLAGS)) -DHDCFLAGS :=$(filter-out -DBCMLXSDMMC,$(DHDCFLAGS)) - -#Remove defines for JB -DHDCFLAGS :=$(filter-out -DWL_ENABLE_P2P_IF,$(DHDCFLAGS)) -DHDCFLAGS :=$(filter-out -DMULTIPLE_SUPPLICANT,$(DHDCFLAGS)) -DHDCFLAGS :=$(filter-out -DWL_CFG80211_STA_EVENT,$(DHDCFLAGS)) + #Remove defines for SDMMC + DHDCFLAGS :=$(filter-out -DOOB_INTR_ONLY,$(DHDCFLAGS)) + DHDCFLAGS :=$(filter-out -DBCMLXSDMMC,$(DHDCFLAGS)) + + #Remove defines for JB + DHDCFLAGS :=$(filter-out -DWL_ENABLE_P2P_IF,$(DHDCFLAGS)) + DHDCFLAGS :=$(filter-out -DMULTIPLE_SUPPLICANT,$(DHDCFLAGS)) + DHDCFLAGS :=$(filter-out -DWL_CFG80211_STA_EVENT,$(DHDCFLAGS)) endif #For INITIAL 2G scan features @@ -182,6 +196,7 @@ endif DHDCFLAGS += -DWLAN_REGION_CODE=$(REGION_CODE) +DHDCFLAGS += -include "dhd_sec_feature.h" ############################################################## ######### --- a/drivers/net/wireless/bcmdhd/bcmevent.c +++ b/drivers/net/wireless/bcmdhd/bcmevent.c @@ -20,7 +20,7 @@ * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. - * $Id: bcmevent.c 327460 2012-04-13 18:38:41Z $ + * $Id: bcmevent.c 364790 2012-10-25 08:39:02Z $ */ #include @@ -29,7 +29,7 @@ #include #include -#if WLC_E_LAST != 94 +#if WLC_E_LAST != 105 #error "You need to add an entry to bcmevent_names[] for the new event" #endif --- a/drivers/net/wireless/bcmdhd/bcmsdh.c +++ b/drivers/net/wireless/bcmdhd/bcmsdh.c @@ -22,7 +22,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: bcmsdh.c 347614 2012-07-27 10:24:51Z $ + * $Id: bcmsdh.c 373329 2012-12-07 04:46:09Z $ */ /** @@ -45,8 +45,6 @@ #include /* SDIO Device and Protocol Specs */ -#include - #define SDIOH_API_ACCESS_RETRY_LIMIT 2 const uint bcmsdh_msglevel = BCMSDH_ERROR_VAL; @@ -159,9 +157,17 @@ bcmsdh_intr_enable(void *sdh) { bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; SDIOH_API_RC status; +#ifdef BCMSPI_ANDROID + uint32 data; +#endif /* BCMSPI_ANDROID */ ASSERT(bcmsdh); status = sdioh_interrupt_set(bcmsdh->sdioh, TRUE); +#ifdef BCMSPI_ANDROID + data = bcmsdh_cfg_read_word(sdh, 0, 4, NULL); + data |= 0xE0E70000; + bcmsdh_cfg_write_word(sdh, 0, 4, data, NULL); +#endif /* BCMSPI_ANDROID */ return (SDIOH_API_SUCCESS(status) ? 0 : BCME_ERROR); } @@ -170,9 +176,17 @@ bcmsdh_intr_disable(void *sdh) { bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; SDIOH_API_RC status; +#ifdef BCMSPI_ANDROID + uint32 data; +#endif /* BCMSPI_ANDROID */ ASSERT(bcmsdh); status = sdioh_interrupt_set(bcmsdh->sdioh, FALSE); +#ifdef BCMSPI_ANDROID + data = bcmsdh_cfg_read_word(sdh, 0, 4, NULL); + data &= ~0xE0E70000; + bcmsdh_cfg_write_word(sdh, 0, 4, data, NULL); +#endif /* BCMSPI_ANDROID */ return (SDIOH_API_SUCCESS(status) ? 0 : BCME_ERROR); } --- a/drivers/net/wireless/bcmdhd/bcmsdh_linux.c +++ b/drivers/net/wireless/bcmdhd/bcmsdh_linux.c @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: bcmsdh_linux.c 347638 2012-07-27 11:39:03Z $ + * $Id: bcmsdh_linux.c 373329 2012-12-07 04:46:09Z $ */ /** @@ -189,6 +189,10 @@ int bcmsdh_probe(struct device *dev) /* Get customer specific OOB IRQ parametres: IRQ number as IRQ type */ irq = dhd_customer_oob_irq_map(&irq_flags); +#if defined(CONFIG_ARCH_RHEA) || defined(CONFIG_ARCH_CAPRI) + /* Do not disable this IRQ during suspend */ + irq_flags |= IRQF_NO_SUSPEND; +#endif /* defined(CONFIG_ARCH_RHEA) || defined(CONFIG_ARCH_CAPRI) */ if (irq < 0) { SDLX_MSG(("%s: Host irq is not defined\n", __FUNCTION__)); return 1; @@ -632,7 +636,9 @@ static irqreturn_t wlan_oob_irq(int irq, dhdp = (dhd_pub_t *)dev_get_drvdata(sdhcinfo->dev); +#ifndef BCMSPI_ANDROID bcmsdh_oob_intr_set(0); +#endif /* !BCMSPI_ANDROID */ if (dhdp == NULL) { SDLX_MSG(("Out of band GPIO interrupt fired way too early\n")); @@ -663,7 +669,13 @@ int bcmsdh_register_oob_intr(void * dhdp if (error) return -ENODEV; +#if defined(CONFIG_ARCH_RHEA) || defined(CONFIG_ARCH_CAPRI) + if (device_may_wakeup(sdhcinfo->dev)) { +#endif error = enable_irq_wake(sdhcinfo->oob_irq); +#if defined(CONFIG_ARCH_RHEA) || defined(CONFIG_ARCH_CAPRI) + } +#endif if (error) SDLX_MSG(("%s enable_irq_wake error=%d \n", __FUNCTION__, error)); sdhcinfo->oob_irq_registered = TRUE; @@ -680,9 +692,15 @@ void bcmsdh_set_irq(int flag) sdhcinfo->oob_irq_enable_flag = flag; if (flag) { enable_irq(sdhcinfo->oob_irq); +#if defined(CONFIG_ARCH_RHEA) || defined(CONFIG_ARCH_CAPRI) + if (device_may_wakeup(sdhcinfo->dev)) +#endif enable_irq_wake(sdhcinfo->oob_irq); } else { #if !(defined(BCMSPI_ANDROID) && defined(CUSTOMER_HW4) && defined(CONFIG_NKERNEL)) +#if defined(CONFIG_ARCH_RHEA) || defined(CONFIG_ARCH_CAPRI) + if (device_may_wakeup(sdhcinfo->dev)) +#endif disable_irq_wake(sdhcinfo->oob_irq); #endif /* !defined(BCMSPI_ANDROID) */ disable_irq(sdhcinfo->oob_irq); --- a/drivers/net/wireless/bcmdhd/bcmsdh_sdmmc.c +++ b/drivers/net/wireless/bcmdhd/bcmsdh_sdmmc.c @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: bcmsdh_sdmmc.c 347640 2012-07-27 11:53:21Z $ + * $Id: bcmsdh_sdmmc.c 362913 2012-10-15 11:26:11Z $ */ #include @@ -62,12 +62,13 @@ extern int sdio_reset_comm(struct mmc_ca extern PBCMSDH_SDMMC_INSTANCE gInstance; -uint sd_sdmode = SDIOH_MODE_SD4; /* Use SD4 mode by default */ -#if defined(SDIO_F2_BLKSIZE) -uint sd_f2_blocksize = SDIO_F2_BLKSIZE; -#else -uint sd_f2_blocksize = 512; /* Default blocksize */ +#define DEFAULT_SDIO_F2_BLKSIZE 512 +#ifndef CUSTOM_SDIO_F2_BLKSIZE +#define CUSTOM_SDIO_F2_BLKSIZE DEFAULT_SDIO_F2_BLKSIZE #endif + +uint sd_sdmode = SDIOH_MODE_SD4; /* Use SD4 mode by default */ +uint sd_f2_blocksize = CUSTOM_SDIO_F2_BLKSIZE; uint sd_divisor = 2; /* Default 48MHz/2 = 24MHz */ uint sd_power = 1; /* Default to SD Slot powered ON */ @@ -81,6 +82,7 @@ DHD_PM_RESUME_WAIT_INIT(sdioh_request_pa DHD_PM_RESUME_WAIT_INIT(sdioh_request_buffer_wait); #define DMA_ALIGN_MASK 0x03 +#define MMC_SDIO_ABORT_RETRY_LIMIT 5 int sdioh_sdmmc_card_regread(sdioh_info_t *sd, int func, uint32 regaddr, int regsize, uint32 *data); @@ -523,7 +525,7 @@ sdioh_iovar_op(sdioh_info_t *si, const c /* Now set it */ si->client_block_size[func] = blksize; -#if defined(CUSTOMER_HW4) && defined(DYNAMIC_F2_BLKSIZE_OF_PROPTXSTATUS) +#if defined(CUSTOMER_HW4) && defined(USE_DYNAMIC_F2_BLKSIZE) if (gInstance == NULL || gInstance->func[func] == NULL) { sd_err(("%s: SDIO Device not present\n", __FUNCTION__)); bcmerror = BCME_NORESOURCE; @@ -536,7 +538,7 @@ sdioh_iovar_op(sdioh_info_t *si, const c blksize)); } sdio_release_host(gInstance->func[func]); -#endif /* CUSTOMER_HW4 && DYNAMIC_F2_BLKSIZE_OF_PROPTXSTATUS */ +#endif /* CUSTOMER_HW4 && USE_DYNAMIC_F2_BLKSIZE */ break; } @@ -792,7 +794,9 @@ extern SDIOH_API_RC sdioh_request_byte(sdioh_info_t *sd, uint rw, uint func, uint regaddr, uint8 *byte) { int err_ret; - +#if defined(MMC_SDIO_ABORT) + int sdio_abort_retry = MMC_SDIO_ABORT_RETRY_LIMIT; +#endif sd_info(("%s: rw=%d, func=%d, addr=0x%05x\n", __FUNCTION__, rw, func, regaddr)); DHD_PM_RESUME_WAIT(sdioh_request_byte_wait); @@ -826,16 +830,24 @@ sdioh_request_byte(sdioh_info_t *sd, uin #if defined(MMC_SDIO_ABORT) /* to allow abort command through F1 */ else if (regaddr == SDIOD_CCCR_IOABORT) { - if (gInstance->func[func]) { - sdio_claim_host(gInstance->func[func]); - /* - * this sdio_f0_writeb() can be replaced with another api - * depending upon MMC driver change. - * As of this time, this is temporaray one - */ - sdio_writeb(gInstance->func[func], - *byte, regaddr, &err_ret); - sdio_release_host(gInstance->func[func]); + /* Because of SDIO3.0 host issue on Manta, + * sometimes the abort fails. + * Retrying again will fix this issue. + */ + while (sdio_abort_retry--) { + if (gInstance->func[func]) { + sdio_claim_host(gInstance->func[func]); + /* + * this sdio_f0_writeb() can be replaced with + * another api depending upon MMC driver change. + * As of this time, this is temporaray one + */ + sdio_writeb(gInstance->func[func], + *byte, regaddr, &err_ret); + sdio_release_host(gInstance->func[func]); + } + if (!err_ret) + break; } } #endif /* MMC_SDIO_ABORT */ @@ -884,6 +896,9 @@ sdioh_request_word(sdioh_info_t *sd, uin uint32 *word, uint nbytes) { int err_ret = SDIOH_API_RC_FAIL; +#if defined(MMC_SDIO_ABORT) + int sdio_abort_retry = MMC_SDIO_ABORT_RETRY_LIMIT; +#endif if (func == 0) { sd_err(("%s: Only CMD52 allowed to F0.\n", __FUNCTION__)); @@ -898,7 +913,7 @@ sdioh_request_word(sdioh_info_t *sd, uin /* Claim host controller */ sdio_claim_host(gInstance->func[func]); - if(rw) { /* CMD52 Write */ + if(rw) { /* CMD53 Write */ if (nbytes == 4) { sdio_writel(gInstance->func[func], *word, addr, &err_ret); } else if (nbytes == 2) { @@ -920,8 +935,29 @@ sdioh_request_word(sdioh_info_t *sd, uin sdio_release_host(gInstance->func[func]); if (err_ret) { - sd_err(("bcmsdh_sdmmc: Failed to %s word, Err: 0x%08x", +#if defined(MMC_SDIO_ABORT) + /* Any error on CMD53 transaction should abort that function using function 0. */ + while (sdio_abort_retry--) { + if (gInstance->func[0]) { + sdio_claim_host(gInstance->func[0]); + /* + * this sdio_f0_writeb() can be replaced with another api + * depending upon MMC driver change. + * As of this time, this is temporaray one + */ + sdio_writeb(gInstance->func[0], + func, SDIOD_CCCR_IOABORT, &err_ret); + sdio_release_host(gInstance->func[0]); + } + if (!err_ret) + break; + } + if (err_ret) +#endif /* MMC_SDIO_ABORT */ + { + sd_err(("bcmsdh_sdmmc: Failed to %s word, Err: 0x%08x\n", rw ? "Write" : "Read", err_ret)); + } } return ((err_ret == 0) ? SDIOH_API_RC_SUCCESS : SDIOH_API_RC_FAIL); @@ -937,6 +973,7 @@ sdioh_request_packet(sdioh_info_t *sd, u void *pnext, *pprev; uint ttl_len, dma_len, lft_len, xfred_len, pkt_len; uint blk_num; + int blk_size; struct mmc_request mmc_req; struct mmc_command mmc_cmd; struct mmc_data mmc_dat; @@ -952,12 +989,13 @@ sdioh_request_packet(sdioh_info_t *sd, u for (pnext = pkt; pnext; pnext = PKTNEXT(sd->osh, pnext)) ttl_len += PKTLEN(sd->osh, pnext); - if (!sd->use_rxchain || ttl_len <= sd->client_block_size[func]) { + blk_size = sd->client_block_size[func]; + if (!sd->use_rxchain || ttl_len <= blk_size) { blk_num = 0; dma_len = 0; } else { - blk_num = ttl_len / sd->client_block_size[func]; - dma_len = blk_num * sd->client_block_size[func]; + blk_num = ttl_len / blk_size; + dma_len = blk_num * blk_size; } lft_len = ttl_len - dma_len; @@ -998,7 +1036,7 @@ sdioh_request_packet(sdioh_info_t *sd, u mmc_dat.sg = sd->sg_list; mmc_dat.sg_len = SGCount; - mmc_dat.blksz = sd->client_block_size[func]; + mmc_dat.blksz = blk_size; mmc_dat.blocks = blk_num; mmc_dat.flags = write ? MMC_DATA_WRITE : MMC_DATA_READ; @@ -1054,13 +1092,13 @@ sdioh_request_packet(sdioh_info_t *sd, u */ if (write == 0 || pkt_len < 32) pkt_len = (pkt_len + 3) & 0xFFFFFFFC; - else if (pkt_len % DHD_SDALIGN) - pkt_len += DHD_SDALIGN - (pkt_len % DHD_SDALIGN); + else if (pkt_len % blk_size) + pkt_len += blk_size - (pkt_len % blk_size); -#if defined(CUSTOMER_HW4) && defined(DYNAMIC_F2_BLKSIZE_OF_PROPTXSTATUS) +#if defined(CUSTOMER_HW4) && defined(USE_DYNAMIC_F2_BLKSIZE) if (write && pkt_len > 64 && (pkt_len % 64) == 32) pkt_len += 32; -#endif /* CUSTOMER_HW4 && DYNAMIC_F2_BLKSIZE_OF_PROPTXSTATUS */ +#endif /* CUSTOMER_HW4 && USE_DYNAMIC_F2_BLKSIZE */ #ifdef CONFIG_MMC_MSM7X00A if ((pkt_len % 64) == 32) { sd_trace(("%s: Rounding up TX packet +=32\n", __FUNCTION__)); --- a/drivers/net/wireless/bcmdhd/bcmsdh_sdmmc_linux.c +++ b/drivers/net/wireless/bcmdhd/bcmsdh_sdmmc_linux.c @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: bcmsdh_sdmmc_linux.c 353908 2012-08-29 08:09:02Z $ + * $Id: bcmsdh_sdmmc_linux.c 372067 2012-11-30 08:03:06Z $ */ #include @@ -153,10 +153,12 @@ static void bcmsdh_sdmmc_remove(struct s sd_info(("sdio_device: 0x%04x\n", func->device)); sd_info(("Function#: 0x%04x\n", func->num)); - if (func->num == 2) { + if (gInstance->func[2]) { sd_trace(("F2 found, calling bcmsdh_remove...\n")); bcmsdh_remove(&func->dev); - } else if (func->num == 1) { + gInstance->func[2] = NULL; + } + if (func->num == 1) { sdio_claim_host(func); sdio_disable_func(func); sdio_release_host(func); @@ -192,7 +194,7 @@ static int bcmsdh_sdmmc_suspend(struct d if (func->num != 2) return 0; - sd_trace(("%s Enter\n", __FUNCTION__)); + sd_trace_hw4(("%s Enter\n", __FUNCTION__)); if (dhd_os_check_wakelock(bcmsdh_get_drvdata())) return -EBUSY; @@ -232,7 +234,7 @@ static int bcmsdh_sdmmc_resume(struct de struct sdio_func *func = dev_to_sdio_func(pdev); #endif /* defined(OOB_INTR_ONLY) */ #endif /* defined(CUSTOMER_HW4) */ - sd_trace(("%s Enter\n", __FUNCTION__)); + sd_trace_hw4(("%s Enter\n", __FUNCTION__)); dhd_mmc_suspend = FALSE; #if !defined(CUSTOMER_HW4) --- a/drivers/net/wireless/bcmdhd/bcmsdspi_linux.c +++ b/drivers/net/wireless/bcmdhd/bcmsdspi_linux.c @@ -2,13 +2,13 @@ * Broadcom SPI Host Controller Driver - Linux Per-port * * Copyright (C) 1999-2012, Broadcom Corporation - * + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -16,12 +16,12 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: bcmsdspi_linux.c 355376 2012-09-06 13:23:59Z $ + * $Id: bcmsdspi_linux.c 373329 2012-12-07 04:46:09Z $ */ #include @@ -30,26 +30,36 @@ #include /* bcmsdh to/from specific controller APIs */ #include /* to get msglevel bit values */ -#ifndef BCMSPI_ANDROID +#ifdef BCMSPI_ANDROID +#include +#include +#include +#else #include #include /* SDIO Device and Protocol Specs */ #include /* request_irq(), free_irq() */ #include #include +#endif /* BCMSPI_ANDROID */ +#ifndef BCMSPI_ANDROID extern uint sd_crc; module_param(sd_crc, uint, 0); #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)) #define KERNEL26 #endif +#endif /* !BCMSPI_ANDROID */ struct sdos_info { sdioh_info_t *sd; spinlock_t lock; +#ifndef BCMSPI_ANDROID wait_queue_head_t intr_wait_queue; +#endif /* !BCMSPI_ANDROID */ }; +#ifndef BCMSPI_ANDROID #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)) #define BLOCKABLE() (!in_atomic()) #else @@ -86,10 +96,9 @@ sdspi_isr(int irq, void *dev_id return IRQ_RETVAL(ours); } } -#else /* !BCMSPI_ANDROID */ -#include -#include +#endif /* !BCMSPI_ANDROID */ +#ifdef BCMSPI_ANDROID static struct spi_device *gBCMSPI = NULL; extern int bcmsdh_probe(struct device *dev); @@ -159,7 +168,7 @@ void spi_function_cleanup(void) sd_trace(("%s Enter\n", __FUNCTION__)); spi_unregister_driver(&bcmsdh_spi_driver); } -#endif /* !BCMSPI_ANDROID */ +#endif /* BCMSPI_ANDROID */ /* Register with Linux for interrupts */ int @@ -202,7 +211,6 @@ spi_reg_unmap(osl_t *osh, uintptr addr, int spi_osinit(sdioh_info_t *sd) { -#ifndef BCMSPI_ANDROID struct sdos_info *sdos; sdos = (struct sdos_info*)MALLOC(sd->osh, sizeof(struct sdos_info)); @@ -212,6 +220,7 @@ spi_osinit(sdioh_info_t *sd) sdos->sd = sd; spin_lock_init(&sdos->lock); +#ifndef BCMSPI_ANDROID init_waitqueue_head(&sdos->intr_wait_queue); #endif /* !BCMSPI_ANDROID */ return BCME_OK; @@ -220,20 +229,17 @@ return BCME_OK; void spi_osfree(sdioh_info_t *sd) { -#ifndef BCMSPI_ANDROID struct sdos_info *sdos; ASSERT(sd && sd->sdos_info); sdos = (struct sdos_info *)sd->sdos_info; MFREE(sd->osh, sdos, sizeof(struct sdos_info)); -#endif /* !BCMSPI_ANDROID */ } /* Interrupt enable/disable */ SDIOH_API_RC sdioh_interrupt_set(sdioh_info_t *sd, bool enable) { -#ifndef BCMSPI_ANDROID ulong flags; struct sdos_info *sdos; @@ -247,22 +253,25 @@ sdioh_interrupt_set(sdioh_info_t *sd, bo return SDIOH_API_RC_FAIL; } +#ifndef BCMSPI_ANDROID if (enable && !(sd->intr_handler && sd->intr_handler_arg)) { sd_err(("%s: no handler registered, will not enable\n", __FUNCTION__)); return SDIOH_API_RC_FAIL; } +#endif /* !BCMSPI_ANDROID */ /* Ensure atomicity for enable/disable calls */ spin_lock_irqsave(&sdos->lock, flags); sd->client_intr_enabled = enable; +#ifndef BCMSPI_ANDROID if (enable && !sd->lockcount) spi_devintr_on(sd); else spi_devintr_off(sd); +#endif /* !BCMSPI_ANDROID */ spin_unlock_irqrestore(&sdos->lock, flags); -#endif /* !BCMSPI_ANDROID */ return SDIOH_API_RC_SUCCESS; } @@ -271,7 +280,6 @@ sdioh_interrupt_set(sdioh_info_t *sd, bo void spi_lock(sdioh_info_t *sd) { -#ifndef BCMSPI_ANDROID ulong flags; struct sdos_info *sdos; @@ -285,17 +293,20 @@ spi_lock(sdioh_info_t *sd) sd_err(("%s: Already locked!\n", __FUNCTION__)); ASSERT(sd->lockcount == 0); } +#ifdef BCMSPI_ANDROID + if (sd->client_intr_enabled) + bcmsdh_oob_intr_set(0); +#else spi_devintr_off(sd); +#endif /* BCMSPI_ANDROID */ sd->lockcount++; spin_unlock_irqrestore(&sdos->lock, flags); -#endif /* !BCMSPI_ANDROID */ } /* Enable client interrupt */ void spi_unlock(sdioh_info_t *sd) { -#ifndef BCMSPI_ANDROID ulong flags; struct sdos_info *sdos; @@ -307,10 +318,13 @@ spi_unlock(sdioh_info_t *sd) spin_lock_irqsave(&sdos->lock, flags); if (--sd->lockcount == 0 && sd->client_intr_enabled) { +#ifdef BCMSPI_ANDROID + bcmsdh_oob_intr_set(1); +#else spi_devintr_on(sd); +#endif /* BCMSPI_ANDROID */ } spin_unlock_irqrestore(&sdos->lock, flags); -#endif /* !BCMSPI_ANDROID */ } #ifndef BCMSPI_ANDROID --- a/drivers/net/wireless/bcmdhd/bcmspibrcm.c +++ b/drivers/net/wireless/bcmdhd/bcmspibrcm.c @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: bcmspibrcm.c 355377 2012-09-06 13:25:35Z $ + * $Id: bcmspibrcm.c 373329 2012-12-07 04:46:09Z $ */ #define HSMODE @@ -94,6 +94,9 @@ uint8 spi_inbuf[SPI_MAX_PKT_LEN]; #define BUF2_PKT_LEN 128 uint8 spi_outbuf2[BUF2_PKT_LEN]; uint8 spi_inbuf2[BUF2_PKT_LEN]; +#ifdef BCMSPI_ANDROID +uint *dhd_spi_lockcount = NULL; +#endif /* BCMSPI_ANDROID */ #if !(defined(SPI_PIO_RW_BIGENDIAN) && defined(SPI_PIO_32BIT_RW)) #define SPISWAP_WD4(x) bcmswap32(x); @@ -164,6 +167,10 @@ sdioh_attach(osl_t *osh, void *bar0, uin */ sd->wordlen = 2; +#ifdef BCMSPI_ANDROID + dhd_spi_lockcount = &sd->lockcount; +#endif /* BCMSPI_ANDROID */ + #ifndef BCMSPI_ANDROID if (!spi_hw_attach(sd)) { sd_err(("%s: spi_hw_attach() failed\n", __FUNCTION__)); @@ -209,6 +216,9 @@ sdioh_detach(osl_t *osh, sdioh_info_t *s spi_hw_detach(sd); #endif /* !BCMSPI_ANDROID */ spi_osfree(sd); +#ifdef BCMSPI_ANDROID + dhd_spi_lockcount = NULL; +#endif /* !BCMSPI_ANDROID */ MFREE(sd->osh, sd, sizeof(sdioh_info_t)); } return SDIOH_API_RC_SUCCESS; @@ -218,24 +228,24 @@ sdioh_detach(osl_t *osh, sdioh_info_t *s extern SDIOH_API_RC sdioh_interrupt_register(sdioh_info_t *sd, sdioh_cb_fn_t fn, void *argh) { -#ifndef BCMSPI_ANDROID sd_trace(("%s: Entering\n", __FUNCTION__)); +#if !defined(OOB_INTR_ONLY) sd->intr_handler = fn; sd->intr_handler_arg = argh; sd->intr_handler_valid = TRUE; -#endif /* !BCMSPI_ANDROID */ +#endif /* !defined(OOB_INTR_ONLY) */ return SDIOH_API_RC_SUCCESS; } extern SDIOH_API_RC sdioh_interrupt_deregister(sdioh_info_t *sd) { -#ifndef BCMSPI_ANDROID sd_trace(("%s: Entering\n", __FUNCTION__)); +#if !defined(OOB_INTR_ONLY) sd->intr_handler_valid = FALSE; sd->intr_handler = NULL; sd->intr_handler_arg = NULL; -#endif /* !BCMSPI_ANDROID */ +#endif /* !defined(OOB_INTR_ONLY) */ return SDIOH_API_RC_SUCCESS; } --- a/drivers/net/wireless/bcmdhd/dhd.h +++ b/drivers/net/wireless/bcmdhd/dhd.h @@ -24,7 +24,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: dhd.h 357924 2012-09-20 10:44:32Z $ + * $Id: dhd.h 363319 2012-10-17 04:44:07Z $ */ /**************** @@ -58,7 +58,6 @@ int setScheduler(struct task_struct *p, #include #include -#include #if defined(CUSTOMER_HW4_RELEASE) /* Customer requirement */ @@ -77,17 +76,20 @@ enum dhd_bus_state { DHD_BUS_DATA /* Ready for frame transfers */ }; - +enum dhd_op_flags { /* Firmware requested operation mode */ -#define STA_MASK 0x0001 -#define HOSTAPD_MASK 0x0002 -#define WFD_MASK 0x0004 -#define SOFTAP_FW_MASK 0x0008 -#define CONCURRENT_FW_MASK (STA_MASK | WFD_MASK) -#define P2P_GO_ENABLED 0x0010 -#define P2P_GC_ENABLED 0x0020 -#define CONCURENT_MASK 0x00F0 -#define CONCURRENT_MULTI_CHAN 0x0100 + DHD_FLAG_STA_MODE = BIT(0), /* STA only */ + DHD_FLAG_HOSTAP_MODE = BIT(1), /* SOFTAP only */ + DHD_FLAG_P2P_MODE = BIT(2), /* P2P Only */ + /* STA + P2P */ + DHD_FLAG_CONCURR_SINGLE_CHAN_MODE = (DHD_FLAG_STA_MODE | DHD_FLAG_P2P_MODE), + DHD_FLAG_CONCURR_MULTI_CHAN_MODE = BIT(4), /* STA + P2P */ + /* Current P2P mode for P2P connection */ + DHD_FLAG_P2P_GC_MODE = BIT(5), + DHD_FLAG_P2P_GO_MODE = BIT(6), + DHD_FLAG_MBSS_MODE = BIT(7) /* MBSS in future */ +}; + #define MANUFACTRING_FW "WLTEST" /* max sequential rxcntl timeouts to set HANG event */ @@ -95,11 +97,15 @@ enum dhd_bus_state { #define MAX_CNTL_TIMEOUT 2 #endif +#define DHD_SCAN_ASSOC_ACTIVE_TIME 40 /* ms: Embedded default Active setting from DHD */ +#define DHD_SCAN_UNASSOC_ACTIVE_TIME 80 /* ms: Embedded def. Unassoc Active setting from DHD */ +#define DHD_SCAN_PASSIVE_TIME 130 /* ms: Embedded default Passive setting from DHD */ + #ifndef POWERUP_MAX_RETRY #define POWERUP_MAX_RETRY 3 /* how many times we retry to power up the chip */ #endif #ifndef POWERUP_WAIT_MS -#define POWERUP_WAIT_MS (2000) /* ms: time out in waiting wifi to come up */ +#define POWERUP_WAIT_MS 2000 /* ms: time out in waiting wifi to come up */ #endif enum dhd_bus_wake_state { @@ -232,8 +238,10 @@ typedef struct dhd_pub { int pno_enable; /* pno status : "1" is pno enable */ int pno_suspend; /* pno suspend status : "1" is pno suspended */ #endif /* PNO_SUPPORT */ - int dtim_skip; /* dtim skip , default 0 means wake each dtim */ - + /* DTIM skip value, default 0(or 1) means wake each DTIM + * 3 means skip 2 DTIMs and wake up 3rd DTIM(9th beacon when AP DTIM is 3) + */ + int suspend_bcn_li_dtim; /* bcn_li_dtim value in suspend mode */ #ifdef PKT_FILTER_SUPPORT int early_suspended; /* Early suspend status */ int dhcp_in_progress; /* DHCP period */ @@ -277,8 +285,8 @@ typedef struct dhd_pub { uint8 htsfdlystat_sz; /* Size of delay stats, max 255B */ #endif struct reorder_info *reorder_bufs[WLHOST_REORDERDATA_MAXFLOWS]; -#if defined(CUSTOMER_HW4) && defined(PNO_SUPPORT) && defined(CONFIG_HAS_WAKELOCK) - struct wake_lock pno_wakelock; +#if defined(ARP_OFFLOAD_SUPPORT) + uint32 arp_version; #endif } dhd_pub_t; @@ -404,12 +412,20 @@ inline static void MUTEX_UNLOCK_SOFTAP_S #define DHD_PACKET_TIMEOUT_MS 1000 #define DHD_EVENT_TIMEOUT_MS 1500 +#if defined(CUSTOMER_HW4) && defined(PNO_SUPPORT) +#define DHD_PNO_TIMEOUT_MS 10000 +#endif + /* interface operations (register, remove) should be atomic, use this lock to prevent race * condition among wifi on/off and interface operation functions */ void dhd_net_if_lock(struct net_device *dev); void dhd_net_if_unlock(struct net_device *dev); +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) && 1 +extern struct mutex _dhd_sdio_mutex_lock_; +#endif + typedef struct dhd_if_event { uint8 ifidx; uint8 action; @@ -526,14 +542,14 @@ extern int dhd_dev_get_pno_status(struct #define DHD_MULTICAST4_FILTER_NUM 2 #define DHD_MULTICAST6_FILTER_NUM 3 #define DHD_MDNS_FILTER_NUM 4 -extern void dhd_set_packet_filter(dhd_pub_t *dhd); -extern void dhd_enable_packet_filter(int value, dhd_pub_t *dhd); -extern int net_os_enable_packet_filter(struct net_device *dev, int val); -extern int net_os_rxfilter_add_remove(struct net_device *dev, int val, int num); +extern int dhd_os_enable_packet_filter(dhd_pub_t *dhdp, int val); +extern void dhd_enable_packet_filter(int value, dhd_pub_t *dhd); +extern int net_os_enable_packet_filter(struct net_device *dev, int val); +extern int net_os_rxfilter_add_remove(struct net_device *dev, int val, int num); #endif /* PKT_FILTER_SUPPORT */ -extern int dhd_get_dtim_skip(dhd_pub_t *dhd); -extern bool dhd_check_ap_wfd_mode_set(dhd_pub_t *dhd); +extern int dhd_get_suspend_bcn_li_dtim(dhd_pub_t *dhd); +extern bool dhd_support_sta_mode(dhd_pub_t *dhd); #ifdef DHD_DEBUG extern int write_to_file(dhd_pub_t *dhd, uint8 *buf, int size); @@ -601,11 +617,7 @@ extern uint dhd_bus_chippkg_id(dhd_pub_t extern int dhd_keep_alive_onoff(dhd_pub_t *dhd); #endif /* KEEP_ALIVE */ -#ifdef ARP_OFFLOAD_SUPPORT -extern void dhd_arp_offload_set(dhd_pub_t * dhd, int arp_mode); -extern void dhd_arp_offload_enable(dhd_pub_t * dhd, int arp_enable); -#endif /* ARP_OFFLOAD_SUPPORT */ - +extern bool dhd_is_concurrent_mode(dhd_pub_t *dhd); typedef enum cust_gpio_modes { WLAN_RESET_ON, @@ -684,17 +696,36 @@ extern uint dhd_force_tx_queueing; #define NULL_PKT_STR "null_pkt" /* hooks for custom glom setting option via Makefile */ -#define DEFAULT_GLOM_VALUE -1 +#define DEFAULT_GLOM_VALUE -1 #ifndef CUSTOM_GLOM_SETTING -#define CUSTOM_GLOM_SETTING DEFAULT_GLOM_VALUE +#define CUSTOM_GLOM_SETTING DEFAULT_GLOM_VALUE +#endif + +/* hooks for custom Roaming Trigger setting via Makefile */ +#define DEFAULT_ROAM_TRIGGER_VALUE -75 /* dBm default roam trigger all band */ +#define DEFAULT_ROAM_TRIGGER_SETTING -1 +#ifndef CUSTOM_ROAM_TRIGGER_SETTING +#define CUSTOM_ROAM_TRIGGER_SETTING DEFAULT_ROAM_TRIGGER_VALUE #endif +/* hooks for custom Roaming Romaing setting via Makefile */ +#define DEFAULT_ROAM_DELTA_VALUE 10 /* dBm default roam delta all band */ +#define DEFAULT_ROAM_DELTA_SETTING -1 +#ifndef CUSTOM_ROAM_DELTA_SETTING +#define CUSTOM_ROAM_DELTA_SETTING DEFAULT_ROAM_DELTA_VALUE +#endif + + /* hooks for custom dhd_dpc_prio setting option via Makefile */ #define DEFAULT_DHP_DPC_PRIO 1 #ifndef CUSTOM_DPC_PRIO_SETTING -#define CUSTOM_DPC_PRIO_SETTING DEFAULT_DHP_DPC_PRIO +#define CUSTOM_DPC_PRIO_SETTING DEFAULT_DHP_DPC_PRIO #endif +#define DEFAULT_SUSPEND_BCN_LI_DTIM 3 +#ifndef CUSTOM_SUSPEND_BCN_LI_DTIM +#define CUSTOM_SUSPEND_BCN_LI_DTIM DEFAULT_SUSPEND_BCN_LI_DTIM +#endif #ifdef SDTEST /* Echo packet generator (SDIO), pkts/s */ @@ -881,11 +912,14 @@ extern int dhd_pno_suspend(dhd_pub_t *dh #endif /* PNO_SUPPORT */ #ifdef ARP_OFFLOAD_SUPPORT #define MAX_IPV4_ENTRIES 8 +void dhd_arp_offload_set(dhd_pub_t * dhd, int arp_mode); +void dhd_arp_offload_enable(dhd_pub_t * dhd, int arp_enable); + /* dhd_commn arp offload wrapers */ -void dhd_aoe_hostip_clr(dhd_pub_t *dhd); -void dhd_aoe_arp_clr(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, uint32 ipaddr); +void dhd_aoe_hostip_clr(dhd_pub_t *dhd, int idx); +void dhd_aoe_arp_clr(dhd_pub_t *dhd, int idx); +int dhd_arp_get_arp_hostip_table(dhd_pub_t *dhd, void *buf, int buflen, int idx); +void dhd_arp_offload_add_ip(dhd_pub_t *dhd, uint32 ipaddr, int idx); #endif /* ARP_OFFLOAD_SUPPORT */ #if defined(CUSTOMER_HW4) && defined(RDWR_KORICS_MACADDR) --- a/drivers/net/wireless/bcmdhd/dhd_cdc.c +++ b/drivers/net/wireless/bcmdhd/dhd_cdc.c @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: dhd_cdc.c 357848 2012-09-20 05:38:41Z $ + * $Id: dhd_cdc.c 364003 2012-10-22 02:22:16Z $ * * BDC is like CDC, except it includes a header for data packets to convey * packet priority over the bus, and flags (e.g. to indicate checksum status @@ -69,11 +69,11 @@ typedef struct dhd_wlfc_commit_info { } dhd_wlfc_commit_info_t; #endif /* PROP_TXSTATUS */ -#if defined(CUSTOMER_HW4) && defined(DYNAMIC_F2_BLKSIZE_OF_PROPTXSTATUS) +#if defined(CUSTOMER_HW4) && defined(USE_DYNAMIC_F2_BLKSIZE) extern uint sd_f2_blocksize; extern int dhdsdio_func_blocksize(dhd_pub_t *dhd, int function_num, int block_size); -#endif /* CUSTOMER_HW4 && DYNAMIC_F2_BLKSIZE_OF_PROPTXSTATUS */ +#endif /* CUSTOMER_HW4 && USE_DYNAMIC_F2_BLKSIZE */ typedef struct dhd_prot { uint16 reqid; @@ -703,13 +703,16 @@ dhd_wlfc_hanger_delete(osl_t *osh, void* static uint16 dhd_wlfc_hanger_get_free_slot(void* hanger) { - int i; + uint32 i; wlfc_hanger_t* h = (wlfc_hanger_t*)hanger; if (h) { - for (i = 0; i < h->max_items; i++) { - if (h->items[i].state == WLFC_HANGER_ITEM_STATE_FREE) + for (i = (h->slot_pos + 1); i != h->slot_pos;) { + if (h->items[i].state == WLFC_HANGER_ITEM_STATE_FREE) { + h->slot_pos = i; return (uint16)i; + } + (i == h->max_items)? i = 0 : i++; } h->failed_slotfind++; } @@ -892,7 +895,7 @@ _dhd_wlfc_pullheader(athost_wl_status_in if (PKTLEN(ctx->osh, pktbuf) < (h->dataOffset << 2)) { WLFC_DBGMESG(("%s: rx data too short (%d < %d)\n", __FUNCTION__, - PKTLEN(ctx->osh, pktbuf), (h->dataOffset << 2))); + PKTLEN(ctx->osh, pktbuf), (h->dataOffset << 2))); return BCME_ERROR; } /* pull wl-header */ @@ -958,7 +961,7 @@ _dhd_wlfc_rollback_packet_toq(athost_wl_ else { /* remove header first */ rc = _dhd_wlfc_pullheader(ctx, p); - if (rc != BCME_OK) { + if (rc != BCME_OK) { WLFC_DBGMESG(("Error: %s():%d\n", __FUNCTION__, __LINE__)); /* free the hanger slot */ dhd_wlfc_hanger_poppkt(ctx->hanger, hslot, &pktout, 1); @@ -1559,7 +1562,8 @@ _dhd_wlfc_handle_packet_commit(athost_wl ctx->stats.sendq_pkts[ac]++; WLFC_HOST_FIFO_CREDIT_INC_SENTCTRS(ctx, ac); } - } + } else if (rc == BCME_NORESOURCE) + rc = BCME_ERROR; else { /* bus commit has failed, rollback. @@ -1838,6 +1842,179 @@ dhd_wlfc_txcomplete(dhd_pub_t *dhd, void return; } +static int +dhd_wlfc_compressed_txstatus_update(dhd_pub_t *dhd, uint8* pkt_info, uint8 len) +{ + uint8 status_flag; + uint32 status; + int ret; + int remove_from_hanger = 1; + void* pktbuf; + uint8 fifo_id; + uint8 count = 0; + uint32 status_g; + uint32 hslot, hcnt; + wlfc_mac_descriptor_t* entry = NULL; + athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) + dhd->wlfc_state; + + memcpy(&status, pkt_info, sizeof(uint32)); + status_flag = WL_TXSTATUS_GET_FLAGS(status); + status_g = status & 0xff000000; + hslot = (status & 0x00ffff00) >> 8; + hcnt = status & 0xff; + len = pkt_info[4]; + + wlfc->stats.txstatus_in++; + + if (status_flag == WLFC_CTL_PKTFLAG_DISCARD) { + wlfc->stats.pkt_freed++; + } + + else if (status_flag == WLFC_CTL_PKTFLAG_D11SUPPRESS) { + wlfc->stats.d11_suppress++; + remove_from_hanger = 0; + } + + else if (status_flag == WLFC_CTL_PKTFLAG_WLSUPPRESS) { + wlfc->stats.wl_suppress++; + remove_from_hanger = 0; + } + + else if (status_flag == WLFC_CTL_PKTFLAG_TOSSED_BYWLC) { + wlfc->stats.wlc_tossed_pkts++; + } + while (count < len) { + status = (status_g << 24) | (hslot << 8) | (hcnt); + count++; + hslot++; + hcnt++; + + ret = dhd_wlfc_hanger_poppkt(wlfc->hanger, + WLFC_PKTID_HSLOT_GET(status), &pktbuf, remove_from_hanger); + if (ret != BCME_OK) { + /* do something */ + continue; + } + + entry = _dhd_wlfc_find_table_entry(wlfc, pktbuf); + + if (!remove_from_hanger) { + /* this packet was suppressed */ + if (!entry->suppressed || entry->generation != WLFC_PKTID_GEN(status)) { + entry->suppressed = TRUE; + entry->suppress_count = pktq_mlen(&entry->psq, + NBITVAL((WL_TXSTATUS_GET_FIFO(status) << 1) + 1)); + entry->suppr_transit_count = entry->transit_count; + } + entry->generation = WLFC_PKTID_GEN(status); + } + +#ifdef PROP_TXSTATUS_DEBUG + { + uint32 new_t = OSL_SYSUPTIME(); + uint32 old_t; + uint32 delta; + old_t = ((wlfc_hanger_t*)(wlfc->hanger))->items[ + WLFC_PKTID_HSLOT_GET(status)].push_time; + + + wlfc->stats.latency_sample_count++; + if (new_t > old_t) + delta = new_t - old_t; + else + delta = 0xffffffff + new_t - old_t; + wlfc->stats.total_status_latency += delta; + wlfc->stats.latency_most_recent = delta; + + wlfc->stats.deltas[wlfc->stats.idx_delta++] = delta; + if (wlfc->stats.idx_delta == sizeof(wlfc->stats.deltas)/sizeof(uint32)) + wlfc->stats.idx_delta = 0; + } +#endif /* PROP_TXSTATUS_DEBUG */ + + fifo_id = DHD_PKTTAG_FIFO(PKTTAG(pktbuf)); + + /* pick up the implicit credit from this packet */ + if (DHD_PKTTAG_CREDITCHECK(PKTTAG(pktbuf))) { + if (wlfc->proptxstatus_mode == WLFC_FCMODE_IMPLIED_CREDIT) { + + int lender, credit_returned = 0; /* Note that borrower is fifo_id */ + + /* Return credits to highest priority lender first */ + for (lender = AC_COUNT; lender >= 0; lender--) { + if (wlfc->credits_borrowed[fifo_id][lender] > 0) { + wlfc->FIFO_credit[lender]++; + wlfc->credits_borrowed[fifo_id][lender]--; + credit_returned = 1; + break; + } + } + + if (!credit_returned) { + wlfc->FIFO_credit[fifo_id]++; + } + } + } + else { + /* + if this packet did not count against FIFO credit, it must have + taken a requested_credit from the destination entry (for pspoll etc.) + */ + if (!entry) { + + entry = _dhd_wlfc_find_table_entry(wlfc, pktbuf); + } + if (!DHD_PKTTAG_ONETIMEPKTRQST(PKTTAG(pktbuf))) + entry->requested_credit++; +#ifdef PROP_TXSTATUS_DEBUG + entry->dstncredit_acks++; +#endif + } + if ((status_flag == WLFC_CTL_PKTFLAG_D11SUPPRESS) || + (status_flag == WLFC_CTL_PKTFLAG_WLSUPPRESS)) { + + ret = _dhd_wlfc_enque_suppressed(wlfc, fifo_id, pktbuf); + if (ret != BCME_OK) { + /* delay q is full, drop this packet */ + dhd_wlfc_hanger_poppkt(wlfc->hanger, WLFC_PKTID_HSLOT_GET(status), + &pktbuf, 1); + + /* indicate failure and free the packet */ + dhd_txcomplete(dhd, pktbuf, FALSE); + entry->transit_count--; + /* packet is transmitted Successfully by dongle + * after first suppress. + */ + if (entry->suppressed) { + entry->suppr_transit_count--; + } + PKTFREE(wlfc->osh, pktbuf, TRUE); + } else { + /* Mark suppressed to avoid a double free during wlfc cleanup */ + + dhd_wlfc_hanger_mark_suppressed(wlfc->hanger, + WLFC_PKTID_HSLOT_GET(status), WLFC_PKTID_GEN(status)); + entry->suppress_count++; + } + } + else { + dhd_txcomplete(dhd, pktbuf, TRUE); + entry->transit_count--; + + /* This packet is transmitted Successfully by dongle + * even after first suppress. + */ + if (entry->suppressed) { + entry->suppr_transit_count--; + } + /* free the packet */ + PKTFREE(wlfc->osh, pktbuf, TRUE); + } + } + return BCME_OK; +} + /* Handle discard or suppress indication */ static int dhd_wlfc_txstatus_update(dhd_pub_t *dhd, uint8* pkt_info) @@ -2290,6 +2467,8 @@ dhd_wlfc_parse_header_info(dhd_pub_t *dh processed += 2 + len; if (type == WLFC_CTL_TYPE_TXSTATUS) dhd_wlfc_txstatus_update(dhd, value); + if (type == WLFC_CTL_TYPE_COMP_TXSTATUS) + dhd_wlfc_compressed_txstatus_update(dhd, value, len); else if (type == WLFC_CTL_TYPE_HOST_REORDER_RXPKTS) dhd_wlfc_reorderinfo_indicate(value, len, reorder_info_buf, @@ -2371,6 +2550,8 @@ dhd_wlfc_enable(dhd_pub_t *dhd) int i; athost_wl_status_info_t* wlfc; + DHD_TRACE(("Enter %s\n", __FUNCTION__)); + if (!dhd->wlfc_enabled || dhd->wlfc_state) return BCME_OK; @@ -2415,9 +2596,10 @@ dhd_wlfc_enable(dhd_pub_t *dhd) wlfc->allow_credit_borrow = TRUE; wlfc->borrow_defer_timestamp = 0; -#if defined(CUSTOMER_HW4) && defined(DYNAMIC_F2_BLKSIZE_OF_PROPTXSTATUS) - dhdsdio_func_blocksize(dhd, 2, VSDB_F2_BLKSIZE); -#endif /* CUSTOMER_HW4 && DYNAMIC_F2_BLKSIZE_OF_PROPTXSTATUS */ +#if defined(CUSTOMER_HW4) && defined(USE_DYNAMIC_F2_BLKSIZE) + dhdsdio_func_blocksize(dhd, 2, DYNAMIC_F2_BLKSIZE_FOR_NONLEGACY); +#endif /* CUSTOMER_HW4 && USE_DYNAMIC_F2_BLKSIZE */ + return BCME_OK; } @@ -2434,10 +2616,13 @@ dhd_wlfc_cleanup(dhd_pub_t *dhd) int prec; void *pkt = NULL; struct pktq *txq = NULL; + + DHD_TRACE(("Enter %s\n", __FUNCTION__)); if (dhd->wlfc_state == NULL) return; /* flush bus->txq */ txq = dhd_bus_txq(dhd->bus); + /* any in the hanger? */ h = (wlfc_hanger_t*)wlfc->hanger; total_entries = sizeof(wlfc->destination_entries)/sizeof(wlfc_mac_descriptor_t); @@ -2466,6 +2651,8 @@ dhd_wlfc_cleanup(dhd_pub_t *dhd) if (h->items[i].state == WLFC_HANGER_ITEM_STATE_INUSE) { PKTFREE(wlfc->osh, h->items[i].pkt, TRUE); h->items[i].state = WLFC_HANGER_ITEM_STATE_FREE; + h->items[i].pkt = NULL; + h->items[i].identifier = 0; } else if (h->items[i].state == WLFC_HANGER_ITEM_STATE_INUSE_SUPPRESSED) { /* These are already freed from the psq */ @@ -2487,6 +2674,7 @@ dhd_wlfc_cleanup(dhd_pub_t *dhd) h->items[i].state = WLFC_HANGER_ITEM_STATE_FREE; } } + return; } @@ -2497,9 +2685,11 @@ dhd_wlfc_deinit(dhd_pub_t *dhd) athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) dhd->wlfc_state; - if (dhd->wlfc_state == NULL) + dhd_os_wlfc_block(dhd); + if (dhd->wlfc_state == NULL) { + dhd_os_wlfc_unblock(dhd); return; - + } #ifdef PROP_TXSTATUS_DEBUG { int i; @@ -2519,9 +2709,11 @@ dhd_wlfc_deinit(dhd_pub_t *dhd) /* free top structure */ MFREE(dhd->osh, dhd->wlfc_state, sizeof(athost_wl_status_info_t)); dhd->wlfc_state = NULL; -#if defined(CUSTOMER_HW4) && defined(DYNAMIC_F2_BLKSIZE_OF_PROPTXSTATUS) + dhd_os_wlfc_unblock(dhd); + +#if defined(CUSTOMER_HW4) && defined(USE_DYNAMIC_F2_BLKSIZE) dhdsdio_func_blocksize(dhd, 2, sd_f2_blocksize); -#endif /* CUSTOMER_HW4 && DYNAMIC_F2_BLKSIZE_OF_PROPTXSTATUS */ +#endif /* CUSTOMER_HW4 && USE_DYNAMIC_F2_BLKSIZE */ return; } #endif /* PROP_TXSTATUS */ @@ -2634,8 +2826,6 @@ dhd_prot_hdrpull(dhd_pub_t *dhd, int *if dhd_wlfc_parse_header_info(dhd, pktbuf, (h->dataOffset << 2), reorder_buf_info, reorder_info_len); ((athost_wl_status_info_t*)dhd->wlfc_state)->stats.dhd_hdrpulls++; - dhd_wlfc_commit_packets(dhd->wlfc_state, (f_commitpkt_t)dhd_bus_txdata, - (void *)dhd->bus); dhd_os_wlfc_unblock(dhd); } #endif /* PROP_TXSTATUS */ @@ -2645,6 +2835,22 @@ dhd_prot_hdrpull(dhd_pub_t *dhd, int *if return 0; } +#if defined(PROP_TXSTATUS) +void +dhd_wlfc_trigger_pktcommit(dhd_pub_t *dhd) +{ + if (dhd->wlfc_state && + (((athost_wl_status_info_t*)dhd->wlfc_state)->proptxstatus_mode + != WLFC_FCMODE_NONE)) { + dhd_os_wlfc_block(dhd); + dhd_wlfc_commit_packets(dhd->wlfc_state, (f_commitpkt_t)dhd_bus_txdata, + (void *)dhd->bus); + dhd_os_wlfc_unblock(dhd); + } +} +#endif + + int dhd_prot_attach(dhd_pub_t *dhd) { @@ -2719,15 +2925,15 @@ dhd_prot_init(dhd_pub_t *dhd) goto done; -#ifdef PROP_TXSTATUS - ret = dhd_wlfc_init(dhd); -#endif - #if defined(WL_CFG80211) if (dhd_download_fw_on_driverload) #endif /* defined(WL_CFG80211) */ ret = dhd_preinit_ioctls(dhd); +#ifdef PROP_TXSTATUS + ret = dhd_wlfc_init(dhd); +#endif + /* Always assumes wl for now */ dhd->iswl = TRUE; --- a/drivers/net/wireless/bcmdhd/dhd_cfg80211.c +++ b/drivers/net/wireless/bcmdhd/dhd_cfg80211.c @@ -80,10 +80,9 @@ s32 dhd_cfg80211_set_p2p_info(struct wl_ { dhd_pub_t *dhd = (dhd_pub_t *)(wl->pub); dhd->op_mode |= val; - WL_ERR(("Set : op_mode=%d\n", dhd->op_mode)); -#if defined(ARP_OFFLOAD_SUPPORT) - if ((dhd->op_mode & CONCURRENT_MULTI_CHAN) != - CONCURRENT_MULTI_CHAN) { + WL_ERR(("Set : op_mode=0x%04x\n", dhd->op_mode)); +#ifdef ARP_OFFLOAD_SUPPORT + if (dhd->arp_version == 1) { /* IF P2P is enabled, disable arpoe */ dhd_arp_offload_set(dhd, 0); dhd_arp_offload_enable(dhd, false); @@ -96,13 +95,15 @@ s32 dhd_cfg80211_set_p2p_info(struct wl_ s32 dhd_cfg80211_clean_p2p_info(struct wl_priv *wl) { dhd_pub_t *dhd = (dhd_pub_t *)(wl->pub); - dhd->op_mode &= ~CONCURENT_MASK; - WL_ERR(("Clean : op_mode=%d\n", dhd->op_mode)); + dhd->op_mode &= ~(DHD_FLAG_P2P_GC_MODE | DHD_FLAG_P2P_GO_MODE); + WL_ERR(("Clean : op_mode=0x%04x\n", dhd->op_mode)); -#if defined(ARP_OFFLOAD_SUPPORT) - /* IF P2P is disabled, enable arpoe back for STA mode. */ - dhd_arp_offload_set(dhd, dhd_arp_mode); - dhd_arp_offload_enable(dhd, true); +#ifdef ARP_OFFLOAD_SUPPORT + if (dhd->arp_version == 1) { + /* IF P2P is disabled, enable arpoe back for STA mode. */ + dhd_arp_offload_set(dhd, dhd_arp_mode); + dhd_arp_offload_enable(dhd, true); + } #endif /* ARP_OFFLOAD_SUPPORT */ return 0; @@ -508,7 +509,7 @@ void wl_cfg80211_btcoex_deinit(struct wl if (!wl->btcoex_info) return; - if (!wl->btcoex_info->timer_on) { + if (wl->btcoex_info->timer_on) { wl->btcoex_info->timer_on = 0; del_timer_sync(&wl->btcoex_info->timer); } --- a/drivers/net/wireless/bcmdhd/dhd_common.c +++ b/drivers/net/wireless/bcmdhd/dhd_common.c @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: dhd_common.c 357867 2012-09-20 06:57:44Z $ + * $Id: dhd_common.c 375020 2012-12-17 06:10:40Z $ */ #include #include @@ -339,7 +339,7 @@ dhd_doiovar(dhd_pub_t *dhd_pub, const bc else if (int_val & DHD_WL_VAL) wl_cfg80211_enable_trace(FALSE, WL_DBG_DBG); if (!(int_val & DHD_WL_VAL2)) -#endif +#endif /* WL_CFG80211 */ dhd_msg_level = int_val; break; case IOV_GVAL(IOV_BCMERRORSTR): @@ -677,7 +677,7 @@ dhd_ioctl(dhd_pub_t * dhd_pub, dhd_ioctl case DHD_GET_VERSION: if (buflen < sizeof(int)) - bcmerror = -BCME_BUFTOOSHORT; + bcmerror = BCME_BUFTOOSHORT; else *(int*)buf = DHD_IOCTL_VERSION; break; @@ -1454,10 +1454,10 @@ dhd_arp_offload_set(dhd_pub_t * dhd, int retcode = retcode >= 0 ? 0 : retcode; if (retcode) DHD_TRACE(("%s: failed to set ARP offload mode to 0x%x, retcode = %d\n", - __FUNCTION__, arp_mode, retcode)); + __FUNCTION__, arp_mode, retcode)); else DHD_TRACE(("%s: successfully set ARP offload mode to 0x%x\n", - __FUNCTION__, arp_mode)); + __FUNCTION__, arp_mode)); } void @@ -1471,49 +1471,73 @@ dhd_arp_offload_enable(dhd_pub_t * dhd, retcode = retcode >= 0 ? 0 : retcode; if (retcode) DHD_TRACE(("%s: failed to enabe ARP offload to %d, retcode = %d\n", - __FUNCTION__, arp_enable, retcode)); + __FUNCTION__, arp_enable, retcode)); else DHD_TRACE(("%s: successfully enabed ARP offload to %d\n", - __FUNCTION__, arp_enable)); + __FUNCTION__, arp_enable)); + if (arp_enable) { + uint32 version; + bcm_mkiovar("arp_version", 0, 0, iovbuf, sizeof(iovbuf)); + retcode = dhd_wl_ioctl_cmd(dhd, WLC_GET_VAR, iovbuf, sizeof(iovbuf), FALSE, 0); + if (retcode) { + DHD_INFO(("%s: fail to get version (maybe version 1:retcode = %d\n", + __FUNCTION__, retcode)); + dhd->arp_version = 1; + } + else { + memcpy(&version, iovbuf, sizeof(version)); + DHD_INFO(("%s: ARP Version= %x\n", __FUNCTION__, version)); + dhd->arp_version = version; + } + } } void -dhd_aoe_arp_clr(dhd_pub_t *dhd) +dhd_aoe_arp_clr(dhd_pub_t *dhd, int idx) { int ret = 0; int iov_len = 0; char iovbuf[128]; if (dhd == NULL) return; + if (dhd->arp_version == 1) + idx = 0; iov_len = bcm_mkiovar("arp_table_clear", 0, 0, iovbuf, sizeof(iovbuf)); - if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, iov_len, TRUE, 0) < 0)) + if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, iov_len, TRUE, idx)) < 0) DHD_ERROR(("%s failed code %d\n", __FUNCTION__, ret)); } void -dhd_aoe_hostip_clr(dhd_pub_t *dhd) +dhd_aoe_hostip_clr(dhd_pub_t *dhd, int idx) { int ret = 0; int iov_len = 0; char iovbuf[128]; if (dhd == NULL) return; + if (dhd->arp_version == 1) + idx = 0; iov_len = bcm_mkiovar("arp_hostip_clear", 0, 0, iovbuf, sizeof(iovbuf)); - if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, iov_len, TRUE, 0)) < 0) + if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, iov_len, TRUE, idx)) < 0) DHD_ERROR(("%s failed code %d\n", __FUNCTION__, ret)); } void -dhd_arp_offload_add_ip(dhd_pub_t *dhd, uint32 ipaddr) +dhd_arp_offload_add_ip(dhd_pub_t *dhd, uint32 ipaddr, int idx) { int iov_len = 0; char iovbuf[32]; int retcode; - iov_len = bcm_mkiovar("arp_hostip", (char *)&ipaddr, 4, iovbuf, sizeof(iovbuf)); - retcode = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, iov_len, TRUE, 0); + + if (dhd == NULL) return; + if (dhd->arp_version == 1) + idx = 0; + iov_len = bcm_mkiovar("arp_hostip", (char *)&ipaddr, + sizeof(ipaddr), iovbuf, sizeof(iovbuf)); + retcode = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, iov_len, TRUE, idx); if (retcode) DHD_TRACE(("%s: ARP ip addr add failed, retcode = %d\n", @@ -1524,7 +1548,7 @@ dhd_arp_offload_add_ip(dhd_pub_t *dhd, u } int -dhd_arp_get_arp_hostip_table(dhd_pub_t *dhd, void *buf, int buflen) +dhd_arp_get_arp_hostip_table(dhd_pub_t *dhd, void *buf, int buflen, int idx) { int retcode, i; int iov_len; @@ -1533,10 +1557,13 @@ dhd_arp_get_arp_hostip_table(dhd_pub_t * if (!buf) return -1; + if (dhd == NULL) return -1; + if (dhd->arp_version == 1) + idx = 0; iov_len = bcm_mkiovar("arp_hostip", 0, 0, buf, buflen); BCM_REFERENCE(iov_len); - retcode = dhd_wl_ioctl_cmd(dhd, WLC_GET_VAR, buf, buflen, FALSE, 0); + retcode = dhd_wl_ioctl_cmd(dhd, WLC_GET_VAR, buf, buflen, FALSE, idx); if (retcode) { DHD_TRACE(("%s: ioctl WLC_GET_VAR error %d\n", @@ -1804,16 +1831,13 @@ bool dhd_is_associated(dhd_pub_t *dhd, v /* Function to estimate possible DTIM_SKIP value */ int -dhd_get_dtim_skip(dhd_pub_t *dhd) +dhd_get_suspend_bcn_li_dtim(dhd_pub_t *dhd) { int bcn_li_dtim; int ret = -1; int dtim_assoc = 0; - if ((dhd->dtim_skip == 0) || (dhd->dtim_skip == 1)) - bcn_li_dtim = 3; - else - bcn_li_dtim = dhd->dtim_skip; + bcn_li_dtim = dhd->suspend_bcn_li_dtim; /* Check if associated */ if (dhd_is_associated(dhd, NULL, NULL) == FALSE) { @@ -1855,34 +1879,16 @@ exit: return bcn_li_dtim; } -/* Check if HostAPD or WFD mode setup */ -bool dhd_check_ap_wfd_mode_set(dhd_pub_t *dhd) +/* Check if the mode supports STA MODE */ +bool dhd_support_sta_mode(dhd_pub_t *dhd) { -#if !defined(AP) && defined(WLP2P) - if ((dhd->op_mode & CONCURRENT_FW_MASK) == CONCURRENT_FW_MASK) - return FALSE; -#endif + #ifdef WL_CFG80211 -#ifndef WL_ENABLE_P2P_IF - /* To be back compatble with ICS MR1 release where p2p interface - * disable but wlan0 used for p2p - */ - if (((dhd->op_mode & HOSTAPD_MASK) == HOSTAPD_MASK) || - ((dhd->op_mode & WFD_MASK) == WFD_MASK)) { - return TRUE; - } - else -#else - /* concurent mode with p2p interface for wfd and wlan0 for sta */ - if (((dhd->op_mode & P2P_GO_ENABLED) == P2P_GO_ENABLED) || - ((dhd->op_mode & P2P_GC_ENABLED) == P2P_GC_ENABLED)) { - DHD_ERROR(("%s P2P enabled for mode=%d\n", __FUNCTION__, dhd->op_mode)); - return TRUE; - } + if (!(dhd->op_mode & DHD_FLAG_STA_MODE)) + return FALSE; else -#endif /* WL_ENABLE_P2P_IF */ #endif /* WL_CFG80211 */ - return FALSE; + return TRUE; } #if defined(PNO_SUPPORT) @@ -1927,7 +1933,8 @@ dhd_pno_enable(dhd_pub_t *dhd, int pfn_e return ret; } - if (dhd_check_ap_wfd_mode_set(dhd) == TRUE) +#ifndef WL_SCHED_SCAN + if (!dhd_support_sta_mode(dhd)) return (ret); memset(iovbuf, 0, sizeof(iovbuf)); @@ -1936,6 +1943,7 @@ dhd_pno_enable(dhd_pub_t *dhd, int pfn_e DHD_ERROR(("%s pno is NOT enable : called in assoc mode , ignore\n", __FUNCTION__)); return ret; } +#endif /* !WL_SCHED_SCAN */ /* Enable/disable PNO */ if ((ret = bcm_mkiovar("pfn", (char *)&pfn_enabled, 4, iovbuf, sizeof(iovbuf))) > 0) { @@ -1975,9 +1983,10 @@ dhd_pno_set(dhd_pub_t *dhd, wlc_ssid_t* err = -1; return err; } - - if (dhd_check_ap_wfd_mode_set(dhd) == TRUE) - return (err); +#ifndef WL_SCHED_SCAN + if (!dhd_support_sta_mode(dhd)) + return err; +#endif /* !WL_SCHED_SCAN */ /* Check for broadcast ssid */ for (k = 0; k < nssid; k++) { @@ -2094,8 +2103,8 @@ int dhd_keep_alive_onoff(dhd_pub_t *dhd) int str_len; int res = -1; - if (dhd_check_ap_wfd_mode_set(dhd) == TRUE) - return (res); + if (!dhd_support_sta_mode(dhd)) + return res; DHD_TRACE(("%s execution\n", __FUNCTION__)); --- a/drivers/net/wireless/bcmdhd/dhd_custom_sec.c +++ b/drivers/net/wireless/bcmdhd/dhd_custom_sec.c @@ -70,7 +70,11 @@ const struct cntry_locales_custom transl {"ES", "ES", 1}, {"FI", "FI", 1}, {"FR", "FR", 1}, +#ifdef BCM4335_CHIP + {"GB", "GB", 6}, +#else {"GB", "GB", 1}, +#endif {"GR", "GR", 1}, {"HR", "HR", 1}, {"HU", "HU", 1}, @@ -84,7 +88,9 @@ const struct cntry_locales_custom transl {"LT", "LT", 1}, {"LU", "LU", 1}, {"LV", "LV", 1}, +#ifndef BCM4330_CHIP {"MA", "MA", 1}, +#endif {"MT", "MT", 1}, {"MX", "MX", 1}, {"NL", "NL", 1}, @@ -96,8 +102,9 @@ const struct cntry_locales_custom transl {"SE", "SE", 1}, {"SI", "SI", 1}, {"SK", "SK", 1}, +#ifndef BCM4330_CHIP {"TR", "TR", 7}, - {"UA", "UA", 2}, +#endif {"TW", "TW", 2}, {"IR", "XZ", 11}, /* Universal if Country code is IRAN, (ISLAMIC REPUBLIC OF) */ {"SD", "XZ", 11}, /* Universal if Country code is SUDAN */ @@ -108,14 +115,50 @@ const struct cntry_locales_custom transl {"MH", "XZ", 11}, /* Universal if Country code is MARSHALL ISLANDS */ {"PK", "XZ", 11}, /* Universal if Country code is PAKISTAN */ #ifdef BCM4334_CHIP - {"RU", "RU", 5}, + {"RU", "RU", 13}, {"SG", "SG", 4}, - {"US", "US", 46} + {"US", "US", 46}, + {"UA", "UA", 8}, + {"CO", "CO", 4}, + {"ID", "ID", 1}, + {"LA", "LA", 1}, + {"LB", "LB", 2}, + {"VN", "VN", 4}, #endif #ifdef BCM4330_CHIP - {"RU", "RU", 1}, - {"US", "US", 5} + {"RU", "RU", 13}, + {"US", "US", 5}, + {"UA", "UY", 0}, + {"AD", "AL", 0}, + {"CX", "AU", 2}, + {"GE", "GB", 1}, + {"ID", "MW", 0}, + {"KI", "AU", 2}, + {"NP", "SA", 0}, + {"WS", "SA", 0}, + {"LR", "BR", 0}, + {"ZM", "IN", 0}, + {"AN", "AG", 0}, + {"AI", "AS", 0}, + {"BM", "AS", 0}, + {"DZ", "IL", 0}, + {"LC", "AG", 0}, + {"MF", "BY", 0}, + {"GY", "CU", 0}, + {"LA", "GB", 1}, + {"LB", "BR", 0}, + {"MA", "IL", 0}, + {"MO", "BD", 0}, + {"MW", "BD", 0}, + {"QA", "BD", 0}, + {"TR", "GB", 1}, + {"TZ", "BF", 0}, + {"VN", "BR", 0}, + {"JO", "XZ", 1}, + {"PG", "XZ", 1}, + {"SA", "XZ", 1}, #endif + {"UA", "UA", 2} }; /* Customized Locale convertor @@ -273,12 +316,12 @@ int dhd_write_rdwr_macaddr(struct ether_ mac->octet[0], mac->octet[1], mac->octet[2], mac->octet[3], mac->octet[4], mac->octet[5]); - /* /data/.mac.info will be created */ - fp_mac = filp_open(filepath_data, O_RDWR | O_CREAT, 0666); + /* /efs/wifi/.mac.info will be created */ + fp_mac = filp_open(filepath_efs, O_RDWR | O_CREAT, 0666); if (IS_ERR(fp_mac)) { DHD_ERROR(("[WIFI] %s: File open error\n", filepath_data)); return -1; - } else { + } else { oldfs = get_fs(); set_fs(get_ds()); @@ -295,12 +338,12 @@ int dhd_write_rdwr_macaddr(struct ether_ set_fs(oldfs); filp_close(fp_mac, NULL); } - /* /efs/wifi/.mac.info will be created */ - fp_mac = filp_open(filepath_efs, O_RDWR | O_CREAT, 0666); + /* /data/.mac.info will be created */ + fp_mac = filp_open(filepath_data, O_RDWR | O_CREAT, 0666); if (IS_ERR(fp_mac)) { DHD_ERROR(("[WIFI] %s: File open error\n", filepath_efs)); return -1; - } else { + } else { oldfs = get_fs(); set_fs(get_ds()); @@ -335,7 +378,7 @@ int dhd_check_rdwr_macaddr(struct dhd_in #ifdef CONFIG_TARGET_LOCALE_NA char *nvfilepath = "/data/misc/wifi/.nvmac.info"; #else - char *nvfilepath = NVMACINFO; + char *nvfilepath = "/efs/wifi/.nvmac.info"; #endif char cur_mac[128] = {0}; char dummy_mac[ETHER_ADDR_LEN] = {0x00, 0x90, 0x4C, 0xC5, 0x12, 0x38}; @@ -347,11 +390,6 @@ int dhd_check_rdwr_macaddr(struct dhd_in fp_nvm = filp_open(nvfilepath, O_RDONLY, 0); if (IS_ERR(fp_nvm)) { /* file does not exist */ - /* Create the .nvmac.info */ - fp_nvm = filp_open(nvfilepath, O_RDWR | O_CREAT, 0666); - if (!IS_ERR(fp_nvm)) - filp_close(fp_nvm, NULL); - /* read MAC Address */ strcpy(cur_mac, "cur_etheraddr"); ret = dhd_wl_ioctl_cmd(dhdp, WLC_GET_VAR, cur_mac, --- a/drivers/net/wireless/bcmdhd/dhd_linux.c +++ b/drivers/net/wireless/bcmdhd/dhd_linux.c @@ -22,7 +22,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: dhd_linux.c 358099 2012-09-21 04:38:52Z $ + * $Id: dhd_linux.c 373329 2012-12-07 04:46:09Z $ */ #include @@ -95,10 +95,6 @@ typedef struct histo_ { static histo_t vi_d1, vi_d2, vi_d3, vi_d4; #endif /* WLMEDIA_HTSF */ -#ifndef DTIM_COUNT -#define DTIM_COUNT 3 -#endif - #if defined(PKT_FILTER_SUPPORT) #if defined(BLOCK_IPV6_PACKET) #define HEX_PREF_STR "0x" @@ -130,7 +126,7 @@ extern bool ap_fw_loaded; #include #ifdef ARP_OFFLOAD_SUPPORT -void aoe_update_host_ipv4_table(dhd_pub_t *dhd_pub, u32 ipa, bool add); +void aoe_update_host_ipv4_table(dhd_pub_t *dhd_pub, u32 ipa, bool add, int idx); static int dhd_device_event(struct notifier_block *this, unsigned long event, void *ptr); @@ -146,9 +142,9 @@ volatile bool dhd_mmc_suspend = FALSE; DECLARE_WAIT_QUEUE_HEAD(dhd_dpc_wait); #endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) && defined(CONFIG_PM_SLEEP) */ -#if defined(OOB_INTR_ONLY) +#if defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) extern void dhd_enable_oob_intr(struct dhd_bus *bus, bool enable); -#endif /* defined(OOB_INTR_ONLY) */ +#endif /* defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) */ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) && (1) static void dhd_hang_process(struct work_struct *work); #endif @@ -196,7 +192,7 @@ extern wl_iw_extra_params_t g_wl_iw_par #endif /* defined(CONFIG_HAS_EARLYSUSPEND) && defined(DHD_USE_EARLYSUSPEND) */ #endif /* CUSTOMER_HW4 && CONFIG_PARTIALSUSPEND_SLP */ -extern int dhd_get_dtim_skip(dhd_pub_t *dhd); +extern int dhd_get_suspend_bcn_li_dtim(dhd_pub_t *dhd); #ifdef PKT_FILTER_SUPPORT extern void dhd_pktfilter_offload_set(dhd_pub_t * dhd, char *arg); @@ -395,7 +391,11 @@ module_param(dhd_msg_level, int, 0); module_param(disable_proptx, int, 0644); /* load firmware and/or nvram values from the filesystem */ module_param_string(firmware_path, firmware_path, MOD_PARAM_PATHLEN, 0660); +#ifdef CUSTOMER_HW4 module_param_string(nvram_path, nvram_path, MOD_PARAM_PATHLEN, 0660); +#else +module_param_string(nvram_path, nvram_path, MOD_PARAM_PATHLEN, 0); +#endif /* CUSTOMER_HW4 */ /* Watchdog interval */ uint dhd_watchdog_ms = 10; @@ -411,7 +411,12 @@ uint dhd_slpauto = TRUE; module_param(dhd_slpauto, uint, 0); /* ARP offload agent mode : Enable ARP Host Auto-Reply and ARP Peer Auto-Reply */ +#if defined(CUSTOMER_HW4) uint dhd_arp_mode = ARP_OL_AGENT | ARP_OL_PEER_AUTO_REPLY | ARP_OL_SNOOP; +#else +uint dhd_arp_mode = ARP_OL_AGENT | ARP_OL_PEER_AUTO_REPLY; +#endif + module_param(dhd_arp_mode, uint, 0); /* ARP offload enable */ @@ -602,9 +607,9 @@ extern int register_pm_notifier(struct n extern int unregister_pm_notifier(struct notifier_block *nb); #endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) && defined(CONFIG_PM_SLEEP) */ -#ifdef PKT_FILTER_SUPPORT void dhd_set_packet_filter(dhd_pub_t *dhd) { +#ifdef PKT_FILTER_SUPPORT int i; DHD_TRACE(("%s: enter\n", __FUNCTION__)); @@ -613,20 +618,24 @@ void dhd_set_packet_filter(dhd_pub_t *dh dhd_pktfilter_offload_set(dhd, dhd->pktfilter[i]); } } +#endif /* PKT_FILTER_SUPPORT */ } void dhd_enable_packet_filter(int value, dhd_pub_t *dhd) { +#ifdef PKT_FILTER_SUPPORT int i; DHD_TRACE(("%s: enter, value = %d\n", __FUNCTION__, value)); /* 1 - Enable packet filter, only allow unicast packet to send up */ /* 0 - Disable packet filter */ - if (dhd_pkt_filter_enable) { + if (dhd_pkt_filter_enable && (!value || + (dhd_support_sta_mode(dhd) && !dhd->dhcp_in_progress))) + { for (i = 0; i < dhd->pktfilter_count; i++) { #ifdef PASS_ARP_PACKET if (value && (i == dhd->pktfilter_count -1) && - !(dhd->op_mode & (P2P_GC_ENABLED | P2P_GO_ENABLED))) { + !(dhd->op_mode & (DHD_FLAG_P2P_GC_MODE | DHD_FLAG_P2P_GO_MODE))) { DHD_TRACE_HW4(("Do not turn on ARP white list pkt filter:" "val %d, cnt %d, op_mode 0x%x\n", value, i, dhd->op_mode)); @@ -637,8 +646,8 @@ void dhd_enable_packet_filter(int value, value, dhd_master_mode); } } -} #endif /* PKT_FILTER_SUPPORT */ +} static int dhd_set_suspend(int value, dhd_pub_t *dhd) { @@ -647,9 +656,7 @@ static int dhd_set_suspend(int value, dh #endif /* wl_pkt_filter_enable_t enable_parm; */ char iovbuf[32]; -#if !defined(CUSTOMER_HW4) - int bcn_li_dtim = DTIM_COUNT; -#endif + int bcn_li_dtim = 0; /* Default bcn_li_dtim in resume mode is 0 */ #ifndef DISABLE_FW_ROAM_SUSPEND uint roamvar = 1; #endif @@ -657,7 +664,9 @@ static int dhd_set_suspend(int value, dh int bcn_li_bcn; #endif /* ENABLE_BCN_LI_BCN_WAKEUP */ #ifdef PASS_ALL_MCAST_PKTS + struct dhd_info *dhdinfo = dhd->info; uint32 allmulti; + uint i; #endif /* PASS_ALL_MCAST_PKTS */ DHD_TRACE(("%s: enter, value = %d in_suspend=%d\n", @@ -670,34 +679,36 @@ static int dhd_set_suspend(int value, dh dhd->early_suspended = 1; #endif /* Kernel suspended */ - DHD_ERROR(("%s: force extra Suspend setting \n", __FUNCTION__)); + DHD_ERROR(("%s: force extra Suspend setting\n", __FUNCTION__)); #ifndef SUPPORT_PM2_ONLY dhd_wl_ioctl_cmd(dhd, WLC_SET_PM, (char *)&power_mode, sizeof(power_mode), TRUE, 0); #endif -#ifdef PKT_FILTER_SUPPORT + /* Enable packet filter, only allow unicast packet to send up */ - if (!dhd->dhcp_in_progress) - dhd_enable_packet_filter(1, dhd); -#endif /* PKT_FILTER_SUPPORT */ + dhd_enable_packet_filter(1, dhd); + #ifdef PASS_ALL_MCAST_PKTS allmulti = 0; bcm_mkiovar("allmulti", (char *)&allmulti, 4, iovbuf, sizeof(iovbuf)); - dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); + for (i = 0; i < DHD_MAX_IFS; i++) { + if (dhdinfo->iflist[i] && dhdinfo->iflist[i]->net) + dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, + sizeof(iovbuf), TRUE, i); + } #endif /* PASS_ALL_MCAST_PKTS */ -#if !defined(CUSTOMER_HW4) /* If DTIM skip is set up as default, force it to wake * each third DTIM for better power savings. Note that * one side effect is a chance to miss BC/MC packet. */ - bcn_li_dtim = dhd_get_dtim_skip(dhd); + bcn_li_dtim = dhd_get_suspend_bcn_li_dtim(dhd); bcm_mkiovar("bcn_li_dtim", (char *)&bcn_li_dtim, 4, iovbuf, sizeof(iovbuf)); dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); -#endif /* !defined(CUSTOMER_HW4) */ + #ifndef DISABLE_FW_ROAM_SUSPEND /* Disable firmware roaming during suspend */ bcm_mkiovar("roam_off", (char *)&roamvar, 4, @@ -716,31 +727,33 @@ static int dhd_set_suspend(int value, dh dhd->early_suspended = 0; #endif /* Kernel resumed */ - DHD_TRACE(("%s: Remove extra suspend setting \n", __FUNCTION__)); + DHD_ERROR(("%s: Remove extra suspend setting\n", __FUNCTION__)); #ifndef SUPPORT_PM2_ONLY power_mode = PM_FAST; dhd_wl_ioctl_cmd(dhd, WLC_SET_PM, (char *)&power_mode, sizeof(power_mode), TRUE, 0); #endif -#ifdef PKT_FILTER_SUPPORT + /* disable pkt filter */ dhd_enable_packet_filter(0, dhd); -#endif /* PKT_FILTER_SUPPORT */ + #ifdef PASS_ALL_MCAST_PKTS allmulti = 1; bcm_mkiovar("allmulti", (char *)&allmulti, 4, iovbuf, sizeof(iovbuf)); - dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); + for (i = 0; i < DHD_MAX_IFS; i++) { + if (dhdinfo->iflist[i] && dhdinfo->iflist[i]->net) + dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, + sizeof(iovbuf), TRUE, i); + } #endif /* PASS_ALL_MCAST_PKTS */ -#if !defined(CUSTOMER_HW4) /* restore pre-suspend setting for dtim_skip */ - bcm_mkiovar("bcn_li_dtim", (char *)&dhd->dtim_skip, + bcm_mkiovar("bcn_li_dtim", (char *)&bcn_li_dtim, 4, iovbuf, sizeof(iovbuf)); dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); -#endif #ifndef DISABLE_FW_ROAM_SUSPEND roamvar = dhd_roam_disable; bcm_mkiovar("roam_off", (char *)&roamvar, 4, iovbuf, @@ -770,7 +783,7 @@ static int dhd_suspend_resume_helper(str /* Set flag when early suspend was called */ dhdp->in_suspend = val; if ((force || !dhdp->suspend_disable_flag) && - (dhd_check_ap_wfd_mode_set(dhdp) == FALSE)) + dhd_support_sta_mode(dhdp)) { ret = dhd_set_suspend(val, dhdp); } @@ -964,9 +977,13 @@ _dhd_set_multicast_list(dhd_info_t *dhd, for (i = 0; i < DHD_MAX_IFS; i++) { if (dhd->iflist[i]) { dev = dhd->iflist[i]->net; + if (!dev) + continue; #else ASSERT(dhd && dhd->iflist[ifidx]); dev = dhd->iflist[ifidx]->net; + if (!dev) + return; #endif /* MCAST_LIST_ACCUMULATION */ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27) netif_addr_lock_bh(dev); @@ -1047,7 +1064,7 @@ _dhd_set_multicast_list(dhd_info_t *dhd, #ifdef MCAST_LIST_ACCUMULATION DHD_TRACE(("_dhd_set_multicast_list: cnt " "%d " MACDBG "\n", - cnt_iface[i], STR_TO_MACD(ha->addr))); + cnt_iface[i], MAC2STRDBG(ha->addr))); cnt_iface[i]--; #else cnt--; @@ -1493,7 +1510,9 @@ dhd_sendpkt(dhd_pub_t *dhdp, int ifidx, } /* Look into the packet and update the packet priority */ +#ifndef PKTPRIO_OVERRIDE if (PKTPRIO(pktbuf) == 0) +#endif /* !CUSTOMER_HW4 */ pktsetprio(pktbuf, FALSE); #ifdef PROP_TXSTATUS @@ -1520,9 +1539,9 @@ dhd_sendpkt(dhd_pub_t *dhdp, int ifidx, dhd_htsf_addtxts(dhdp, pktbuf); #endif #ifdef PROP_TXSTATUS + dhd_os_wlfc_block(dhdp); if (dhdp->wlfc_state && ((athost_wl_status_info_t*)dhdp->wlfc_state)->proptxstatus_mode != WLFC_FCMODE_NONE) { - dhd_os_wlfc_block(dhdp); ret = dhd_wlfc_enque_sendq(dhdp->wlfc_state, DHD_PKTTAG_FIFO(PKTTAG(pktbuf)), pktbuf); dhd_wlfc_commit_packets(dhdp->wlfc_state, (f_commitpkt_t)dhd_bus_txdata, @@ -1532,9 +1551,11 @@ dhd_sendpkt(dhd_pub_t *dhdp, int ifidx, } dhd_os_wlfc_unblock(dhdp); } - else + else{ + dhd_os_wlfc_unblock(dhdp); /* non-proptxstatus way */ ret = dhd_bus_txdata(dhdp->bus, pktbuf); + } #else ret = dhd_bus_txdata(dhdp->bus, pktbuf); #endif /* PROP_TXSTATUS */ @@ -1713,11 +1734,6 @@ static const char *_get_packet_type_str( } #endif /* DHD_RX_DUMP */ -#ifdef CUSTOMER_HW4 -extern int pkt_free; -extern int caller; -extern void *free_ptr; -#endif void dhd_rx_frame(dhd_pub_t *dhdp, int ifidx, void *pktbuf, int numpkt, uint8 chan) { @@ -1757,11 +1773,11 @@ dhd_rx_frame(dhd_pub_t *dhdp, int ifidx, } #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0) /* Dropping packets before registering net device to avoid kernel panic */ -#ifdef BCMDHDUSB +#ifndef PROP_TXSTATUS_VSDB if (!ifp->net || ifp->net->reg_state != NETREG_REGISTERED) { #else if (!ifp->net || ifp->net->reg_state != NETREG_REGISTERED || !dhd->pub.up) { -#endif /* BCMDHDUSB */ +#endif /* PROP_TXSTATUS_VSDB */ DHD_ERROR(("%s: net device is NOT registered yet. drop packet\n", __FUNCTION__)); PKTFREE(dhdp->osh, pktbuf, TRUE); @@ -1793,16 +1809,10 @@ dhd_rx_frame(dhd_pub_t *dhdp, int ifidx, piggy-back on */ ((athost_wl_status_info_t*)dhdp->wlfc_state)->stats.wlfc_header_only_pkt++; -#ifdef CUSTOMER_HW4 - /*if (numpkt == 1 && pkt_free && (free_ptr == pktbuf)) { - DHD_ERROR(("DHD TRACE2(FREE):%d %d %p\n", - pkt_free, caller, free_ptr)); - }*/ -#endif PKTFREE(dhdp->osh, pktbuf, TRUE); continue; } -#endif /* PROP_TXSTATUS */ +#endif skb = PKTTONATIVE(dhdp->osh, pktbuf); @@ -1845,7 +1855,7 @@ dhd_rx_frame(dhd_pub_t *dhdp, int ifidx, } } else if (dump_data[0] & 1) { DHD_ERROR(("%s: MULTICAST: " MACDBG "\n", - __FUNCTION__, STR_TO_MACD(dump_data))); + __FUNCTION__, MAC2STRDBG(dump_data))); } if (protocol == ETHER_TYPE_802_1X) { @@ -1903,7 +1913,11 @@ dhd_rx_frame(dhd_pub_t *dhdp, int ifidx, #if defined(PNO_SUPPORT) if (event.event_type == WLC_E_PFN_NET_FOUND) { +#ifdef CUSTOMER_HW4 + tout_ctrl = DHD_PNO_TIMEOUT_MS; +#else tout_ctrl *= 2; +#endif } #endif /* PNO_SUPPORT */ } else { @@ -2741,7 +2755,9 @@ dhd_stop(struct net_device *net) #endif #ifdef PROP_TXSTATUS + dhd_os_wlfc_block(&dhd->pub); dhd_wlfc_cleanup(&dhd->pub); + dhd_os_wlfc_unblock(&dhd->pub); #endif /* Stop the protocol module */ @@ -2784,8 +2800,14 @@ dhd_open(struct net_device *net) int ifidx; int32 ret = 0; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) && 1 + if (mutex_is_locked(&_dhd_sdio_mutex_lock_) != 0) { + DHD_ERROR(("%s : dhd_open: call dev open before insmod complete!\n", __FUNCTION__)); + } + mutex_lock(&_dhd_sdio_mutex_lock_); +#endif + DHD_OS_WAKE_LOCK(&dhd->pub); - DHD_ERROR(("%s: Enter, net[%p]\n", __FUNCTION__, net)); /* Update FW path if it was changed */ if (strlen(firmware_path) != 0) { if (firmware_path[strlen(firmware_path)-1] == '\n') @@ -2802,6 +2824,7 @@ dhd_open(struct net_device *net) firmware_path[0] = '\0'; } +#ifdef CUSTOMER_HW4 /* Update NVRAM path if it was changed */ if (!dhd_download_fw_on_driverload && (strlen(nvram_path) != 0)) { if (nvram_path[strlen(nvram_path)-1] == '\n') @@ -2809,7 +2832,7 @@ dhd_open(struct net_device *net) strcpy(nv_path, nvram_path); nvram_path[0] = '\0'; } - +#endif /* CUSTOMER_HW4 */ dhd->pub.dongle_trap_occured = 0; dhd->pub.hang_was_sent = 0; @@ -2870,32 +2893,12 @@ dhd_open(struct net_device *net) if (dhd->pub.busstate != DHD_BUS_DATA) { -#if defined(CUSTOMER_HW4) -#define WAIT_DHDBUS_READY 5 - /* Delay ifup until insmod completed in case of module type */ - if (dhd_download_fw_on_driverload) { - uint retry = 0; - - do { - OSL_DELAY(100*1000); - } while ((dhd->pub.busstate != DHD_BUS_DATA) && - (retry++ < WAIT_DHDBUS_READY)); - - if (dhd->pub.busstate != DHD_BUS_DATA) { - DHD_ERROR(("%s: call dev open before insmod complete!\n", - __FUNCTION__)); - ret = -1; - goto exit; - } + /* try to bring up bus */ + if ((ret = dhd_bus_start(&dhd->pub)) != 0) { + DHD_ERROR(("%s: failed with code %d\n", __FUNCTION__, ret)); + ret = -1; + goto exit; } - else -#endif /* CUSTOMER_HW4 */ - /* try to bring up bus */ - if ((ret = dhd_bus_start(&dhd->pub)) != 0) { - DHD_ERROR(("%s: failed with code %d\n", __FUNCTION__, ret)); - ret = -1; - goto exit; - } } @@ -2933,6 +2936,10 @@ exit: dhd_stop(net); DHD_OS_WAKE_UNLOCK(&dhd->pub); + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) && 1 + mutex_unlock(&_dhd_sdio_mutex_lock_); +#endif return ret; } @@ -2945,6 +2952,15 @@ int dhd_do_driver_init(struct net_device return -EINVAL; } +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) +#ifdef MULTIPLE_SUPPLICANT + if (mutex_is_locked(&_dhd_sdio_mutex_lock_) != 0) { + DHD_ERROR(("%s : dhdsdio_probe is already running!\n", __FUNCTION__)); + return 0; + } +#endif /* MULTIPLE_SUPPLICANT */ +#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25) */ + dhd = *(dhd_info_t **)netdev_priv(net); /* If driver is already initialized, do nothing @@ -2953,7 +2969,7 @@ int dhd_do_driver_init(struct net_device DHD_TRACE(("Driver already Inititalized. Nothing to do")); return 0; } - DHD_ERROR(("%s: call dhd_open\n", __FUNCTION__)); + if (dhd_open(net) < 0) { DHD_ERROR(("Driver Init Failed \n")); return -1; @@ -3166,6 +3182,11 @@ dhd_attach(osl_t *osh, struct dhd_bus *b #ifdef PROP_TXSTATUS spin_lock_init(&dhd->wlfc_spinlock); +#ifdef PROP_TXSTATUS_VSDB + dhd->pub.wlfc_enabled = FALSE; +#else + dhd->pub.wlfc_enabled = TRUE; +#endif /* PROP_TXSTATUS_VSDB */ #endif /* PROP_TXSTATUS */ /* Initialize other structure content */ @@ -3186,10 +3207,7 @@ dhd_attach(osl_t *osh, struct dhd_bus *b wake_lock_init(&dhd->wl_wifi, WAKE_LOCK_SUSPEND, "wlan_wake"); wake_lock_init(&dhd->wl_rxwake, WAKE_LOCK_SUSPEND, "wlan_rx_wake"); wake_lock_init(&dhd->wl_ctrlwake, WAKE_LOCK_SUSPEND, "wlan_ctrl_wake"); -#if defined(CUSTOMER_HW4) && defined(PNO_SUPPORT) - wake_lock_init(&dhd->pub.pno_wakelock, WAKE_LOCK_SUSPEND, "pno_wake_lock"); -#endif -#endif +#endif /* CONFIG_HAS_WAKELOCK */ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) && 1 mutex_init(&dhd->dhd_net_if_mutex); mutex_init(&dhd->dhd_suspend_mutex); @@ -3240,7 +3258,7 @@ dhd_attach(osl_t *osh, struct dhd_bus *b dhd->threads_only = FALSE; } - if (dhd_dpc_prio >= 0) { + if (dhd_watchdog_prio >= 0) { /* Initialize watchdog thread */ #ifdef USE_KTHREAD_API PROC_START2(dhd_watchdog_thread, dhd, &dhd->thr_wdt_ctl, 0, "dhd_watchdog_thread"); @@ -3396,10 +3414,8 @@ dhd_bus_start(dhd_pub_t *dhdp) return -ENODEV; } -#ifndef BCMSPI_ANDROID /* Enable oob at firmware */ dhd_enable_oob_intr(dhd->pub.bus, TRUE); -#endif /* !BCMSPI_ANDROID */ #endif /* defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) */ /* If bus is not ready, can't come up */ @@ -3469,7 +3485,7 @@ dhd_bus_start(dhd_pub_t *dhdp) #ifdef ARP_OFFLOAD_SUPPORT if (dhd->pend_ipaddr) { #ifdef AOE_IP_ALIAS_SUPPORT - aoe_update_host_ipv4_table(&dhd->pub, dhd->pend_ipaddr, TRUE); + aoe_update_host_ipv4_table(&dhd->pub, dhd->pend_ipaddr, TRUE, 0); #endif /* AOE_IP_ALIAS_SUPPORT */ dhd->pend_ipaddr = 0; } @@ -3478,18 +3494,37 @@ dhd_bus_start(dhd_pub_t *dhdp) return 0; } +bool dhd_is_concurrent_mode(dhd_pub_t *dhd) +{ + if (!dhd) + return FALSE; + + if (dhd->op_mode & DHD_FLAG_CONCURR_MULTI_CHAN_MODE) + return TRUE; + else if ((dhd->op_mode & DHD_FLAG_CONCURR_SINGLE_CHAN_MODE) == + DHD_FLAG_CONCURR_SINGLE_CHAN_MODE) + return TRUE; + else + return FALSE; +} + #if !defined(AP) && defined(WLP2P) -/* For Android ICS MR2 release, the concurrent mode is enabled by default and the firmware +/* From Android JerryBean release, the concurrent mode is enabled by default and the firmware * name would be fw_bcmdhd.bin. So we need to determine whether P2P is enabled in the STA * firmware and accordingly enable concurrent mode (Apply P2P settings). SoftAP firmware * would still be named as fw_bcmdhd_apsta. */ -int +uint32 dhd_get_concurrent_capabilites(dhd_pub_t *dhd) { - int ret = 0; + int32 ret = 0; char buf[WLC_IOCTL_SMLEN]; - bool vsdb_supported = false; + bool mchan_supported = FALSE; + /* if dhd->op_mode is already set for HOSTAP, + * that means we only will use the mode as it is + */ + if (dhd->op_mode & DHD_FLAG_HOSTAP_MODE) + return 0; memset(buf, 0, sizeof(buf)); bcm_mkiovar("cap", 0, 0, buf, sizeof(buf)); if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_GET_VAR, buf, sizeof(buf), @@ -3499,7 +3534,7 @@ dhd_get_concurrent_capabilites(dhd_pub_t return 0; } if (strstr(buf, "vsdb")) { - vsdb_supported = true; + mchan_supported = TRUE; } if (strstr(buf, "p2p") == NULL) { DHD_TRACE(("Chip does not support p2p\n")); @@ -3516,14 +3551,19 @@ dhd_get_concurrent_capabilites(dhd_pub_t } else { if (buf[0] == 1) { - /* Chip supports p2p, now lets check for vsdb */ - if (vsdb_supported) - return 2; - else -#ifdef WL_ENABLE_P2P_IF - return 1; + /* By default, chip supports single chan concurrency, + * now lets check for mchan + */ + ret = DHD_FLAG_CONCURR_SINGLE_CHAN_MODE; + if (mchan_supported) + ret |= DHD_FLAG_CONCURR_MULTI_CHAN_MODE; +#if defined(WL_ENABLE_P2P_IF) || defined(CUSTOMER_HW4) + /* For customer_hw4, although ICS, + * we still support concurrent mode + */ + return ret; #else - return 0; + return 0; #endif } } @@ -3556,7 +3596,7 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) #if defined(ARP_OFFLOAD_SUPPORT) int arpoe = 1; #endif - int scan_assoc_time = DHD_SCAN_ACTIVE_TIME; + int scan_assoc_time = DHD_SCAN_ASSOC_ACTIVE_TIME; int scan_unassoc_time = DHD_SCAN_UNASSOC_ACTIVE_TIME; int scan_passive_time = DHD_SCAN_PASSIVE_TIME; char buf[WLC_IOCTL_SMLEN]; @@ -3564,9 +3604,9 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) uint32 listen_interval = LISTEN_INTERVAL; /* Default Listen Interval in Beacons */ #ifdef ROAM_ENABLE uint roamvar = 0; - int roam_trigger[2] = {-75, WLC_BAND_ALL}; + int roam_trigger[2] = {CUSTOM_ROAM_TRIGGER_SETTING, WLC_BAND_ALL}; int roam_scan_period[2] = {10, WLC_BAND_ALL}; - int roam_delta[2] = {10, WLC_BAND_ALL}; + int roam_delta[2] = {CUSTOM_ROAM_DELTA_SETTING, WLC_BAND_ALL}; #ifdef ROAM_AP_ENV_DETECTION int roam_env_mode = AP_ENV_INDETERMINATE; #endif /* ROAM_AP_ENV_DETECTION */ @@ -3608,9 +3648,14 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) #if defined(VSDB) && defined(CUSTOMER_HW4) int interference_mode = 3; #endif + dhd->suspend_bcn_li_dtim = CUSTOM_SUSPEND_BCN_LI_DTIM; #ifdef PROP_TXSTATUS +#ifdef PROP_TXSTATUS_VSDB dhd->wlfc_enabled = FALSE; /* enable WLFC only if the firmware is VSDB */ +#else + dhd->wlfc_enabled = TRUE; +#endif /* PROP_TXSTATUS_VSDB */ #endif /* PROP_TXSTATUS */ DHD_TRACE(("Enter %s\n", __FUNCTION__)); dhd->op_mode = 0; @@ -3642,12 +3687,14 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) } #endif /* GET_CUSTOM_MAC_ENABLE */ + DHD_TRACE(("Firmware = %s\n", fw_path)); - if ((!op_mode && strstr(fw_path, "_apsta") != NULL) || (op_mode == HOSTAPD_MASK)) { + if ((!op_mode && strstr(fw_path, "_apsta") != NULL) || + (op_mode == DHD_FLAG_HOSTAP_MODE)) { #ifdef SET_RANDOM_MAC_SOFTAP uint rand_mac; #endif - op_mode = HOSTAPD_MASK; + dhd->op_mode = DHD_FLAG_HOSTAP_MODE; #if defined(ARP_OFFLOAD_SUPPORT) arpoe = 0; #endif @@ -3682,31 +3729,33 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) } else { - int concurrent_capab = 0; - if ((!op_mode && strstr(fw_path, "_p2p") != NULL) || (op_mode == WFD_MASK)) { + uint32 concurrent_mode = 0; + if ((!op_mode && strstr(fw_path, "_p2p") != NULL) || + (op_mode == DHD_FLAG_P2P_MODE)) { #if defined(ARP_OFFLOAD_SUPPORT) arpoe = 0; #endif #ifdef PKT_FILTER_SUPPORT dhd_pkt_filter_enable = FALSE; #endif - op_mode = WFD_MASK; + dhd->op_mode = DHD_FLAG_P2P_MODE; } else - op_mode = STA_MASK; + dhd->op_mode = DHD_FLAG_STA_MODE; #if !defined(AP) && defined(WLP2P) - if ((concurrent_capab = dhd_get_concurrent_capabilites(dhd)) > 0) { - op_mode = STA_MASK | WFD_MASK; - if (concurrent_capab == 2) - op_mode = STA_MASK | WFD_MASK | CONCURRENT_MULTI_CHAN; + if ((concurrent_mode = dhd_get_concurrent_capabilites(dhd))) { +#if defined(ARP_OFFLOAD_SUPPORT) + arpoe = 1; +#endif + dhd->op_mode |= concurrent_mode; } /* Check if we are enabling p2p */ - if (op_mode & WFD_MASK) { + if (dhd->op_mode & DHD_FLAG_P2P_MODE) { bcm_mkiovar("apsta", (char *)&apsta, 4, iovbuf, sizeof(iovbuf)); if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0)) < 0) { - DHD_ERROR(("%s APSTA for WFD failed ret= %d\n", __FUNCTION__, ret)); + DHD_ERROR(("%s APSTA for P2P failed ret= %d\n", __FUNCTION__, ret)); } memcpy(&p2p_ea, &dhd->mac, ETHER_ADDR_LEN); @@ -3721,15 +3770,14 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) } } #else - (void)concurrent_capab; -#endif + (void)concurrent_mode; +#endif } - dhd->op_mode = op_mode; - DHD_ERROR(("Firmware up: op_mode=%d, " + DHD_ERROR(("Firmware up: op_mode=0x%04x, " "Broadcom Dongle Host Driver mac="MACDBG"\n", dhd->op_mode, - STR_TO_MACD(dhd->mac.octet))); + MAC2STRDBG(dhd->mac.octet))); /* Set Country code */ if (dhd->dhd_cspec.ccode[0] != 0) { bcm_mkiovar("country", (char *)&dhd->dhd_cspec, @@ -3749,20 +3797,27 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); #endif /* ROAM_ENABLE || DISABLE_BUILTIN_ROAM */ #ifdef ROAM_ENABLE - dhd_wl_ioctl_cmd(dhd, WLC_SET_ROAM_TRIGGER, roam_trigger, sizeof(roam_trigger), TRUE, 0); - dhd_wl_ioctl_cmd(dhd, WLC_SET_ROAM_SCAN_PERIOD, roam_scan_period, - sizeof(roam_scan_period), TRUE, 0); - dhd_wl_ioctl_cmd(dhd, WLC_SET_ROAM_DELTA, roam_delta, sizeof(roam_delta), TRUE, 0); + if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_ROAM_TRIGGER, roam_trigger, + sizeof(roam_trigger), TRUE, 0)) < 0) + DHD_ERROR(("%s: roam trigger set failed %d\n", __FUNCTION__, ret)); + if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_ROAM_SCAN_PERIOD, roam_scan_period, + sizeof(roam_scan_period), TRUE, 0)) < 0) + DHD_ERROR(("%s: roam scan period set failed %d\n", __FUNCTION__, ret)); + if ((dhd_wl_ioctl_cmd(dhd, WLC_SET_ROAM_DELTA, roam_delta, + sizeof(roam_delta), TRUE, 0)) < 0) + DHD_ERROR(("%s: roam delta set failed %d\n", __FUNCTION__, ret)); bcm_mkiovar("fullroamperiod", (char *)&roam_fullscan_period, 4, iovbuf, sizeof(iovbuf)); - dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); + if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0)) < 0) + DHD_ERROR(("%s: roam fullscan period set failed %d\n", __FUNCTION__, ret)); #ifdef ROAM_AP_ENV_DETECTION if (roam_trigger[0] == WL_AUTO_ROAM_TRIGGER) { bcm_mkiovar("roam_env_detection", (char *)&roam_env_mode, 4, iovbuf, sizeof(iovbuf)); if (dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0) == BCME_OK) dhd->roam_env_detection = TRUE; - else + else { dhd->roam_env_detection = FALSE; + } } #endif /* ROAM_AP_ENV_DETECTION */ #endif /* ROAM_ENABLE */ @@ -3783,9 +3838,11 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) bcm_mkiovar("bus:txglomalign", (char *)&dongle_align, 4, iovbuf, sizeof(iovbuf)); dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); - DHD_INFO(("%s set glom=0x%X\n", __FUNCTION__, glom)); - bcm_mkiovar("bus:txglom", (char *)&glom, 4, iovbuf, sizeof(iovbuf)); - dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); + if (glom != DEFAULT_GLOM_VALUE) { + DHD_INFO(("%s set glom=0x%X\n", __FUNCTION__, glom)); + bcm_mkiovar("bus:txglom", (char *)&glom, 4, iovbuf, sizeof(iovbuf)); + dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); + } /* Setup timeout if Beacons are lost and roam is off to report link down */ bcm_mkiovar("bcn_timeout", (char *)&bcn_timeout, 4, iovbuf, sizeof(iovbuf)); @@ -3819,7 +3876,7 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) #if defined(SOFTAP) if (ap_fw_loaded == FALSE) #endif - if ((dhd->op_mode & HOSTAPD_MASK) != HOSTAPD_MASK) { + if (!(dhd->op_mode & DHD_FLAG_HOSTAP_MODE)) { if ((res = dhd_keep_alive_onoff(dhd)) < 0) DHD_ERROR(("%s set keeplive failed %d\n", __FUNCTION__, res)); @@ -3874,7 +3931,7 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) #endif /* BCMCCX */ #ifdef WL_CFG80211 setbit(eventmask, WLC_E_ESCAN_RESULT); - if ((dhd->op_mode & WFD_MASK) == WFD_MASK) { + if (dhd->op_mode & DHD_FLAG_P2P_MODE) { setbit(eventmask, WLC_E_ACTION_FRAME_RX); setbit(eventmask, WLC_E_ACTION_FRAME_COMPLETE); setbit(eventmask, WLC_E_ACTION_FRAME_OFF_CHAN_COMPLETE); @@ -3914,6 +3971,7 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) dhd_arp_offload_enable(dhd, FALSE); dhd_arp_offload_set(dhd, 0); } + dhd_arp_enable = arpoe; #endif /* ARP_OFFLOAD_SUPPORT */ #ifdef PKT_FILTER_SUPPORT @@ -3954,13 +4012,14 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) dhd->pktfilter[dhd->pktfilter_count++] = "105 0 0 12 0xFFFF 0x0806"; #endif #endif /* CUSTOMER_HW4 */ + dhd_set_packet_filter(dhd); #if defined(SOFTAP) if (ap_fw_loaded) { dhd_enable_packet_filter(0, dhd); } #endif /* defined(SOFTAP) */ - dhd_set_packet_filter(dhd); + #endif /* PKT_FILTER_SUPPORT */ #ifdef DISABLE_11N bcm_mkiovar("nmode", (char *)&nmode, 4, iovbuf, sizeof(iovbuf)); @@ -4009,7 +4068,7 @@ dhd_preinit_ioctls(dhd_pub_t *dhd) /* Check and adjust IOCTL response timeout for Manufactring firmware */ if (strstr(buf, MANUFACTRING_FW) != NULL) { - dhd_os_set_ioctl_resp_timeout(IOCTL_RESP_TIMEOUT * 10); + dhd_os_set_ioctl_resp_timeout(20000); DHD_ERROR(("%s : adjust IOCTL response time for Manufactring Firmware\n", __FUNCTION__)); } @@ -4073,7 +4132,7 @@ int dhd_change_mtu(dhd_pub_t *dhdp, int #ifdef ARP_OFFLOAD_SUPPORT /* add or remove AOE host ip(s) (up to 8 IPs on the interface) */ void -aoe_update_host_ipv4_table(dhd_pub_t *dhd_pub, u32 ipa, bool add) +aoe_update_host_ipv4_table(dhd_pub_t *dhd_pub, u32 ipa, bool add, int idx) { u32 ipv4_buf[MAX_IPV4_ENTRIES]; /* temp save for AOE host_ip table */ int i; @@ -4082,13 +4141,13 @@ aoe_update_host_ipv4_table(dhd_pub_t *dh bzero(ipv4_buf, sizeof(ipv4_buf)); /* display what we've got */ - ret = dhd_arp_get_arp_hostip_table(dhd_pub, ipv4_buf, sizeof(ipv4_buf)); + ret = dhd_arp_get_arp_hostip_table(dhd_pub, ipv4_buf, sizeof(ipv4_buf), idx); DHD_ARPOE(("%s: hostip table read from Dongle:\n", __FUNCTION__)); #ifdef AOE_DBG dhd_print_buf(ipv4_buf, 32, 4); /* max 8 IPs 4b each */ #endif /* now we saved hoste_ip table, clr it in the dongle AOE */ - dhd_aoe_hostip_clr(dhd_pub); + dhd_aoe_hostip_clr(dhd_pub, idx); if (ret) { DHD_ERROR(("%s failed\n", __FUNCTION__)); @@ -4109,19 +4168,24 @@ aoe_update_host_ipv4_table(dhd_pub_t *dh if (ipv4_buf[i] != 0) { /* add back host_ip entries from our local cache */ - dhd_arp_offload_add_ip(dhd_pub, ipv4_buf[i]); + dhd_arp_offload_add_ip(dhd_pub, ipv4_buf[i], idx); DHD_ARPOE(("%s: added IP:%x to dongle arp_hostip[%d]\n\n", __FUNCTION__, ipv4_buf[i], i)); } } #ifdef AOE_DBG /* see the resulting hostip table */ - dhd_arp_get_arp_hostip_table(dhd_pub, ipv4_buf, sizeof(ipv4_buf)); + dhd_arp_get_arp_hostip_table(dhd_pub, ipv4_buf, sizeof(ipv4_buf), idx); DHD_ARPOE(("%s: read back arp_hostip table:\n", __FUNCTION__)); dhd_print_buf(ipv4_buf, 32, 4); /* max 8 IPs 4b each */ #endif } +/* + * Notification mechanism from kernel to our driver. This function is called by the Linux kernel + * whenever there is an event related to an IP address. + * ptr : kernel provided pointer to IP address that has changed + */ static int dhd_device_event(struct notifier_block *this, unsigned long event, void *ptr) @@ -4130,19 +4194,48 @@ static int dhd_device_event(struct notif dhd_info_t *dhd; dhd_pub_t *dhd_pub; + int idx; + + if (!dhd_arp_enable) + return NOTIFY_DONE; + if (!ifa || !(ifa->ifa_dev->dev)) + return NOTIFY_DONE; - if (!ifa) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 31)) + /* Filter notifications meant for non Broadcom devices */ + if ((ifa->ifa_dev->dev->netdev_ops != &dhd_ops_pri) && + (ifa->ifa_dev->dev->netdev_ops != &dhd_ops_virt)) { +#ifdef WLP2P + if (!wl_cfgp2p_is_ifops(ifa->ifa_dev->dev->netdev_ops)) +#endif return NOTIFY_DONE; + } +#endif /* LINUX_VERSION_CODE */ dhd = *(dhd_info_t **)netdev_priv(ifa->ifa_dev->dev); + if (!dhd) + return NOTIFY_DONE; + 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) { -#endif - switch (event) { + if (dhd_pub->arp_version == 1) { + idx = 0; + } + else { + for (idx = 0; idx < DHD_MAX_IFS; idx++) { + if (dhd->iflist[idx] && dhd->iflist[idx]->net == ifa->ifa_dev->dev) + break; + } + if (idx < DHD_MAX_IFS) + DHD_TRACE(("ifidx : %p %s %d\n", dhd->iflist[idx]->net, + dhd->iflist[idx]->name, dhd->iflist[idx]->idx)); + else { + DHD_ERROR(("Cannot find ifidx for(%s) set to 0\n", ifa->ifa_label)); + idx = 0; + } + } + + switch (event) { case NETDEV_UP: DHD_ARPOE(("%s: [%s] Up IP: 0x%x\n", __FUNCTION__, ifa->ifa_label, ifa->ifa_address)); @@ -4158,16 +4251,9 @@ static int dhd_device_event(struct notif } #ifdef AOE_IP_ALIAS_SUPPORT - if ((dhd_pub->op_mode & HOSTAPD_MASK) != HOSTAPD_MASK) { - if (ifa->ifa_label[strlen(ifa->ifa_label)-2] == 0x3a) { - /* 0x3a = ':' */ - DHD_ARPOE(("%s:add aliased IP to AOE hostip cache\n", - __FUNCTION__)); - aoe_update_host_ipv4_table(dhd_pub, ifa->ifa_address, TRUE); - } - else - aoe_update_host_ipv4_table(dhd_pub, ifa->ifa_address, TRUE); - } + DHD_ARPOE(("%s:add aliased IP to AOE hostip cache\n", + __FUNCTION__)); + aoe_update_host_ipv4_table(dhd_pub, ifa->ifa_address, TRUE, idx); #endif break; @@ -4176,27 +4262,19 @@ static int dhd_device_event(struct notif __FUNCTION__, ifa->ifa_label, ifa->ifa_address)); dhd->pend_ipaddr = 0; #ifdef AOE_IP_ALIAS_SUPPORT - if ((dhd_pub->op_mode & HOSTAPD_MASK) != HOSTAPD_MASK) { - if (!(ifa->ifa_label[strlen(ifa->ifa_label)-2] == 0x3a)) { - /* 0x3a = ':' */ - DHD_ARPOE(("%s: primary interface is down, AOE clr all\n", - __FUNCTION__)); - dhd_aoe_hostip_clr(&dhd->pub); - dhd_aoe_arp_clr(&dhd->pub); - } else - aoe_update_host_ipv4_table(dhd_pub, ifa->ifa_address, FALSE); - } + DHD_ARPOE(("%s:interface is down, AOE clr all for this if\n", + __FUNCTION__)); + aoe_update_host_ipv4_table(dhd_pub, ifa->ifa_address, FALSE, idx); #else - dhd_aoe_hostip_clr(&dhd->pub); - dhd_aoe_arp_clr(&dhd->pub); -#endif + dhd_aoe_hostip_clr(&dhd->pub, idx); + dhd_aoe_arp_clr(&dhd->pub, idx); +#endif /* AOE_IP_ALIAS_SUPPORT */ break; default: DHD_ARPOE(("%s: do noting for [%s] Event: %lu\n", __func__, ifa->ifa_label, event)); break; - } } return NOTIFY_DONE; } @@ -4210,7 +4288,7 @@ dhd_net_attach(dhd_pub_t *dhdp, int ifid int err = 0; uint8 temp_addr[ETHER_ADDR_LEN] = { 0x00, 0x90, 0x4c, 0x11, 0x22, 0x33 }; - DHD_ERROR(("%s: ifidx %d\n", __FUNCTION__, ifidx)); + DHD_TRACE(("%s: ifidx %d\n", __FUNCTION__, ifidx)); ASSERT(dhd && dhd->iflist[ifidx]); @@ -4287,9 +4365,9 @@ dhd_net_attach(dhd_pub_t *dhdp, int ifid " MAC: "MACDBG"\n", net->name, #if defined(CUSTOMER_HW4) - STR_TO_MACD(dhd->pub.mac.octet)); + MAC2STRDBG(dhd->pub.mac.octet)); #else - STR_TO_MACD(net->dev_addr)); + MAC2STRDBG(net->dev_addr)); #endif /* CUSTOMER_HW4 */ #if defined(SOFTAP) && defined(CONFIG_WIRELESS_EXT) && !defined(WL_CFG80211) @@ -4479,9 +4557,6 @@ void dhd_detach(dhd_pub_t *dhdp) wake_lock_destroy(&dhd->wl_wifi); wake_lock_destroy(&dhd->wl_rxwake); wake_lock_destroy(&dhd->wl_ctrlwake); -#if defined(CUSTOMER_HW4) && defined(PNO_SUPPORT) - wake_lock_destroy(&dhdp->pno_wakelock); -#endif #endif /* CONFIG_HAS_WAKELOCK */ } } @@ -5081,9 +5156,9 @@ void dhd_wait_for_event(dhd_pub_t *dhd, struct dhd_info *dhdinfo = dhd->info; #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) - int timeout = msecs_to_jiffies(2000); + int timeout = msecs_to_jiffies(IOCTL_RESP_TIMEOUT); #else - int timeout = 2 * HZ; + int timeout = (IOCTL_RESP_TIMEOUT / 1000) * HZ; #endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) */ dhd_os_sdunlock(dhd); @@ -5149,16 +5224,19 @@ int net_os_set_suspend(struct net_device #else ret = dhd_suspend_resume_helper(dhd, val, force); #endif +#ifdef WL_CFG80211 + wl_cfg80211_update_power_mode(dev); +#endif } return ret; } -int net_os_set_dtim_skip(struct net_device *dev, int val) +int net_os_set_suspend_bcn_li_dtim(struct net_device *dev, int val) { dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); if (dhd) - dhd->pub.dtim_skip = val; + dhd->pub.suspend_bcn_li_dtim = val; return 0; } @@ -5203,9 +5281,9 @@ int net_os_rxfilter_add_remove(struct ne #endif /* GAN_LITE_NAT_KEEPALIVE_FILTER */ } -int net_os_enable_packet_filter(struct net_device *dev, int val) +int dhd_os_enable_packet_filter(dhd_pub_t *dhdp, int val) + { - dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); int ret = 0; /* Packet filtering is set only if we still in early-suspend and @@ -5213,15 +5291,22 @@ int net_os_enable_packet_filter(struct n * We can always turn it OFF in case of early-suspend, but we turn it * back ON only if suspend_disable_flag was not set */ - if (dhd && dhd->pub.up) { - if (dhd->pub.in_suspend) { - if (!val || (val && !dhd->pub.suspend_disable_flag)) { - dhd_enable_packet_filter(val, &dhd->pub); - } + if (dhdp && dhdp->up) { + if (dhdp->in_suspend) { + if (!val || (val && !dhdp->suspend_disable_flag)) + dhd_enable_packet_filter(val, dhdp); } } return ret; } + +/* function to enable/disable packet for Network device */ +int net_os_enable_packet_filter(struct net_device *dev, int val) +{ + dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); + + return dhd_os_enable_packet_filter(&dhd->pub, val); +} #endif /* PKT_FILTER_SUPPORT */ int @@ -5515,22 +5600,6 @@ int net_os_wake_lock_timeout(struct net_ return ret; } -#if defined(CUSTOMER_HW4) && defined(PNO_SUPPORT) && defined(CONFIG_HAS_WAKELOCK) -int net_os_wake_lock_timeout_for_pno(struct net_device *dev, int sec) -{ - dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); - int ret = 0; - unsigned long flags; - - if (dhd) { - spin_lock_irqsave(&dhd->wakelock_spinlock, flags); - wake_lock_timeout(&dhd->pub.pno_wakelock, HZ * sec); - spin_unlock_irqrestore(&dhd->wakelock_spinlock, flags); - } - return ret; -} -#endif - int dhd_os_wake_lock_rx_timeout_enable(dhd_pub_t *pub, int val) { dhd_info_t *dhd = (dhd_info_t *)(pub->info); --- a/drivers/net/wireless/bcmdhd/dhd_sdio.c +++ b/drivers/net/wireless/bcmdhd/dhd_sdio.c @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: dhd_sdio.c 357912 2012-09-20 09:42:47Z $ + * $Id: dhd_sdio.c 373329 2012-12-07 04:46:09Z $ */ #include @@ -155,6 +155,7 @@ extern void bcmsdh_set_irq(int flag); #endif /* defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) */ #ifdef PROP_TXSTATUS extern void dhd_wlfc_txcomplete(dhd_pub_t *dhd, void *txp, bool success); +extern void dhd_wlfc_trigger_pktcommit(dhd_pub_t *dhd); #endif #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) DEFINE_MUTEX(_dhd_sdio_mutex_lock_); @@ -304,6 +305,13 @@ typedef struct dhd_bus { uint pktgen_ptick; /* Burst counter for printing */ uint pktgen_sent; /* Number of test packets generated */ uint pktgen_rcvd; /* Number of test packets received */ + uint pktgen_prev_time; /* Time at which previous stats where printed */ + uint pktgen_prev_sent; /* Number of test packets generated when + * previous stats were printed + */ + uint pktgen_prev_rcvd; /* Number of test packets received when + * previous stats were printed + */ uint pktgen_fail; /* Number of failed send attempts */ uint16 pktgen_len; /* Length of next packet to send */ #define PKTGEN_RCV_IDLE (0) @@ -380,6 +388,10 @@ static int tx_packets[NUMPRIO]; const uint dhd_deferred_tx = 1; extern uint dhd_watchdog_ms; +#ifdef BCMSPI_ANDROID +extern uint *dhd_spi_lockcount; +#endif /* BCMSPI_ANDROID */ + extern void dhd_os_wd_timer(void *bus, uint wdtick); /* Tx/Rx bounds */ @@ -403,6 +415,9 @@ static bool retrydata; /* At a watermark around 8 the spid hits underflow error. */ static const uint watermark = 32; static const uint mesbusyctrl = 0; +#elif defined(SDIO_CRC_ERROR_FIX) +static uint watermark = 48; +static uint mesbusyctrl = 80; #else static const uint watermark = 8; static const uint mesbusyctrl = 0; @@ -417,7 +432,6 @@ static const uint retry_limit = 2; /* Force even SD lengths (some host controllers mess up on odd bytes) */ static bool forcealign; - #define ALIGNMENT 4 #if defined(OOB_INTR_ONLY) && defined(HW_OOB) @@ -540,7 +554,7 @@ do { \ \ R_SDREG(intstatuserr, &bus->regs->intstatus, retries); \ printf("dstatussw = 0x%x, dstatushw = 0x%x, intstatus = 0x%x\n", \ - dstatussw, dstatushw, intstatuserr); \ + dstatussw, dstatushw, intstatuserr); \ \ bus->nextlen = 0; \ *finished = TRUE; \ @@ -563,7 +577,7 @@ do { \ #ifdef SDTEST static void dhdsdio_testrcv(dhd_bus_t *bus, void *pkt, uint seq); -static void dhdsdio_sdtest_set(dhd_bus_t *bus, uint8 count); +static void dhdsdio_sdtest_set(dhd_bus_t *bus, uint count); #endif #ifdef DHD_DEBUG @@ -1063,6 +1077,8 @@ dhdsdio_clk_devsleep_iovar(dhd_bus_t *bu bus->kso = on ? FALSE : TRUE; else { DHD_ERROR(("%s: Sleep request failed: on:%d err:%d\n", __FUNCTION__, on, err)); + if (!on && retry > 2) + bus->kso = TRUE; } return err; @@ -1111,11 +1127,12 @@ dhdsdio_htclk(dhd_bus_t *bus, bool on, b DHD_ERROR(("%s: HT Avail request error: %d\n", __FUNCTION__, err)); } - else { - if (ht_avail_error == HT_AVAIL_ERROR_MAX) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27) + else if (ht_avail_error == HT_AVAIL_ERROR_MAX) { dhd_os_send_hang_message(bus->dhd); - } -return BCME_ERROR; + } +#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27) */ + return BCME_ERROR; } else { ht_avail_error = 0; } @@ -1485,7 +1502,7 @@ dhdsdio_bussleep(dhd_bus_t *bus, bool sl return err; } -#if defined(CUSTOMER_HW4) && defined(DYNAMIC_F2_BLKSIZE_OF_PROPTXSTATUS) +#if defined(CUSTOMER_HW4) && defined(USE_DYNAMIC_F2_BLKSIZE) int dhdsdio_func_blocksize(dhd_pub_t *dhd, int function_num, int block_size) { @@ -1503,7 +1520,7 @@ dhdsdio_func_blocksize(dhd_pub_t *dhd, i if (result != block_size) { - DHD_ERROR(("%s: F%d Block size set from %d to %d\n", __FUNCTION__, + DHD_TRACE_HW4(("%s: F%d Block size set from %d to %d\n", __FUNCTION__, function_num, result, block_size)); func_blk_size = function_num << 16 | block_size; @@ -1519,14 +1536,16 @@ dhdsdio_func_blocksize(dhd_pub_t *dhd, i return BCME_OK; } -#endif /* CUSTOMER_HW4 && DYNAMIC_F2_BLKSIZE_OF_PROPTXSTATUS */ +#endif /* CUSTOMER_HW4 && USE_DYNAMIC_F2_BLKSIZE */ -#if defined(OOB_INTR_ONLY) +#if defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) void dhd_enable_oob_intr(struct dhd_bus *bus, bool enable) { #if defined(HW_OOB) bcmsdh_enable_hw_oob_intr(bus->sdh, enable); +#elif defined(BCMSPI_ANDROID) + bcmsdh_intr_enable(bus->sdh); #else sdpcmd_regs_t *regs = bus->regs; uint retries = 0; @@ -1550,7 +1569,7 @@ dhd_enable_oob_intr(struct dhd_bus *bus, dhdsdio_clkctl(bus, CLK_SDONLY, FALSE); #endif /* !defined(HW_OOB) */ } -#endif /* defined(OOB_INTR_ONLY) */ +#endif /* defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) */ /* Writes a HW/SW header into the packet and sends it. */ /* Assumes: (a) header space already there, (b) caller holds lock */ @@ -1834,7 +1853,13 @@ done: dhd_os_sdlock(bus->dhd); } else { #endif /* PROP_TXSTATUS */ +#ifdef SDTEST + if (chan != SDPCM_TEST_CHANNEL) { + dhd_txcomplete(bus->dhd, pkt, ret != 0); + } +#else /* SDTEST */ dhd_txcomplete(bus->dhd, pkt, ret != 0); +#endif /* SDTEST */ if (free_pkt) PKTFREE(osh, pkt, TRUE); @@ -2236,9 +2261,18 @@ dhd_bus_txctl(struct dhd_bus *bus, uchar ret = 0; } else { bus->dhd->txcnt_timeout++; - if (!bus->dhd->hang_was_sent) + if (!bus->dhd->hang_was_sent) { +#ifdef CUSTOMER_HW4 + uint32 status, retry = 0; + R_SDREG(status, &bus->regs->intstatus, retry); + DHD_TRACE_HW4(("%s: txcnt_timeout, INT status=0x%08X\n", + __FUNCTION__, status)); + DHD_TRACE_HW4(("%s : tx_max : %d, tx_seq : %d, clkstate : %d \n", + __FUNCTION__, bus->tx_max, bus->tx_seq, bus->clkstate)); +#endif /* CUSTOMER_HW4 */ DHD_ERROR(("%s: ctrl_frame_stat == TRUE txcnt_timeout=%d\n", __FUNCTION__, bus->dhd->txcnt_timeout)); + } ret = -1; bus->ctrl_frame_stat = FALSE; goto done; @@ -2411,6 +2445,10 @@ enum { IOV_SDALIGN, IOV_DEVRESET, IOV_CPU, +#if defined(SDIO_CRC_ERROR_FIX) + IOV_WATERMARK, + IOV_MESBUSYCTRL, +#endif /* SDIO_CRC_ERROR_FIX */ #ifdef SDTEST IOV_PKTGEN, IOV_EXTLOOP, @@ -2471,6 +2509,10 @@ const bcm_iovar_t dhdsdio_iovars[] = { {"extloop", IOV_EXTLOOP, 0, IOVT_BOOL, 0 }, {"pktgen", IOV_PKTGEN, 0, IOVT_BUFFER, sizeof(dhd_pktgen_t) }, #endif /* SDTEST */ +#if defined(SDIO_CRC_ERROR_FIX) + {"watermark", IOV_WATERMARK, 0, IOVT_UINT32, 0 }, + {"mesbusyctrl", IOV_MESBUSYCTRL, 0, IOVT_UINT32, 0 }, +#endif /* SDIO_CRC_ERROR_FIX */ {"devcap", IOV_DEVCAP, 0, IOVT_UINT32, 0 }, {"dngl_isolation", IOV_DONGLEISOLATION, 0, IOVT_UINT32, 0 }, {"kso", IOV_KSO, 0, IOVT_UINT32, 0 }, @@ -2639,12 +2681,15 @@ dhdsdio_pktgen_set(dhd_bus_t *bus, uint8 bus->pktgen_stop = pktgen.stop; bus->pktgen_tick = bus->pktgen_ptick = 0; + bus->pktgen_prev_time = jiffies; bus->pktgen_len = MAX(bus->pktgen_len, bus->pktgen_minlen); bus->pktgen_len = MIN(bus->pktgen_len, bus->pktgen_maxlen); /* Clear counts for a new pktgen (mode change, or was stopped) */ - if (bus->pktgen_count && (!oldcnt || oldmode != bus->pktgen_mode)) - bus->pktgen_sent = bus->pktgen_rcvd = bus->pktgen_fail = 0; + if (bus->pktgen_count && (!oldcnt || oldmode != bus->pktgen_mode)) { + bus->pktgen_sent = bus->pktgen_prev_sent = bus->pktgen_rcvd = 0; + bus->pktgen_prev_rcvd = bus->pktgen_fail = 0; + } return 0; } @@ -3105,7 +3150,8 @@ dhd_serialconsole(dhd_bus_t *bus, bool s if (bus->sih->chip == BCM4330_CHIP_ID) { uart_enab = CC_PLL_CHIPCTRL_SERIAL_ENAB; } - else if (bus->sih->chip == BCM4334_CHIP_ID) { + else if (bus->sih->chip == BCM4334_CHIP_ID || + bus->sih->chip == BCM43341_CHIP_ID) { if (enable) { /* Moved to PMU chipcontrol 1 from 4330 */ int_val &= ~gpio_sel; @@ -3575,6 +3621,34 @@ dhdsdio_doiovar(dhd_bus_t *bus, const bc break; #endif /* SDTEST */ +#if defined(SDIO_CRC_ERROR_FIX) + case IOV_GVAL(IOV_WATERMARK): + int_val = (int32)watermark; + bcopy(&int_val, arg, val_size); + break; + + case IOV_SVAL(IOV_WATERMARK): + watermark = (uint)int_val; + watermark = (watermark > SBSDIO_WATERMARK_MASK) ? SBSDIO_WATERMARK_MASK : watermark; + DHD_ERROR(("Setting watermark as 0x%x.\n", watermark)); + bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_1, SBSDIO_WATERMARK, (uint8)watermark, NULL); + break; + + case IOV_GVAL(IOV_MESBUSYCTRL): + int_val = (int32)mesbusyctrl; + bcopy(&int_val, arg, val_size); + break; + + case IOV_SVAL(IOV_MESBUSYCTRL): + mesbusyctrl = (uint)int_val; + mesbusyctrl = (mesbusyctrl > SBSDIO_MESBUSYCTRL_MASK) + ? SBSDIO_MESBUSYCTRL_MASK : mesbusyctrl; + DHD_ERROR(("Setting mesbusyctrl as 0x%x.\n", mesbusyctrl)); + bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_1, SBSDIO_FUNC1_MESBUSYCTRL, + ((uint8)mesbusyctrl | 0x80), NULL); + break; +#endif /* SDIO_CRC_ERROR_FIX */ + case IOV_GVAL(IOV_DONGLEISOLATION): int_val = bus->dhd->dongle_isolation; @@ -3884,6 +3958,7 @@ dhdsdio_download_state(dhd_bus_t *bus, b DHD_ERROR(("%s: could not write vars to RAM\n", __FUNCTION__)); goto fail; } + /* Enable remap before ARM reset but after vars. * No backplane access in remap mode */ @@ -3898,6 +3973,7 @@ dhdsdio_download_state(dhd_bus_t *bus, b } W_SDREG(0xFFFFFFFF, &bus->regs->intstatus, retries); + if (!(si_setcore(bus->sih, ARM7S_CORE_ID, 0)) && !(si_setcore(bus->sih, ARMCM3_CORE_ID, 0))) { DHD_ERROR(("%s: Failed to find ARM core!\n", __FUNCTION__)); @@ -4078,51 +4154,60 @@ dhd_bus_stop(struct dhd_bus *bus, bool e if (enforce_mutex) dhd_os_sdlock(bus->dhd); - BUS_WAKE(bus); + if ((bus->dhd->busstate == DHD_BUS_DOWN) || bus->dhd->hang_was_sent) { + /* if Firmware already hangs disbale any interrupt */ + bus->dhd->busstate = DHD_BUS_DOWN; + bus->hostintmask = 0; + bcmsdh_intr_disable(bus->sdh); + } else { - if (KSO_ENAB(bus)) { - /* Mask the interrupt */ - dat = bcmsdh_cfg_read(bus->sdh, SDIO_FUNC_0, SDIOD_CCCR_INTEN, NULL); - dat &= ~(INTR_CTL_FUNC1_EN | INTR_CTL_FUNC2_EN); - bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_0, SDIOD_CCCR_INTEN, dat, NULL); - } + BUS_WAKE(bus); - /* Change our idea of bus state */ - bus->dhd->busstate = DHD_BUS_DOWN; + if (KSO_ENAB(bus)) { + /* Mask the interrupt */ + dat = bcmsdh_cfg_read(bus->sdh, SDIO_FUNC_0, SDIOD_CCCR_INTEN, NULL); + dat &= ~(INTR_CTL_FUNC1_EN | INTR_CTL_FUNC2_EN); + bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_0, SDIOD_CCCR_INTEN, dat, NULL); + } - if (KSO_ENAB(bus)) { + /* Change our idea of bus state */ + bus->dhd->busstate = DHD_BUS_DOWN; - /* Enable clock for device interrupts */ - dhdsdio_clkctl(bus, CLK_AVAIL, FALSE); + if (KSO_ENAB(bus)) { - /* Disable and clear interrupts at the chip level also */ - W_SDREG(0, &bus->regs->hostintmask, retries); - local_hostintmask = bus->hostintmask; - bus->hostintmask = 0; + /* Enable clock for device interrupts */ + dhdsdio_clkctl(bus, CLK_AVAIL, FALSE); - /* Force clocks on backplane to be sure F2 interrupt propagates */ - saveclk = bcmsdh_cfg_read(bus->sdh, SDIO_FUNC_1, SBSDIO_FUNC1_CHIPCLKCSR, &err); - if (!err) { - bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_1, SBSDIO_FUNC1_CHIPCLKCSR, - (saveclk | SBSDIO_FORCE_HT), &err); - } - if (err) { - DHD_ERROR(("%s: Failed to force clock for F2: err %d\n", __FUNCTION__, err)); - } + /* Disable and clear interrupts at the chip level also */ + W_SDREG(0, &bus->regs->hostintmask, retries); + local_hostintmask = bus->hostintmask; + bus->hostintmask = 0; + + /* Force clocks on backplane to be sure F2 interrupt propagates */ + saveclk = bcmsdh_cfg_read(bus->sdh, SDIO_FUNC_1, SBSDIO_FUNC1_CHIPCLKCSR, &err); + if (!err) { + bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_1, SBSDIO_FUNC1_CHIPCLKCSR, + (saveclk | SBSDIO_FORCE_HT), &err); + } + if (err) { + DHD_ERROR(("%s: Failed to force clock for F2: err %d\n", + __FUNCTION__, err)); + } - /* Turn off the bus (F2), free any pending packets */ - DHD_INTR(("%s: disable SDIO interrupts\n", __FUNCTION__)); - bcmsdh_intr_disable(bus->sdh); + /* Turn off the bus (F2), free any pending packets */ + DHD_INTR(("%s: disable SDIO interrupts\n", __FUNCTION__)); + bcmsdh_intr_disable(bus->sdh); #ifndef BCMSPI - bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_0, SDIOD_CCCR_IOEN, SDIO_FUNC_ENABLE_1, NULL); + bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_0, SDIOD_CCCR_IOEN, SDIO_FUNC_ENABLE_1, NULL); #endif /* !BCMSPI */ - /* Clear any pending interrupts now that F2 is disabled */ - W_SDREG(local_hostintmask, &bus->regs->intstatus, retries); - } + /* Clear any pending interrupts now that F2 is disabled */ + W_SDREG(local_hostintmask, &bus->regs->intstatus, retries); + } - /* Turn off the backplane clock (only) */ - dhdsdio_clkctl(bus, CLK_SDONLY, FALSE); + /* Turn off the backplane clock (only) */ + dhdsdio_clkctl(bus, CLK_SDONLY, FALSE); + } /* Clear the data packet queues */ pktq_flush(osh, &bus->txq, TRUE, NULL, 0); @@ -4281,8 +4366,19 @@ dhd_bus_init(dhd_pub_t *dhdp, bool enfor } #endif /* BCMSPI */ W_SDREG(bus->hostintmask, &bus->regs->hostintmask, retries); +#ifdef SDIO_CRC_ERROR_FIX + if (bus->blocksize < 512) { + mesbusyctrl = watermark = bus->blocksize / 4; + } +#endif /* SDIO_CRC_ERROR_FIX */ bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_1, SBSDIO_WATERMARK, (uint8)watermark, &err); +#ifdef SDIO_CRC_ERROR_FIX + bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_1, SBSDIO_FUNC1_MESBUSYCTRL, + (uint8)mesbusyctrl|0x80, &err); + bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_1, SBSDIO_DEVICE_CTL, + SBSDIO_DEVCTL_EN_F2_BLK_WATERMARK, NULL); +#endif /* SDIO_CRC_ERROR_FIX */ /* Set bus state according to enable result */ dhdp->busstate = DHD_BUS_DATA; @@ -4292,7 +4388,9 @@ dhd_bus_init(dhd_pub_t *dhdp, bool enfor bus->intdis = FALSE; if (bus->intr) { DHD_INTR(("%s: enable SDIO device interrupts\n", __FUNCTION__)); +#ifndef BCMSPI_ANDROID bcmsdh_intr_enable(bus->sdh); +#endif /* !BCMSPI_ANDROID */ } else { DHD_INTR(("%s: disable SDIO interrupts\n", __FUNCTION__)); bcmsdh_intr_disable(bus->sdh); @@ -4490,11 +4588,6 @@ done: dhd_os_ioctl_resp_wake(bus->dhd); } -#ifdef CUSTOMER_HW4 -int pkt_free; -int caller; -void *free_ptr; -#endif static uint8 dhdsdio_rxglom(dhd_bus_t *bus, uint8 rxseq) { @@ -4517,9 +4610,6 @@ dhdsdio_rxglom(dhd_bus_t *bus, uint8 rxs int ifidx = 0; bool usechain = bus->use_rxchain; -#ifdef CUSTOMER_HW4 - pkt_free = 0; -#endif /* If packets, issue read(s) and send up packet chain */ /* Return sequence numbers consumed? */ @@ -4837,24 +4927,13 @@ dhdsdio_rxglom(dhd_bus_t *bus, uint8 rxs reorder_info_len = sizeof(reorder_info_buf); if (PKTLEN(osh, pfirst) == 0) { -#ifdef CUSTOMER_HW4 - pkt_free = 1; - caller = 1; - free_ptr = pfirst; -#endif PKTFREE(bus->dhd->osh, pfirst, FALSE); - if (plast) { - PKTSETNEXT(osh, plast, pnext); - } continue; } else if (dhd_prot_hdrpull(bus->dhd, &ifidx, pfirst, reorder_info_buf, &reorder_info_len) != 0) { DHD_ERROR(("%s: rx protocol error\n", __FUNCTION__)); bus->dhd->rx_errors++; PKTFREE(osh, pfirst, FALSE); - if (plast) { - PKTSETNEXT(osh, plast, pnext); - } continue; } if (reorder_info_len) { @@ -4867,9 +4946,6 @@ dhdsdio_rxglom(dhd_bus_t *bus, uint8 rxs reorder_info_len, &ppfirst, &free_buf_count); if (free_buf_count == 0) { - if (plast) { - PKTSETNEXT(osh, plast, pnext); - } continue; } else { @@ -4889,14 +4965,12 @@ dhdsdio_rxglom(dhd_bus_t *bus, uint8 rxs PKTSETNEXT(osh, list_tail[ifidx], ppfirst); list_tail[ifidx] = pfirst; } - plast = pfirst; } num += (uint8)free_buf_count; } else { /* this packet will go up, link back into chain and count it */ - plast = pfirst; if (list_tail[ifidx] == NULL) { list_head[ifidx] = list_tail[ifidx] = pfirst; @@ -4977,9 +5051,6 @@ dhdsdio_readframes(dhd_bus_t *bus, uint bool sdtest = FALSE; /* To limit message spew from test mode */ #endif -#ifdef CUSTOMER_HW4 - pkt_free = 0; -#endif DHD_TRACE(("%s: Enter\n", __FUNCTION__)); bus->readframes = TRUE; @@ -5624,11 +5695,6 @@ deliver: if (PKTLEN(osh, pkt) == 0) { dhd_os_sdlock_rxq(bus->dhd); -#ifdef CUSTOMER_HW4 - pkt_free = 1; - caller = 0; - free_ptr = pkt; -#endif PKTFREE(bus->dhd->osh, pkt, FALSE); dhd_os_sdunlock_rxq(bus->dhd); continue; @@ -5762,8 +5828,9 @@ dhdsdio_hostmail(dhd_bus_t *bus) #ifdef DHD_DEBUG /* At least print a message if FW halted */ if (hmb_data & HMB_DATA_FWHALT) { - DHD_ERROR(("INTERNAL ERROR: FIRMWARE HALTED\n")); + DHD_ERROR(("INTERNAL ERROR: FIRMWARE HALTED : set BUS DOWN\n")); dhdsdio_checkdied(bus, NULL, 0); + bus->dhd->busstate = DHD_BUS_DOWN; } #endif /* DHD_DEBUG */ @@ -5961,10 +6028,14 @@ clkwait: DHD_INTR(("%s: enable SDIO interrupts, rxdone %d framecnt %d\n", __FUNCTION__, rxdone, framecnt)); bus->intdis = FALSE; -#if defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) +#if defined(OOB_INTR_ONLY) bcmsdh_oob_intr_set(1); -#endif /* defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) */ +#endif /* defined(OOB_INTR_ONLY) */ bcmsdh_intr_enable(sdh); +#ifdef BCMSPI_ANDROID + if (*dhd_spi_lockcount == 0) + bcmsdh_oob_intr_set(1); +#endif /* BCMSPI_ANDROID */ } #if defined(OOB_INTR_ONLY) && !defined(HW_OOB) @@ -5982,7 +6053,9 @@ clkwait: resched = TRUE; } #endif /* defined(OOB_INTR_ONLY) && !defined(HW_OOB) */ - +#ifdef PROP_TXSTATUS + dhd_wlfc_trigger_pktcommit(bus->dhd); +#endif if (TXCTLOK(bus) && bus->ctrl_frame_stat && (bus->clkstate == CLK_AVAIL)) { int ret, i; @@ -6039,11 +6112,8 @@ clkwait: txlimit -= framecnt; } /* Resched the DPC if ctrl cmd is pending on bus credit */ - if (bus->ctrl_frame_stat) { - DHD_TRACE_HW4(("%s : tx_max : %d, tx_seq : %d, clkstate : %d \n", - __FUNCTION__, bus->tx_max, bus->tx_seq, bus->clkstate)); + if (bus->ctrl_frame_stat) resched = TRUE; - } /* Resched if events or tx frames are pending, else await next interrupt */ /* On failed register access, all bets are off: no resched or interrupts */ @@ -6134,6 +6204,9 @@ dhdsdio_isr(void *arg) DHD_ERROR(("dhdsdio_isr() w/o interrupt configured!\n")); } +#ifdef BCMSPI_ANDROID + bcmsdh_oob_intr_set(0); +#endif /* BCMSPI_ANDROID */ bcmsdh_intr_disable(sdh); bus->intdis = TRUE; @@ -6184,19 +6257,39 @@ dhdsdio_pktgen(dhd_bus_t *bus) uint fillbyte; osl_t *osh = bus->dhd->osh; uint16 len; + ulong cur_jiffies; + ulong time_lapse; + uint sent_pkts; + uint rcvd_pkts; /* Display current count if appropriate */ - if (bus->pktgen_print && (++bus->pktgen_ptick >= bus->pktgen_print)) { - bus->pktgen_ptick = 0; - printf("%s: send attempts %d rcvd %d\n", - __FUNCTION__, bus->pktgen_sent, bus->pktgen_rcvd); + bus->pktgen_ptick = 0; + printf("%s: send attempts %d, rcvd %d, errors %d\n", + __FUNCTION__, bus->pktgen_sent, bus->pktgen_rcvd, bus->pktgen_fail); + + /* Print throughput stats only for constant length packet runs */ + if (bus->pktgen_minlen == bus->pktgen_maxlen) { + cur_jiffies = jiffies; + if(cur_jiffies >= bus->pktgen_prev_time) /* Check for jiffies wrap around */ + time_lapse = cur_jiffies - bus->pktgen_prev_time; + else + time_lapse = bus->pktgen_prev_time - cur_jiffies; + bus->pktgen_prev_time = jiffies; + sent_pkts = bus->pktgen_sent - bus->pktgen_prev_sent; + bus->pktgen_prev_sent = bus->pktgen_sent; + rcvd_pkts = bus->pktgen_rcvd - bus->pktgen_prev_rcvd; + bus->pktgen_prev_rcvd = bus->pktgen_rcvd; + + printf("%s: Tx Throughput %d kbps, Rx Throughput %d kbps\n", __FUNCTION__, + (sent_pkts * bus->pktgen_len / jiffies_to_msecs(time_lapse)) * 8, + (rcvd_pkts * bus->pktgen_len / jiffies_to_msecs(time_lapse)) * 8); } /* For recv mode, just make sure dongle has started sending */ if (bus->pktgen_mode == DHD_PKTGEN_RECV) { if (bus->pktgen_rcv_state == PKTGEN_RCV_IDLE) { bus->pktgen_rcv_state = PKTGEN_RCV_ONGOING; - dhdsdio_sdtest_set(bus, (uint8)bus->pktgen_total); + dhdsdio_sdtest_set(bus, bus->pktgen_total); } return; } @@ -6210,7 +6303,11 @@ dhdsdio_pktgen(dhd_bus_t *bus) } /* Allocate an appropriate-sized packet */ - len = bus->pktgen_len; + if (bus->pktgen_mode == DHD_PKTGEN_RXBURST) { + len = SDPCM_TEST_PKT_CNT_FLD_LEN; + } else { + len = bus->pktgen_len; + } if (!(pkt = PKTGET(osh, (len + SDPCM_HDRLEN + SDPCM_TEST_HDRLEN + DHD_SDALIGN), TRUE))) {; DHD_ERROR(("%s: PKTGET failed!\n", __FUNCTION__)); @@ -6233,7 +6330,7 @@ dhdsdio_pktgen(dhd_bus_t *bus) case DHD_PKTGEN_RXBURST: *data++ = SDPCM_TEST_BURST; - *data++ = (uint8)bus->pktgen_count; + *data++ = (uint8)bus->pktgen_count; /* Just for backward compatability */ break; default: @@ -6244,12 +6341,23 @@ dhdsdio_pktgen(dhd_bus_t *bus) } /* Write test header length field */ - *data++ = (len >> 0); - *data++ = (len >> 8); + *data++ = (bus->pktgen_len >> 0); + *data++ = (bus->pktgen_len >> 8); - /* Then fill in the remainder -- N/A for burst, but who cares... */ - for (fillbyte = 0; fillbyte < len; fillbyte++) - *data++ = SDPCM_TEST_FILL(fillbyte, (uint8)bus->pktgen_sent); + /* Write frame count in a 4 byte field adjucent to SDPCM test header for + * burst mode + */ + if (bus->pktgen_mode == DHD_PKTGEN_RXBURST) { + *data++ = (uint8)(bus->pktgen_count >> 0); + *data++ = (uint8)(bus->pktgen_count >> 8); + *data++ = (uint8)(bus->pktgen_count >> 16); + *data++ = (uint8)(bus->pktgen_count >> 24); + } else { + + /* Then fill in the remainder -- N/A for burst */ + for (fillbyte = 0; fillbyte < len; fillbyte++) + *data++ = SDPCM_TEST_FILL(fillbyte, (uint8)bus->pktgen_sent); + } #ifdef DHD_DEBUG if (DHD_BYTES_ON() && DHD_DATA_ON()) { @@ -6277,25 +6385,31 @@ dhdsdio_pktgen(dhd_bus_t *bus) } static void -dhdsdio_sdtest_set(dhd_bus_t *bus, uint8 count) +dhdsdio_sdtest_set(dhd_bus_t *bus, uint count) { void *pkt; uint8 *data; osl_t *osh = bus->dhd->osh; /* Allocate the packet */ - if (!(pkt = PKTGET(osh, SDPCM_HDRLEN + SDPCM_TEST_HDRLEN + DHD_SDALIGN, TRUE))) { + if (!(pkt = PKTGET(osh, SDPCM_HDRLEN + SDPCM_TEST_HDRLEN + + SDPCM_TEST_PKT_CNT_FLD_LEN + DHD_SDALIGN, TRUE))) { DHD_ERROR(("%s: PKTGET failed!\n", __FUNCTION__)); return; } - PKTALIGN(osh, pkt, (SDPCM_HDRLEN + SDPCM_TEST_HDRLEN), DHD_SDALIGN); + PKTALIGN(osh, pkt, (SDPCM_HDRLEN + SDPCM_TEST_HDRLEN + + SDPCM_TEST_PKT_CNT_FLD_LEN), DHD_SDALIGN); data = (uint8*)PKTDATA(osh, pkt) + SDPCM_HDRLEN; /* Fill in the test header */ *data++ = SDPCM_TEST_SEND; - *data++ = count; + *data++ = (count > 0)?TRUE:FALSE; *data++ = (bus->pktgen_maxlen >> 0); *data++ = (bus->pktgen_maxlen >> 8); + *data++ = (uint8)(count >> 0); + *data++ = (uint8)(count >> 8); + *data++ = (uint8)(count >> 16); + *data++ = (uint8)(count >> 24); /* Send it */ if (dhdsdio_txpkt(bus, pkt, SDPCM_TEST_CHANNEL, TRUE, FALSE)) @@ -6506,7 +6620,10 @@ dhd_bus_watchdog(dhd_pub_t *dhdp) /* Generate packets if configured */ if (bus->pktgen_count && (++bus->pktgen_tick >= bus->pktgen_freq)) { /* Make sure backplane clock is on */ - dhdsdio_clkctl(bus, CLK_AVAIL, FALSE); + if (SLPAUTO_ENAB(bus)) + dhdsdio_bussleep(bus, FALSE); + else + dhdsdio_clkctl(bus, CLK_AVAIL, FALSE); bus->pktgen_tick = 0; dhdsdio_pktgen(bus); } @@ -6668,6 +6785,8 @@ dhdsdio_chipmatch(uint16 chipid) return TRUE; if (chipid == BCM4334_CHIP_ID) return TRUE; + if (chipid == BCM43341_CHIP_ID) + return TRUE; if (chipid == BCM43239_CHIP_ID) return TRUE; if (chipid == BCM4324_CHIP_ID) @@ -6855,8 +6974,7 @@ dhdsdio_probe(uint16 venid, uint16 devid if (dhd_download_fw_on_driverload) { if ((ret = dhd_bus_start(bus->dhd)) != 0) { DHD_ERROR(("%s: dhd_bus_start failed\n", __FUNCTION__)); - if (ret == BCME_NOTUP) - goto fail; + goto fail; } } /* Ok, have the per-port tell the stack we're open for business */ @@ -7849,9 +7967,7 @@ dhd_bus_devreset(dhd_pub_t *dhdp, uint8 if (bcmerror == BCME_OK) { #if defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) bcmsdh_set_irq(TRUE); -#ifndef BCMSPI_ANDROID dhd_enable_oob_intr(bus, TRUE); -#endif /* !BCMSPI_ANDROID */ #endif /* defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) */ bus->dhd->dongle_reset = FALSE; --- a/drivers/net/wireless/bcmdhd/dhd_sec_feature.h +++ b/drivers/net/wireless/bcmdhd/dhd_sec_feature.h @@ -1,8 +1,5 @@ /* - * Header file describing the internal (inter-module) DHD interfaces. - * - * Provides type definitions and function prototypes used to link the - * DHD OS, bus, and protocol modules. + * Customer HW 4 dependant file * * Copyright (C) 1999-2012, Broadcom Corporation * @@ -24,72 +21,79 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: dhd_sec_feature.h 309548 2012-01-20 01:13:08Z $ + * $Id: dhd_sec_feature.h$ */ +#ifndef _dhd_sec_feature_h_ +#define _dhd_sec_feature_h_ + /* PROJECTS */ -#if defined(CONFIG_MACH_SAMSUNG_ESPRESSO)\ - || defined(CONFIG_MACH_SAMSUNG_ESPRESSO_10) +#if defined(CONFIG_MACH_SAMSUNG_ESPRESSO) || defined(CONFIG_MACH_SAMSUNG_ESPRESSO_10) #define READ_MACADDR #define HW_OOB -#endif +#endif /* CONFIG_MACH_SAMSUNG_ESPRESSO && CONFIG_MACH_SAMSUNG_ESPRESSO_10 */ /* Q1 also uses this feature */ #if defined(CONFIG_MACH_U1) || defined(CONFIG_MACH_TRATS) #ifdef CONFIG_MACH_Q1_BD #define HW_OOB -#endif +#endif /* CONFIG_MACH_Q1_BD */ #define USE_CID_CHECK #define WRITE_MACADDR -#endif +#endif /* CONFIG_MACH_U1 || CONFIG_MACH_TRATS */ #ifdef CONFIG_ARCH_MSM7X30 #define HW_OOB #define READ_MACADDR -#endif +#endif /* CONFIG_ARCH_MSM7X30 */ -#if defined CONFIG_MACH_GC1 || defined CONFIG_MACH_U1_NA_SPR +#if defined CONFIG_MACH_GC1 || defined CONFIG_MACH_U1_NA_SPR\ + || defined CONFIG_MACH_KONA #undef USE_CID_CHECK #define READ_MACADDR -#endif +#endif /* CONFIG_MACH_GC1 || CONFIG_MACH_U1_NA_SPR */ #ifdef CONFIG_MACH_P10 #define READ_MACADDR -#endif +#endif /* CONFIG_MACH_P10 */ #ifdef CONFIG_ARCH_MSM8960 #undef WIFI_TURNOFF_DELAY #define WIFI_TURNOFF_DELAY 200 #endif +#ifdef CONFIG_MACH_M0 +#define WL11U +#endif + /* REGION CODE */ #if (WLAN_REGION_CODE >= 100) && (WLAN_REGION_CODE < 200) /*EUR*/ #if (WLAN_REGION_CODE == 101) /*EUR ORG*/ /* GAN LITE NAT KEEPALIVE FILTER */ #define GAN_LITE_NAT_KEEPALIVE_FILTER -#endif -#endif +#endif /* WLAN_REGION_CODE == 101 */ +#endif /* WLAN_REGION_CODE >= 100 && WLAN_REGION_CODE < 200 */ #if (WLAN_REGION_CODE >= 200) && (WLAN_REGION_CODE < 300) /* KOR */ #undef USE_INITIAL_2G_SCAN_ORG #ifndef ROAM_ENABLE #define ROAM_ENABLE -#endif +#endif /* ROAM_ENABLE */ #ifndef ROAM_API #define ROAM_API -#endif +#endif /* ROAM_API */ #ifndef ROAM_CHANNEL_CACHE #define ROAM_CHANNEL_CACHE -#endif +#endif /* ROAM_CHANNEL_CACHE */ #ifndef OKC_SUPPORT #define OKC_SUPPORT -#endif +#endif /* OKC_SUPPORT */ #ifndef ROAM_AP_ENV_DETECTION #define ROAM_AP_ENV_DETECTION -#endif +#endif /* ROAM_AP_ENV_DETECTION */ #undef WRITE_MACADDR #undef READ_MACADDR @@ -97,27 +101,29 @@ #define READ_MACADDR #else #define RDWR_MACADDR -#endif +#endif /* CONFIG_BCM4334 */ #if (WLAN_REGION_CODE == 201) /* SKT */ -#endif +#endif /* WLAN_REGION_CODE == 201 */ #if (WLAN_REGION_CODE == 202) /* KTT */ #define VLAN_MODE_OFF #define KEEP_ALIVE_PACKET_PERIOD_30_SEC #define FULL_ROAMING_SCAN_PERIOD_60_SEC -#endif +#endif /* WLAN_REGION_CODE == 202 */ #if (WLAN_REGION_CODE == 203) /* LGT */ -#endif -#endif +#endif /* WLAN_REGION_CODE == 203 */ +#endif /* WLAN_REGION_CODE >= 200 && WLAN_REGION_CODE < 300 */ #if (WLAN_REGION_CODE >= 300) && (WLAN_REGION_CODE < 400) /* CHN */ #define BCMWAPI_WPI #define BCMWAPI_WAI -#endif +#endif /* WLAN_REGION_CODE >= 300 && WLAN_REGION_CODE < 400 */ -#if !defined(READ_MACADDR) && !defined(WRITE_MACADDR) && !defined(RDWR_KORICS_MACADDR) && !defined(RDWR_MACADDR) +#if !defined(READ_MACADDR) && !defined(WRITE_MACADDR)\ + && !defined(RDWR_KORICS_MACADDR) && !defined(RDWR_MACADDR) #define GET_MAC_FROM_OTP -#endif +#endif /* !READ_MACADDR && !WRITE_MACADDR && !RDWR_KORICS_MACADDR && !RDWR_MACADDR */ +#endif /* _dhd_sec_feature_h_ */ --- a/drivers/net/wireless/bcmdhd/dhd_wlfc.h +++ b/drivers/net/wireless/bcmdhd/dhd_wlfc.h @@ -18,7 +18,7 @@ * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. -* $Id: dhd_wlfc.h 341930 2012-06-29 04:51:25Z $ +* $Id: dhd_wlfc.h 361006 2012-10-05 07:45:51Z $ * */ #ifndef __wlfc_host_driver_definitions_h__ @@ -85,6 +85,7 @@ typedef struct wlfc_hanger { uint32 failed_to_pop; uint32 failed_slotfind; wlfc_hanger_item_t items[1]; + uint32 slot_pos; } wlfc_hanger_t; #define WLFC_HANGER_SIZE(n) ((sizeof(wlfc_hanger_t) - \ --- a/drivers/net/wireless/bcmdhd/hndpmu.c +++ b/drivers/net/wireless/bcmdhd/hndpmu.c @@ -1,209 +1,209 @@ -/* - * Misc utility routines for accessing PMU corerev specific features - * of the SiliconBackplane-based Broadcom chips. - * - * Copyright (C) 1999-2012, Broadcom Corporation - * - * Unless you and Broadcom execute a separate written software license - * agreement governing use of this software, this software is licensed to you - * under the terms of the GNU General Public License version 2 (the "GPL"), - * available at http://www.broadcom.com/licenses/GPLv2.php, with the - * following added to such license: - * - * As a special exception, the copyright holders of this software give you - * permission to link this software with independent modules, and to copy and - * distribute the resulting executable under terms of your choice, provided that - * you also meet, for each linked independent module, the terms and conditions of - * the license of that module. An independent module is a module which is not - * derived from this software. The special exception does not apply to any - * modifications of the software. - * - * Notwithstanding the above, under no circumstances may you combine this - * software in any way with any other Broadcom software provided under a license - * other than the GPL, without Broadcom's express prior written consent. - * - * $Id: hndpmu.c 357871 2012-09-20 07:17:35Z $ - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define PMU_ERROR(args) - -#define PMU_MSG(args) - -/* To check in verbose debugging messages not intended - * to be on except on private builds. - */ -#define PMU_NONE(args) - - -/* SDIO Pad drive strength to select value mappings. - * The last strength value in each table must be 0 (the tri-state value). - */ -typedef struct { - uint8 strength; /* Pad Drive Strength in mA */ - uint8 sel; /* Chip-specific select value */ -} sdiod_drive_str_t; - -/* SDIO Drive Strength to sel value table for PMU Rev 1 */ -static const sdiod_drive_str_t sdiod_drive_strength_tab1[] = { - {4, 0x2}, - {2, 0x3}, - {1, 0x0}, - {0, 0x0} }; - -/* SDIO Drive Strength to sel value table for PMU Rev 2, 3 */ -static const sdiod_drive_str_t sdiod_drive_strength_tab2[] = { - {12, 0x7}, - {10, 0x6}, - {8, 0x5}, - {6, 0x4}, - {4, 0x2}, - {2, 0x1}, - {0, 0x0} }; - -/* SDIO Drive Strength to sel value table for PMU Rev 8 (1.8V) */ -static const sdiod_drive_str_t sdiod_drive_strength_tab3[] = { - {32, 0x7}, - {26, 0x6}, - {22, 0x5}, - {16, 0x4}, - {12, 0x3}, - {8, 0x2}, - {4, 0x1}, - {0, 0x0} }; - -/* SDIO Drive Strength to sel value table for PMU Rev 11 (1.8v) */ -static const sdiod_drive_str_t sdiod_drive_strength_tab4_1v8[] = { - {32, 0x6}, - {26, 0x7}, - {22, 0x4}, - {16, 0x5}, - {12, 0x2}, - {8, 0x3}, - {4, 0x0}, - {0, 0x1} }; - -/* SDIO Drive Strength to sel value table for PMU Rev 11 (1.2v) */ - -/* SDIO Drive Strength to sel value table for PMU Rev 11 (2.5v) */ - -/* SDIO Drive Strength to sel value table for PMU Rev 13 (1.8v) */ -static const sdiod_drive_str_t sdiod_drive_strength_tab5_1v8[] = { - {6, 0x7}, - {5, 0x6}, - {4, 0x5}, - {3, 0x4}, - {2, 0x2}, - {1, 0x1}, - {0, 0x0} }; - -/* SDIO Drive Strength to sel value table for PMU Rev 13 (3.3v) */ - -/* SDIO Drive Strength to sel value table for PMU Rev 17 (1.8v) */ -static const sdiod_drive_str_t sdiod_drive_strength_tab6_1v8[] = { - {3, 0x3}, - {2, 0x2}, - {1, 0x1}, - {0, 0x0} }; - - -#define SDIOD_DRVSTR_KEY(chip, pmu) (((chip) << 16) | (pmu)) - -void -si_sdiod_drive_strength_init(si_t *sih, osl_t *osh, uint32 drivestrength) -{ - chipcregs_t *cc; - uint origidx, intr_val = 0; - sdiod_drive_str_t *str_tab = NULL; - uint32 str_mask = 0; - uint32 str_shift = 0; - - if (!(sih->cccaps & CC_CAP_PMU)) { - return; - } - - /* Remember original core before switch to chipc */ - cc = (chipcregs_t *) si_switch_core(sih, CC_CORE_ID, &origidx, &intr_val); - - switch (SDIOD_DRVSTR_KEY(sih->chip, sih->pmurev)) { - case SDIOD_DRVSTR_KEY(BCM4325_CHIP_ID, 1): - str_tab = (sdiod_drive_str_t *)&sdiod_drive_strength_tab1; - str_mask = 0x30000000; - str_shift = 28; - break; - case SDIOD_DRVSTR_KEY(BCM4325_CHIP_ID, 2): - case SDIOD_DRVSTR_KEY(BCM4325_CHIP_ID, 3): - case SDIOD_DRVSTR_KEY(BCM4315_CHIP_ID, 4): - str_tab = (sdiod_drive_str_t *)&sdiod_drive_strength_tab2; - str_mask = 0x00003800; - str_shift = 11; - break; - case SDIOD_DRVSTR_KEY(BCM4336_CHIP_ID, 8): - case SDIOD_DRVSTR_KEY(BCM4336_CHIP_ID, 11): - if (sih->pmurev == 8) { - str_tab = (sdiod_drive_str_t *)&sdiod_drive_strength_tab3; - } - else if (sih->pmurev == 11) { - str_tab = (sdiod_drive_str_t *)&sdiod_drive_strength_tab4_1v8; - } - str_mask = 0x00003800; - str_shift = 11; - break; - case SDIOD_DRVSTR_KEY(BCM4330_CHIP_ID, 12): - str_tab = (sdiod_drive_str_t *)&sdiod_drive_strength_tab4_1v8; - str_mask = 0x00003800; - str_shift = 11; - break; - case SDIOD_DRVSTR_KEY(BCM43362_CHIP_ID, 13): - str_tab = (sdiod_drive_str_t *)&sdiod_drive_strength_tab5_1v8; - str_mask = 0x00003800; - str_shift = 11; - break; - case SDIOD_DRVSTR_KEY(BCM4334_CHIP_ID, 17): - str_tab = (sdiod_drive_str_t *)&sdiod_drive_strength_tab6_1v8; - str_mask = 0x00001800; - str_shift = 11; - break; - default: - PMU_MSG(("No SDIO Drive strength init done for chip %s rev %d pmurev %d\n", - bcm_chipname(sih->chip, chn, 8), sih->chiprev, sih->pmurev)); - - break; - } - - if (str_tab != NULL && cc != NULL) { - uint32 cc_data_temp; - int i; - - /* Pick the lowest available drive strength equal or greater than the - * requested strength. Drive strength of 0 requests tri-state. - */ - for (i = 0; drivestrength < str_tab[i].strength; i++) - ; - - if (i > 0 && drivestrength > str_tab[i].strength) - i--; - - W_REG(osh, &cc->chipcontrol_addr, 1); - cc_data_temp = R_REG(osh, &cc->chipcontrol_data); - cc_data_temp &= ~str_mask; - cc_data_temp |= str_tab[i].sel << str_shift; - W_REG(osh, &cc->chipcontrol_data, cc_data_temp); - - PMU_MSG(("SDIO: %dmA drive strength requested; set to %dmA\n", - drivestrength, str_tab[i].strength)); - } - - /* Return to original core */ - si_restore_core(sih, origidx, intr_val); -} +/* + * Misc utility routines for accessing PMU corerev specific features + * of the SiliconBackplane-based Broadcom chips. + * + * Copyright (C) 1999-2012, Broadcom Corporation + * + * Unless you and Broadcom execute a separate written software license + * agreement governing use of this software, this software is licensed to you + * under the terms of the GNU General Public License version 2 (the "GPL"), + * available at http://www.broadcom.com/licenses/GPLv2.php, with the + * following added to such license: + * + * As a special exception, the copyright holders of this software give you + * permission to link this software with independent modules, and to copy and + * distribute the resulting executable under terms of your choice, provided that + * you also meet, for each linked independent module, the terms and conditions of + * the license of that module. An independent module is a module which is not + * derived from this software. The special exception does not apply to any + * modifications of the software. + * + * Notwithstanding the above, under no circumstances may you combine this + * software in any way with any other Broadcom software provided under a license + * other than the GPL, without Broadcom's express prior written consent. + * + * $Id: hndpmu.c 354194 2012-08-30 08:39:03Z $ + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define PMU_ERROR(args) + +#define PMU_MSG(args) + +/* To check in verbose debugging messages not intended + * to be on except on private builds. + */ +#define PMU_NONE(args) + + +/* SDIO Pad drive strength to select value mappings. + * The last strength value in each table must be 0 (the tri-state value). + */ +typedef struct { + uint8 strength; /* Pad Drive Strength in mA */ + uint8 sel; /* Chip-specific select value */ +} sdiod_drive_str_t; + +/* SDIO Drive Strength to sel value table for PMU Rev 1 */ +static const sdiod_drive_str_t sdiod_drive_strength_tab1[] = { + {4, 0x2}, + {2, 0x3}, + {1, 0x0}, + {0, 0x0} }; + +/* SDIO Drive Strength to sel value table for PMU Rev 2, 3 */ +static const sdiod_drive_str_t sdiod_drive_strength_tab2[] = { + {12, 0x7}, + {10, 0x6}, + {8, 0x5}, + {6, 0x4}, + {4, 0x2}, + {2, 0x1}, + {0, 0x0} }; + +/* SDIO Drive Strength to sel value table for PMU Rev 8 (1.8V) */ +static const sdiod_drive_str_t sdiod_drive_strength_tab3[] = { + {32, 0x7}, + {26, 0x6}, + {22, 0x5}, + {16, 0x4}, + {12, 0x3}, + {8, 0x2}, + {4, 0x1}, + {0, 0x0} }; + +/* SDIO Drive Strength to sel value table for PMU Rev 11 (1.8v) */ +static const sdiod_drive_str_t sdiod_drive_strength_tab4_1v8[] = { + {32, 0x6}, + {26, 0x7}, + {22, 0x4}, + {16, 0x5}, + {12, 0x2}, + {8, 0x3}, + {4, 0x0}, + {0, 0x1} }; + +/* SDIO Drive Strength to sel value table for PMU Rev 11 (1.2v) */ + +/* SDIO Drive Strength to sel value table for PMU Rev 11 (2.5v) */ + +/* SDIO Drive Strength to sel value table for PMU Rev 13 (1.8v) */ +static const sdiod_drive_str_t sdiod_drive_strength_tab5_1v8[] = { + {6, 0x7}, + {5, 0x6}, + {4, 0x5}, + {3, 0x4}, + {2, 0x2}, + {1, 0x1}, + {0, 0x0} }; + +/* SDIO Drive Strength to sel value table for PMU Rev 13 (3.3v) */ + +/* SDIO Drive Strength to sel value table for PMU Rev 17 (1.8v) */ +static const sdiod_drive_str_t sdiod_drive_strength_tab6_1v8[] = { + {3, 0x3}, + {2, 0x2}, + {1, 0x1}, + {0, 0x0} }; + + +#define SDIOD_DRVSTR_KEY(chip, pmu) (((chip) << 16) | (pmu)) + +void +si_sdiod_drive_strength_init(si_t *sih, osl_t *osh, uint32 drivestrength) +{ + chipcregs_t *cc; + uint origidx, intr_val = 0; + sdiod_drive_str_t *str_tab = NULL; + uint32 str_mask = 0; + uint32 str_shift = 0; + + if (!(sih->cccaps & CC_CAP_PMU)) { + return; + } + + /* Remember original core before switch to chipc */ + cc = (chipcregs_t *) si_switch_core(sih, CC_CORE_ID, &origidx, &intr_val); + + switch (SDIOD_DRVSTR_KEY(sih->chip, sih->pmurev)) { + case SDIOD_DRVSTR_KEY(BCM4325_CHIP_ID, 1): + str_tab = (sdiod_drive_str_t *)&sdiod_drive_strength_tab1; + str_mask = 0x30000000; + str_shift = 28; + break; + case SDIOD_DRVSTR_KEY(BCM4325_CHIP_ID, 2): + case SDIOD_DRVSTR_KEY(BCM4325_CHIP_ID, 3): + case SDIOD_DRVSTR_KEY(BCM4315_CHIP_ID, 4): + str_tab = (sdiod_drive_str_t *)&sdiod_drive_strength_tab2; + str_mask = 0x00003800; + str_shift = 11; + break; + case SDIOD_DRVSTR_KEY(BCM4336_CHIP_ID, 8): + case SDIOD_DRVSTR_KEY(BCM4336_CHIP_ID, 11): + if (sih->pmurev == 8) { + str_tab = (sdiod_drive_str_t *)&sdiod_drive_strength_tab3; + } + else if (sih->pmurev == 11) { + str_tab = (sdiod_drive_str_t *)&sdiod_drive_strength_tab4_1v8; + } + str_mask = 0x00003800; + str_shift = 11; + break; + case SDIOD_DRVSTR_KEY(BCM4330_CHIP_ID, 12): + str_tab = (sdiod_drive_str_t *)&sdiod_drive_strength_tab4_1v8; + str_mask = 0x00003800; + str_shift = 11; + break; + case SDIOD_DRVSTR_KEY(BCM43362_CHIP_ID, 13): + str_tab = (sdiod_drive_str_t *)&sdiod_drive_strength_tab5_1v8; + str_mask = 0x00003800; + str_shift = 11; + break; + case SDIOD_DRVSTR_KEY(BCM4334_CHIP_ID, 17): + str_tab = (sdiod_drive_str_t *)&sdiod_drive_strength_tab6_1v8; + str_mask = 0x00001800; + str_shift = 11; + break; + default: + PMU_MSG(("No SDIO Drive strength init done for chip %s rev %d pmurev %d\n", + bcm_chipname(sih->chip, chn, 8), sih->chiprev, sih->pmurev)); + + break; + } + + if (str_tab != NULL && cc != NULL) { + uint32 cc_data_temp; + int i; + + /* Pick the lowest available drive strength equal or greater than the + * requested strength. Drive strength of 0 requests tri-state. + */ + for (i = 0; drivestrength < str_tab[i].strength; i++) + ; + + if (i > 0 && drivestrength > str_tab[i].strength) + i--; + + W_REG(osh, &cc->chipcontrol_addr, 1); + cc_data_temp = R_REG(osh, &cc->chipcontrol_data); + cc_data_temp &= ~str_mask; + cc_data_temp |= str_tab[i].sel << str_shift; + W_REG(osh, &cc->chipcontrol_data, cc_data_temp); + + PMU_MSG(("SDIO: %dmA drive strength requested; set to %dmA\n", + drivestrength, str_tab[i].strength)); + } + + /* Return to original core */ + si_restore_core(sih, origidx, intr_val); +} --- a/drivers/net/wireless/bcmdhd/include/bcmsdh_sdmmc.h +++ b/drivers/net/wireless/bcmdhd/include/bcmsdh_sdmmc.h @@ -21,19 +21,27 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: bcmsdh_sdmmc.h 313732 2012-02-08 19:49:00Z $ + * $Id: bcmsdh_sdmmc.h 366811 2012-11-05 13:49:17Z $ */ #ifndef __BCMSDH_SDMMC_H__ #define __BCMSDH_SDMMC_H__ -#define sd_err(x) do {printf x;} while (0) +#define sd_err(x) #define sd_trace(x) #define sd_info(x) #define sd_debug(x) #define sd_data(x) #define sd_ctrl(x) +#ifdef CUSTOMER_HW4 +#undef sd_err +#define sd_err(x) do {printf x;} while (0) +#define sd_trace_hw4 sd_err +#else +#define sd_trace_hw4 sd_trace +#endif + #define sd_sync_dma(sd, read, nbytes) #define sd_init_dma(sd) #define sd_ack_intr(sd) --- a/drivers/net/wireless/bcmdhd/include/bcmsdpcm.h +++ b/drivers/net/wireless/bcmdhd/include/bcmsdpcm.h @@ -22,7 +22,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: bcmsdpcm.h 291086 2011-10-21 01:17:24Z $ + * $Id: bcmsdpcm.h 362722 2012-10-12 23:55:55Z $ */ #ifndef _bcmsdpcm_h_ @@ -146,16 +146,23 @@ #define SDPCM_GLOMDESC(p) (((uint8 *)p)[1] & 0x80) /* For TEST_CHANNEL packets, define another 4-byte header */ -#define SDPCM_TEST_HDRLEN 4 /* Generally: Cmd(1), Ext(1), Len(2); - * Semantics of Ext byte depend on command. - * Len is current or requested frame length, not - * including test header; sent little-endian. - */ -#define SDPCM_TEST_DISCARD 0x01 /* Receiver discards. Ext is a pattern id. */ -#define SDPCM_TEST_ECHOREQ 0x02 /* Echo request. Ext is a pattern id. */ -#define SDPCM_TEST_ECHORSP 0x03 /* Echo response. Ext is a pattern id. */ -#define SDPCM_TEST_BURST 0x04 /* Receiver to send a burst. Ext is a frame count */ -#define SDPCM_TEST_SEND 0x05 /* Receiver sets send mode. Ext is boolean on/off */ +#define SDPCM_TEST_HDRLEN 4 /* Generally: Cmd(1), Ext(1), Len(2); + * Semantics of Ext byte depend on command. + * Len is current or requested frame length, not + * including test header; sent little-endian. + */ +#define SDPCM_TEST_PKT_CNT_FLD_LEN 4 /* Packet count filed legth */ +#define SDPCM_TEST_DISCARD 0x01 /* Receiver discards. Ext is a pattern id. */ +#define SDPCM_TEST_ECHOREQ 0x02 /* Echo request. Ext is a pattern id. */ +#define SDPCM_TEST_ECHORSP 0x03 /* Echo response. Ext is a pattern id. */ +#define SDPCM_TEST_BURST 0x04 /* Receiver to send a burst. Ext is a frame count + * (Backward compatabilty) Set frame count in a + * 4 byte filed adjacent to the HDR + */ +#define SDPCM_TEST_SEND 0x05 /* Receiver sets send mode. Ext is boolean on/off + * Set frame count in a 4 byte filed adjacent to + * the HDR + */ /* Handy macro for filling in datagen packets with a pattern */ #define SDPCM_TEST_FILL(byteno, id) ((uint8)(id + byteno)) --- a/drivers/net/wireless/bcmdhd/include/bcmspibrcm.h +++ b/drivers/net/wireless/bcmdhd/include/bcmspibrcm.h @@ -1,168 +1,164 @@ -/* - * SD-SPI Protocol Conversion - BCMSDH->gSPI Translation Layer - * - * Copyright (C) 1999-2012, Broadcom Corporation - * - * Unless you and Broadcom execute a separate written software license - * agreement governing use of this software, this software is licensed to you - * under the terms of the GNU General Public License version 2 (the "GPL"), - * available at http://www.broadcom.com/licenses/GPLv2.php, with the - * following added to such license: - * - * As a special exception, the copyright holders of this software give you - * permission to link this software with independent modules, and to copy and - * distribute the resulting executable under terms of your choice, provided that - * you also meet, for each linked independent module, the terms and conditions of - * the license of that module. An independent module is a module which is not - * derived from this software. The special exception does not apply to any - * modifications of the software. - * - * Notwithstanding the above, under no circumstances may you combine this - * software in any way with any other Broadcom software provided under a license - * other than the GPL, without Broadcom's express prior written consent. - * - * $Id: bcmspibrcm.h 354176 2012-08-30 07:34:33Z $ - */ -#ifndef _BCM_SPI_BRCM_H -#define _BCM_SPI_BRCM_H - -#ifndef SPI_MAX_IOFUNCS -/* Maximum number of I/O funcs */ -#define SPI_MAX_IOFUNCS 4 -#endif -/* global msglevel for debug messages - bitvals come from sdiovar.h */ - -#if defined(DHD_DEBUG) -#define sd_err(x) do { if (sd_msglevel & SDH_ERROR_VAL) printf x; } while (0) -#define sd_trace(x) do { if (sd_msglevel & SDH_TRACE_VAL) printf x; } while (0) -#define sd_info(x) do { if (sd_msglevel & SDH_INFO_VAL) printf x; } while (0) -#define sd_debug(x) do { if (sd_msglevel & SDH_DEBUG_VAL) printf x; } while (0) -#define sd_data(x) do { if (sd_msglevel & SDH_DATA_VAL) printf x; } while (0) -#define sd_ctrl(x) do { if (sd_msglevel & SDH_CTRL_VAL) printf x; } while (0) -#else -#define sd_err(x) -#define sd_trace(x) -#define sd_info(x) -#define sd_debug(x) -#define sd_data(x) -#define sd_ctrl(x) -#endif - -#define sd_log(x) - -#define SDIOH_ASSERT(exp) \ - do { if (!(exp)) \ - printf("!!!ASSERT fail: file %s lines %d", __FILE__, __LINE__); \ - } while (0) - -#define BLOCK_SIZE_F1 64 -#define BLOCK_SIZE_F2 2048 -#define BLOCK_SIZE_F3 2048 - -/* internal return code */ -#define SUCCESS 0 -#undef ERROR -#define ERROR 1 -#define ERROR_UF 2 -#define ERROR_OF 3 - -/* private bus modes */ -#define SDIOH_MODE_SPI 0 - -#define USE_BLOCKMODE 0x2 /* Block mode can be single block or multi */ -#define USE_MULTIBLOCK 0x4 - -struct sdioh_info { - uint cfg_bar; /* pci cfg address for bar */ - uint32 caps; /* cached value of capabilities reg */ -#ifndef BCMSPI_ANDROID - void *bar0; /* BAR0 for PCI Device */ -#endif /* !BCMSPI_ANDROID */ - osl_t *osh; /* osh handler */ - void *controller; /* Pointer to SPI Controller's private data struct */ -#ifndef BCMSPI_ANDROID - uint lockcount; /* nest count of spi_lock() calls */ - bool client_intr_enabled; /* interrupt connnected flag */ - bool intr_handler_valid; /* client driver interrupt handler valid */ - sdioh_cb_fn_t intr_handler; /* registered interrupt handler */ - void *intr_handler_arg; /* argument to call interrupt handler */ -#endif /* !BCMSPI_ANDROID */ - bool initialized; /* card initialized */ - uint32 target_dev; /* Target device ID */ - uint32 intmask; /* Current active interrupts */ -#ifndef BCMSPI_ANDROID - void *sdos_info; /* Pointer to per-OS private data */ -#endif /* !BCMSPI_ANDROID */ - uint32 controller_type; /* Host controller type */ - uint8 version; /* Host Controller Spec Compliance Version */ - uint irq; /* Client irq */ - uint32 intrcount; /* Client interrupts */ - uint32 local_intrcount; /* Controller interrupts */ - bool host_init_done; /* Controller initted */ - bool card_init_done; /* Client SDIO interface initted */ - bool polled_mode; /* polling for command completion */ - - bool sd_use_dma; /* DMA on CMD53 */ - bool sd_blockmode; /* sd_blockmode == FALSE => 64 Byte Cmd 53s. */ - /* Must be on for sd_multiblock to be effective */ - bool use_client_ints; /* If this is false, make sure to restore */ - /* polling hack in wl_linux.c:wl_timer() */ - int adapter_slot; /* Maybe dealing with multiple slots/controllers */ - int sd_mode; /* SD1/SD4/SPI */ - int client_block_size[SPI_MAX_IOFUNCS]; /* Blocksize */ - uint32 data_xfer_count; /* Current transfer */ - uint16 card_rca; /* Current Address */ - uint8 num_funcs; /* Supported funcs on client */ - uint32 card_dstatus; /* 32bit device status */ - uint32 com_cis_ptr; - uint32 func_cis_ptr[SPI_MAX_IOFUNCS]; - void *dma_buf; - ulong dma_phys; - int r_cnt; /* rx count */ - int t_cnt; /* tx_count */ - uint32 wordlen; /* host processor 16/32bits */ - uint32 prev_fun; - uint32 chip; - uint32 chiprev; - bool resp_delay_all; - bool dwordmode; - bool resp_delay_new; - - struct spierrstats_t spierrstats; -}; - -/************************************************************ - * Internal interfaces: per-port references into bcmspibrcm.c - */ - -/* Global message bits */ -extern uint sd_msglevel; - -/************************************************************** - * Internal interfaces: bcmspibrcm.c references to per-port code - */ - -/* Interrupt (de)registration routines */ -extern int spi_register_irq(sdioh_info_t *sd, uint irq); -extern void spi_free_irq(uint irq, sdioh_info_t *sd); - -/* OS-specific interrupt wrappers (atomic interrupt enable/disable) */ -extern void spi_lock(sdioh_info_t *sd); -extern void spi_unlock(sdioh_info_t *sd); - -/* Allocate/init/free per-OS private data */ -extern int spi_osinit(sdioh_info_t *sd); -extern void spi_osfree(sdioh_info_t *sd); - -#define SPI_RW_FLAG_M BITFIELD_MASK(1) /* Bit [31] - R/W Command Bit */ -#define SPI_RW_FLAG_S 31 -#define SPI_ACCESS_M BITFIELD_MASK(1) /* Bit [30] - Fixed/Incr Access */ -#define SPI_ACCESS_S 30 -#define SPI_FUNCTION_M BITFIELD_MASK(2) /* Bit [29:28] - Function Number */ -#define SPI_FUNCTION_S 28 -#define SPI_REG_ADDR_M BITFIELD_MASK(17) /* Bit [27:11] - Address */ -#define SPI_REG_ADDR_S 11 -#define SPI_LEN_M BITFIELD_MASK(11) /* Bit [10:0] - Packet length */ -#define SPI_LEN_S 0 - -#endif /* _BCM_SPI_BRCM_H */ +/* + * SD-SPI Protocol Conversion - BCMSDH->gSPI Translation Layer + * + * Copyright (C) 1999-2012, Broadcom Corporation + * + * Unless you and Broadcom execute a separate written software license + * agreement governing use of this software, this software is licensed to you + * under the terms of the GNU General Public License version 2 (the "GPL"), + * available at http://www.broadcom.com/licenses/GPLv2.php, with the + * following added to such license: + * + * As a special exception, the copyright holders of this software give you + * permission to link this software with independent modules, and to copy and + * distribute the resulting executable under terms of your choice, provided that + * you also meet, for each linked independent module, the terms and conditions of + * the license of that module. An independent module is a module which is not + * derived from this software. The special exception does not apply to any + * modifications of the software. + * + * Notwithstanding the above, under no circumstances may you combine this + * software in any way with any other Broadcom software provided under a license + * other than the GPL, without Broadcom's express prior written consent. + * + * $Id: bcmspibrcm.h 373329 2012-12-07 04:46:09Z $ + */ +#ifndef _BCM_SPI_BRCM_H +#define _BCM_SPI_BRCM_H + +#ifndef SPI_MAX_IOFUNCS +/* Maximum number of I/O funcs */ +#define SPI_MAX_IOFUNCS 4 +#endif +/* global msglevel for debug messages - bitvals come from sdiovar.h */ + +#if defined(DHD_DEBUG) +#define sd_err(x) do { if (sd_msglevel & SDH_ERROR_VAL) printf x; } while (0) +#define sd_trace(x) do { if (sd_msglevel & SDH_TRACE_VAL) printf x; } while (0) +#define sd_info(x) do { if (sd_msglevel & SDH_INFO_VAL) printf x; } while (0) +#define sd_debug(x) do { if (sd_msglevel & SDH_DEBUG_VAL) printf x; } while (0) +#define sd_data(x) do { if (sd_msglevel & SDH_DATA_VAL) printf x; } while (0) +#define sd_ctrl(x) do { if (sd_msglevel & SDH_CTRL_VAL) printf x; } while (0) +#else +#define sd_err(x) +#define sd_trace(x) +#define sd_info(x) +#define sd_debug(x) +#define sd_data(x) +#define sd_ctrl(x) +#endif + +#define sd_log(x) + +#define SDIOH_ASSERT(exp) \ + do { if (!(exp)) \ + printf("!!!ASSERT fail: file %s lines %d", __FILE__, __LINE__); \ + } while (0) + +#define BLOCK_SIZE_F1 64 +#define BLOCK_SIZE_F2 2048 +#define BLOCK_SIZE_F3 2048 + +/* internal return code */ +#define SUCCESS 0 +#undef ERROR +#define ERROR 1 +#define ERROR_UF 2 +#define ERROR_OF 3 + +/* private bus modes */ +#define SDIOH_MODE_SPI 0 + +#define USE_BLOCKMODE 0x2 /* Block mode can be single block or multi */ +#define USE_MULTIBLOCK 0x4 + +struct sdioh_info { + uint cfg_bar; /* pci cfg address for bar */ + uint32 caps; /* cached value of capabilities reg */ +#ifndef BCMSPI_ANDROID + void *bar0; /* BAR0 for PCI Device */ +#endif /* !BCMSPI_ANDROID */ + osl_t *osh; /* osh handler */ + void *controller; /* Pointer to SPI Controller's private data struct */ + uint lockcount; /* nest count of spi_lock() calls */ + bool client_intr_enabled; /* interrupt connnected flag */ + bool intr_handler_valid; /* client driver interrupt handler valid */ + sdioh_cb_fn_t intr_handler; /* registered interrupt handler */ + void *intr_handler_arg; /* argument to call interrupt handler */ + bool initialized; /* card initialized */ + uint32 target_dev; /* Target device ID */ + uint32 intmask; /* Current active interrupts */ + void *sdos_info; /* Pointer to per-OS private data */ + uint32 controller_type; /* Host controller type */ + uint8 version; /* Host Controller Spec Compliance Version */ + uint irq; /* Client irq */ + uint32 intrcount; /* Client interrupts */ + uint32 local_intrcount; /* Controller interrupts */ + bool host_init_done; /* Controller initted */ + bool card_init_done; /* Client SDIO interface initted */ + bool polled_mode; /* polling for command completion */ + + bool sd_use_dma; /* DMA on CMD53 */ + bool sd_blockmode; /* sd_blockmode == FALSE => 64 Byte Cmd 53s. */ + /* Must be on for sd_multiblock to be effective */ + bool use_client_ints; /* If this is false, make sure to restore */ + /* polling hack in wl_linux.c:wl_timer() */ + int adapter_slot; /* Maybe dealing with multiple slots/controllers */ + int sd_mode; /* SD1/SD4/SPI */ + int client_block_size[SPI_MAX_IOFUNCS]; /* Blocksize */ + uint32 data_xfer_count; /* Current transfer */ + uint16 card_rca; /* Current Address */ + uint8 num_funcs; /* Supported funcs on client */ + uint32 card_dstatus; /* 32bit device status */ + uint32 com_cis_ptr; + uint32 func_cis_ptr[SPI_MAX_IOFUNCS]; + void *dma_buf; + ulong dma_phys; + int r_cnt; /* rx count */ + int t_cnt; /* tx_count */ + uint32 wordlen; /* host processor 16/32bits */ + uint32 prev_fun; + uint32 chip; + uint32 chiprev; + bool resp_delay_all; + bool dwordmode; + bool resp_delay_new; + + struct spierrstats_t spierrstats; +}; + +/************************************************************ + * Internal interfaces: per-port references into bcmspibrcm.c + */ + +/* Global message bits */ +extern uint sd_msglevel; + +/************************************************************** + * Internal interfaces: bcmspibrcm.c references to per-port code + */ + +/* Interrupt (de)registration routines */ +extern int spi_register_irq(sdioh_info_t *sd, uint irq); +extern void spi_free_irq(uint irq, sdioh_info_t *sd); + +/* OS-specific interrupt wrappers (atomic interrupt enable/disable) */ +extern void spi_lock(sdioh_info_t *sd); +extern void spi_unlock(sdioh_info_t *sd); + +/* Allocate/init/free per-OS private data */ +extern int spi_osinit(sdioh_info_t *sd); +extern void spi_osfree(sdioh_info_t *sd); + +#define SPI_RW_FLAG_M BITFIELD_MASK(1) /* Bit [31] - R/W Command Bit */ +#define SPI_RW_FLAG_S 31 +#define SPI_ACCESS_M BITFIELD_MASK(1) /* Bit [30] - Fixed/Incr Access */ +#define SPI_ACCESS_S 30 +#define SPI_FUNCTION_M BITFIELD_MASK(2) /* Bit [29:28] - Function Number */ +#define SPI_FUNCTION_S 28 +#define SPI_REG_ADDR_M BITFIELD_MASK(17) /* Bit [27:11] - Address */ +#define SPI_REG_ADDR_S 11 +#define SPI_LEN_M BITFIELD_MASK(11) /* Bit [10:0] - Packet length */ +#define SPI_LEN_S 0 + +#endif /* _BCM_SPI_BRCM_H */ --- a/drivers/net/wireless/bcmdhd/include/bcmutils.h +++ b/drivers/net/wireless/bcmdhd/include/bcmutils.h @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: bcmutils.h 354184 2012-08-30 08:08:08Z $ + * $Id: bcmutils.h 354837 2012-09-04 06:58:44Z $ */ #ifndef _bcmutils_h_ @@ -598,7 +598,7 @@ extern void *_bcmutils_dummy_fn; #ifndef setbit -#ifndef NBBY +#ifndef NBBY #define NBBY 8 #endif #define setbit(a, i) (((uint8 *)a)[(i) / NBBY] |= 1 << ((i) % NBBY)) @@ -659,10 +659,10 @@ extern void *_bcmutils_dummy_fn; (ea).octet[5] #if !defined(SIMPLE_MAC_PRINT) #define MACDBG "%02x:%02x:%02x:%02x:%02x:%02x" -#define STR_TO_MACD(ea) (ea)[0], (ea)[1], (ea)[2], (ea)[3], (ea)[4], (ea)[5] +#define MAC2STRDBG(ea) (ea)[0], (ea)[1], (ea)[2], (ea)[3], (ea)[4], (ea)[5] #else #define MACDBG "%02x:%02x:%02x" -#define STR_TO_MACD(ea) (ea)[0], (ea)[4], (ea)[5] +#define MAC2STRDBG(ea) (ea)[0], (ea)[4], (ea)[5] #endif --- a/drivers/net/wireless/bcmdhd/include/dhdioctl.h +++ b/drivers/net/wireless/bcmdhd/include/dhdioctl.h @@ -25,7 +25,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: dhdioctl.h 357867 2012-09-20 06:57:44Z $ + * $Id: dhdioctl.h 354894 2012-09-04 12:34:07Z $ */ #ifndef _dhdioctl_h_ --- a/drivers/net/wireless/bcmdhd/include/epivers.h +++ b/drivers/net/wireless/bcmdhd/include/epivers.h @@ -30,26 +30,26 @@ #define EPI_MINOR_VERSION 28 -#define EPI_RC_NUMBER 11 +#define EPI_RC_NUMBER 19 -#define EPI_INCREMENTAL_NUMBER 12 +#define EPI_INCREMENTAL_NUMBER 9 #define EPI_BUILD_NUMBER 0 -#define EPI_VERSION 1, 28, 11, 12 +#define EPI_VERSION 1, 28, 19, 9 -#define EPI_VERSION_NUM 0x011c0b0c +#define EPI_VERSION_NUM 0x011c1309 -#define EPI_VERSION_DEV 1.28.11 +#define EPI_VERSION_DEV 1.28.19 /* Driver Version String, ASCII, 32 chars max */ #ifdef BCMINTERNAL -#define EPI_VERSION_STR "1.28.11.12 (r BCMINT)" +#define EPI_VERSION_STR "1.28.19.9 (r BCMINT)" #else #ifdef WLTEST -#define EPI_VERSION_STR "1.28.11.12 (r WLTEST)" +#define EPI_VERSION_STR "1.28.19.9 (r WLTEST)" #else -#define EPI_VERSION_STR "1.28.11.12 (Add_Patch_1005)" +#define EPI_VERSION_STR "1.28.19.9 (RC1_0107)" #endif #endif /* BCMINTERNAL */ --- a/drivers/net/wireless/bcmdhd/include/linux_osl.h +++ b/drivers/net/wireless/bcmdhd/include/linux_osl.h @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: linux_osl.h 352246 2012-08-22 05:42:04Z $ + * $Id: linux_osl.h 354452 2012-08-31 04:59:17Z $ */ #ifndef _linux_osl_h_ @@ -165,8 +165,11 @@ extern int osl_error(int bcmerror); #include #include #include - +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 4, 29) #define OSL_SYSUPTIME() ((uint32)jiffies_to_msecs(jiffies)) +#else +#define OSL_SYSUPTIME() ((uint32)jiffies * (1000 / HZ)) +#endif #define printf(fmt, args...) printk(fmt , ## args) #include #include --- a/drivers/net/wireless/bcmdhd/include/linuxver.h +++ b/drivers/net/wireless/bcmdhd/include/linuxver.h @@ -22,7 +22,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: linuxver.h 353905 2012-08-29 07:33:08Z $ + * $Id: linuxver.h 366811 2012-11-05 13:49:17Z $ */ #ifndef _linuxver_h_ --- a/drivers/net/wireless/bcmdhd/include/proto/bcmevent.h +++ b/drivers/net/wireless/bcmdhd/include/proto/bcmevent.h @@ -23,7 +23,7 @@ * * Dependencies: proto/bcmeth.h * - * $Id: bcmevent.h 326276 2012-04-06 23:16:42Z $ + * $Id: bcmevent.h 363350 2012-10-17 08:29:23Z $ * */ @@ -188,7 +188,10 @@ typedef BWL_PRE_PACKED_STRUCT struct bcm #define WLC_E_AUTH_REQ 91 #define WLC_E_TDLS_PEER_EVENT 92 #define WLC_E_SPEEDY_RECREATE_FAIL 93 -#define WLC_E_LAST 94 +#define WLC_E_SERVICE_FOUND 102 +#define WLC_E_GAS_FRAGMENT_RX 103 +#define WLC_E_GAS_COMPLETE 104 +#define WLC_E_LAST 105 --- a/drivers/net/wireless/bcmdhd/include/proto/p2p.h +++ b/drivers/net/wireless/bcmdhd/include/proto/p2p.h @@ -21,7 +21,7 @@ * * Fundamental types and constants relating to WFA P2P (aka WiFi Direct) * - * $Id: p2p.h 357863 2012-09-20 06:40:47Z $ + * $Id: p2p.h 356417 2012-09-12 16:41:24Z $ */ #ifndef _P2P_H_ --- a/drivers/net/wireless/bcmdhd/include/proto/wpa.h +++ b/drivers/net/wireless/bcmdhd/include/proto/wpa.h @@ -34,7 +34,7 @@ #include -#include + #define DOT11_RC_INVALID_WPA_IE 13 --- a/drivers/net/wireless/bcmdhd/include/sbsdio.h +++ b/drivers/net/wireless/bcmdhd/include/sbsdio.h @@ -24,7 +24,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: sbsdio.h 308945 2012-01-18 02:15:27Z $ + * $Id: sbsdio.h 361940 2012-10-10 08:32:12Z $ */ #ifndef _SBSDIO_H @@ -120,6 +120,7 @@ #define SBSDIO_DEVCTL_RST_CORECTL 0x00 /* Determined by CoreControl bit */ #define SBSDIO_DEVCTL_RST_BPRESET 0x10 /* Force backplane reset */ #define SBSDIO_DEVCTL_RST_NOBPRESET 0x20 /* Force no backplane reset */ +#define SBSDIO_DEVCTL_EN_F2_BLK_WATERMARK 0x10 /* Enable function 2 tx for each block */ /* SBSDIO_FUNC1_CHIPCLKCSR */ --- a/drivers/net/wireless/bcmdhd/include/spid.h +++ b/drivers/net/wireless/bcmdhd/include/spid.h @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: spid.h 354172 2012-08-30 07:19:26Z $ + * $Id: spid.h 354197 2012-08-30 09:05:59Z $ */ #ifndef _SPI_H --- a/drivers/net/wireless/bcmdhd/include/wlfc_proto.h +++ b/drivers/net/wireless/bcmdhd/include/wlfc_proto.h @@ -18,7 +18,7 @@ * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. -* $Id: wlfc_proto.h 347585 2012-07-27 09:02:53Z $ +* $Id: wlfc_proto.h 361006 2012-10-05 07:45:51Z $ * */ #ifndef __wlfc_proto_definitions_h__ @@ -97,6 +97,7 @@ #define WLFC_CTL_TYPE_NIC_PRD_END 16 #define WLFC_CTL_TYPE_AF_TXS 17 #define WLFC_CTL_TYPE_TRANS_ID 18 +#define WLFC_CTL_TYPE_COMP_TXSTATUS 19 #define WLFC_CTL_TYPE_FILLER 255 --- a/drivers/net/wireless/bcmdhd/include/wlioctl.h +++ b/drivers/net/wireless/bcmdhd/include/wlioctl.h @@ -24,7 +24,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: wlioctl.h 357629 2012-09-19 12:51:08Z $ + * $Id: wlioctl.h 362236 2012-10-11 13:29:56Z $ */ #ifndef _wlioctl_h_ @@ -43,8 +43,6 @@ #include #endif /* LINUX_POSTMOGRIFY_REMOVAL */ -#include - /* LINUX_POSTMOGRIFY_REMOVAL: undefined during compile phase, so its * a no-op for most cases. For hybrid and other open source releases, * its defined during a second pass and mogrified out for distribution. @@ -881,14 +879,14 @@ typedef enum sup_auth_status { #define CRYPTO_ALGO_AES_CCM 4 #define CRYPTO_ALGO_AES_OCB_MSDU 5 #define CRYPTO_ALGO_AES_OCB_MPDU 6 -#if !defined(BCMCCX) +#if !defined(BCMCCX) && !defined(BCMEXTCCX) #define CRYPTO_ALGO_NALG 7 #else #define CRYPTO_ALGO_CKIP 7 #define CRYPTO_ALGO_CKIP_MMH 8 #define CRYPTO_ALGO_WEP_MMH 9 #define CRYPTO_ALGO_NALG 10 -#endif +#endif /* !BCMCCX && !BCMEXTCCX */ #ifdef BCMWAPI_WPI #define CRYPTO_ALGO_SMS4 11 #endif /* BCMWAPI_WPI */ @@ -903,13 +901,13 @@ typedef enum sup_auth_status { #define WL_SOFT_KEY (1 << 0) /* Indicates this key is using soft encrypt */ #define WL_PRIMARY_KEY (1 << 1) /* Indicates this key is the primary (ie tx) key */ -#if defined(BCMCCX) +#if defined(BCMCCX) || defined(BCMEXTCCX) #define WL_CKIP_KP (1 << 4) /* CMIC */ #define WL_CKIP_MMH (1 << 5) /* CKIP */ #else #define WL_KF_RES_4 (1 << 4) /* Reserved for backward compat */ #define WL_KF_RES_5 (1 << 5) /* Reserved for backward compat */ -#endif +#endif /* BCMCCX || BCMEXTCCX */ #define WL_IBSS_PEER_GROUP_KEY (1 << 6) /* Indicates a group key for a IBSS PEER */ typedef struct wl_wsec_key { @@ -1001,10 +999,10 @@ typedef struct { #define WPA_AUTH_NONE 0x0001 /* none (IBSS) */ #define WPA_AUTH_UNSPECIFIED 0x0002 /* over 802.1x */ #define WPA_AUTH_PSK 0x0004 /* Pre-shared key */ -#if defined(BCMCCX) +#if defined(BCMCCX) || defined(BCMEXTCCX) #define WPA_AUTH_CCKM 0x0008 /* CCKM */ #define WPA2_AUTH_CCKM 0x0010 /* CCKM2 */ -#endif +#endif /* BCMCCX || BCMEXTCCX */ /* #define WPA_AUTH_8021X 0x0020 */ /* 802.1x, reserved */ #define WPA2_AUTH_UNSPECIFIED 0x0040 /* over 802.1x */ #define WPA2_AUTH_PSK 0x0080 /* Pre-shared key */ @@ -1782,9 +1780,6 @@ typedef struct { /* BCM4334(Phoenex branch) value changed to 3 */ #define WL_AUTH_OPEN_SHARED 3 /* try open, then shared if open failed w/rc 13 */ #endif -#ifdef USE_WEP_AUTH_SHARED_OPEN -#define WL_AUTH_SHARED_OPEN 4 /* try shared, then open if shared failed w/rc 13 */ -#endif /* USE_WEP_AUTH_SHARED_OPEN */ #endif /* LINUX_POSTMOGRIFY_REMOVAL */ /* Bit masks for radio disabled status - returned by WL_GET_RADIO */ @@ -1982,10 +1977,6 @@ typedef struct wl_po { /* when sgi_tx==WLC_SGI_ALL, bypass rate selection, enable sgi for all mcs */ #define WLC_SGI_ALL 0x02 -#define DHD_SCAN_ACTIVE_TIME 40 /* ms : Embedded default Active setting from DHD */ -#define DHD_SCAN_UNASSOC_ACTIVE_TIME 80 /* ms : def. Unassoc Active setting from DHD */ -#define DHD_SCAN_PASSIVE_TIME 130 /* ms: Embedded default Passive setting from DHD */ - #define LISTEN_INTERVAL 10 /* interference mitigation options */ #define INTERFERE_OVRRIDE_OFF -1 /* interference override off */ --- a/drivers/net/wireless/bcmdhd/linux_osl.c +++ b/drivers/net/wireless/bcmdhd/linux_osl.c @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: linux_osl.c 350283 2012-08-12 07:47:25Z $ + * $Id: linux_osl.c 372888 2012-12-05 06:56:47Z $ */ #define LINUX_PORT @@ -35,10 +35,6 @@ #include #include -#ifdef BCMASSERT_LOG -#include -#endif - #include @@ -188,14 +184,9 @@ osl_t * osl_attach(void *pdev, uint bustype, bool pkttag) { osl_t *osh; -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) - gfp_t flags; - flags = (in_atomic()) ? GFP_ATOMIC : GFP_KERNEL; - osh = kmalloc(sizeof(osl_t), flags); -#else - osh = kmalloc(sizeof(osl_t), GFP_ATOMIC); -#endif + if (!(osh = kmalloc(sizeof(osl_t), GFP_ATOMIC))) + return osh; ASSERT(osh); @@ -288,9 +279,7 @@ osl_detach(osl_t *osh) static struct sk_buff *osl_alloc_skb(unsigned int len) { #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25) - gfp_t flags = (in_atomic()) ? GFP_ATOMIC : GFP_KERNEL; - - return __dev_alloc_skb(len, flags); + return __dev_alloc_skb(len, GFP_ATOMIC); #else return dev_alloc_skb(len); #endif @@ -370,14 +359,7 @@ osl_ctfpool_replenish(osl_t *osh, uint t int32 osl_ctfpool_init(osl_t *osh, uint numobj, uint size) { -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) - gfp_t flags; - - flags = (in_atomic()) ? GFP_ATOMIC : GFP_KERNEL; - osh->ctfpool = kmalloc(sizeof(ctfpool_t), flags); -#else osh->ctfpool = kmalloc(sizeof(ctfpool_t), GFP_ATOMIC); -#endif ASSERT(osh->ctfpool); bzero(osh->ctfpool, sizeof(ctfpool_t)); @@ -853,9 +835,6 @@ void * osl_malloc(osl_t *osh, uint size) { void *addr; -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) - gfp_t flags; -#endif if (osh) @@ -895,12 +874,7 @@ osl_malloc(osl_t *osh, uint size) original: #endif -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) - flags = (in_atomic()) ? GFP_ATOMIC : GFP_KERNEL; - if ((addr = kmalloc(size, flags)) == NULL) { -#else if ((addr = kmalloc(size, GFP_ATOMIC)) == NULL) { -#endif if (osh) osh->failed++; return (NULL); @@ -1020,14 +994,10 @@ osl_assert(const char *exp, const char * if (!basename) basename = file; -#ifdef BCMASSERT_LOG snprintf(tempbuf, 64, "\"%s\": file \"%s\", line %d\n", exp, basename, line); - bcm_assert_log(tempbuf); -#endif - - + printk("%s", tempbuf); } #endif @@ -1050,19 +1020,11 @@ osl_pktdup(osl_t *osh, void *skb) { void * p; unsigned long irqflags; -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) - gfp_t flags; -#endif PKTCTFMAP(osh, skb); -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) - flags = (in_atomic()) ? GFP_ATOMIC : GFP_KERNEL; - if ((p = skb_clone((struct sk_buff *)skb, flags)) == NULL) -#else - if ((p = skb_clone((struct sk_buff*)skb, GFP_ATOMIC)) == NULL) -#endif + if ((p = skb_clone((struct sk_buff *)skb, GFP_ATOMIC)) == NULL) return NULL; #ifdef CTFPOOL --- a/drivers/net/wireless/bcmdhd/wl_android.c +++ b/drivers/net/wireless/bcmdhd/wl_android.c @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: wl_android.c 354184 2012-08-30 08:08:08Z $ + * $Id: wl_android.c 372067 2012-11-30 08:03:06Z $ */ #include @@ -77,8 +77,10 @@ #if !defined WL_ENABLE_P2P_IF #define CMD_P2P_GET_NOA "P2P_GET_NOA" #endif +#define CMD_P2P_SD_OFFLOAD "P2P_SD_" #define CMD_P2P_SET_PS "P2P_SET_PS" #define CMD_SET_AP_WPS_P2P_IE "SET_AP_WPS_P2P_IE" +#define CMD_SETROAMMODE "SETROAMMODE" #if defined(SUPPORT_HIDDEN_AP) /* Hostapd private command */ @@ -199,6 +201,45 @@ typedef struct android_wifi_priv_cmd { int total_len; } android_wifi_priv_cmd; +#ifdef WL_GENL +static s32 wl_genl_handle_msg(struct sk_buff *skb, struct genl_info *info); +static int wl_genl_init(void); +static int wl_genl_deinit(void); + +extern struct net init_net; +/* attribute policy: defines which attribute has which type (e.g int, char * etc) + * possible values defined in net/netlink.h + */ +static struct nla_policy wl_genl_policy[BCM_GENL_ATTR_MAX + 1] = { + [BCM_GENL_ATTR_MSG] = { .type = NLA_NUL_STRING }, +}; + +#define WL_GENL_VER 1 +/* family definition */ +static struct genl_family wl_genl_family = { + .id = GENL_ID_GENERATE, /* Genetlink would generate the ID */ + .hdrsize = 0, + .name = "bcm-genl", /* Netlink I/F for Android */ + .version = WL_GENL_VER, /* Version Number */ + .maxattr = BCM_GENL_ATTR_MAX, +}; + +/* commands: mapping between the command enumeration and the actual function */ +struct genl_ops wl_genl_ops = { + .cmd = BCM_GENL_CMD_MSG, + .flags = 0, + .policy = wl_genl_policy, + .doit = wl_genl_handle_msg, + .dumpit = NULL, +}; + +static struct genl_multicast_group wl_genl_mcast = { + .id = GENL_ID_GENERATE, /* Genetlink would generate the ID */ + .name = "bcm-genl-mcast", +}; + +#endif /* WL_GENL */ + /** * Extern function declarations (TODO: move them to dhd_linux.h) */ @@ -223,9 +264,16 @@ int wl_cfg80211_get_p2p_noa(struct net_d int wl_cfg80211_set_p2p_ps(struct net_device *net, char* buf, int len) { return 0; } #endif /* WL_CFG80211 */ + +extern int dhd_os_check_wakelock(void *dhdp); extern int dhd_os_check_if_up(void *dhdp); extern void *bcmsdh_get_drvdata(void); +#if defined(PROP_TXSTATUS) && !defined(PROP_TXSTATUS_VSDB) +extern int dhd_wlfc_init(dhd_pub_t *dhd); +extern void dhd_wlfc_deinit(dhd_pub_t *dhd); +#endif + #if defined(CUSTOMER_HW4) && defined(WES_SUPPORT) /* wl_roam.c */ extern int get_roamscan_mode(struct net_device *dev, int *mode); @@ -998,7 +1046,7 @@ int wl_android_set_okc_mode(struct net_d } #endif /* WES_SUPPORT */ -#ifdef PNO_SUPPORT +#if defined(PNO_SUPPORT) && !defined(WL_SCHED_SCAN) static int wl_android_set_pno_setup(struct net_device *dev, char *command, int total_len) { wlc_ssid_t ssids_local[MAX_PFN_LIST_COUNT]; @@ -1105,7 +1153,7 @@ static int wl_android_set_pno_setup(stru exit_proc: return res; } -#endif /* PNO_SUPPORT */ +#endif /* PNO_SUPPORT && !WL_SCHED_SCAN */ static int wl_android_get_p2p_dev_addr(struct net_device *ndev, char *command, int total_len) { @@ -1239,6 +1287,9 @@ int wl_android_wifi_on(struct net_device if (dhd_dev_init_ioctl(dev) < 0) ret = -EFAULT; } +#if defined(PROP_TXSTATUS) && !defined(PROP_TXSTATUS_VSDB) + dhd_wlfc_init(bcmsdh_get_drvdata()); +#endif g_wifi_on = TRUE; } @@ -1260,6 +1311,9 @@ int wl_android_wifi_off(struct net_devic dhd_net_if_lock(dev); if (g_wifi_on) { +#if defined(PROP_TXSTATUS) && !defined(PROP_TXSTATUS_VSDB) + dhd_wlfc_deinit(bcmsdh_get_drvdata()); +#endif ret = dhd_dev_reset(dev, TRUE); sdioh_stop(NULL); dhd_customer_gpio_wlan_ctrl(WLAN_RESET_OFF); @@ -1411,7 +1465,7 @@ wl_android_sta_diassoc(struct net_device bcm_ether_atoe(straddr, &scbval.ea); DHD_INFO(("%s: deauth STA: "MACDBG "\n", __FUNCTION__, - STR_TO_MACD(scbval.ea.octet))); + MAC2STRDBG(scbval.ea.octet))); wldev_ioctl(dev, WLC_SCB_DEAUTHENTICATE_FOR_REASON, &scbval, sizeof(scb_val_t), true); @@ -1515,6 +1569,28 @@ wl_android_set_ampdu_mpdu(struct net_dev } #endif /* SUPPORT_AMPDU_MPDU_CMD */ +int wl_android_set_roam_mode(struct net_device *dev, char *command, int total_len) +{ + int error = 0; + int mode = 0; + + if (sscanf(command, "%*s %d", &mode) != 1) { + DHD_ERROR(("%s: Failed to get Parameter\n", __FUNCTION__)); + return -1; + } + + error = wldev_iovar_setint(dev, "roam_off", mode); + if (error) { + DHD_ERROR(("%s: Failed to set roaming Mode %d, error = %d\n", + __FUNCTION__, mode, error)); + return -1; + } + else + DHD_ERROR(("%s: succeeded to set roaming Mode %d, error = %d\n", + __FUNCTION__, mode, error)); + return 0; +} + int wl_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd) { #define PRIVATE_COMMAND_MAX_LEN 8192 @@ -1633,7 +1709,16 @@ int wl_android_priv_cmd(struct net_devic } else if (strnicmp(command, CMD_SETBAND, strlen(CMD_SETBAND)) == 0) { uint band = *(command + strlen(CMD_SETBAND) + 1) - '0'; +#ifdef WL_HOST_BAND_MGMT + if (wl_cfg80211_set_band(net, band) < 0) { + bytes_written = -1; + goto exit; + } + if (band == WLC_BAND_AUTO) + bytes_written = wldev_set_band(net, band); +#else bytes_written = wldev_set_band(net, band); +#endif /* WL_HOST_BAND_MGMT */ } else if (strnicmp(command, CMD_GETBAND, strlen(CMD_GETBAND)) == 0) { bytes_written = wl_android_get_band(net, command, priv_cmd.total_len); @@ -1684,7 +1769,6 @@ int wl_android_priv_cmd(struct net_devic strlen(CMD_COUNTRYREV_SET)) == 0) { bytes_written = wl_android_set_country_rev(net, command, priv_cmd.total_len); - wl_update_wiphybands(NULL); } else if (strnicmp(command, CMD_COUNTRYREV_GET, strlen(CMD_COUNTRYREV_GET)) == 0) { bytes_written = wl_android_get_country_rev(net, command, @@ -1749,7 +1833,7 @@ int wl_android_priv_cmd(struct net_devic bytes_written = wl_android_set_okc_mode(net, command, priv_cmd.total_len); } #endif /* WES_SUPPORT */ -#ifdef PNO_SUPPORT +#if defined(PNO_SUPPORT) && !defined(WL_SCHED_SCAN) else if (strnicmp(command, CMD_PNOSSIDCLR_SET, strlen(CMD_PNOSSIDCLR_SET)) == 0) { bytes_written = dhd_dev_pno_reset(net); } @@ -1760,7 +1844,7 @@ int wl_android_priv_cmd(struct net_devic uint pfn_enabled = *(command + strlen(CMD_PNOENABLE_SET) + 1) - '0'; bytes_written = dhd_dev_pno_enable(net, pfn_enabled); } -#endif +#endif /* PNO_SUPPORT && !WL_SCHED_SCAN */ else if (strnicmp(command, CMD_P2P_DEV_ADDR, strlen(CMD_P2P_DEV_ADDR)) == 0) { bytes_written = wl_android_get_p2p_dev_addr(net, command, priv_cmd.total_len); } @@ -1849,6 +1933,8 @@ int wl_android_priv_cmd(struct net_devic else if (strnicmp(command, CMD_RESTORE_RL, strlen(CMD_RESTORE_RL)) == 0) bytes_written = wl_android_ch_res_rl(net, false); #endif /* CUSTOMER_HW4 */ + else if (strnicmp(command, CMD_SETROAMMODE, strlen(CMD_SETROAMMODE)) == 0) + bytes_written = wl_android_set_roam_mode(net, command, priv_cmd.total_len); else { DHD_ERROR(("Unknown PRIVATE command %s - ignored\n", command)); snprintf(command, 3, "OK"); @@ -1897,6 +1983,11 @@ int wl_android_init(void) bcm_strncpy_s(iface_name, IFNAMSIZ, "wlan", IFNAMSIZ); } #endif /* CUSTOMER_HW2 || CUSTOMER_HW4 */ + +#ifdef WL_GENL + wl_genl_init(); +#endif + return ret; } @@ -1904,6 +1995,10 @@ int wl_android_exit(void) { int ret = 0; +#ifdef WL_GENL + wl_genl_deinit(); +#endif /* WL_GENL */ + return ret; } @@ -1915,6 +2010,145 @@ void wl_android_post_init(void) g_wifi_on = 0; } } + +#ifdef WL_GENL +/* Generic Netlink Initializaiton */ +static int wl_genl_init(void) +{ + int ret; + + WL_DBG(("GEN Netlink Init\n\n")); + + /* register new family */ + ret = genl_register_family(&wl_genl_family); + if (ret != 0) + goto failure; + + /* register functions (commands) of the new family */ + ret = genl_register_ops(&wl_genl_family, &wl_genl_ops); + if (ret != 0) { + WL_ERR(("register ops failed: %i\n", ret)); + genl_unregister_family(&wl_genl_family); + goto failure; + } + + ret = genl_register_mc_group(&wl_genl_family, &wl_genl_mcast); + if (ret != 0) { + WL_ERR(("register mc_group failed: %i\n", ret)); + genl_unregister_ops(&wl_genl_family, &wl_genl_ops); + genl_unregister_family(&wl_genl_family); + goto failure; + } + + return 0; + +failure: + WL_ERR(("Registering Netlink failed!!\n")); + return -1; +} + +/* Generic netlink deinit */ +static int wl_genl_deinit(void) +{ + if (genl_unregister_ops(&wl_genl_family, &wl_genl_ops) < 0) + WL_ERR(("Unregister wl_genl_ops failed\n")); + + if (genl_unregister_family(&wl_genl_family) < 0) + WL_ERR(("Unregister wl_genl_ops failed\n")); + + return 0; +} + +s32 +wl_genl_send_msg( + struct net_device *ndev, + int pid, + u8 *string, + u8 len, + int mcast) +{ + int ret = 0; + struct sk_buff *skb; + void *msg; + + WL_DBG(("Enter \n")); + skb = genlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL); + if (skb == NULL) { + ret = -ENOMEM; + goto out; + } + + msg = genlmsg_put(skb, 0, 0, &wl_genl_family, 0, BCM_GENL_CMD_MSG); + if (msg == NULL) { + ret = -ENOMEM; + goto out; + } + + /* Add a BCM_GENL_MSG attribute. Since it is specified as a string. + * make sure it is null terminated + */ + ret = nla_put_string(skb, BCM_GENL_ATTR_MSG, string); + if (ret != 0) { + WL_ERR(("nla_put_string failed\n")); + goto out; + } + + if (mcast) { + /* finalize the message */ + genlmsg_end(skb, msg); + /* NETLINK_CB(skb).dst_group = 1; */ + if (genlmsg_multicast(skb, 0, wl_genl_mcast.id, GFP_ATOMIC) < 0) + WL_ERR(("genlmsg_multicast failed\n")); + } else { + NETLINK_CB(skb).dst_group = 0; /* Not in multicast group */ + + /* finalize the message */ + genlmsg_end(skb, msg); + + /* send the message back */ + if (genlmsg_unicast(&init_net, skb, pid) < 0) + WL_ERR(("genlmsg_unicast failed\n")); + } + + return 0; +out: + nlmsg_free(skb); + return ret; +} + +static s32 +wl_genl_handle_msg( + struct sk_buff *skb, + struct genl_info *info) +{ + struct nlattr *na; + u8 *data = NULL; + + WL_DBG(("Enter \n")); + + if (info == NULL) { + return -EINVAL; + } + + na = info->attrs[BCM_GENL_ATTR_MSG]; + if (!na) { + WL_ERR(("nlattribute NULL\n")); + return -EINVAL; + } + + data = (char *)nla_data(na); + if (!data) { + WL_ERR(("Invalid data\n")); + return -EINVAL; + } else { + /* Handle the data */ + WL_DBG(("%s: Data received from pid (%d) \n", __func__, info->snd_pid)); + } + + return 0; +} +#endif /* WL_GENL */ + /** * Functions for Android WiFi card detection */ @@ -2109,7 +2343,6 @@ static int wifi_add_dev(void) { int ret = 0; DHD_TRACE(("## Calling platform_driver_register\n")); - ret = platform_driver_register(&wifi_device); if (ret) return ret; --- a/drivers/net/wireless/bcmdhd/wl_android.h +++ b/drivers/net/wireless/bcmdhd/wl_android.h @@ -21,13 +21,22 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: wl_android.h 307885 2012-01-12 23:30:48Z $ + * $Id: wl_android.h 363350 2012-10-17 08:29:23Z $ */ #include #include #include +/* If any feature uses the Generic Netlink Interface, put it here to enable WL_GENL + * automatically + */ + + +#ifdef WL_GENL +#include +#endif + /** * Android platform dependent functions, feel free to add Android specific functions here * (save the macros in dhd). Please do NOT declare functions that are NOT exposed to dhd @@ -55,3 +64,29 @@ int wifi_set_power(int on, unsigned long int wifi_get_mac_addr(unsigned char *buf); void *wifi_get_country_code(char *ccode); #endif /* CONFIG_WIFI_CONTROL_FUNC */ + +#ifdef WL_GENL +/* attributes (variables): the index in this enum is used as a reference for the type, + * userspace application has to indicate the corresponding type + * the policy is used for security considerations + */ +enum { + BCM_GENL_ATTR_UNSPEC, + BCM_GENL_ATTR_STRING, + BCM_GENL_ATTR_MSG, + __BCM_GENL_ATTR_MAX +}; +#define BCM_GENL_ATTR_MAX (__BCM_GENL_ATTR_MAX - 1) + +/* commands: enumeration of all commands (functions), + * used by userspace application to identify command to be ececuted + */ +enum { + BCM_GENL_CMD_UNSPEC, + BCM_GENL_CMD_MSG, + __BCM_GENL_CMD_MAX +}; +#define BCM_GENL_CMD_MAX (__BCM_GENL_CMD_MAX - 1) + +s32 wl_genl_send_msg(struct net_device *ndev, int pid, u8 *string, u8 len, int mcast); +#endif /* WL_GENL */ --- a/drivers/net/wireless/bcmdhd/wl_cfg80211.c +++ b/drivers/net/wireless/bcmdhd/wl_cfg80211.c @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: wl_cfg80211.c 358102 2012-09-21 04:45:06Z $ + * $Id: wl_cfg80211.c 375020 2012-12-17 06:10:40Z $ */ #include @@ -58,6 +58,11 @@ #include #include #include +#include + +#ifdef PROP_TXSTATUS +#include +#endif #ifdef WL11U #ifndef WL_ENABLE_P2P_IF @@ -110,7 +115,7 @@ u32 wl_dbg_level = WL_DBG_ERR; #ifdef VSDB /* sleep time to keep STA's connecting or connection for continuous af tx or finding a peer */ -#define DEFAULT_SLEEP_TIME_VSDB 200 +#define DEFAULT_SLEEP_TIME_VSDB 200 #define OFF_CHAN_TIME_THRESHOLD_MS 200 /* if sta is connected or connecting, sleep for a while before retry af tx or finding a peer */ @@ -140,6 +145,10 @@ u32 wl_dbg_level = WL_DBG_ERR; #define DNGL_FUNC(func, parameters) func parameters; #define COEX_DHCP +#define WLAN_EID_SSID 0 +#define CH_MIN_5G_CHANNEL 34 +#define CH_MIN_2G_CHANNEL 1 + /* This is to override regulatory domains defined in cfg80211 module (reg.c) * By default world regulatory domain defined in reg.c puts the flags NL80211_RRF_PASSIVE_SCAN * and NL80211_RRF_NO_IBSS for 5GHz channels (for 36..48 and 149..165). @@ -255,6 +264,12 @@ static s32 wl_cfg80211_get_key(struct wi static s32 wl_cfg80211_config_default_mgmt_key(struct wiphy *wiphy, struct net_device *dev, u8 key_idx); static s32 wl_cfg80211_resume(struct wiphy *wiphy); +#if 0 || (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0)) +static s32 wl_cfg80211_mgmt_tx_cancel_wait(struct wiphy *wiphy, + struct net_device *dev, u64 cookie); +static s32 wl_cfg80211_del_station(struct wiphy *wiphy, + struct net_device *ndev, u8* mac_addr); +#endif #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39) static s32 wl_cfg80211_suspend(struct wiphy *wiphy, struct cfg80211_wowlan *wow); #else @@ -301,6 +316,15 @@ static s32 wl_bss_roaming_done(struct wl const wl_event_msg_t *e, void *data); static s32 wl_notify_mic_status(struct wl_priv *wl, struct net_device *ndev, const wl_event_msg_t *e, void *data); +#ifdef WL_SCHED_SCAN +static s32 +wl_notify_sched_scan_results(struct wl_priv *wl, struct net_device *ndev, + const wl_event_msg_t *e, void *data); +#endif /* WL_SCHED_SCAN */ +#ifdef PNO_SUPPORT +static s32 wl_notify_pfn_status(struct wl_priv *wl, struct net_device *ndev, + const wl_event_msg_t *e, void *data); +#endif /* PNO_SUPPORT */ static s32 wl_notifier_change_state(struct wl_priv *wl, struct net_info *_net_info, enum wl_status state, bool set); /* @@ -369,10 +393,9 @@ static s32 wl_setup_wiphy(struct wireles static void wl_free_wdev(struct wl_priv *wl); static s32 wl_inform_bss(struct wl_priv *wl); -static s32 wl_inform_single_bss(struct wl_priv *wl, struct wl_bss_info *bi); -static s32 wl_update_bss_info(struct wl_priv *wl, struct net_device *ndev); +static s32 wl_inform_single_bss(struct wl_priv *wl, struct wl_bss_info *bi, u8 is_roam_done); +static s32 wl_update_bss_info(struct wl_priv *wl, struct net_device *ndev, u8 is_roam_done); static chanspec_t wl_cfg80211_get_shared_freq(struct wiphy *wiphy); - static s32 wl_add_keyext(struct wiphy *wiphy, struct net_device *dev, u8 key_idx, const u8 *mac_addr, struct key_params *params); @@ -480,11 +503,16 @@ do { \ extern int dhd_wait_pend8021x(struct net_device *dev); -#ifdef PROP_TXSTATUS +#ifdef PROP_TXSTATUS_VSDB extern int disable_proptx; extern int dhd_wlfc_init(dhd_pub_t *dhd); extern void dhd_wlfc_deinit(dhd_pub_t *dhd); -#endif /* PROP_TXSTATUS */ +#endif /* PROP_TXSTATUS_VSDB */ + +#if defined(CUSTOMER_HW4) && defined(USE_DYNAMIC_F2_BLKSIZE) +extern int +dhdsdio_func_blocksize(dhd_pub_t *dhd, int function_num, int block_size); +#endif /* CUSTOMER_HW4 && USE_DYNAMIC_F2_BLKSIZE */ #if (WL_DBG_LEVEL > 0) #define WL_DBG_ESTR_MAX 50 @@ -958,7 +986,7 @@ static chanspec_t wl_cfg80211_get_shared else { bss = (struct wl_bss_info *) (wl->extra_buf + 4); chspec = bss->chanspec; - WL_DBG(("Valid BSS Found. chanspec:%d \n", bss->chanspec)); + WL_DBG(("Valid BSS Found. chanspec:%d \n", chspec)); } return chspec; } @@ -987,26 +1015,24 @@ wl_cfg80211_add_virtual_iface(struct wip s32 wlif_type = -1; s32 mode = 0; s32 val = 0; -#if defined(WL_ENABLE_P2P_IF) s32 dhd_mode = 0; -#endif /* (WL_ENABLE_P2P_IF) */ chanspec_t chspec; struct wl_priv *wl = wiphy_priv(wiphy); struct net_device *_ndev; struct ether_addr primary_mac; int (*net_attach)(void *dhdp, int ifidx); bool rollback_lock = false; -#ifdef PROP_TXSTATUS +#ifdef PROP_TXSTATUS_VSDB s32 up = 1; dhd_pub_t *dhd; -#endif /* PROP_TXSTATUS */ +#endif /* PROP_TXSTATUS_VSDB */ if (!wl) return ERR_PTR(-EINVAL); -#ifdef PROP_TXSTATUS +#ifdef PROP_TXSTATUS_VSDB dhd = (dhd_pub_t *)(wl->pub); -#endif /* PROP_TXSTATUS */ +#endif /* PROP_TXSTATUS_VSDB */ /* Use primary I/F for sending cmds down to firmware */ @@ -1077,11 +1103,11 @@ wl_cfg80211_add_virtual_iface(struct wip return ERR_PTR(-ENOMEM); } -#ifdef PROP_TXSTATUS +#ifdef PROP_TXSTATUS_VSDB if (!dhd) return ERR_PTR(-ENODEV); -#endif /* PROP_TXSTATUS */ - if (!wl->p2p || !wl->p2p->vir_ifname) +#endif /* PROP_TXSTATUS_VSDB */ + if (!wl->p2p) return ERR_PTR(-ENODEV); if (wl->p2p && !wl->p2p->on && strstr(name, WL_P2P_INTERFACE_PREFIX)) { @@ -1097,7 +1123,7 @@ wl_cfg80211_add_virtual_iface(struct wip strncpy(wl->p2p->vir_ifname, name, IFNAMSIZ - 1); wl_notify_escan_complete(wl, _ndev, true, true); -#ifdef PROP_TXSTATUS +#ifdef PROP_TXSTATUS_VSDB if (!wl->wlfc_on && !disable_proptx) { dhd->wlfc_enabled = true; dhd_wlfc_init(dhd); @@ -1106,7 +1132,7 @@ wl_cfg80211_add_virtual_iface(struct wip WL_ERR(("WLC_UP return err:%d\n", err)); wl->wlfc_on = true; } -#endif /* PROP_TXSTATUS */ +#endif /* PROP_TXSTATUS_VSDB */ /* In concurrency case, STA may be already associated in a particular channel. * so retrieve the current channel of primary interface and then start the virtual @@ -1167,13 +1193,11 @@ wl_cfg80211_add_virtual_iface(struct wip "created net attach done\n", wl->p2p->vir_ifname)); if (mode == WL_MODE_AP) wl_set_drv_status(wl, CONNECTED, _ndev); -#if defined(WL_ENABLE_P2P_IF) if (type == NL80211_IFTYPE_P2P_CLIENT) - dhd_mode = P2P_GC_ENABLED; + dhd_mode = DHD_FLAG_P2P_GC_MODE; else if (type == NL80211_IFTYPE_P2P_GO) - dhd_mode = P2P_GO_ENABLED; + dhd_mode = DHD_FLAG_P2P_GO_MODE; DNGL_FUNC(dhd_cfg80211_set_p2p_info, (wl, dhd_mode)); -#endif /* (WL_ENABLE_P2P_IF) */ } else { /* put back the rtnl_lock again */ if (rollback_lock) @@ -1190,13 +1214,13 @@ wl_cfg80211_add_virtual_iface(struct wip WL_ERR((" virtual interface(%s) is not created \n", wl->p2p->vir_ifname)); memset(wl->p2p->vir_ifname, '\0', IFNAMSIZ); wl->p2p->vif_created = false; -#ifdef PROP_TXSTATUS +#ifdef PROP_TXSTATUS_VSDB if (dhd->wlfc_enabled && wl->wlfc_on) { dhd->wlfc_enabled = false; dhd_wlfc_deinit(dhd); wl->wlfc_on = false; } -#endif /* PROP_TXSTATUS */ +#endif /* PROP_TXSTATUS_VSDB */ } } fail: @@ -1242,9 +1266,7 @@ wl_cfg80211_del_virtual_iface(struct wip (&wl->iface_disable, msecs_to_jiffies(500)); } wl_set_p2p_status(wl, IF_DELETING); -#if defined(WL_ENABLE_P2P_IF) DNGL_FUNC(dhd_cfg80211_clean_p2p_info, (wl)); -#endif /* (WL_ENABLE_P2P_IF)) */ /* for GO */ if (wl_get_mode_by_netdev(wl, dev) == WL_MODE_AP) { @@ -1262,6 +1284,7 @@ wl_cfg80211_del_virtual_iface(struct wip msleep(300); } } + wl_cfgp2p_clear_management_ie(wl, wl_cfgp2p_find_idx(wl, dev)); /* delete interface after link down */ ret = wl_cfgp2p_ifdel(wl, &p2p_mac); /* Firmware could not delete the interface so we will not get WLC_E_IF @@ -1275,7 +1298,7 @@ wl_cfg80211_del_virtual_iface(struct wip struct net_device *ndev = wl_to_prmry_ndev(wl); WL_ERR(("Firmware returned an error (%d) from p2p_ifdel" "HANG Notification sent to %s\n", ret, ndev->name)); - wl_cfg80211_hang(ndev, WLAN_REASON_UNSPECIFIED); + net_os_send_hang_message(ndev); } /* Wait for IF_DEL operation to be finished in firmware */ timeout = wait_event_interruptible_timeout(wl->netif_change_event, @@ -1303,7 +1326,7 @@ wl_cfg80211_change_virtual_iface(struct s32 mode = 0; chanspec_t chspec; struct wl_priv *wl = wiphy_priv(wiphy); - + dhd_pub_t *dhd = (dhd_pub_t *)(wl->pub); WL_DBG(("Enter type %d\n", type)); switch (type) { case NL80211_IFTYPE_MONITOR: @@ -1330,7 +1353,8 @@ wl_cfg80211_change_virtual_iface(struct default: return -EINVAL; } - + if (!dhd) + return -EINVAL; if (ap) { wl_set_mode_by_netdev(wl, ndev, mode); if (wl->p2p_supported && wl->p2p->vif_created) { @@ -1355,6 +1379,8 @@ wl_cfg80211_change_virtual_iface(struct (wl_get_p2p_status(wl, IF_CHANGED) == true), msecs_to_jiffies(MAX_WAIT_TIME)); wl_set_mode_by_netdev(wl, ndev, mode); + dhd->op_mode &= ~DHD_FLAG_P2P_GC_MODE; + dhd->op_mode |= DHD_FLAG_P2P_GO_MODE; wl_clr_p2p_status(wl, IF_CHANGING); wl_clr_p2p_status(wl, IF_CHANGED); if (mode == WL_MODE_AP) @@ -1367,6 +1393,9 @@ wl_cfg80211_change_virtual_iface(struct WL_ERR(("struct ap_saved_ie allocation failed\n")); return -ENOMEM; } +#if defined(CUSTOMER_HW4) && defined(USE_DYNAMIC_F2_BLKSIZE) + dhdsdio_func_blocksize(dhd, 2, DYNAMIC_F2_BLKSIZE_FOR_NONLEGACY); +#endif /* CUSTOMER_HW4 && USE_DYNAMIC_F2_BLKSIZE */ } else { WL_ERR(("Cannot change the interface for GO or SOFTAP\n")); return -EINVAL; @@ -1425,9 +1454,9 @@ wl_cfg80211_ifdel_ops(struct net_device struct wl_priv *wl = wlcfg_drv_priv; bool rollback_lock = false; s32 index = 0; -#ifdef PROP_TXSTATUS +#ifdef PROP_TXSTATUS_VSDB dhd_pub_t *dhd = (dhd_pub_t *)(wl->pub); -#endif /* PROP_TXSTATUS */ +#endif /* PROP_TXSTATUS_VSDB */ if (!ndev || (strlen(ndev->name) == 0)) { WL_ERR(("net is NULL\n")); return 0; @@ -1454,18 +1483,17 @@ wl_cfg80211_ifdel_ops(struct net_device memset(wl->p2p->vir_ifname, '\0', IFNAMSIZ); index = wl_cfgp2p_find_idx(wl, ndev); wl_to_p2p_bss_ndev(wl, index) = NULL; - wl_to_p2p_bss_bssidx(wl, index) = 0; + wl_to_p2p_bss_bssidx(wl, index) = WL_INVALID; wl->p2p->vif_created = false; - wl_cfgp2p_clear_management_ie(wl, - index); + WL_DBG(("index : %d\n", index)); -#ifdef PROP_TXSTATUS +#ifdef PROP_TXSTATUS_VSDB if (dhd->wlfc_enabled && wl->wlfc_on) { dhd->wlfc_enabled = false; dhd_wlfc_deinit(dhd); wl->wlfc_on = false; } -#endif /* PROP_TXSTATUS */ +#endif /* PROP_TXSTATUS_VSDB */ wl_clr_drv_status(wl, CONNECTED, ndev); } /* Wake up any waiting thread */ @@ -1567,7 +1595,7 @@ static void wl_scan_prep(struct wl_scan_ u32 n_channels; u16 channel; chanspec_t chanspec; - s32 i = 0, offset; + s32 i = 0, j = 0, offset; char *ptr; wlc_ssid_t ssid; struct wl_priv *wl = wlcfg_drv_priv; @@ -1613,25 +1641,39 @@ static void wl_scan_prep(struct wl_scan_ (IEEE80211_CHAN_RADAR | IEEE80211_CHAN_PASSIVE_SCAN))) continue; - if (request->channels[i]->band == IEEE80211_BAND_2GHZ) + if (request->channels[i]->band == IEEE80211_BAND_2GHZ) { +#ifdef WL_HOST_BAND_MGMT + if (wl->curr_band == WLC_BAND_5G) { + WL_DBG(("In 5G only mode, omit 2G channel:%d\n", channel)); + continue; + } +#endif /* WL_HOST_BAND_MGMT */ chanspec |= WL_CHANSPEC_BAND_2G; - else + } else { +#ifdef WL_HOST_BAND_MGMT + if (wl->curr_band == WLC_BAND_2G) { + WL_DBG(("In 2G only mode, omit 5G channel:%d\n", channel)); + continue; + } +#endif /* WL_HOST_BAND_MGMT */ chanspec |= WL_CHANSPEC_BAND_5G; + } chanspec |= WL_CHANSPEC_BW_20; chanspec |= WL_CHANSPEC_CTL_SB_NONE; - params->channel_list[i] = channel; - params->channel_list[i] &= WL_CHANSPEC_CHAN_MASK; - params->channel_list[i] |= chanspec; + params->channel_list[j] = channel; + params->channel_list[j] &= WL_CHANSPEC_CHAN_MASK; + params->channel_list[j] |= chanspec; WL_SCAN(("Chan : %d, Channel spec: %x \n", - channel, params->channel_list[i])); - params->channel_list[i] = wl_chspec_host_to_driver(params->channel_list[i]); + channel, params->channel_list[j])); + params->channel_list[j] = wl_chspec_host_to_driver(params->channel_list[j]); + j++; } } else { WL_SCAN(("Scanning all channels\n")); } - n_channels = i; + n_channels = j; /* Copy ssid array if applicable */ WL_SCAN(("### List of SSIDs to scan ###\n")); if (n_ssids > 0) { @@ -1673,21 +1715,19 @@ wl_run_iscan(struct wl_iscan_ctrl *iscan struct wl_iscan_params *params = NULL; s32 err = 0; - if (request == NULL) { - err = -EINVAL; - goto done; - } - n_channels = request->n_channels; - n_ssids = request->n_ssids; - /* Allocate space for populating ssids in wl_iscan_params struct */ - if (n_channels % 2) - /* If n_channels is odd, add a padd of u16 */ - params_size += sizeof(u16) * (n_channels + 1); - else - params_size += sizeof(u16) * n_channels; + if (request != NULL) { + n_channels = request->n_channels; + n_ssids = request->n_ssids; + /* Allocate space for populating ssids in wl_iscan_params struct */ + if (n_channels % 2) + /* If n_channels is odd, add a padd of u16 */ + params_size += sizeof(u16) * (n_channels + 1); + else + params_size += sizeof(u16) * n_channels; - /* Allocate space for populating ssids in wl_iscan_params struct */ - params_size += sizeof(struct wlc_ssid) * n_ssids; + /* Allocate space for populating ssids in wl_iscan_params struct */ + params_size += sizeof(struct wlc_ssid) * n_ssids; + } params = (struct wl_iscan_params *)kzalloc(params_size, GFP_KERNEL); if (!params) { err = -ENOMEM; @@ -1731,7 +1771,7 @@ static s32 wl_do_iscan(struct wl_priv *w passive_scan = wl->active_scan ? 0 : 1; err = wldev_ioctl(ndev, WLC_SET_PASSIVE_SCAN, - &passive_scan, sizeof(passive_scan), false); + &passive_scan, sizeof(passive_scan), true); if (unlikely(err)) { WL_DBG(("error (%d)\n", err)); return err; @@ -1788,9 +1828,10 @@ wl_run_escan(struct wl_priv *wl, struct #ifdef USE_INITIAL_2G_SCAN bool is_first_init_2g_scan = false; #endif /* USE_INITIAL_2G_SCAN */ + WL_DBG(("Enter \n")); - if (!request || !wl) { + if (!wl) { err = -EINVAL; goto exit; } @@ -1798,6 +1839,9 @@ wl_run_escan(struct wl_priv *wl, struct /* LEGACY SCAN TRIGGER */ WL_SCAN((" LEGACY E-SCAN START\n")); + /* if scan request is not empty parse scan request paramters */ + if (request != NULL) { + #ifdef USE_INITIAL_2G_SCAN if (ndev == wl_to_prmry_ndev(wl) && g_first_broadcast_scan == true) { j = 0; @@ -1838,6 +1882,7 @@ wl_run_escan(struct wl_priv *wl, struct /* Allocate space for populating ssids in wl_iscan_params struct */ params_size += sizeof(struct wlc_ssid) * n_ssids; + } params = (wl_escan_params_t *) kzalloc(params_size, GFP_KERNEL); if (params == NULL) { err = -ENOMEM; @@ -1889,20 +1934,33 @@ wl_run_escan(struct wl_priv *wl, struct n_valid_chan = dtoh32(list->count); for (i = 0; i < num_chans; i++) { +#ifdef WL_HOST_BAND_MGMT + int channel_band = 0; +#endif /* WL_HOST_BAND_MGMT */ _freq = request->channels[i]->center_freq; channel = ieee80211_frequency_to_channel(_freq); - /* remove DFS channels */ - if (!(request->channels[i]->flags & +#ifdef WL_HOST_BAND_MGMT + channel_band = (channel > CH_MAX_2G_CHANNEL) ? + WLC_BAND_5G : WLC_BAND_2G; + if ((wl->curr_band != WLC_BAND_AUTO) && + (wl->curr_band != channel_band) && + !IS_P2P_SOCIAL_CHANNEL(channel)) + continue; +#endif /* WL_HOST_BAND_MGMT */ + + /* ignore DFS channels */ + if (request->channels[i]->flags & (IEEE80211_CHAN_RADAR - | IEEE80211_CHAN_PASSIVE_SCAN))) { - for (j = 0; j < n_valid_chan; j++) { - /* allows only supported channel on - * current reguatory - */ - if (channel == (dtoh32(list->element[j]))) - default_chan_list[n_nodfs++] = - channel; - } + | IEEE80211_CHAN_PASSIVE_SCAN)) + continue; + + for (j = 0; j < n_valid_chan; j++) { + /* allows only supported channel on + * current reguatory + */ + if (channel == (dtoh32(list->element[j]))) + default_chan_list[n_nodfs++] = + channel; } } @@ -1963,7 +2021,7 @@ wl_do_escan(struct wl_priv *wl, struct w wl->escan_info.escan_state = WL_ESCAN_STATE_SCANING; passive_scan = wl->active_scan ? 0 : 1; err = wldev_ioctl(ndev, WLC_SET_PASSIVE_SCAN, - &passive_scan, sizeof(passive_scan), false); + &passive_scan, sizeof(passive_scan), true); if (unlikely(err)) { WL_ERR(("error (%d)\n", err)); goto exit; @@ -2036,6 +2094,7 @@ __wl_cfg80211_scan(struct wiphy *wiphy, } #endif /* WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST */ + /* Arm scan timeout timer */ mod_timer(&wl->scan_timeout, jiffies + msecs_to_jiffies(WL_SCAN_TIMER_INTERVAL_MS)); iscan_req = false; @@ -2177,7 +2236,7 @@ __wl_cfg80211_scan(struct wiphy *wiphy, WL_SCAN(("sr->ssid.SSID_len (%d)\n", sr->ssid.SSID_len)); passive_scan = wl->active_scan ? 0 : 1; err = wldev_ioctl(ndev, WLC_SET_PASSIVE_SCAN, - &passive_scan, sizeof(passive_scan), false); + &passive_scan, sizeof(passive_scan), true); if (unlikely(err)) { WL_SCAN(("WLC_SET_PASSIVE_SCAN error (%d)\n", err)); goto scan_out; @@ -2229,7 +2288,7 @@ scan_out: if ((ret = wldev_ioctl(ndev, WLC_GET_BSSID, &bssid, ETHER_ADDR_LEN, false)) == 0) WL_ERR(("FW is connected with " MACDBG "/n", - STR_TO_MACD(bssid.octet))); + MAC2STRDBG(bssid.octet))); else WL_ERR(("GET BSSID failed with %d\n", ret)); @@ -2244,6 +2303,7 @@ scan_out: spin_lock_irqsave(&wl->cfgdrv_lock, flags); wl->scan_request = NULL; spin_unlock_irqrestore(&wl->cfgdrv_lock, flags); + return err; } @@ -2296,7 +2356,7 @@ static s32 wl_set_retry(struct net_devic u32 cmd = (l ? WLC_SET_LRL : WLC_SET_SRL); retry = htod32(retry); - err = wldev_ioctl(dev, cmd, &retry, sizeof(retry), false); + err = wldev_ioctl(dev, cmd, &retry, sizeof(retry), true); if (unlikely(err)) { WL_ERR(("cmd (%d) , error (%d)\n", cmd, err)); return err; @@ -2414,7 +2474,7 @@ wl_cfg80211_join_ibss(struct wiphy *wiph memset(&join_params.params.bssid, 0, ETHER_ADDR_LEN); err = wldev_ioctl(dev, WLC_SET_SSID, &join_params, - sizeof(join_params), false); + sizeof(join_params), true); if (unlikely(err)) { WL_ERR(("Error (%d)\n", err)); return err; @@ -2520,11 +2580,7 @@ wl_set_auth_type(struct net_device *dev, WL_DBG(("shared key\n")); break; case NL80211_AUTHTYPE_AUTOMATIC: -#ifdef USE_WEP_AUTH_SHARED_OPEN - val = WL_AUTH_SHARED_OPEN; -#else val = WL_AUTH_OPEN_SHARED; -#endif /* USE_WEP_AUTH_SHARED_OPEN */ WL_DBG(("automatic\n")); break; #ifdef BCMCCX @@ -2839,7 +2895,7 @@ wl_cfg80211_connect(struct wiphy *wiphy, wl_extjoin_params_t *ext_join_params; struct wl_join_params join_params; size_t join_params_size; -#ifdef ROAM_AP_ENV_DETECTION +#if defined(ROAM_ENABLE) && defined(ROAM_AP_ENV_DETECTION) dhd_pub_t *dhd = (dhd_pub_t *)(wl->pub); #endif /* ROAM_AP_ENV_DETECTION */ s32 err = 0; @@ -2897,7 +2953,7 @@ wl_cfg80211_connect(struct wiphy *wiphy, scbval.val = htod32(scbval.val); WL_DBG(("drv status CONNECTED is not set, but connected in FW!" MACDBG "/n", - STR_TO_MACD(bssid.octet))); + MAC2STRDBG(bssid.octet))); err = wldev_ioctl(dev, WLC_DISASSOC, &scbval, sizeof(scb_val_t), true); if (unlikely(err)) { @@ -2950,7 +3006,7 @@ wl_cfg80211_connect(struct wiphy *wiphy, return err; } } -#ifdef ROAM_AP_ENV_DETECTION +#if defined(ROAM_ENABLE) && defined(ROAM_AP_ENV_DETECTION) if (dhd->roam_env_detection && (wldev_iovar_setint(dev, "roam_env_detection", AP_ENV_DETECT_NOT_USED) == BCME_OK)) { s32 roam_trigger[2] = {WL_AUTO_ROAM_TRIGGER, WLC_BAND_ALL}; @@ -3047,12 +3103,13 @@ wl_cfg80211_connect(struct wiphy *wiphy, } ext_join_params->ssid.SSID_len = min(sizeof(ext_join_params->ssid.SSID), sme->ssid_len); memcpy(&ext_join_params->ssid.SSID, sme->ssid, ext_join_params->ssid.SSID_len); + wl_update_prof(wl, dev, NULL, &ext_join_params->ssid, WL_PROF_SSID); ext_join_params->ssid.SSID_len = htod32(ext_join_params->ssid.SSID_len); /* increate dwell time to receive probe response or detect Beacon * from target AP at a noisy air only during connect command */ - ext_join_params->scan.active_time = DHD_SCAN_ACTIVE_TIME*8; - ext_join_params->scan.passive_time = DHD_SCAN_PASSIVE_TIME*3; + ext_join_params->scan.active_time = WL_SCAN_JOIN_ACTIVE_DWELL_TIME_MS; + ext_join_params->scan.passive_time = WL_SCAN_JOIN_PASSIVE_DWELL_TIME_MS; /* Set up join scan parameters */ ext_join_params->scan.scan_type = -1; ext_join_params->scan.nprobes @@ -3635,7 +3692,7 @@ wl_cfg80211_get_station(struct wiphy *wi } if (memcmp(mac, curmacp, ETHER_ADDR_LEN)) { WL_ERR(("Wrong Mac address: "MACDBG" != "MACDBG"\n", - STR_TO_MACD(mac), STR_TO_MACD(curmacp))); + MAC2STRDBG(mac), MAC2STRDBG(curmacp))); } /* Report the current tx rate */ @@ -3686,6 +3743,23 @@ get_station_err: return err; } +/* Function to update sta power save mode for Kernel wifi stack */ +int wl_cfg80211_update_power_mode(struct net_device *dev) +{ + int pm = -1; + int err; + + err = wldev_ioctl(dev, WLC_GET_PM, &pm, sizeof(pm), false); + if (err || (pm == -1)) { + WL_ERR(("error (%d)\n", err)); + } else { + pm = (pm == PM_OFF) ? false : true; + WL_DBG(("%s: %d\n", __func__, pm)); + if (dev->ieee80211_ptr) + dev->ieee80211_ptr->ps = pm; + } + return err; +} static s32 wl_cfg80211_set_power_mgmt(struct wiphy *wiphy, struct net_device *dev, bool enabled, s32 timeout) @@ -3694,21 +3768,31 @@ wl_cfg80211_set_power_mgmt(struct wiphy s32 err = 0; struct wl_priv *wl = wiphy_priv(wiphy); struct net_info *_net_info = wl_get_netinfo_by_netdev(wl, dev); - +#if !defined(SUPPORT_PM2_ONLY) + dhd_pub_t *dhd = (dhd_pub_t *)(wl->pub); +#endif /* SUPPORT_PM2_ONLY */ CHECK_SYS_UP(wl); - if (wl->p2p_net == dev || _net_info == NULL) { + if (wl->p2p_net == dev || _net_info == NULL || wl->vsdb_mode) { return err; } + WL_DBG(("%s: Enter power save enabled %d\n", dev->name, enabled)); +#if !defined(SUPPORT_PM2_ONLY) + /* android has special hooks to change pm when kernel suspended */ + pm = enabled ? ((dhd->in_suspend) ? PM_MAX : PM_FAST) : PM_OFF; +#else pm = enabled ? PM_FAST : PM_OFF; - /* Do not enable the power save after assoc if it is p2p interface */ - if (_net_info->pm_block || wl->vsdb_mode) { - WL_DBG(("Do not enable the power save\n")); +#endif /* SUPPORT_PM2_ONLY */ + + if (_net_info->pm_block) { + /* Do not enable the power save if it is p2p interface or vsdb mode is set */ + WL_DBG(("%s:Do not enable the power save for pm_block %d or vsdb_mode %d\n", + dev->name, _net_info->pm_block, wl->vsdb_mode)); pm = PM_OFF; } pm = htod32(pm); - WL_DBG(("power save %s\n", (pm ? "enabled" : "disabled"))); + WL_DBG(("%s:power save %s\n", dev->name, (pm ? "enabled" : "disabled"))); err = wldev_ioctl(dev, WLC_SET_PM, &pm, sizeof(pm), true); if (unlikely(err)) { if (err == -ENODEV) @@ -3997,6 +4081,13 @@ wl_cfg80211_remain_on_channel(struct wip } else { ndev = dev; } + + if (!wl->p2p) { + WL_ERR(("wl->p2p is not initialized\n")); + err = BCME_ERROR; + goto exit; + } + #ifndef WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST if (wl_get_drv_status(wl, SCANNING, ndev)) { wl_notify_escan_complete(wl, ndev, true, true); @@ -4334,13 +4425,7 @@ wl_cfg80211_send_action_frame(struct wip #ifdef VSDB ulong off_chan_started_jiffies = 0; #endif - -#ifdef WL11U - if (!af_params || !action_frame || (!p2p_is_on(wl) && !wl->wl11u)) -#else - if (!af_params || !action_frame || !p2p_is_on(wl)) - return false; -#endif + dhd_pub_t *dhd = (dhd_pub_t *)(wl->pub); wl_cfgp2p_print_actframe(true, action_frame->data, action_frame->len); @@ -4384,7 +4469,7 @@ wl_cfg80211_send_action_frame(struct wip } else if (action_frame_len >= sizeof(wifi_p2psd_gas_pub_act_frame_t)) { /* service discovery process */ if (action == P2PSD_ACTION_ID_GAS_IREQ || - action == P2PSD_ACTION_ID_GAS_IREQ) { + action == P2PSD_ACTION_ID_GAS_CREQ) { /* configure service discovery query frame */ config_af_params.search_channel = true; @@ -4394,7 +4479,7 @@ wl_cfg80211_send_action_frame(struct wip af_params->dwell_time = WL_MED_DWELL_TIME; } else if (action == P2PSD_ACTION_ID_GAS_IRESP || - action == P2PSD_ACTION_ID_GAS_IRESP) { + action == P2PSD_ACTION_ID_GAS_CRESP) { /* configure service discovery response frame */ af_params->dwell_time = WL_MIN_DWELL_TIME; } else { @@ -4408,7 +4493,11 @@ wl_cfg80211_send_action_frame(struct wip /* do not configure anything. it will be sent with a default configuration */ } else { WL_DBG(("Unknown Frame: category 0x%x, action 0x%x\n", - category, action)); + category, action)); + if (dhd->op_mode & DHD_FLAG_HOSTAP_MODE) { + wl_clr_drv_status(wl, SENDING_ACT_FRM, dev); + return false; + } } /* To make sure to send successfully action frame, we have to turn off mpc */ @@ -4636,8 +4725,10 @@ wl_cfg80211_mgmt_tx(struct wiphy *wiphy, ieee80211_is_deauth(mgmt->frame_control)) { memcpy(scb_val.ea.octet, mgmt->da, ETH_ALEN); scb_val.val = mgmt->u.disassoc.reason_code; - wldev_ioctl(dev, WLC_SCB_DEAUTHENTICATE_FOR_REASON, &scb_val, + err = wldev_ioctl(dev, WLC_SCB_DEAUTHENTICATE_FOR_REASON, &scb_val, sizeof(scb_val_t), true); + if (err < 0) + WL_ERR(("WLC_SCB_DEAUTHENTICATE_FOR_REASON error %d\n", err)); WL_DBG(("Disconnect STA : %s scb_val.val %d\n", bcm_ether_ntoa((const struct ether_addr *)mgmt->da, eabuf), scb_val.val)); @@ -5509,6 +5600,53 @@ static s32 wl_cfg80211_hostapd_sec( return 0; } +#if 0 || (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0)) +static s32 +wl_cfg80211_del_station( + struct wiphy *wiphy, + struct net_device *ndev, + u8* mac_addr) +{ + struct net_device *dev; + struct wl_priv *wl = wiphy_priv(wiphy); + scb_val_t scb_val; + s8 eabuf[ETHER_ADDR_STR_LEN]; + + WL_DBG(("Entry\n")); + if (mac_addr == NULL) { + WL_DBG(("mac_addr is NULL ignore it\n")); + return 0; + } + + if (ndev == wl->p2p_net) { + dev = wl_to_prmry_ndev(wl); + } else { + dev = ndev; + } + + if (p2p_is_on(wl)) { + /* Suspend P2P discovery search-listen to prevent it from changing the + * channel. + */ + if ((wl_cfgp2p_discover_enable_search(wl, false)) < 0) { + WL_ERR(("Can not disable discovery mode\n")); + return -EFAULT; + } + } + + memcpy(scb_val.ea.octet, mac_addr, ETHER_ADDR_LEN); + scb_val.val = DOT11_RC_DEAUTH_LEAVING; + if (wldev_ioctl(dev, WLC_SCB_DEAUTHENTICATE_FOR_REASON, &scb_val, + sizeof(scb_val_t), true)) + WL_ERR(("WLC_SCB_DEAUTHENTICATE_FOR_REASON failed\n")); + WL_DBG(("Disconnect STA : %s scb_val.val %d\n", + bcm_ether_ntoa((const struct ether_addr *)mac_addr, eabuf), + scb_val.val)); + wl_delay(400); + return 0; +} +#endif + #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) static s32 wl_cfg80211_start_ap( @@ -5638,49 +5776,6 @@ wl_cfg80211_stop_ap( exit: return err; } -static s32 -wl_cfg80211_del_station( - struct wiphy *wiphy, - struct net_device *ndev, - u8* mac_addr) -{ - struct net_device *dev; - struct wl_priv *wl = wiphy_priv(wiphy); - scb_val_t scb_val; - s8 eabuf[ETHER_ADDR_STR_LEN]; - - WL_DBG(("Entry\n")); - if (mac_addr == NULL) { - WL_DBG(("mac_addr is NULL ignore it\n")); - return 0; - } - - if (ndev == wl->p2p_net) { - dev = wl_to_prmry_ndev(wl); - } else { - dev = ndev; - } - - if (p2p_is_on(wl)) { - /* Suspend P2P discovery search-listen to prevent it from changing the - * channel. - */ - if ((wl_cfgp2p_discover_enable_search(wl, false)) < 0) { - WL_ERR(("Can not disable discovery mode\n")); - return -EFAULT; - } - } - - memcpy(scb_val.ea.octet, mac_addr, ETHER_ADDR_LEN); - scb_val.val = DOT11_RC_DEAUTH_LEAVING; - wldev_ioctl(dev, WLC_SCB_DEAUTHENTICATE_FOR_REASON, &scb_val, - sizeof(scb_val_t), true); - WL_DBG(("Disconnect STA : %s scb_val.val %d\n", - bcm_ether_ntoa((const struct ether_addr *)mac_addr, eabuf), - scb_val.val)); - wl_delay(400); - return 0; -} static s32 wl_cfg80211_change_beacon( @@ -5850,6 +5945,105 @@ fail: } #endif /* LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0) */ +#ifdef WL_SCHED_SCAN +#define PNO_TIME 30 +#define PNO_REPEAT 4 +#define PNO_FREQ_EXPO_MAX 2 +int wl_cfg80211_sched_scan_start(struct wiphy *wiphy, + struct net_device *dev, + struct cfg80211_sched_scan_request *request) +{ + ushort pno_time = PNO_TIME; + int pno_repeat = PNO_REPEAT; + int pno_freq_expo_max = PNO_FREQ_EXPO_MAX; + wlc_ssid_t ssids_local[MAX_PFN_LIST_COUNT]; + struct wl_priv *wl = wiphy_priv(wiphy); + struct cfg80211_ssid *ssid = NULL; + int ssid_count = 0; + int i; + int ret = 0; + + WL_DBG(("Enter \n")); + WL_PNO((">>> SCHED SCAN START\n")); + WL_PNO(("Enter n_match_sets:%d n_ssids:%d \n", + request->n_match_sets, request->n_ssids)); + WL_PNO(("ssids:%d pno_time:%d pno_repeat:%d pno_freq:%d \n", + request->n_ssids, pno_time, pno_repeat, pno_freq_expo_max)); + + + if (!request || !request->n_ssids || !request->n_match_sets) { + WL_ERR(("Invalid sched scan req!! n_ssids:%d \n", request->n_ssids)); + return -EINVAL; + } + + memset(&ssids_local, 0, sizeof(ssids_local)); + + if (request->n_match_sets > 0) { + for (i = 0; i < request->n_match_sets; i++) { + ssid = &request->match_sets[i].ssid; + memcpy(ssids_local[i].SSID, ssid->ssid, ssid->ssid_len); + ssids_local[i].SSID_len = ssid->ssid_len; + WL_PNO((">>> PNO filter set for ssid (%s) \n", ssid->ssid)); + ssid_count++; + } + } + + if (request->n_ssids > 0) { + for (i = 0; i < request->n_ssids; i++) { + /* Active scan req for ssids */ + WL_PNO((">>> Active scan req for ssid (%s) \n", request->ssids[i].ssid)); + + /* match_set ssids is a supert set of n_ssid list, so we need + * not add these set seperately + */ + } + } + + if (ssid_count) { + if ((ret = dhd_dev_pno_set(dev, ssids_local, request->n_match_sets, + pno_time, pno_repeat, pno_freq_expo_max)) < 0) { + WL_ERR(("PNO setup failed!! ret=%d \n", ret)); + return -EINVAL; + } + + /* Enable the PNO */ + if (dhd_dev_pno_enable(dev, 1) < 0) { + WL_ERR(("PNO enable failed!! ret=%d \n", ret)); + return -EINVAL; + } + wl->sched_scan_req = request; + } else { + return -EINVAL; + } + + return 0; +} + +int wl_cfg80211_sched_scan_stop(struct wiphy *wiphy, struct net_device *dev) +{ + struct wl_priv *wl = wiphy_priv(wiphy); + + WL_DBG(("Enter \n")); + WL_PNO((">>> SCHED SCAN STOP\n")); + + if (dhd_dev_pno_enable(dev, 0) < 0) + WL_ERR(("PNO disable failed")); + + if (dhd_dev_pno_reset(dev) < 0) + WL_ERR(("PNO reset failed")); + + if (wl->scan_request && wl->sched_scan_running) { + WL_PNO((">>> Sched scan running. Aborting it..\n")); + wl_notify_escan_complete(wl, dev, true, true); + } + + wl->sched_scan_req = NULL; + wl->sched_scan_running = FALSE; + + return 0; +} +#endif /* WL_SCHED_SCAN */ + static struct cfg80211_ops wl_cfg80211_ops = { .add_virtual_intf = wl_cfg80211_add_virtual_iface, .del_virtual_intf = wl_cfg80211_del_virtual_iface, @@ -5887,8 +6081,17 @@ static struct cfg80211_ops wl_cfg80211_o .change_beacon = wl_cfg80211_change_beacon, .start_ap = wl_cfg80211_start_ap, .stop_ap = wl_cfg80211_stop_ap, - .del_station = wl_cfg80211_del_station, #endif /* LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0) */ +#ifdef WL_SCHED_SCAN + .sched_scan_start = wl_cfg80211_sched_scan_start, + .sched_scan_stop = wl_cfg80211_sched_scan_stop, +#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0) */ +#if 0 || (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0)) +#ifndef CUSTOMER_HW4 + .del_station = wl_cfg80211_del_station, +#endif /* CUSTOMER_HW4 */ + .mgmt_tx_cancel_wait = wl_cfg80211_mgmt_tx_cancel_wait, +#endif }; s32 wl_mode_to_nl80211_iftype(s32 mode) @@ -5924,6 +6127,12 @@ static s32 wl_setup_wiphy(struct wireles /* Report how many SSIDs Driver can support per Scan request */ wdev->wiphy->max_scan_ssids = WL_SCAN_PARAMS_SSID_MAX; wdev->wiphy->max_num_pmkids = WL_NUM_PMKIDS_MAX; +#ifdef WL_SCHED_SCAN + wdev->wiphy->max_sched_scan_ssids = MAX_PFN_LIST_COUNT; + wdev->wiphy->max_match_sets = MAX_PFN_LIST_COUNT; + wdev->wiphy->max_sched_scan_ie_len = WL_SCAN_IE_LEN_MAX; + wdev->wiphy->flags |= WIPHY_FLAG_SUPPORTS_SCHED_SCAN; +#endif /* WL_SCHED_SCAN */ wdev->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) #if !(defined(WLP2P) && defined(WL_ENABLE_P2P_IF)) @@ -5965,7 +6174,7 @@ static s32 wl_setup_wiphy(struct wireles wdev->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL | WIPHY_FLAG_OFFCHAN_TX; #endif -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) +#if 0 || (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0)) /* From 3.4 kernel ownards AP_SME flag can be advertised * to remove the patch from supplicant */ @@ -6020,7 +6229,7 @@ static s32 wl_inform_bss(struct wl_priv #ifdef ROAM_CHANNEL_CACHE add_roam_cache(bi); #endif - err = wl_inform_single_bss(wl, bi); + err = wl_inform_single_bss(wl, bi, 0); if (unlikely(err)) break; } @@ -6030,7 +6239,7 @@ static s32 wl_inform_bss(struct wl_priv return err; } -static s32 wl_inform_single_bss(struct wl_priv *wl, struct wl_bss_info *bi) +static s32 wl_inform_single_bss(struct wl_priv *wl, struct wl_bss_info *bi, u8 is_roam_done) { struct wiphy *wiphy = wl_to_wiphy(wl); struct ieee80211_mgmt *mgmt; @@ -6045,6 +6254,7 @@ static s32 wl_inform_single_bss(struct w u32 freq; s32 err = 0; gfp_t aflags; + u8 *ie_offset = NULL; if (unlikely(dtoh32(bi->length) > WL_BSS_INFO_MAX)) { WL_DBG(("Beacon is larger than buffer. Discarding\n")); @@ -6085,7 +6295,36 @@ static s32 wl_inform_single_bss(struct w beacon_proberesp->capab_info = cpu_to_le16(bi->capability); wl_rst_ie(wl); - wl_mrg_ie(wl, ((u8 *) bi) + bi->ie_offset, bi->ie_length); + ie_offset = ((u8 *) bi) + bi->ie_offset; + + if (is_roam_done && ((int)(*(ie_offset)) == WLAN_EID_SSID && + ((int)(*(ie_offset+1)) == 0 || (int)(*(ie_offset+2)) == 0))) { + u8 *ie_new_offset = NULL; + uint8 ie_new_length; + + WL_ERR(("WAR trace: Changing the SSID Info, from beacon %d\n", + bi->flags & WL_BSS_FLAGS_FROM_BEACON)); + + ie_new_offset = (u8 *)kzalloc(WL_BSS_INFO_MAX, GFP_KERNEL); + if (ie_new_offset) { + *(ie_new_offset) = WLAN_EID_SSID; + *(ie_new_offset+1) = bi->SSID_len; + memcpy(ie_new_offset+2, bi->SSID, bi->SSID_len); + ie_new_length = bi->ie_length - *(ie_offset+1) + bi->SSID_len; + + /* Copy the remaining IE apart from SSID IE from bi */ + memcpy(ie_new_offset+2 + bi->SSID_len, + ie_offset+2 + *(ie_offset+1), + bi->ie_length - 2 - *(ie_offset+1)); + wl_mrg_ie(wl, ie_new_offset, ie_new_length); + kfree(ie_new_offset); + } else { + wl_mrg_ie(wl, ((u8 *) bi) + bi->ie_offset, bi->ie_length); + } + } else { + wl_mrg_ie(wl, ((u8 *) bi) + bi->ie_offset, bi->ie_length); + } + wl_cp_ie(wl, beacon_proberesp->variable, WL_BSS_INFO_MAX - offsetof(struct wl_cfg80211_bss_info, frame_buf)); notif_bss_info->frame_len = offsetof(struct ieee80211_mgmt, @@ -6233,16 +6472,17 @@ wl_notify_connect_status_ap(struct wl_pr struct station_info sinfo; #endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(3, 2, 0)) && !WL_CFG80211_STA_EVENT */ + WL_DBG(("event %d status %d reason %d\n", event, ntoh32(e->status), reason)); /* if link down, bsscfg is disabled. */ if (event == WLC_E_LINK && reason == WLC_E_LINK_BSSCFG_DIS && wl_get_p2p_status(wl, IF_DELETING) && (ndev != wl_to_prmry_ndev(wl))) { + wl_add_remove_eventmsg(ndev, WLC_E_PROBREQ_MSG, false); WL_INFO(("AP mode link down !! \n")); complete(&wl->iface_disable); return 0; } #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 2, 0)) && !defined(WL_CFG80211_STA_EVENT) - body = kzalloc(len, GFP_KERNEL); WL_DBG(("Enter \n")); if (!len && (event == WLC_E_DEAUTH)) { len = 2; /* reason code field */ @@ -6355,6 +6595,9 @@ exit: } sinfo.assoc_req_ies = data; sinfo.assoc_req_ies_len = len; +#ifdef BCM4330_CHIP + cfg80211_del_sta(ndev, e->addr.octet, GFP_ATOMIC); +#endif cfg80211_new_sta(ndev, e->addr.octet, &sinfo, GFP_ATOMIC); } else if (event == WLC_E_DISASSOC_IND) { cfg80211_del_sta(ndev, e->addr.octet, GFP_ATOMIC); @@ -6414,7 +6657,7 @@ wl_notify_connect_status(struct wl_priv } else { if (!wl_get_drv_status(wl, DISCONNECTING, ndev)) { printk("wl_bss_connect_done succeeded with " MACDBG "\n", - STR_TO_MACD((u8*)(&e->addr))); + MAC2STRDBG((u8*)(&e->addr))); wl_bss_connect_done(wl, ndev, e, data, true); WL_DBG(("joined in BSS network \"%s\"\n", ((struct wlc_ssid *) @@ -6445,11 +6688,11 @@ wl_notify_connect_status(struct wl_priv printk("link down if %s may call cfg80211_disconnected. " "event : %d, reason=%d from " MACDBG "\n", ndev->name, event, ntoh32(e->reason), - STR_TO_MACD((u8*)(&e->addr))); + MAC2STRDBG((u8*)(&e->addr))); if (memcmp(curbssid, &e->addr, ETHER_ADDR_LEN) != 0) { WL_ERR(("BSSID of event is not the connected BSSID" "(ignore it) cur: " MACDBG " event: " MACDBG"\n", - STR_TO_MACD(curbssid), STR_TO_MACD((u8*)(&e->addr)))); + MAC2STRDBG(curbssid), MAC2STRDBG((u8*)(&e->addr)))); return 0; } wl_clr_drv_status(wl, CONNECTED, ndev); @@ -6645,7 +6888,7 @@ static void wl_ch_to_chanspec(int ch, st } } -static s32 wl_update_bss_info(struct wl_priv *wl, struct net_device *ndev) +static s32 wl_update_bss_info(struct wl_priv *wl, struct net_device *ndev, u8 is_roam_done) { struct cfg80211_bss *bss; struct wl_bss_info *bi; @@ -6655,6 +6898,7 @@ static s32 wl_update_bss_info(struct wl_ s32 dtim_period; size_t ie_len; u8 *ie; + u8 *ssidie; u8 *curbssid; s32 err = 0; struct wiphy *wiphy; @@ -6685,7 +6929,14 @@ static s32 wl_update_bss_info(struct wl_ err = -EIO; goto update_bss_info_out; } - err = wl_inform_single_bss(wl, bi); + + ie = ((u8 *)bi) + bi->ie_offset; + ie_len = bi->ie_length; + ssidie = (u8 *)cfg80211_find_ie(WLAN_EID_SSID, ie, ie_len); + if (ssidie && ssidie[1] == bi->SSID_len && !ssidie[2] && bi->SSID[0]) + memcpy(ssidie + 2, bi->SSID, bi->SSID_len); + + err = wl_inform_single_bss(wl, bi, is_roam_done); if (unlikely(err)) goto update_bss_info_out; @@ -6736,10 +6987,10 @@ wl_bss_roaming_done(struct wl_priv *wl, wl_get_assoc_ies(wl, ndev); wl_update_prof(wl, ndev, NULL, (void *)(e->addr.octet), WL_PROF_BSSID); curbssid = wl_read_prof(wl, ndev, WL_PROF_BSSID); - wl_update_bss_info(wl, ndev); + wl_update_bss_info(wl, ndev, 1); wl_update_pmklist(ndev, wl->pmk_list, err); printk("wl_bss_roaming_done succeeded to " MACDBG "\n", - STR_TO_MACD((u8*)(&e->addr))); + MAC2STRDBG((u8*)(&e->addr))); cfg80211_roamed(ndev, @@ -6764,19 +7015,20 @@ wl_bss_connect_done(struct wl_priv *wl, { struct wl_connect_info *conn_info = wl_to_conn(wl); struct wl_security *sec = wl_read_prof(wl, ndev, WL_PROF_SEC); -#ifdef ROAM_AP_ENV_DETECTION +#if defined(ROAM_ENABLE) && defined(ROAM_AP_ENV_DETECTION) dhd_pub_t *dhd = (dhd_pub_t *)(wl->pub); #endif /* ROAM_AP_ENV_DETECTION */ s32 err = 0; u8 *curbssid = wl_read_prof(wl, ndev, WL_PROF_BSSID); if (!sec) { WL_ERR(("sec is NULL\n")); + return -ENODEV; } WL_DBG((" enter\n")); #ifdef ESCAN_RESULT_PATCH if (wl_get_drv_status(wl, CONNECTED, ndev)) { if (memcmp(curbssid, connect_req_bssid, ETHER_ADDR_LEN) == 0) { - WL_ERR((" Connected event of connected device e=%d s=%d, ignore it\n", + WL_DBG((" Connected event of connected device e=%d s=%d, ignore it\n", ntoh32(e->event_type), ntoh32(e->status))); return err; } @@ -6803,10 +7055,10 @@ wl_bss_connect_done(struct wl_priv *wl, wl_get_assoc_ies(wl, ndev); wl_update_prof(wl, ndev, NULL, (void *)(e->addr.octet), WL_PROF_BSSID); curbssid = wl_read_prof(wl, ndev, WL_PROF_BSSID); - wl_update_bss_info(wl, ndev); + wl_update_bss_info(wl, ndev, 0); wl_update_pmklist(ndev, wl->pmk_list, err); wl_set_drv_status(wl, CONNECTED, ndev); -#ifdef ROAM_AP_ENV_DETECTION +#if defined(ROAM_ENABLE) && defined(ROAM_AP_ENV_DETECTION) if (dhd->roam_env_detection) wldev_iovar_setint(ndev, "roam_env_detection", AP_ENV_INDETERMINATE); @@ -6851,6 +7103,30 @@ wl_notify_mic_status(struct wl_priv *wl, return 0; } +#ifdef PNO_SUPPORT +static s32 +wl_notify_pfn_status(struct wl_priv *wl, struct net_device *ndev, + const wl_event_msg_t *e, void *data) +{ + WL_ERR((">>> PNO Event\n")); + +#ifndef WL_SCHED_SCAN +#ifndef CUSTOMER_HW4 + mutex_lock(&wl->usr_sync); + /* TODO: Use cfg80211_sched_scan_results(wiphy); */ + cfg80211_disconnected(ndev, 0, NULL, 0, GFP_KERNEL); + mutex_unlock(&wl->usr_sync); +#endif /* !CUSTOMER_HW4 */ +#else + /* If cfg80211 scheduled scan is supported, report the pno results via sched + * scan results + */ + wl_notify_sched_scan_results(wl, ndev, e, data); +#endif /* WL_SCHED_SCAN */ + return 0; +} +#endif /* PNO_SUPPORT */ + static s32 wl_notify_scan_status(struct wl_priv *wl, struct net_device *ndev, const wl_event_msg_t *e, void *data) @@ -7122,7 +7398,9 @@ wl_notify_rx_mgmt_frame(struct wl_priv * wldev_iovar_getbuf_bsscfg(dev, "cur_etheraddr", NULL, 0, wl->ioctl_buf, WLC_IOCTL_SMLEN, bsscfgidx, &wl->ioctl_buf_sync); - wldev_ioctl(dev, WLC_GET_BSSID, &bssid, ETHER_ADDR_LEN, false); + err = wldev_ioctl(dev, WLC_GET_BSSID, &bssid, ETHER_ADDR_LEN, false); + if (err < 0) + WL_ERR(("WLC_GET_BSSID error %d\n", err)); memcpy(da.octet, wl->ioctl_buf, ETHER_ADDR_LEN); err = wl_frame_get_mgmt(FC_ACTION, &da, &e->addr, &bssid, &mgmt_frame, &mgmt_frame_len, @@ -7144,6 +7422,7 @@ wl_notify_rx_mgmt_frame(struct wl_priv * (void) p2p_act_frm; } else if (wl_cfgp2p_is_gas_action(&mgmt_frame[DOT11_MGMT_HDR_LEN], mgmt_frame_len - DOT11_MGMT_HDR_LEN)) { + sd_act_frm = (wifi_p2psd_gas_pub_act_frame_t *) (&mgmt_frame[DOT11_MGMT_HDR_LEN]); if (sd_act_frm && wl_get_drv_status_all(wl, WAITING_NEXT_ACT_FRM)) { @@ -7275,6 +7554,122 @@ exit: return 0; } +#ifdef WL_SCHED_SCAN +/* If target scan is not reliable, set the below define to "1" to do a + * full escan + */ +#define FULL_ESCAN_ON_PFN_NET_FOUND 0 +static s32 +wl_notify_sched_scan_results(struct wl_priv *wl, struct net_device *ndev, + const wl_event_msg_t *e, void *data) +{ + wl_pfn_net_info_t *netinfo, *pnetinfo; + struct cfg80211_scan_request request; + struct wiphy *wiphy = wl_to_wiphy(wl); + int err = 0; + struct cfg80211_ssid ssid[MAX_PFN_LIST_COUNT]; + struct ieee80211_channel *channel = NULL; + int channel_req = 0; + int band = 0; + struct wl_pfn_scanresults *pfn_result = (struct wl_pfn_scanresults *)data; + + WL_DBG(("Enter\n")); + + if (e->event_type == WLC_E_PFN_NET_LOST) { + WL_PNO(("PFN NET LOST event. Do Nothing \n")); + return 0; + } + WL_PNO((">>> PFN NET FOUND event. count:%d \n", pfn_result->count)); + if (pfn_result->count > 0) { + int i; + + memset(&request, 0x00, sizeof(struct cfg80211_scan_request)); + memset(&ssid, 0x00, sizeof(ssid)); + request.wiphy = wiphy; + + pnetinfo = (wl_pfn_net_info_t *)(data + sizeof(wl_pfn_scanresults_t) + - sizeof(wl_pfn_net_info_t)); + channel = (struct ieee80211_channel *)kzalloc( + (sizeof(struct ieee80211_channel) * MAX_PFN_LIST_COUNT), + GFP_KERNEL); + if (!channel) { + WL_ERR(("No memory")); + err = -ENOMEM; + goto out_err; + } + + for (i = 0; i < pfn_result->count; i++) { + netinfo = &pnetinfo[i]; + if (!netinfo) { + WL_ERR(("Invalid netinfo ptr. index:%d", i)); + err = -EINVAL; + goto out_err; + } + WL_PNO((">>> SSID:%s Channel:%d \n", + netinfo->pfnsubnet.SSID, netinfo->pfnsubnet.channel)); + /* PFN result doesn't have all the info which are required by the supplicant + * (For e.g IEs) Do a target Escan so that sched scan results are reported + * via wl_inform_single_bss in the required format. Escan does require the + * scan request in the form of cfg80211_scan_request. For timebeing, create + * cfg80211_scan_request one out of the received PNO event. + */ + memcpy(ssid[i].ssid, netinfo->pfnsubnet.SSID, + netinfo->pfnsubnet.SSID_len); + ssid[i].ssid_len = netinfo->pfnsubnet.SSID_len; + request.n_ssids++; + + channel_req = netinfo->pfnsubnet.channel; + band = (channel_req <= CH_MAX_2G_CHANNEL) ? NL80211_BAND_2GHZ + : NL80211_BAND_5GHZ; + channel[i].center_freq = ieee80211_channel_to_frequency(channel_req, band); + channel[i].band = band; + channel[i].flags |= IEEE80211_CHAN_NO_HT40; + request.channels[i] = &channel[i]; + request.n_channels++; + } + + /* assign parsed ssid array */ + if (request.n_ssids) + request.ssids = &ssid[0]; + + if (wl_get_drv_status_all(wl, SCANNING)) { + /* Abort any on-going scan */ + wl_notify_escan_complete(wl, ndev, true, true); + } + + if (wl_get_p2p_status(wl, DISCOVERY_ON)) { + WL_PNO((">>> P2P discovery was ON. Disabling it\n")); + err = wl_cfgp2p_discover_enable_search(wl, false); + if (unlikely(err)) { + wl_clr_drv_status(wl, SCANNING, ndev); + goto out_err; + } + } + + wl_set_drv_status(wl, SCANNING, ndev); +#if FULL_ESCAN_ON_PFN_NET_FOUND + WL_PNO((">>> Doing Full ESCAN on PNO event\n")); + err = wl_do_escan(wl, wiphy, ndev, NULL); +#else + WL_PNO((">>> Doing targeted ESCAN on PNO event\n")); + err = wl_do_escan(wl, wiphy, ndev, &request); +#endif + if (err) { + wl_clr_drv_status(wl, SCANNING, ndev); + goto out_err; + } + wl->sched_scan_running = TRUE; + } + else { + WL_ERR(("FALSE PNO Event. (pfn_count == 0) \n")); + } +out_err: + if (channel) + kfree(channel); + return err; +} +#endif /* WL_SCHED_SCAN */ + static void wl_init_conf(struct wl_conf *conf) { WL_DBG(("Enter \n")); @@ -7317,7 +7712,9 @@ static void wl_init_event_handler(struct wl->evt_handler[WLC_E_P2P_DISC_LISTEN_COMPLETE] = wl_cfgp2p_listen_complete; wl->evt_handler[WLC_E_ACTION_FRAME_COMPLETE] = wl_cfgp2p_action_tx_complete; wl->evt_handler[WLC_E_ACTION_FRAME_OFF_CHAN_COMPLETE] = wl_cfgp2p_action_tx_complete; - +#ifdef PNO_SUPPORT + wl->evt_handler[WLC_E_PFN_NET_FOUND] = wl_notify_pfn_status; +#endif /* PNO_SUPPORT */ } static s32 wl_init_priv_mem(struct wl_priv *wl) @@ -7785,13 +8182,13 @@ static s32 wl_notify_escan_complete(stru ndev, wl_to_prmry_ndev(wl), wl->p2p_net)); dev = ndev; } - if (fw_abort) { + if (fw_abort && !in_atomic()) { /* Our scan params only need space for 1 channel and 0 ssids */ params = wl_cfg80211_scan_alloc_params(-1, 0, ¶ms_size); if (params == NULL) { WL_ERR(("scan params allocation failed \n")); err = -ENOMEM; - } else if (!in_atomic()) { + } else { /* Do a scan abort to stop the driver's scan engine */ err = wldev_ioctl(dev, WLC_SCAN, params, params_size, true); if (err < 0) { @@ -7818,6 +8215,17 @@ static s32 wl_notify_escan_complete(stru } #endif /* ESCAN_RESULT_PATCH */ spin_lock_irqsave(&wl->cfgdrv_lock, flags); +#ifdef WL_SCHED_SCAN + if (wl->sched_scan_req && !wl->scan_request) { + WL_PNO((">>> REPORTING SCHED SCAN RESULTS \n")); + if (aborted) + cfg80211_sched_scan_stopped(wl->sched_scan_req->wiphy); + else + cfg80211_sched_scan_results(wl->sched_scan_req->wiphy); + wl->sched_scan_running = FALSE; + wl->sched_scan_req = NULL; + } +#endif /* WL_SCHED_SCAN */ if (likely(wl->scan_request)) { cfg80211_scan_done(wl->scan_request, aborted); wl->scan_request = NULL; @@ -7860,7 +8268,8 @@ static s32 wl_escan_handler(struct wl_pr } if (!ndev || !wl->escan_on || - !wl_get_drv_status(wl, SCANNING, ndev)) { + (!wl_get_drv_status(wl, SCANNING, ndev) && + !wl->sched_scan_running)) { #if defined(DUAL_ESCAN_RESULT_BUFFER) WL_ERR(("escan is not ready ndev %p wl->escan_on %d" " drv_status 0x%x e_type %d e_states %d\n", @@ -7919,7 +8328,7 @@ static s32 wl_escan_handler(struct wl_pr s32 channel = CHSPEC_CHANNEL( wl_chspec_driver_to_host(bi->chanspec)); WL_DBG(("ACTION FRAME SCAN : Peer " MACDBG " found, channel : %d\n", - STR_TO_MACD(wl->afx_hdl->tx_dst_addr.octet), channel)); + MAC2STRDBG(wl->afx_hdl->tx_dst_addr.octet), channel)); wl_clr_p2p_status(wl, SCANNING); wl->afx_hdl->peer_chan = channel; complete(&wl->act_frm_scan); @@ -7940,6 +8349,10 @@ static s32 wl_escan_handler(struct wl_pr #else if (p2p_is_on(wl) && p2p_scan(wl)) { #endif +#ifdef WL_HOST_BAND_MGMT + s32 channel = 0; + s32 channel_band = 0; +#endif /* WL_HOST_BAND_MGMT */ /* p2p scan && allow only probe response */ if (bi->flags & WL_BSS_FLAGS_FROM_BEACON) goto exit; @@ -7949,6 +8362,20 @@ static s32 wl_escan_handler(struct wl_pr " response/beacon\n")); goto exit; } +#ifdef WL_HOST_BAND_MGMT + channel = CHSPEC_CHANNEL(wl_chspec_driver_to_host(bi->chanspec)); + channel_band = (channel > CH_MAX_2G_CHANNEL) ? + WLC_BAND_5G : WLC_BAND_2G; + + + if ((wl->curr_band == WLC_BAND_5G) && + (channel_band == WLC_BAND_2G)) { + /* Avoid sending the GO results in band conflict */ + if (wl_cfgp2p_retreive_p2pattrib(p2p_ie, + P2P_SEID_GROUP_ID) != NULL) + goto exit; + } +#endif /* WL_HOST_BAND_MGMT */ } for (i = 0; i < list->count; i++) { bss = bss ? (wl_bss_info_t *)((uintptr)bss + dtoh32(bss->length)) @@ -7969,7 +8396,7 @@ static s32 wl_escan_handler(struct wl_pr WL_DBG(("%s("MACDBG"), i=%d prev: RSSI %d" " flags 0x%x, new: RSSI %d flags 0x%x\n", - bss->SSID, STR_TO_MACD(bi->BSSID.octet), i, + bss->SSID, MAC2STRDBG(bi->BSSID.octet), i, bss->RSSI, bss->flags, bi->RSSI, bi->flags)); if ((bss->flags & WL_BSS_FLAGS_RSSI_ONCHANNEL) == @@ -7979,7 +8406,7 @@ static s32 wl_escan_handler(struct wl_pr */ WL_SCAN(("%s("MACDBG"), same onchan" ", RSSI: prev %d new %d\n", - bss->SSID, STR_TO_MACD(bi->BSSID.octet), + bss->SSID, MAC2STRDBG(bi->BSSID.octet), bss->RSSI, bi->RSSI)); bi->RSSI = MAX(bss->RSSI, bi->RSSI); } else if ((bss->flags & WL_BSS_FLAGS_RSSI_ONCHANNEL) && @@ -7989,7 +8416,7 @@ static s32 wl_escan_handler(struct wl_pr */ WL_SCAN(("%s("MACDBG"), prev onchan" ", RSSI: prev %d new %d\n", - bss->SSID, STR_TO_MACD(bi->BSSID.octet), + bss->SSID, MAC2STRDBG(bi->BSSID.octet), bss->RSSI, bi->RSSI)); bi->RSSI = bss->RSSI; bi->flags |= WL_BSS_FLAGS_RSSI_ONCHANNEL; @@ -8001,7 +8428,7 @@ static s32 wl_escan_handler(struct wl_pr " is occured(bcast:%d->probresp%d)\n", bss->ie_length, bi->ie_length)); WL_DBG(("%s("MACDBG"), replacement!(%d -> %d)\n", - bss->SSID, STR_TO_MACD(bi->BSSID.octet), + bss->SSID, MAC2STRDBG(bi->BSSID.octet), prev_len, bi_length)); if (list->buflen - prev_len + bi_length @@ -8060,7 +8487,7 @@ static s32 wl_escan_handler(struct wl_pr wl_clr_drv_status(wl, SCANNING, wl->afx_hdl->dev); if (wl->afx_hdl->peer_chan == WL_INVALID) complete(&wl->act_frm_scan); - } else if (likely(wl->scan_request)) { + } else if ((likely(wl->scan_request)) || (wl->sched_scan_running)) { WL_INFO(("ESCAN COMPLETED\n")); #if defined(DUAL_ESCAN_RESULT_BUFFER) wl->bss_list = (wl_scan_results_t *) @@ -8089,7 +8516,7 @@ static s32 wl_escan_handler(struct wl_pr wl_clr_p2p_status(wl, SCANNING); if (wl->afx_hdl->peer_chan == WL_INVALID) complete(&wl->act_frm_scan); - } else if (likely(wl->scan_request)) { + } else if ((likely(wl->scan_request)) || (wl->sched_scan_running)) { WL_INFO(("ESCAN ABORTED\n")); #if defined(DUAL_ESCAN_RESULT_BUFFER) wl->bss_list = (wl_scan_results_t *) @@ -8125,7 +8552,7 @@ static s32 wl_escan_handler(struct wl_pr wl_clr_drv_status(wl, SCANNING, wl->afx_hdl->dev); if (wl->afx_hdl->peer_chan == WL_INVALID) complete(&wl->act_frm_scan); - } else if (likely(wl->scan_request)) { + } else if ((likely(wl->scan_request)) || (wl->sched_scan_running)) { #if defined(DUAL_ESCAN_RESULT_BUFFER) wl->bss_list = (wl_scan_results_t *) wl->escan_info.escan_buf[(wl->escan_info.cur_sync_id+1)%2]; @@ -8143,147 +8570,164 @@ exit: mutex_unlock(&wl->usr_sync); return err; } +static void wl_cfg80211_concurrent_roam(struct wl_priv *wl, int enable) +{ + u32 connected_cnt = wl_get_drv_status_all(wl, CONNECTED); + struct net_info *iter, *next; + int err; + + if (!wl->roamoff_on_concurrent) + return; + if (enable && connected_cnt > 1) { + for_each_ndev(wl, iter, next) { + /* Save the current roam setting */ + if ((err = wldev_iovar_getint(iter->ndev, "roam_off", + (s32 *)&iter->roam_off)) != BCME_OK) { + WL_ERR(("%s:Failed to get current roam setting err %d\n", + iter->ndev->name, err)); + continue; + } + if ((err = wldev_iovar_setint(iter->ndev, "roam_off", 1)) != BCME_OK) { + WL_ERR((" %s:failed to set roam_off : %d\n", + iter->ndev->name, err)); + } + } + } + else if (!enable) { + for_each_ndev(wl, iter, next) { + if (iter->roam_off != WL_INVALID) { + if ((err = wldev_iovar_setint(iter->ndev, "roam_off", + iter->roam_off)) == BCME_OK) + iter->roam_off = WL_INVALID; + else { + WL_ERR((" %s:failed to set roam_off : %d\n", + iter->ndev->name, err)); + } + } + } + } + return; +} + +static void wl_cfg80211_determine_vsdb_mode(struct wl_priv *wl) +{ +#ifdef CUSTOMER_HW4 + u32 connected_cnt = wl_get_drv_status_all(wl, CONNECTED); + if (connected_cnt > 1) { + wl->vsdb_mode = true; + } else { + wl->vsdb_mode = false; + } + return; +#else + struct net_info *iter, *next; + u32 chan = 0; + u32 chanspec = 0; + u32 prev_chan = 0; + u32 connected_cnt = wl_get_drv_status_all(wl, CONNECTED); + wl->vsdb_mode = false; + + if (connected_cnt <= 1) { + return; + } + for_each_ndev(wl, iter, next) { + chanspec = 0; + chan = 0; + if (wl_get_drv_status(wl, CONNECTED, iter->ndev)) { + if (wldev_iovar_getint(iter->ndev, "chanspec", + (s32 *)&chanspec) == BCME_OK) { + chan = CHSPEC_CHANNEL(chanspec); + if (CHSPEC_IS40(chanspec)) { + if (CHSPEC_SB_UPPER(chanspec)) + chan += CH_10MHZ_APART; + else + chan -= CH_10MHZ_APART; + } + wl_update_prof(wl, iter->ndev, NULL, + &chan, WL_PROF_CHAN); + } + if (!prev_chan && chan) + prev_chan = chan; + else if (prev_chan && (prev_chan != chan)) + wl->vsdb_mode = true; + } + } + return; +#endif /* CUSTOMER_HW4 */ +} static s32 wl_notifier_change_state(struct wl_priv *wl, struct net_info *_net_info, enum wl_status state, bool set) { s32 pm = PM_FAST; s32 err = BCME_OK; u32 chan = 0; - u32 chanspec = 0; - u32 prev_chan = 0; - u32 connected_cnt = 0; struct net_info *iter, *next; struct net_device *primary_dev = wl_to_prmry_ndev(wl); - if (set) { /* set */ - switch (state) { - case WL_STATUS_CONNECTED: { - if ((connected_cnt = wl_get_drv_status_all(wl, CONNECTED)) > 1) { - pm = PM_OFF; - WL_INFO(("Do not enable the power save for VSDB mode\n")); - } else if (_net_info->pm_block) { - pm = PM_OFF; - } else { - pm = PM_FAST; - } + WL_DBG(("Enter state %d set %d _net_info->pm_restore %d iface %s\n", + state, set, _net_info->pm_restore, _net_info->ndev->name)); + + if (state != WL_STATUS_CONNECTED) + return 0; + + if (set) { + wl_cfg80211_concurrent_roam(wl, 1); + + if (wl_get_mode_by_netdev(wl, _net_info->ndev) == WL_MODE_AP) { + + if (wl_add_remove_eventmsg(primary_dev, WLC_E_P2P_PROBREQ_MSG, false)) + WL_ERR((" failed to unset WLC_E_P2P_PROPREQ_MSG\n")); + } + wl_cfg80211_determine_vsdb_mode(wl); + if (wl->vsdb_mode || _net_info->pm_block) { + pm = PM_OFF; for_each_ndev(wl, iter, next) { - if ((connected_cnt == 1) && (iter->ndev != _net_info->ndev)) + if (iter->pm_restore) continue; - chanspec = 0; - chan = 0; - if (wl_get_drv_status(wl, CONNECTED, iter->ndev)) { - if (wldev_iovar_getint(iter->ndev, "chanspec", - (s32 *)&chanspec) == BCME_OK) { - chan = CHSPEC_CHANNEL(chanspec); - if (CHSPEC_IS40(chanspec)) { - if (CHSPEC_SB_UPPER(chanspec)) - chan += CH_10MHZ_APART; - else - chan -= CH_10MHZ_APART; - } - wl_update_prof(wl, iter->ndev, NULL, - &chan, WL_PROF_CHAN); - } - if ((wl_get_mode_by_netdev(wl, iter->ndev) - == WL_MODE_BSS)) { - pm = htod32(pm); - WL_DBG(("power save %s\n", - (pm ? "enabled" : "disabled"))); - err = wldev_ioctl(iter->ndev, WLC_SET_PM, - &pm, sizeof(pm), true); - if (unlikely(err)) { - if (err == -ENODEV) - WL_DBG(("net_device" - " is not ready\n")); - else - WL_ERR(("error" - " (%d)\n", err)); - break; - } - } - if (connected_cnt > 1) { - if (!prev_chan && chan) - prev_chan = chan; - else if (prev_chan && (prev_chan != chan)) { - wl->vsdb_mode = true; - } - if (wl->roamoff_on_concurrent) { - if ((err = wldev_iovar_getint(iter->ndev, - "roam_off", (s32 *)&iter->roam_off)) - == BCME_OK) { - if ((err = - wldev_iovar_setint(iter->ndev, - "roam_off", 1)) != - BCME_OK) { - WL_ERR((" failed to set " - "roam_off : %d\n", err)); - } - } else - WL_ERR(("failed to get" - " roam_off : %d\n", err)); - } - } + /* Save the current power mode */ + err = wldev_ioctl(iter->ndev, WLC_GET_PM, &iter->pm, + sizeof(iter->pm), false); + WL_DBG(("%s:power save %s\n", iter->ndev->name, + iter->pm ? "enabled" : "disabled")); + if (!err && iter->pm) { + iter->pm_restore = true; } + } - if (wl_get_mode_by_netdev(wl, _net_info->ndev) == WL_MODE_AP) { - if (wl_add_remove_eventmsg(primary_dev, - WLC_E_P2P_PROBREQ_MSG, false)) - WL_ERR((" failed to unset" - " WLC_E_P2P_PROPREQ_MSG\n")); - } - break; - } - default: - break; - } - } else { /* clear */ - switch (state) { - case WL_STATUS_CONNECTED: { - chan = 0; - /* clear chan information when the net device is disconnected */ - wl_update_prof(wl, _net_info->ndev, NULL, &chan, WL_PROF_CHAN); - if (wl_get_drv_status_all(wl, CONNECTED) == 1) { - wl->vsdb_mode = false; - for_each_ndev(wl, iter, next) { - if (wl_get_drv_status(wl, CONNECTED, iter->ndev) && - (wl_get_mode_by_netdev(wl, iter->ndev) - == WL_MODE_BSS)) { - if (wl_get_netinfo_by_netdev(wl, - iter->ndev)->pm_block) - pm = PM_OFF; - else - pm = PM_FAST; - pm = htod32(pm); - WL_DBG(("power save %s\n", - (pm ? "enabled" : "disabled"))); - err = wldev_ioctl(iter->ndev, - WLC_SET_PM, &pm, sizeof(pm), true); - if (unlikely(err)) { - if (err == -ENODEV) - WL_DBG(("net_device" - " is not ready\n")); - else - WL_ERR(("error" - " (%d)\n", err)); - break; - } - } + for_each_ndev(wl, iter, next) { + if ((err = wldev_ioctl(iter->ndev, WLC_SET_PM, &pm, + sizeof(pm), true)) != 0) { + if (err == -ENODEV) + WL_DBG(("%s:netdev not ready\n", iter->ndev->name)); + else + WL_ERR(("%s:error (%d)\n", iter->ndev->name, err)); + iter->ndev->ieee80211_ptr->ps = false; } } - if (wl->roamoff_on_concurrent) { - for_each_ndev(wl, iter, next) { - if ((iter->roam_off != WL_INVALID) && - ((err = wldev_iovar_setint(iter->ndev, "roam_off", - iter->roam_off)) == BCME_OK)) { - iter->roam_off = WL_INVALID; - } else if (err) - WL_ERR((" failed to set roam_off : %d\n", err)); + } + } + else { /* clear */ + chan = 0; + /* clear chan information when the net device is disconnected */ + wl_update_prof(wl, _net_info->ndev, NULL, &chan, WL_PROF_CHAN); + wl_cfg80211_determine_vsdb_mode(wl); + for_each_ndev(wl, iter, next) { + if (iter->pm_restore && iter->pm) { + WL_DBG(("%s:restoring power save %s\n", + iter->ndev->name, (iter->pm ? "enabled" : "disabled"))); + err = wldev_ioctl(iter->ndev, + WLC_SET_PM, &iter->pm, sizeof(iter->pm), true); + if (unlikely(err)) { + if (err == -ENODEV) + WL_DBG(("%s:netdev not ready\n", iter->ndev->name)); + else + WL_ERR(("%s:error(%d)\n", iter->ndev->name, err)); + break; } + iter->pm_restore = 0; + iter->ndev->ieee80211_ptr->ps = true; } - break; - } - default: - break; } + wl_cfg80211_concurrent_roam(wl, 0); } return err; } @@ -8425,7 +8869,11 @@ s32 wl_cfg80211_attach_post(struct net_d return -ENODEV; } wl = wlcfg_drv_priv; - if (wl && !wl_get_drv_status(wl, READY, ndev)) { + if (unlikely(!wl)) { + WL_ERR(("wl is invaild\n")); + return -EINVAL; + } + if (!wl_get_drv_status(wl, READY, ndev)) { if (wl->wdev && wl_cfgp2p_supported(wl, ndev)) { #if !defined(WL_ENABLE_P2P_IF) @@ -8443,7 +8891,7 @@ s32 wl_cfg80211_attach_post(struct net_d wl->p2p_net->dev_addr[0] |= 0x02; WL_ERR(("%s: p2p_dev_addr="MACDBG "\n", wl->p2p_net->name, - STR_TO_MACD(wl->p2p_net->dev_addr))); + MAC2STRDBG(wl->p2p_net->dev_addr))); } else { WL_ERR(("p2p_net not yet populated." " Couldn't update the MAC Address for p2p0 \n")); @@ -8453,8 +8901,7 @@ s32 wl_cfg80211_attach_post(struct net_d wl->p2p_supported = true; } - } else - return -ENODEV; + } wl_set_drv_status(wl, READY, ndev); fail: return err; @@ -8551,8 +8998,9 @@ void wl_cfg80211_detach(void *para) wl_setup_rfkill(wl, FALSE); if (wl->p2p_supported) { - WL_ERR(("wl_cfgp2p_down() is not called yet\n")); - wl_cfgp2p_down(wl); + if (timer_pending(&wl->p2p->listen_timer)) + del_timer_sync(&wl->p2p->listen_timer); + wl_cfgp2p_deinit_priv(wl); } #if defined(WLP2P) && defined(WL_ENABLE_P2P_IF) @@ -8663,10 +9111,6 @@ wl_cfg80211_event(struct net_device *nde u32 event_type = ntoh32(e->event_type); struct wl_priv *wl = wlcfg_drv_priv; -#if defined(CUSTOMER_HW4) && defined(PNO_SUPPORT) && defined(CONFIG_HAS_WAKELOCK) - int pno_wakelock_timeout = 10; /* 10 second */ -#endif - #if (WL_DBG_LEVEL > 0) s8 *estr = (event_type <= sizeof(wl_dbg_estr) / WL_DBG_ESTR_MAX - 1) ? wl_dbg_estr[event_type] : (s8 *) "Unknown"; @@ -8674,9 +9118,6 @@ wl_cfg80211_event(struct net_device *nde #endif /* (WL_DBG_LEVEL > 0) */ if (event_type == WLC_E_PFN_NET_FOUND) { -#if defined(CUSTOMER_HW4) && defined(PNO_SUPPORT) && defined(CONFIG_HAS_WAKELOCK) - net_os_wake_lock_timeout_for_pno(ndev, pno_wakelock_timeout); -#endif WL_DBG((" PNOEVENT: PNO_NET_FOUND\n")); } else if (event_type == WLC_E_PFN_NET_LOST) { @@ -8815,7 +9256,8 @@ s32 wl_add_remove_eventmsg(struct net_de s8 eventmask[WL_EVENTING_MASK_LEN]; s32 err = 0; - + if (!ndev) + return -ENODEV; /* Setup event_msgs */ bcm_mkiovar("event_msgs", NULL, 0, iovbuf, sizeof(iovbuf)); @@ -8891,13 +9333,14 @@ static int wl_construct_reginfo(struct w else channel -= CH_10MHZ_APART; } - if (CHSPEC_IS2G(c) && channel <= CH_MAX_2G_CHANNEL) { + if (CHSPEC_IS2G(c) && (channel >= CH_MIN_2G_CHANNEL) && + (channel <= CH_MAX_2G_CHANNEL)) { band_chan_arr = __wl_2ghz_channels; array_size = ARRAYSIZE(__wl_2ghz_channels); n_cnt = &n_2g; band = IEEE80211_BAND_2GHZ; ht40_allowed = (bw_cap == WLC_N_BW_40ALL)? true : false; - } else if (CHSPEC_IS5G(c) && channel > CH_MAX_2G_CHANNEL) { + } else if (CHSPEC_IS5G(c) && channel >= CH_MIN_5G_CHANNEL) { band_chan_arr = __wl_5ghz_a_channels; array_size = ARRAYSIZE(__wl_5ghz_a_channels); n_cnt = &n_5g; @@ -8907,6 +9350,8 @@ static int wl_construct_reginfo(struct w WL_ERR(("Invalid channel Sepc. 0x%x.\n", c)); continue; } + if (!ht40_allowed && CHSPEC_IS40(c)) + continue; for (j = 0; (j < *n_cnt && (*n_cnt < array_size)); j++) { if (band_chan_arr[j].hw_value == channel) { update = true; @@ -8989,6 +9434,8 @@ s32 wl_update_wiphybands(struct wl_priv bool rollback_lock = false; s32 bw_cap = 0; s32 cur_band = -1; + struct ieee80211_supported_band *bands[IEEE80211_NUM_BANDS]={NULL,}; + if (wl == NULL) { wl = wlcfg_drv_priv; mutex_lock(&wl->usr_sync); @@ -9000,9 +9447,12 @@ s32 wl_update_wiphybands(struct wl_priv err = wldev_ioctl(dev, WLC_GET_BANDLIST, bandlist, sizeof(bandlist), false); if (unlikely(err)) { - WL_ERR(("error real bandlist (%d)\n", err)); + WL_ERR(("error read bandlist (%d)\n", err)); goto end_bands; } + + wiphy = wl_to_wiphy(wl); + err = wldev_ioctl(dev, WLC_GET_BAND, &cur_band, sizeof(s32), false); if (unlikely(err)) { @@ -9028,37 +9478,42 @@ s32 wl_update_wiphybands(struct wl_priv goto end_bands; err = 0; } - wiphy = wl_to_wiphy(wl); + nband = bandlist[0]; - wiphy->bands[IEEE80211_BAND_5GHZ] = NULL; - wiphy->bands[IEEE80211_BAND_2GHZ] = NULL; + for (i = 1; i <= nband && i < ARRAYSIZE(bandlist); i++) { index = -1; if (bandlist[i] == WLC_BAND_5G && __wl_band_5ghz_a.n_channels > 0) { - wiphy->bands[IEEE80211_BAND_5GHZ] = + bands[IEEE80211_BAND_5GHZ] = &__wl_band_5ghz_a; index = IEEE80211_BAND_5GHZ; if (bw_cap == WLC_N_BW_40ALL || bw_cap == WLC_N_BW_20IN2G_40IN5G) - wiphy->bands[index]->ht_cap.cap |= IEEE80211_HT_CAP_SGI_40; + bands[index]->ht_cap.cap |= IEEE80211_HT_CAP_SGI_40; } else if (bandlist[i] == WLC_BAND_2G && __wl_band_2ghz.n_channels > 0) { - wiphy->bands[IEEE80211_BAND_2GHZ] = + bands[IEEE80211_BAND_2GHZ] = &__wl_band_2ghz; index = IEEE80211_BAND_2GHZ; if (bw_cap == WLC_N_BW_40ALL) - wiphy->bands[index]->ht_cap.cap |= IEEE80211_HT_CAP_SGI_40; + bands[index]->ht_cap.cap |= IEEE80211_HT_CAP_SGI_40; } if ((index >= 0) && nmode) { - wiphy->bands[index]->ht_cap.cap |= + bands[index]->ht_cap.cap |= (IEEE80211_HT_CAP_SGI_20 | IEEE80211_HT_CAP_DSSSCCK40); - wiphy->bands[index]->ht_cap.ht_supported = TRUE; - wiphy->bands[index]->ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K; - wiphy->bands[index]->ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_16; + bands[index]->ht_cap.ht_supported = TRUE; + bands[index]->ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K; + bands[index]->ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_16; + /* An HT shall support all EQM rates for one spatial stream */ + bands[index]->ht_cap.mcs.rx_mask[0] = 0xff; } } + wiphy->bands[IEEE80211_BAND_2GHZ] = bands[IEEE80211_BAND_2GHZ]; + wiphy->bands[IEEE80211_BAND_5GHZ] = bands[IEEE80211_BAND_5GHZ]; + + wiphy_apply_custom_regulatory(wiphy, &brcm_regdom); end_bands: if (rollback_lock) @@ -9089,6 +9544,15 @@ static s32 __wl_cfg80211_up(struct wl_pr err = dhd_monitor_init(wl->pub); err = wl_invoke_iscan(wl); + +#ifdef WL_HOST_BAND_MGMT + /* By default the curr_band is initialized to BAND_AUTO */ + if (wl_cfg80211_set_band(ndev, WLC_BAND_AUTO) < 0) { + WL_ERR(("roam_band set failed\n")); + err = -1; + } +#endif /* WL_HOST_BAND_MGMT */ + wl_set_drv_status(wl, READY, ndev); return err; } @@ -9099,18 +9563,16 @@ static s32 __wl_cfg80211_down(struct wl_ unsigned long flags; struct net_info *iter, *next; struct net_device *ndev = wl_to_prmry_ndev(wl); -#ifdef WL_ENABLE_P2P_IF -#if !defined(CUSTOMER_HW4) struct net_device *p2p_net = wl->p2p_net; -#endif /* !defined(CUSTOMER_HW4) */ -#endif /* WL_ENABLE_P2P_IF */ WL_DBG(("In\n")); /* Check if cfg80211 interface is already down */ if (!wl_get_drv_status(wl, READY, ndev)) return err; /* it is even not ready */ + for_each_ndev(wl, iter, next) wl_set_drv_status(wl, SCAN_ABORTING, iter->ndev); + wl_term_iscan(wl); spin_lock_irqsave(&wl->cfgdrv_lock, flags); if (wl->scan_request) { @@ -9131,14 +9593,12 @@ static s32 __wl_cfg80211_down(struct wl_ } wl_to_prmry_ndev(wl)->ieee80211_ptr->iftype = NL80211_IFTYPE_STATION; -#ifdef WL_ENABLE_P2P_IF -#if !defined(CUSTOMER_HW4) - if ((p2p_net) && (p2p_net->flags & IFF_UP)) { - /* p2p0 interface is still UP. Bring it down */ - p2p_net->flags &= ~IFF_UP; +#if defined(WL_CFG80211) && defined(SUPPORT_DEEP_SLEEP) + if (!sleep_never) { + if (p2p_net) + dev_close(p2p_net); } #endif -#endif /* WL_ENABLE_P2P_IF */ DNGL_FUNC(dhd_cfg80211_down, (wl)); wl_flush_eq(wl); wl_link_down(wl); @@ -9155,7 +9615,6 @@ s32 wl_cfg80211_up(void *para) s32 err = 0; int val = 1; dhd_pub_t *dhd; - (void)para; WL_DBG(("In\n")); wl = wlcfg_drv_priv; @@ -9176,14 +9635,15 @@ s32 wl_cfg80211_up(void *para) mutex_lock(&wl->usr_sync); dhd = (dhd_pub_t *)(wl->pub); - if ((dhd->op_mode & HOSTAPD_MASK) != HOSTAPD_MASK) { - wl_cfg80211_attach_post(wl_to_prmry_ndev(wl)); + if (!(dhd->op_mode & DHD_FLAG_HOSTAP_MODE)) { + err = wl_cfg80211_attach_post(wl_to_prmry_ndev(wl)); + if (unlikely(err)) + return err; } err = __wl_cfg80211_up(wl); - if (err) + if (unlikely(err)) WL_ERR(("__wl_cfg80211_up failed\n")); mutex_unlock(&wl->usr_sync); - return err; } @@ -9237,6 +9697,7 @@ static void *wl_read_prof(struct wl_priv break; case WL_PROF_SSID: rptr = &profile->ssid; + break; case WL_PROF_CHAN: rptr = &profile->channel; break; @@ -9287,6 +9748,7 @@ wl_update_prof(struct wl_priv *wl, struc break; case WL_PROF_CHAN: profile->channel = *(u32*)data; + break; default: err = -EOPNOTSUPP; break; @@ -9624,6 +10086,20 @@ void wl_cfg80211_enable_trace(bool set, else wl_dbg_level |= (WL_DBG_LEVEL & level); } +#if 0 || (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0)) +static s32 +wl_cfg80211_mgmt_tx_cancel_wait(struct wiphy *wiphy, + struct net_device *dev, u64 cookie) +{ + /* CFG80211 checks for tx_cancel_wait callback when ATTR_DURATION + * is passed with CMD_FRAME. This callback is supposed to cancel + * the OFFCHANNEL Wait. Since we are already taking care of that + * with the tx_mgmt logic, do nothing here. + */ + + return 0; +} +#endif /* WL_SUPPORT_BACKPORTED_PATCHES || KERNEL >= 3.2.0 */ #ifdef WL11U bcm_tlv_t * @@ -9717,3 +10193,29 @@ wl_cfg80211_add_iw_ie(struct wl_priv *wl return err; } #endif /* WL11U */ + +#ifdef WL_HOST_BAND_MGMT +s32 +wl_cfg80211_set_band(struct net_device *ndev, int band) +{ + struct wl_priv *wl = wlcfg_drv_priv; + int ret = 0; + char ioctl_buf[50]; + + if ((band < WLC_BAND_AUTO) || (band > WLC_BAND_2G)) { + WL_ERR(("Invalid band\n")); + return -EINVAL; + } + + if ((ret = wldev_iovar_setbuf(ndev, "roam_band", &band, + sizeof(int), ioctl_buf, sizeof(ioctl_buf), NULL)) < 0) { + WL_ERR(("seting roam_band failed code=%d\n", ret)); + return ret; + } + + WL_DBG(("Setting band to %d\n", band)); + wl->curr_band = band; + + return 0; +} +#endif /* WL_HOST_BAND_MGMT */ --- a/drivers/net/wireless/bcmdhd/wl_cfg80211.h +++ b/drivers/net/wireless/bcmdhd/wl_cfg80211.h @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: wl_cfg80211.h 357867 2012-09-20 06:57:44Z $ + * $Id: wl_cfg80211.h 366811 2012-11-05 13:49:17Z $ */ #ifndef _wl_cfg80211_h_ @@ -62,6 +62,12 @@ struct wl_ibss; /* 0 invalidates all debug messages. default is 1 */ #define WL_DBG_LEVEL 0xFF +#ifdef CUSTOMER_HW4 +#define CFG80211_ERROR_TEXT "CFG80211-INFO2) " +#else +#define CFG80211_ERROR_TEXT "CFG80211-ERROR) " +#endif + #if defined(DHD_DEBUG) #define WL_ERR(args) \ do { \ @@ -76,7 +82,7 @@ do { \ if ((wl_dbg_level & WL_DBG_ERR) && net_ratelimit()) { \ printk(KERN_INFO "CFG80211-INFO2) %s : ", __func__); \ printk args; \ - } \ + } \ } while (0) #endif /* defined(DHD_DEBUG) */ @@ -119,7 +125,7 @@ do { \ if (wl_dbg_level & WL_DBG_ERR) { \ printk(KERN_INFO "CFG80211-TRACE) %s : ", __func__); \ printk args; \ - } \ + } \ } while (0) #else #define WL_TRACE_HW4 WL_TRACE @@ -135,6 +141,7 @@ do { \ #else /* !(WL_DBG_LEVEL > 0) */ #define WL_DBG(args) #endif /* (WL_DBG_LEVEL > 0) */ +#define WL_PNO(x) #define WL_SCAN_RETRY_MAX 3 @@ -156,9 +163,11 @@ do { \ #define WL_MIN_DWELL_TIME 100 #define WL_LONG_DWELL_TIME 1000 #define IFACE_MAX_CNT 2 -#define WL_SCAN_CONNECT_DWELL_TIME_MS 200 -#define WL_SCAN_JOIN_PROBE_INTERVAL_MS 20 -#define WL_AF_TX_MAX_RETRY 5 +#define WL_SCAN_CONNECT_DWELL_TIME_MS 200 +#define WL_SCAN_JOIN_PROBE_INTERVAL_MS 20 +#define WL_SCAN_JOIN_ACTIVE_DWELL_TIME_MS 320 +#define WL_SCAN_JOIN_PASSIVE_DWELL_TIME_MS 400 +#define WL_AF_TX_MAX_RETRY 5 #define WL_SCAN_TIMER_INTERVAL_MS 8000 /* Scan timeout */ #define WL_CHANNEL_SYNC_RETRY 5 @@ -340,7 +349,9 @@ struct net_info { s32 mode; s32 roam_off; unsigned long sme_state; + bool pm_restore; bool pm_block; + s32 pm; struct list_head list; /* list of all net_info structure */ }; typedef s32(*ISCAN_HANDLER) (struct wl_priv *wl); @@ -475,6 +486,7 @@ struct parsed_ies { u32 wpa2_ie_len; }; + #ifdef WL11U /* Max length of Interworking element */ #define IW_IES_MAX_BUF_LEN 9 @@ -577,6 +589,13 @@ struct wl_priv { u8 iw_ie[IW_IES_MAX_BUF_LEN]; u32 iw_ie_len; #endif /* WL11U */ + bool sched_scan_running; /* scheduled scan req status */ +#ifdef WL_SCHED_SCAN + struct cfg80211_sched_scan_request *sched_scan_req; /* scheduled scan req */ +#endif /* WL_SCHED_SCAN */ +#ifdef WL_HOST_BAND_MGMT + u8 curr_band; +#endif /* WL_HOST_BAND_MGMT */ }; @@ -600,6 +619,8 @@ wl_alloc_netinfo(struct wl_priv *wl, str _net_info->mode = mode; _net_info->ndev = ndev; _net_info->wdev = wdev; + _net_info->pm_restore = 0; + _net_info->pm = 0; _net_info->pm_block = pm_block; _net_info->roam_off = WL_INVALID; wl->iface_cnt++; @@ -839,4 +860,6 @@ extern s32 wl_cfg80211_if_is_group_owner extern chanspec_t wl_ch_host_to_driver(u16 channel); extern s32 wl_add_remove_eventmsg(struct net_device *ndev, u16 event, bool add); extern void wl_stop_wait_next_action_frame(struct wl_priv *wl, struct net_device *ndev); +extern s32 wl_cfg80211_set_band(struct net_device *ndev, int band); +extern int wl_cfg80211_update_power_mode(struct net_device *dev); #endif /* _wl_cfg80211_h_ */ --- a/drivers/net/wireless/bcmdhd/wl_cfgp2p.c +++ b/drivers/net/wireless/bcmdhd/wl_cfgp2p.c @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: wl_cfgp2p.c 357864 2012-09-20 06:41:42Z $ + * $Id: wl_cfgp2p.c 371797 2012-11-29 11:19:45Z $ * */ #include @@ -409,7 +409,7 @@ wl_cfgp2p_ifadd(struct wl_priv *wl, stru memcpy(ifreq.addr.octet, mac->octet, sizeof(ifreq.addr.octet)); CFGP2P_DBG(("---wl p2p_ifadd "MACDBG" %s %u\n", - STR_TO_MACD(ifreq.addr.octet), + MAC2STRDBG(ifreq.addr.octet), (if_type == WL_P2P_IF_GO) ? "go" : "client", (chspec & WL_CHANSPEC_CHAN_MASK) >> WL_CHANSPEC_CHAN_SHIFT)); @@ -438,7 +438,7 @@ wl_cfgp2p_ifdisable(struct wl_priv *wl, struct net_device *netdev = wl_to_prmry_ndev(wl); CFGP2P_INFO(("------primary idx %d : wl p2p_ifdis "MACDBG"\n", - netdev->ifindex, STR_TO_MACD(mac->octet))); + netdev->ifindex, MAC2STRDBG(mac->octet))); ret = wldev_iovar_setbuf(netdev, "p2p_ifdis", mac, sizeof(*mac), wl->ioctl_buf, WLC_IOCTL_MAXLEN, &wl->ioctl_buf_sync); if (unlikely(ret < 0)) { @@ -459,7 +459,7 @@ wl_cfgp2p_ifdel(struct wl_priv *wl, stru struct net_device *netdev = wl_to_prmry_ndev(wl); CFGP2P_INFO(("------primary idx %d : wl p2p_ifdel "MACDBG"\n", - netdev->ifindex, STR_TO_MACD(mac->octet))); + netdev->ifindex, MAC2STRDBG(mac->octet))); ret = wldev_iovar_setbuf(netdev, "p2p_ifdel", mac, sizeof(*mac), wl->ioctl_buf, WLC_IOCTL_MAXLEN, &wl->ioctl_buf_sync); if (unlikely(ret < 0)) { @@ -488,7 +488,7 @@ wl_cfgp2p_ifchange(struct wl_priv *wl, s memcpy(ifreq.addr.octet, mac->octet, sizeof(ifreq.addr.octet)); CFGP2P_INFO(("---wl p2p_ifchange "MACDBG" %s %u" - " chanspec 0x%04x\n", STR_TO_MACD(ifreq.addr.octet), + " chanspec 0x%04x\n", MAC2STRDBG(ifreq.addr.octet), (if_type == WL_P2P_IF_GO) ? "go" : "client", (chspec & WL_CHANSPEC_CHAN_MASK) >> WL_CHANSPEC_CHAN_SHIFT, ifreq.chspec)); @@ -520,7 +520,7 @@ wl_cfgp2p_ifidx(struct wl_priv *wl, stru u8 getbuf[64]; struct net_device *dev = wl_to_prmry_ndev(wl); - CFGP2P_INFO(("---wl p2p_if "MACDBG"\n", STR_TO_MACD(mac->octet))); + CFGP2P_INFO(("---wl p2p_if "MACDBG"\n", MAC2STRDBG(mac->octet))); ret = wldev_iovar_getbuf_bsscfg(dev, "p2p_if", mac, sizeof(*mac), getbuf, sizeof(getbuf), wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_PRIMARY), NULL); @@ -677,7 +677,7 @@ wl_cfgp2p_deinit_discovery(struct wl_pri /* Clear the saved bsscfg index of the discovery BSSCFG to indicate we * have no discovery BSS. */ - wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_DEVICE) = 0; + wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_DEVICE) = WL_INVALID; wl_to_p2p_bss_ndev(wl, P2PAPI_BSSCFG_DEVICE) = NULL; return ret; @@ -1262,16 +1262,26 @@ exit: s32 wl_cfgp2p_clear_management_ie(struct wl_priv *wl, s32 bssidx) { + + s32 vndrie_flag[] = {VNDR_IE_BEACON_FLAG, VNDR_IE_PRBRSP_FLAG, VNDR_IE_ASSOCRSP_FLAG, + VNDR_IE_PRBREQ_FLAG, VNDR_IE_ASSOCREQ_FLAG}; + s32 index = -1; + struct net_device *ndev = wl_cfgp2p_find_ndev(wl, bssidx); #define INIT_IE(IE_TYPE, BSS_TYPE) \ do { \ memset(wl_to_p2p_bss_saved_ie(wl, BSS_TYPE).p2p_ ## IE_TYPE ## _ie, 0, \ sizeof(wl_to_p2p_bss_saved_ie(wl, BSS_TYPE).p2p_ ## IE_TYPE ## _ie)); \ wl_to_p2p_bss_saved_ie(wl, BSS_TYPE).p2p_ ## IE_TYPE ## _ie_len = 0; \ } while (0); - if (bssidx < 0) { - CFGP2P_ERR(("invalid bssidx\n")); + + if (bssidx < 0 || ndev == NULL) { + CFGP2P_ERR(("invalid %s\n", (bssidx < 0) ? "bssidx" : "ndev")); return BCME_BADARG; } + for (index = 0; index < ARRAYSIZE(vndrie_flag); index++) { + /* clean up vndr ies in dongle */ + wl_cfgp2p_set_management_ie(wl, ndev, bssidx, vndrie_flag[index], NULL, 0); + } INIT_IE(probe_req, bssidx); INIT_IE(probe_res, bssidx); INIT_IE(assoc_req, bssidx); @@ -1441,6 +1451,27 @@ wl_cfgp2p_find_idx(struct wl_priv *wl, s exit: return index; } +struct net_device * +wl_cfgp2p_find_ndev(struct wl_priv *wl, s32 bssidx) +{ + u32 i; + struct net_device *ndev = NULL; + if (bssidx < 0) { + CFGP2P_ERR((" bsscfg idx is invalid\n")); + goto exit; + } + + for (i = 0; i < P2PAPI_BSSCFG_MAX; i++) { + if (bssidx == wl_to_p2p_bss_bssidx(wl, i)) { + ndev = wl_to_p2p_bss_ndev(wl, i); + break; + } + } + +exit: + return ndev; +} + /* * Callback function for WLC_E_P2P_DISC_LISTEN_COMPLETE */ @@ -1893,10 +1924,14 @@ wl_cfgp2p_supported(struct wl_priv *wl, s32 wl_cfgp2p_down(struct wl_priv *wl) { - + s32 i = 0, index = -1; wl_cfgp2p_cancel_listen(wl, wl->p2p_net ? wl->p2p_net : wl_to_prmry_ndev(wl), TRUE); - + for (i = 0; i < P2PAPI_BSSCFG_MAX; i++) { + index = wl_to_p2p_bss_bssidx(wl, i); + if (index != WL_INVALID) + wl_cfgp2p_clear_management_ie(wl, index); + } wl_cfgp2p_deinit_priv(wl); return 0; } @@ -2042,10 +2077,17 @@ wl_cfgp2p_set_p2p_ps(struct wl_priv *wl, } if ((legacy_ps != -1) && ((legacy_ps == PM_MAX) || (legacy_ps == PM_OFF))) { +#if !defined(SUPPORT_PM2_ONLY) + if (legacy_ps == PM_MAX) + legacy_ps = PM_FAST; +#endif /* SUPPORT_PM2_ONLY */ + ret = wldev_ioctl(wl_to_p2p_bss_ndev(wl, P2PAPI_BSSCFG_CONNECTION), WLC_SET_PM, &legacy_ps, sizeof(legacy_ps), true); if (unlikely(ret)) { CFGP2P_ERR(("error (%d)\n", ret)); + } else { + wl_cfg80211_update_power_mode(ndev); } } else @@ -2166,13 +2208,25 @@ wl_cfgp2p_register_ndev(struct wl_priv * { int ret = 0; struct net_device* net = NULL; - struct wireless_dev *wdev; + struct wireless_dev *wdev = NULL; uint8 temp_addr[ETHER_ADDR_LEN] = { 0x00, 0x90, 0x4c, 0x33, 0x22, 0x11 }; + if (wl->p2p_net) { + CFGP2P_ERR(("p2p_net defined already.\n")); + return -EINVAL; + } + /* Allocate etherdev, including space for private structure */ if (!(net = alloc_etherdev(sizeof(struct wl_priv *)))) { CFGP2P_ERR(("%s: OOM - alloc_etherdev\n", __FUNCTION__)); - goto fail; + return -ENODEV; + } + + wdev = kzalloc(sizeof(*wdev), GFP_KERNEL); + if (unlikely(!wdev)) { + WL_ERR(("Could not allocate wireless device\n")); + free_netdev(net); + return -ENOMEM; } strncpy(net->name, "p2p%d", sizeof(net->name) - 1); @@ -2195,12 +2249,6 @@ wl_cfgp2p_register_ndev(struct wl_priv * /* Register with a dummy MAC addr */ memcpy(net->dev_addr, temp_addr, ETHER_ADDR_LEN); - wdev = kzalloc(sizeof(*wdev), GFP_KERNEL); - if (unlikely(!wdev)) { - WL_ERR(("Could not allocate wireless device\n")); - return -ENOMEM; - } - wdev->wiphy = wl->wdev->wiphy; wdev->iftype = wl_mode_to_nl80211_iftype(WL_MODE_BSS); @@ -2216,40 +2264,23 @@ wl_cfgp2p_register_ndev(struct wl_priv * /* Associate p2p0 network interface with new wdev */ wdev->netdev = net; + ret = register_netdev(net); + if (ret) { + CFGP2P_ERR((" register_netdevice failed (%d)\n", ret)); + free_netdev(net); + kfree(wdev); + return -ENODEV; + } + /* store p2p net ptr for further reference. Note that iflist won't have this * entry as there corresponding firmware interface is a "Hidden" interface. */ - if (wl->p2p_net) { - CFGP2P_ERR(("p2p_net defined already.\n")); - return -EINVAL; - } else { wl->p2p_wdev = wdev; wl->p2p_net = net; - } - - ret = register_netdev(net); - if (ret) { - CFGP2P_ERR((" register_netdevice failed (%d)\n", ret)); - goto fail; - } printk("%s: P2P Interface Registered\n", net->name); return ret; -fail: - -#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 31) - net->open = NULL; -#else - net->netdev_ops = NULL; -#endif - - if (net) { - unregister_netdev(net); - free_netdev(net); - } - - return -ENODEV; } s32 @@ -2268,7 +2299,13 @@ wl_cfgp2p_unregister_ndev(struct wl_priv } static int wl_cfgp2p_start_xmit(struct sk_buff *skb, struct net_device *ndev) { - CFGP2P_DBG(("(%s) is not used for data operations. Droping the packet. \n", ndev->name)); + if(skb) + { + CFGP2P_DBG(("(%s) is not used for data operations.Droping the packet.\n", + ndev->name)); + dev_kfree_skb_any(skb); + } + return 0; } @@ -2296,21 +2333,22 @@ static int wl_cfgp2p_do_ioctl(struct net static int wl_cfgp2p_if_open(struct net_device *net) { + extern struct wl_priv *wlcfg_drv_priv; struct wireless_dev *wdev = net->ieee80211_ptr; - - if (!wdev) + struct wl_priv *wl = NULL; + wl = wlcfg_drv_priv; + if (!wdev || !wl || !wl->p2p) return -EINVAL; - + WL_TRACE(("Enter\n")); /* If suppose F/W download (ifconfig wlan0 up) hasn't been done by now, * do it here. This will make sure that in concurrent mode, supplicant * is not dependent on a particular order of interface initialization. * i.e you may give wpa_supp -iwlan0 -N -ip2p0 or wpa_supp -ip2p0 -N * -iwlan0. */ - wl_cfg80211_do_driver_init(net); - wdev->wiphy->interface_modes |= (BIT(NL80211_IFTYPE_P2P_CLIENT) | BIT(NL80211_IFTYPE_P2P_GO)); + wl_cfg80211_do_driver_init(net); return 0; } @@ -2341,10 +2379,10 @@ static int wl_cfgp2p_if_stop(struct net_ wdev->wiphy->interface_modes = (wdev->wiphy->interface_modes) & (~(BIT(NL80211_IFTYPE_P2P_CLIENT)| BIT(NL80211_IFTYPE_P2P_GO))); -#if defined(CUSTOMER_HW4) - if (net->flags & IFF_UP) - net->flags &= ~IFF_UP; -#endif - return 0; } + +bool wl_cfgp2p_is_ifops(const struct net_device_ops *if_ops) +{ + return (if_ops == &wl_cfgp2p_if_ops); +} --- a/drivers/net/wireless/bcmdhd/wl_cfgp2p.h +++ b/drivers/net/wireless/bcmdhd/wl_cfgp2p.h @@ -21,7 +21,7 @@ * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. * - * $Id: wl_cfgp2p.h 354184 2012-08-30 08:08:08Z $ + * $Id: wl_cfgp2p.h 368090 2012-11-12 04:28:13Z $ */ #ifndef _wl_cfgp2p_h_ #define _wl_cfgp2p_h_ @@ -46,7 +46,7 @@ typedef enum { /* vendor ies max buffer length for probe response or beacon */ #define VNDR_IES_MAX_BUF_LEN 1400 /* normal vendor ies buffer length */ -#define VNDR_IES_BUF_LEN 512 +#define VNDR_IES_BUF_LEN 512 /* Structure to hold all saved P2P and WPS IEs for a BSSCFG */ struct p2p_saved_ie { @@ -110,15 +110,16 @@ enum wl_cfgp2p_status { WLP2P_STATUS_ACTION_TX_COMPLETED, WLP2P_STATUS_ACTION_TX_NOACK, WLP2P_STATUS_SCANNING, - WLP2P_STATUS_GO_NEG_PHASE + WLP2P_STATUS_GO_NEG_PHASE, + WLP2P_STATUS_DISC_IN_PROGRESS }; -#define wl_to_p2p_bss_ndev(w, type) ((wl)->p2p->bss_idx[type].dev) -#define wl_to_p2p_bss_bssidx(w, type) ((wl)->p2p->bss_idx[type].bssidx) -#define wl_to_p2p_bss_saved_ie(w, type) ((wl)->p2p->bss_idx[type].saved_ie) -#define wl_to_p2p_bss_private(w, type) ((wl)->p2p->bss_idx[type].private_data) -#define wl_to_p2p_bss(wl, type) ((wl)->p2p->bss_idx[type]) +#define wl_to_p2p_bss_ndev(wl, type) ((wl)->p2p->bss_idx[type].dev) +#define wl_to_p2p_bss_bssidx(wl, type) ((wl)->p2p->bss_idx[type].bssidx) +#define wl_to_p2p_bss_saved_ie(wl, type) ((wl)->p2p->bss_idx[type].saved_ie) +#define wl_to_p2p_bss_private(wl, type) ((wl)->p2p->bss_idx[type].private_data) +#define wl_to_p2p_bss(wl, type) ((wl)->p2p->bss_idx[type]) #define wl_get_p2p_status(wl, stat) ((!(wl)->p2p_supported) ? 0 : test_bit(WLP2P_STATUS_ ## stat, \ &(wl)->p2p->status)) #define wl_set_p2p_status(wl, stat) ((!(wl)->p2p_supported) ? 0 : set_bit(WLP2P_STATUS_ ## stat, \ @@ -134,6 +135,13 @@ enum wl_cfgp2p_status { /* dword align allocation */ #define WLC_IOCTL_MAXLEN 8192 +#ifdef CUSTOMER_HW4 +#define CFGP2P_ERROR_TEXT "CFGP2P-INFO2) " +#else +#define CFGP2P_ERROR_TEXT "CFGP2P-ERROR) " +#endif + + #define CFGP2P_ERR(args) \ do { \ if (wl_dbg_level & WL_DBG_ERR) { \ @@ -237,6 +245,8 @@ wl_cfgp2p_clear_management_ie(struct wl_ extern s32 wl_cfgp2p_find_idx(struct wl_priv *wl, struct net_device *ndev); +extern struct net_device * +wl_cfgp2p_find_ndev(struct wl_priv *wl, s32 bssidx); extern s32 @@ -295,10 +305,16 @@ wl_cfgp2p_register_ndev(struct wl_priv * extern s32 wl_cfgp2p_unregister_ndev(struct wl_priv *wl); +extern bool +wl_cfgp2p_is_ifops(const struct net_device_ops *if_ops); + /* WiFi Direct */ #define SOCIAL_CHAN_1 1 #define SOCIAL_CHAN_2 6 #define SOCIAL_CHAN_3 11 +#define IS_P2P_SOCIAL_CHANNEL(channel) ((channel == SOCIAL_CHAN_1) || \ + (channel == SOCIAL_CHAN_2) || \ + (channel == SOCIAL_CHAN_3)) #define SOCIAL_CHAN_CNT 3 #define AF_PEER_SEARCH_CNT 2 #define WL_P2P_WILDCARD_SSID "DIRECT-" --- a/drivers/net/wireless/bcmdhd/wl_roam.c +++ b/drivers/net/wireless/bcmdhd/wl_roam.c @@ -99,7 +99,7 @@ int set_roamscan_channel_list(struct net chanspec_t channels[20]; } channel_list; char iobuf[200]; - uint band, band2G, band5G, bw; + uint band2G, band5G, bw; roamscan_mode = 1; if (n > 20) @@ -174,7 +174,7 @@ void add_roam_cache(wl_bss_info_t *bi) return; #endif - if (n_roam_cache == MAX_ROAM_CACHE) + if (n_roam_cache >= MAX_ROAM_CACHE) return; for (i = 0; i < n_roam_cache; i++) { --- a/drivers/net/wireless/bcmdhd/wldev_common.c +++ b/drivers/net/wireless/bcmdhd/wldev_common.c @@ -327,7 +327,7 @@ int wldev_set_band( int error = -1; if ((band == WLC_BAND_AUTO) || (band == WLC_BAND_5G) || (band == WLC_BAND_2G)) { - error = wldev_ioctl(dev, WLC_SET_BAND, &band, sizeof(band), 1); + error = wldev_ioctl(dev, WLC_SET_BAND, &band, sizeof(band), true); if (!error) dhd_bus_band_set(dev, band); } @@ -353,7 +353,7 @@ int wldev_set_country( if ((error < 0) || (strncmp(country_code, smbuf, WLC_CNTRY_BUF_SZ) != 0)) { bzero(&scbval, sizeof(scb_val_t)); - error = wldev_ioctl(dev, WLC_DISASSOC, &scbval, sizeof(scb_val_t), 1); + error = wldev_ioctl(dev, WLC_DISASSOC, &scbval, sizeof(scb_val_t), true); if (error < 0) { WLDEV_ERROR(("%s: set country failed due to Disassoc error %d\n", __FUNCTION__, error)); --- a/drivers/net/wireless/bcmdhd/wldev_common.h +++ b/drivers/net/wireless/bcmdhd/wldev_common.h @@ -96,9 +96,7 @@ extern int net_os_set_suspend_disable(st extern int net_os_set_suspend(struct net_device *dev, int val, int force); extern int wl_iw_parse_ssid_list_tlv(char** list_str, wlc_ssid_t* ssid, int max, int *bytes_left); -#if defined(CUSTOMER_HW4) && defined(PNO_SUPPORT) && defined(CONFIG_HAS_WAKELOCK) -int net_os_wake_lock_timeout_for_pno(struct net_device *dev, int sec); -#endif + /* Get the link speed from dongle, speed is in kpbs */ int wldev_get_link_speed(struct net_device *dev, int *plink_speed); --- a/drivers/net/wireless/wcnss/Makefile +++ b/drivers/net/wireless/wcnss/Makefile @@ -4,3 +4,4 @@ wcnsscore-objs += wcnss_wlan.o wcnss_riva.o qcomwlan_secif.o obj-$(CONFIG_WCNSS_CORE) += wcnsscore.o +obj-$(CONFIG_WCNSS_MEM_PRE_ALLOC) += wcnss_prealloc.o --- a/drivers/power/max17040_battery.c +++ b/drivers/power/max17040_battery.c @@ -655,7 +655,11 @@ static void max17040_rcomp_update(struct chip->pdata->rcomp_value = 0xa01d; } else if (chip->batt_type == BATT_TYPE_D2_ACTIVE) { if (chg_state == POWER_SUPPLY_STATUS_CHARGING) +#if defined(_d2ltetmo_) + chip->pdata->rcomp_value = 0x6d1c; +#else chip->pdata->rcomp_value = 0x851c; +#endif else chip->pdata->rcomp_value = 0x6d1c; } else if (chip->batt_type == BATT_TYPE_GOGH) { @@ -869,7 +873,7 @@ static int __devinit max17040_probe(stru chip->rcomp = max17040_get_rcomp(client); chip->battery.name = "fuelgauge", - chip->battery.type = POWER_SUPPLY_TYPE_BATTERY, + chip->battery.type = POWER_SUPPLY_TYPE_UNKNOWN, chip->battery.get_property = max17040_get_property, chip->battery.set_property = max17040_set_property, chip->battery.properties = max17040_battery_props, --- a/drivers/power/power_supply_sysfs.c +++ b/drivers/power/power_supply_sysfs.c @@ -42,14 +42,18 @@ static ssize_t power_supply_show_propert struct device_attribute *attr, char *buf) { static char *type_text[] = { - "Battery", "UPS", "Mains", "USB", - "USB_DCP", "USB_CDP", "USB_ACA" + "Unknown", "Battery", "UPS", "Mains", "USB", + "USB_DCP", "USB_CDP", "USB_ACA", "Misc", "Cardock", +#ifdef CONFIG_WIRELESS_CHARGING + "WPC", +#endif + "Dummy", "OTG", "UARTOFF" }; static char *status_text[] = { "Unknown", "Charging", "Discharging", "Not charging", "Full" }; static char *charge_type[] = { - "Unknown", "N/A", "Trickle", "Fast" + "Unknown", "N/A", "Trickle", "Fast", "Slow" }; static char *health_text[] = { "Unknown", "Good", "Overheat", "Dead", "Over voltage", --- a/drivers/power/sec_battery.c +++ b/drivers/power/sec_battery.c @@ -60,6 +60,7 @@ #define TOTAL_EVENT_TIME (10 * 60) /* 10 minites */ static int is_charging_disabled; +static unsigned int sec_bat_recovery_mode; enum cable_type_t { CABLE_TYPE_NONE = 0, @@ -424,10 +425,11 @@ static int sec_bat_get_property(struct p info->test_info.test_value); val->intval = POWER_SUPPLY_STATUS_UNKNOWN; } else if (info->is_timeout_chgstop && - info->charging_status == POWER_SUPPLY_STATUS_FULL) { + info->charging_status == POWER_SUPPLY_STATUS_FULL && + info->batt_soc != 100) { /* new concept : in case of time-out charging stop, - Do not update FULL for UI, + Do not update FULL for UI except soc 100%, Use same time-out value for first charing and re-charging */ @@ -458,9 +460,40 @@ static int sec_bat_get_property(struct p case POWER_SUPPLY_PROP_ONLINE: if (info->charging_status == POWER_SUPPLY_STATUS_DISCHARGING && info->cable_type != CABLE_TYPE_NONE) { - val->intval = CABLE_TYPE_NONE; - } else - val->intval = info->cable_type; + val->intval = POWER_SUPPLY_TYPE_BATTERY; + } else { + switch (info->cable_type) { + case CABLE_TYPE_NONE: + val->intval = POWER_SUPPLY_TYPE_BATTERY; + break; + case CABLE_TYPE_USB: + val->intval = POWER_SUPPLY_TYPE_USB; + break; + case CABLE_TYPE_AC: + val->intval = POWER_SUPPLY_TYPE_MAINS; + break; + case CABLE_TYPE_MISC: + val->intval = POWER_SUPPLY_TYPE_MISC; + break; + case CABLE_TYPE_CARDOCK: + val->intval = POWER_SUPPLY_TYPE_CARDOCK; + break; + case CABLE_TYPE_UARTOFF: + val->intval = POWER_SUPPLY_TYPE_UARTOFF; + break; + case CABLE_TYPE_CDP: + val->intval = POWER_SUPPLY_TYPE_USB_CDP; + break; +#if defined(CONFIG_WIRELESS_CHARGING) + case CABLE_TYPE_WPC: + val->intval = POWER_SUPPLY_TYPE_WPC; + break; +#endif + default: + val->intval = POWER_SUPPLY_TYPE_UNKNOWN; + break; + } + } break; case POWER_SUPPLY_PROP_VOLTAGE_NOW: val->intval = sec_bat_get_fuelgauge_data(info, FG_T_VCELL); @@ -789,7 +822,8 @@ static int sec_ac_get_property(struct po if (info->cable_type == CABLE_TYPE_MISC || info->cable_type == CABLE_TYPE_UARTOFF || info->cable_type == CABLE_TYPE_CARDOCK) { - if (!info->dcin_intr_triggered) + if (sec_bat_is_charging(info) + == POWER_SUPPLY_STATUS_DISCHARGING) val->intval = 0; else val->intval = 1; @@ -1333,6 +1367,8 @@ static void sec_bat_cable_work(struct wo wake_lock(&info->cable_wake_lock); + info->prev_cable = info->cable_type; + if ((info->present == BATT_STATUS_MISSING) && (info->cable_type != CABLE_TYPE_NONE)) { pr_info("[battery] VF is open, do not care cable_work\n"); @@ -1361,6 +1397,7 @@ static void sec_bat_cable_work(struct wo if (ret < 0) pr_err("%s : failed to set charger state(%d)\n", __func__, ret); + wake_lock_timeout(&info->cable_wake_lock, 2*HZ); queue_delayed_work(info->monitor_wqueue, &info->cable_work, msecs_to_jiffies(500)); @@ -1418,12 +1455,12 @@ static void sec_bat_cable_work(struct wo case CABLE_TYPE_MISC: case CABLE_TYPE_CARDOCK: case CABLE_TYPE_UARTOFF: - if (!info->dcin_intr_triggered && !info->lpm_chg_mode) { + if (sec_bat_is_charging(info) + == POWER_SUPPLY_STATUS_DISCHARGING) { wake_lock_timeout(&info->vbus_wake_lock, 5 * HZ); pr_info("%s : dock inserted, but dcin nok skip charging!\n", __func__); - sec_bat_enable_charging(info, true); - info->charging_enabled = false; + sec_bat_enable_charging(info, false); break; } case CABLE_TYPE_UNKNOWN: @@ -1578,22 +1615,40 @@ static void sec_bat_monitor_work(struct goto monitoring_skip; } - pm8921_enable_batt_therm(1); - /* check battery 5 times */ - for (i = 0; i < 5; i++) { - msleep(500); - info->present = !gpio_get_value_cansleep(info->batt_int); - - /* If the battery is missing, then check more */ - if (info->present) { - i++; - break; + if (sec_bat_recovery_mode == 1 + || system_state == SYSTEM_RESTART) { + pm8921_enable_batt_therm(0); + info->present = 1; + pr_info("%s : recovery/restart, skip batt check(1)\n", + __func__); + } else { + pm8921_enable_batt_therm(1); + /* check battery 5 times */ + for (i = 0; i < 5; i++) { + msleep(500); + if (sec_bat_recovery_mode == 1 + || system_state == SYSTEM_RESTART) { + pm8921_enable_batt_therm(0); + info->present = 1; + pr_info("%s : recovery/restart, skip batt check(2)\n", + __func__); + break; + } + + info->present = !gpio_get_value_cansleep( + info->batt_int); + + /* If the battery is missing, then check more */ + if (info->present) { + i++; + break; + } } + pm8921_enable_batt_therm(0); + pr_info("%s: battery check is %s (%d time%c)\n", + __func__, info->present ? "present" : "absent", + i, (i == 1) ? ' ' : 's'); } - pm8921_enable_batt_therm(0); - pr_info("%s: battery check is %s (%d time%c)\n", - __func__, info->present ? "present" : "absent", - i, (i == 1) ? ' ' : 's'); if ((info->present == BATT_STATUS_MISSING) && (info->cable_type != CABLE_TYPE_NONE)) { @@ -1726,8 +1781,10 @@ static void sec_bat_monitor_work(struct info->batt_soc = 100; info->check_full_state_cnt++; } else { - if (info->batt_presoc > info->batt_soc) { + if ((info->batt_presoc > info->batt_soc) + && (info->check_full_state_cnt <= 4)) { info->batt_soc = info->batt_presoc - 1; + info->check_full_state_cnt++; } else { info->check_full_state = false; info->check_full_state_cnt = 0; @@ -1782,6 +1839,7 @@ static void sec_bat_measure_work(struct } local_irq_restore(flags); + wake_lock_timeout(&info->cable_wake_lock, 2*HZ); queue_delayed_work(info->monitor_wqueue, &info->cable_work, HZ); } @@ -1881,7 +1939,7 @@ static struct device_attribute sec_batte SEC_BATTERY_ATTR(batt_current_adc), SEC_BATTERY_ATTR(batt_esus_test), SEC_BATTERY_ATTR(sys_rev), - SEC_BATTERY_ATTR(fg_psoc), + SEC_BATTERY_ATTR(batt_read_raw_soc), SEC_BATTERY_ATTR(batt_reset_soc), #ifdef CONFIG_WIRELESS_CHARGING SEC_BATTERY_ATTR(wc_status), @@ -1933,7 +1991,7 @@ enum { BATT_CURRENT_ADC, BATT_ESUS_TEST, BATT_SYSTEM_REV, - BATT_FG_PSOC, + BATT_READ_RAW_SOC, BATT_RESET_SOC, #ifdef CONFIG_WIRELESS_CHARGING BATT_WC_STATUS, @@ -2078,12 +2136,44 @@ static ssize_t sec_bat_show_property(str info->batt_temp_radc); break; case BATT_CHARGING_SOURCE: - val = info->cable_type; + + switch(info->cable_type) { + case CABLE_TYPE_NONE: + val = POWER_SUPPLY_TYPE_BATTERY; + break; + case CABLE_TYPE_USB: + val = POWER_SUPPLY_TYPE_USB; + break; + case CABLE_TYPE_AC: + val = POWER_SUPPLY_TYPE_MAINS; + break; + case CABLE_TYPE_MISC: + val = POWER_SUPPLY_TYPE_MISC; + break; + case CABLE_TYPE_CARDOCK: + val = POWER_SUPPLY_TYPE_CARDOCK; + break; + case CABLE_TYPE_UARTOFF: + val = POWER_SUPPLY_TYPE_UARTOFF; + break; + case CABLE_TYPE_CDP: + val = POWER_SUPPLY_TYPE_USB_CDP; + break; +#ifdef CONFIG_WIRELESS_CHARGING + case CABLE_TYPE_WPC: + val = POWER_SUPPLY_TYPE_WPC; + break; +#endif + default: + val = POWER_SUPPLY_TYPE_UNKNOWN; + break; + } + /*val = 2; // for lpm test */ if (info->lpm_chg_mode && info->cable_type != CABLE_TYPE_NONE && info->charging_status == POWER_SUPPLY_STATUS_DISCHARGING) { - val = CABLE_TYPE_NONE; + val = POWER_SUPPLY_TYPE_BATTERY; } i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", val); break; @@ -2140,7 +2230,7 @@ static ssize_t sec_bat_show_property(str case BATT_SYSTEM_REV: i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", info->hw_rev); break; - case BATT_FG_PSOC: + case BATT_READ_RAW_SOC: val = sec_bat_get_fuelgauge_data(info, FG_T_PSOC); i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", val); break; @@ -2530,6 +2620,25 @@ static void sec_bat_late_resume(struct e return; } +static int __init sec_bat_current_boot_mode(char *mode) +{ + /* + * 1 is recovery booting + * 0 is normal booting + */ + + if (strncmp(mode, "1", 1) == 0) + sec_bat_recovery_mode = 1; + else + sec_bat_recovery_mode = 0; + + pr_info("%s : %s", __func__, sec_bat_recovery_mode == 1 ? + "recovery" : "normal"); + + return 1; +} +__setup("androidboot.batt_check_recovery=", sec_bat_current_boot_mode); + static __devinit int sec_bat_probe(struct platform_device *pdev) { struct sec_bat_platform_data *pdata = dev_get_platdata(&pdev->dev); --- a/drivers/power/smb347_charger.c +++ b/drivers/power/smb347_charger.c @@ -262,6 +262,8 @@ static void check_smb347_version(void) smb347_verA5 = 1; #elif defined(CONFIG_MACH_SUPERIORLTE_SKT) smb347_verA5 = 1; +#elif defined(CONFIG_MACH_INFINITE) + smb347_verA5 = 1; #else smb347_verA5 = 0; #endif @@ -450,8 +452,13 @@ static void smb347_charger_function_conr pr_err("%s : error!\n", __func__); } - /* Float voltage : 4.36V Vprechg : 2.4V */ +#if defined(CONFIG_MACH_JASPER) || defined(_d2ltetmo_) || defined(_d2mtr_) + /* Float voltage : 4.35V Vprechg : 2.4V */ + smb347_write_reg(client, SMB347_FLOAT_VOLTAGE, 0x2A); +#else + /* Float voltage : 4.36V Vprechg : 2.4V */ smb347_write_reg(client, SMB347_FLOAT_VOLTAGE, 0x2B); +#endif /* Charge control (Auto Recharge) * Automatic Recharge Disabled , Current Termination Enabled, @@ -1685,7 +1692,7 @@ static int __devinit smb347_probe(struct mutex_init(&chip->mutex); chip->psy_bat.name = "sec-charger", - chip->psy_bat.type = POWER_SUPPLY_TYPE_BATTERY, + chip->psy_bat.type = POWER_SUPPLY_TYPE_UNKNOWN, chip->psy_bat.properties = smb347_battery_props, chip->psy_bat.num_properties = ARRAY_SIZE(smb347_battery_props), chip->psy_bat.get_property = smb347_chg_get_property, --- a/drivers/usb/gadget/android.c +++ b/drivers/usb/gadget/android.c @@ -1680,6 +1680,11 @@ static void android_disconnect(struct us unsigned long flags; composite_disconnect(gadget); + /* accessory HID support can be active while the + accessory function is not actually enabled, + so we need to inform it when we are disconnected. + */ + acc_disconnect(); spin_lock_irqsave(&cdev->lock, flags); dev->connected = 0; --- a/drivers/usb/gadget/ci13xxx_udc.c +++ b/drivers/usb/gadget/ci13xxx_udc.c @@ -2392,6 +2392,7 @@ static int ep_enable(struct usb_ep *ep, struct ci13xxx_ep *mEp = container_of(ep, struct ci13xxx_ep, ep); int retval = 0; unsigned long flags; + unsigned mult = 0; trace("%p, %p", ep, desc); @@ -2417,12 +2418,15 @@ static int ep_enable(struct usb_ep *ep, mEp->qh.ptr->cap = 0; - if (mEp->type == USB_ENDPOINT_XFER_CONTROL) + if (mEp->type == USB_ENDPOINT_XFER_CONTROL) { mEp->qh.ptr->cap |= QH_IOS; - else if (mEp->type == USB_ENDPOINT_XFER_ISOC) + } else if (mEp->type == USB_ENDPOINT_XFER_ISOC) { mEp->qh.ptr->cap &= ~QH_MULT; - else + mult = ((mEp->ep.maxpacket >> QH_MULT_SHIFT) + 1) & 0x03; + mEp->qh.ptr->cap |= (mult << ffs_nr(QH_MULT)); + } else { mEp->qh.ptr->cap |= QH_ZLT; + } mEp->qh.ptr->cap |= (mEp->ep.maxpacket << ffs_nr(QH_MAX_PKT)) & QH_MAX_PKT; @@ -2956,7 +2960,12 @@ int usb_gadget_probe_driver(struct usb_g mEp->ep.name = mEp->name; mEp->ep.ops = &usb_ep_ops; - mEp->ep.maxpacket = CTRL_PAYLOAD_MAX; + + if (i == 0) + mEp->ep.maxpacket = CTRL_PAYLOAD_MAX; + else + /* For ISO EP */ + mEp->ep.maxpacket = 512; INIT_LIST_HEAD(&mEp->qh.queue); spin_unlock_irqrestore(udc->lock, flags); --- a/drivers/usb/gadget/ci13xxx_udc.h +++ b/drivers/usb/gadget/ci13xxx_udc.h @@ -74,6 +74,7 @@ struct ci13xxx_qh { #define QH_MAX_PKT (0x07FFUL << 16) #define QH_ZLT BIT(29) #define QH_MULT (0x0003UL << 30) +#define QH_MULT_SHIFT 11 /* 1 */ u32 curr; /* 2 - 8 */ --- a/drivers/usb/gadget/f_audio_source.c +++ b/drivers/usb/gadget/f_audio_source.c @@ -22,11 +22,9 @@ #include #define SAMPLE_RATE 44100 -/* Each frame is two 16 bit integers (one per channel) */ -#define BYTES_PER_FRAME 4 #define FRAMES_PER_MSEC (SAMPLE_RATE / 1000) -#define IN_EP_MAX_PACKET_SIZE 256 +#define IN_EP_MAX_PACKET_SIZE 384 /* Number of requests to allocate */ #define IN_EP_REQ_COUNT 4 @@ -245,8 +243,7 @@ struct audio_dev { struct list_head idle_reqs; struct usb_ep *in_ep; - struct usb_endpoint_descriptor *in_desc; - + struct usb_endpoint_descriptor *in_desc; spinlock_t lock; /* beginning, end and current position in our buffer */ @@ -414,7 +411,7 @@ static void audio_data_complete(struct u audio_req_put(audio, req); - if (!audio->buffer_start) + if (!audio->buffer_start || req->status) return; audio->period_offset += req->actual; @@ -622,7 +619,10 @@ audio_unbind(struct usb_configuration *c audio_request_free(req, audio->in_ep); snd_card_free_when_closed(audio->card); - kfree(audio); + audio->card = NULL; + audio->pcm = NULL; + audio->substream = NULL; + audio->in_ep = NULL; } static void audio_pcm_playback_start(struct audio_dev *audio) @@ -738,6 +738,22 @@ static int audio_pcm_playback_trigger(st return ret; } +static struct audio_dev _audio_dev = { + .func = { + .name = "audio_source", + .bind = audio_bind, + .unbind = audio_unbind, + .set_alt = audio_set_alt, + .setup = audio_setup, + .disable = audio_disable, + .descriptors = fs_audio_desc, + .hs_descriptors = hs_audio_desc, + }, + .in_desc = &fs_as_in_ep_desc, + .lock = __SPIN_LOCK_UNLOCKED(_audio_dev.lock), + .idle_reqs = LIST_HEAD_INIT(_audio_dev.idle_reqs), +}; + static struct snd_pcm_ops audio_playback_ops = { .open = audio_pcm_open, .close = audio_pcm_close, @@ -760,27 +776,12 @@ int audio_source_bind_config(struct usb_ config->card = -1; config->device = -1; - audio = kzalloc(sizeof *audio, GFP_KERNEL); - if (!audio) - return -ENOMEM; - - audio->func.name = "audio_source"; - - spin_lock_init(&audio->lock); - - audio->func.bind = audio_bind; - audio->func.unbind = audio_unbind; - audio->func.set_alt = audio_set_alt; - audio->func.setup = audio_setup; - audio->func.disable = audio_disable; - audio->in_desc = &fs_as_in_ep_desc; - - INIT_LIST_HEAD(&audio->idle_reqs); + audio = &_audio_dev; err = snd_card_create(SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1, THIS_MODULE, 0, &card); if (err) - goto snd_card_fail; + return err; snd_card_set_dev(card, &c->cdev->gadget->dev); @@ -819,7 +820,5 @@ add_fail: register_fail: pcm_fail: snd_card_free(audio->card); -snd_card_fail: - kfree(audio); return err; } --- a/drivers/video/msm/external_common.c +++ b/drivers/video/msm/external_common.c @@ -18,6 +18,9 @@ /* #define DEBUG */ #define DEV_DBG_PREFIX "EXT_COMMON: " +/* The start of the data block collection within the CEA Extension Version 3 */ +#define DBC_START_OFFSET 4 + #include "msm_fb.h" #include "hdmi_msm.h" #include "external_common.h" @@ -346,6 +349,143 @@ static ssize_t hdmi_common_rda_edid_mode return ret; } +static ssize_t hdmi_common_rda_edid_physical_address(struct device *dev, + struct device_attribute *attr, char *buf) +{ + ssize_t ret = snprintf(buf, PAGE_SIZE, "%d\n", + external_common_state->physical_address); + + DEV_DBG("%s: '%d'\n", __func__, + external_common_state->physical_address); + return ret; +} + + +static ssize_t hdmi_common_rda_edid_scan_info(struct device *dev, + struct device_attribute *attr, char *buf) +{ + ssize_t ret = snprintf(buf, PAGE_SIZE, "%d, %d, %d\n", + external_common_state->pt_scan_info, + external_common_state->it_scan_info, + external_common_state->ce_scan_info); + DEV_DBG("%s: '%s'\n", __func__, buf); + return ret; +} + +static ssize_t hdmi_common_wta_vendor_name(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + uint8 *s = (uint8 *) buf; + uint8 *d = external_common_state->spd_vendor_name; + ssize_t ret = strnlen(buf, PAGE_SIZE); + ret = (ret > 8) ? 8 : ret; + + memset(external_common_state->spd_vendor_name, 0, 8); + while (*s) { + if (*s & 0x60 && *s ^ 0x7f) { + *d = *s; + } else { + /* stop copying if control character found */ + break; + } + + if (++s > (uint8 *) (buf + ret)) + break; + + d++; + } + + DEV_DBG("%s: '%s'\n", __func__, + external_common_state->spd_vendor_name); + + return ret; +} + +static ssize_t hdmi_common_rda_vendor_name(struct device *dev, + struct device_attribute *attr, char *buf) +{ + ssize_t ret = snprintf(buf, PAGE_SIZE, "%s\n", + external_common_state->spd_vendor_name); + DEV_DBG("%s: '%s'\n", __func__, + external_common_state->spd_vendor_name); + + return ret; +} + +static ssize_t hdmi_common_wta_product_description(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + uint8 *s = (uint8 *) buf; + uint8 *d = external_common_state->spd_product_description; + ssize_t ret = strnlen(buf, PAGE_SIZE); + ret = (ret > 16) ? 16 : ret; + + memset(external_common_state->spd_product_description, 0, 16); + while (*s) { + if (*s & 0x60 && *s ^ 0x7f) { + *d = *s; + } else { + /* stop copying if control character found */ + break; + } + + if (++s > (uint8 *) (buf + ret)) + break; + + d++; + } + + DEV_DBG("%s: '%s'\n", __func__, + external_common_state->spd_product_description); + + return ret; +} + +static ssize_t hdmi_common_rda_product_description(struct device *dev, + struct device_attribute *attr, char *buf) +{ + ssize_t ret = snprintf(buf, PAGE_SIZE, "%s\n", + external_common_state->spd_product_description); + DEV_DBG("%s: '%s'\n", __func__, + external_common_state->spd_product_description); + + return ret; +} + +static ssize_t hdmi_common_rda_edid_3d_modes(struct device *dev, + struct device_attribute *attr, char *buf) +{ + ssize_t ret = 0; + int i; + char buff_3d[128]; + + buf[0] = 0; + if (external_common_state->disp_mode_list.num_of_elements) { + uint32 *video_mode = external_common_state->disp_mode_list + .disp_mode_list; + uint32 *video_3d_mode = external_common_state->disp_mode_list + .disp_3d_mode_list; + for (i = 0; i < external_common_state->disp_mode_list + .num_of_elements; ++i) { + video_3d_format_2string(*video_3d_mode++, buff_3d); + if (ret > 0) + ret += snprintf(buf+ret, PAGE_SIZE-ret, + ",%d=%s", + *video_mode++ + 1, buff_3d); + else + ret += snprintf(buf+ret, PAGE_SIZE-ret, + "%d=%s", + *video_mode++ + 1, buff_3d); + } + } else + ret += snprintf(buf+ret, PAGE_SIZE-ret, "%d", + external_common_state->video_resolution+1); + + DEV_DBG("%s: '%s'\n", __func__, buf); + ret += snprintf(buf+ret, PAGE_SIZE-ret, "\n"); + return ret; +} + static ssize_t hdmi_common_rda_hdcp(struct device *dev, struct device_attribute *attr, char *buf) { @@ -702,6 +842,17 @@ static DEVICE_ATTR(edid_modes, S_IRUGO, static DEVICE_ATTR(hpd, S_IRUGO | S_IWUGO, hdmi_common_rda_hpd, hdmi_common_wta_hpd); static DEVICE_ATTR(hdcp, S_IRUGO, hdmi_common_rda_hdcp, NULL); +static DEVICE_ATTR(pa, S_IRUGO, + hdmi_common_rda_edid_physical_address, NULL); +static DEVICE_ATTR(scan_info, S_IRUGO, + hdmi_common_rda_edid_scan_info, NULL); +static DEVICE_ATTR(vendor_name, S_IRUGO | S_IWUSR, hdmi_common_rda_vendor_name, + hdmi_common_wta_vendor_name); +static DEVICE_ATTR(product_description, S_IRUGO | S_IWUSR, + hdmi_common_rda_product_description, + hdmi_common_wta_product_description); +static DEVICE_ATTR(edid_3d_modes, S_IRUGO, + hdmi_common_rda_edid_3d_modes, NULL); static DEVICE_ATTR(3d_present, S_IRUGO, hdmi_common_rda_3d_present, NULL); static DEVICE_ATTR(hdcp_present, S_IRUGO, hdmi_common_rda_hdcp_present, NULL); #endif @@ -720,6 +871,11 @@ static struct attribute *external_common &dev_attr_edid_modes.attr, &dev_attr_hdcp.attr, &dev_attr_hpd.attr, + &dev_attr_pa.attr, + &dev_attr_scan_info.attr, + &dev_attr_vendor_name.attr, + &dev_attr_product_description.attr, + &dev_attr_edid_3d_modes.attr, &dev_attr_3d_present.attr, &dev_attr_hdcp_present.attr, #endif @@ -947,11 +1103,12 @@ static struct hdmi_edid_video_mode_prope 31500, 60000, 108108, 60000, TRUE}, }; -static const uint8 *hdmi_edid_find_block(const uint8 *in_buf, uint8 type, - uint8 *len) +static const uint8 *hdmi_edid_find_block(const uint8 *in_buf, + uint32 start_offset, uint8 type, uint8 *len) { /* the start of data block collection, start of Video Data Block */ - uint32 offset = 4; + uint32 offset = start_offset; + uint32 end_dbc_offset = in_buf[2]; uint16 start_DTD = 0; *len = 0; @@ -959,12 +1116,12 @@ static const uint8 *hdmi_edid_find_block present. edid buffer 1, byte 2 being 0 menas no non-DTD/DATA block collection present and no DTD data present.*/ - if ((in_buf[2] == 0) || (in_buf[2] == 4)) { + if ((end_dbc_offset == 0) || (end_dbc_offset == 4)) { DEV_WARN("EDID: no DTD or non-DTD data present\n"); return NULL; } start_DTD = in_buf[2]; - while (offset < 0x80) { + while (offset < end_dbc_offset) { /* some block_data is optional in CEA EDID*/ if (start_DTD <= offset) break; @@ -996,20 +1153,27 @@ static void hdmi_edid_extract_vendor_id( static uint32 hdmi_edid_extract_ieee_reg_id(const uint8 *in_buf) { uint8 len; - const uint8 *vsd = hdmi_edid_find_block(in_buf, 3, &len); + const uint8 *vsd = hdmi_edid_find_block(in_buf, DBC_START_OFFSET, 3, + &len); if (vsd == NULL) return 0; DEV_DBG("EDID: VSD PhyAddr=%04x, MaxTMDS=%dMHz\n", - ((uint32)vsd[6] << 8) + (uint32)vsd[5], (uint32)vsd[7] * 5); + ((uint32)vsd[4] << 8) + (uint32)vsd[5], (uint32)vsd[7] * 5); + external_common_state->physical_address = + ((uint16)vsd[4] << 8) + (uint16)vsd[5]; return ((uint32)vsd[3] << 16) + ((uint32)vsd[2] << 8) + (uint32)vsd[1]; } +#define HDMI_VSDB_3D_DATA_OFFSET(vsd) \ + (!((vsd)[8] & BIT(7)) ? 9 : (!((vsd)[8] & BIT(6)) ? 11 : 13)) + static void hdmi_edid_extract_3d_present(const uint8 *in_buf) { uint8 len, offset; - const uint8 *vsd = hdmi_edid_find_block(in_buf, 3, &len); + const uint8 *vsd = hdmi_edid_find_block(in_buf, DBC_START_OFFSET, 3, + &len); external_common_state->present_3d = 0; if (vsd == NULL || len < 9) { @@ -1017,7 +1181,7 @@ static void hdmi_edid_extract_3d_present return; } - offset = !(vsd[8] & BIT(7)) ? 9 : 13; + offset = HDMI_VSDB_3D_DATA_OFFSET(vsd); DEV_DBG("EDID: 3D present @ %d = %02x\n", offset, vsd[offset]); if (vsd[offset] >> 7) { /* 3D format indication present */ DEV_INFO("EDID: 3D present, 3D-len=%d\n", vsd[offset+1] & 0x1F); @@ -1029,7 +1193,8 @@ static void hdmi_edid_extract_3d_present static void hdmi_edid_extract_latency_fields(const uint8 *in_buf) { uint8 len; - const uint8 *vsd = hdmi_edid_find_block(in_buf, 3, &len); + const uint8 *vsd = hdmi_edid_find_block(in_buf, DBC_START_OFFSET, 3, + &len); if (vsd == NULL || len < 12 || !(vsd[8] & BIT(7))) { external_common_state->video_latency = (uint16)-1; @@ -1048,7 +1213,8 @@ static void hdmi_edid_extract_speaker_al { uint8 len; uint16 speaker_allocation = 0; - const uint8 *sad = hdmi_edid_find_block(in_buf, 4, &len); + const uint8 *sad = hdmi_edid_find_block(in_buf, DBC_START_OFFSET, 4, + &len); if (sad == NULL) return; @@ -1072,7 +1238,8 @@ static void hdmi_edid_extract_audio_data { uint8 len; uint16 audio_ch = 0; - const uint8 *sad = hdmi_edid_find_block(in_buf, 1, &len); + const uint8 *sad = hdmi_edid_find_block(in_buf, DBC_START_OFFSET, 1, + &len); uint32 *adb = external_common_state->audio_data_blocks; if (sad == NULL) @@ -1093,6 +1260,61 @@ static void hdmi_edid_extract_audio_data external_common_state->audio_speaker_data |= audio_ch; } +static void hdmi_edid_extract_extended_data_blocks(const uint8 *in_buf) +{ + uint8 len = 0; + uint32 start_offset = DBC_START_OFFSET; + + /* A Tage code of 7 identifies extended data blocks */ + uint8 const *etag = hdmi_edid_find_block(in_buf, start_offset, 7, &len); + + while (etag != NULL) { + /* The extended data block should at least be 2 bytes long */ + if (len < 2) { + DEV_DBG("EDID: Found an extended data block of length" + "less than 2 bytes. Ignoring ...\n"); + } else { + /* + * The second byte of the extended data block has the + * extended tag code + */ + switch (etag[1]) { + case 0: + /* Video Capability Data Block */ + DEV_DBG("EDID: VCDB=%02X %02X\n", etag[1], + etag[2]); + + /* + * Check if the sink specifies underscan + * support for: + * BIT 5: preferred video format + * BIT 3: IT video format + * BIT 1: CE video format + */ + external_common_state->pt_scan_info = (etag[2] & + (BIT(4) | BIT(5))) >> 4; + external_common_state->it_scan_info = (etag[2] & + (BIT(3) | BIT(2))) >> 2; + external_common_state->ce_scan_info = etag[2] & + (BIT(1) | BIT(0)); + DEV_DBG("EDID: Scan Information (pt|it|ce): " + "(%d|%d|%d)", + external_common_state->pt_scan_info, + external_common_state->it_scan_info, + external_common_state->ce_scan_info); + break; + default: + DEV_DBG("EDID: Extend Tag Code %d not" + "supported\n", etag[1]); + break; + } + } + + /* There could be more that one extended data block */ + start_offset = etag - in_buf + len + 1; + etag = hdmi_edid_find_block(in_buf, start_offset, 7, &len); + } +} static void hdmi_edid_detail_desc(const uint8 *data_buf, uint32 *disp_mode) { @@ -1226,6 +1448,192 @@ static void add_supported_video_format( } } +const char *single_video_3d_format_2string(uint32 format) +{ + switch (format) { + case TOP_AND_BOTTOM: return "TAB"; + case FRAME_PACKING: return "FP"; + case SIDE_BY_SIDE_HALF: return "SSH"; + } + return ""; +} + +ssize_t video_3d_format_2string(uint32 format, char *buf) +{ + ssize_t ret, len = 0; + ret = snprintf(buf, PAGE_SIZE, "%s", + single_video_3d_format_2string(format & FRAME_PACKING)); + len += ret; + + if (len && (format & TOP_AND_BOTTOM)) + ret = snprintf(buf + len, PAGE_SIZE, ":%s", + single_video_3d_format_2string( + format & TOP_AND_BOTTOM)); + else + ret = snprintf(buf + len, PAGE_SIZE, "%s", + single_video_3d_format_2string( + format & TOP_AND_BOTTOM)); + len += ret; + + if (len && (format & SIDE_BY_SIDE_HALF)) + ret = snprintf(buf + len, PAGE_SIZE, ":%s", + single_video_3d_format_2string( + format & SIDE_BY_SIDE_HALF)); + else + ret = snprintf(buf + len, PAGE_SIZE, "%s", + single_video_3d_format_2string( + format & SIDE_BY_SIDE_HALF)); + len += ret; + + return len; +} + +static void add_supported_3d_format( + struct hdmi_disp_mode_list_type *disp_mode_list, + uint32 video_format, + uint32 video_3d_format) +{ + char string[128]; + boolean added = FALSE; + int i; + for (i = 0; i < disp_mode_list->num_of_elements; ++i) { + if (disp_mode_list->disp_mode_list[i] == video_format) { + disp_mode_list->disp_3d_mode_list[i] |= + video_3d_format; + added = TRUE; + break; + } + } + video_3d_format_2string(video_3d_format, string); + DEV_DBG("EDID[3D]: format: %d [%s], %s %s\n", + video_format, video_format_2string(video_format), + string, added ? "added" : "NOT added"); +} + +static void hdmi_edid_get_display_vsd_3d_mode(const uint8 *data_buf, + struct hdmi_disp_mode_list_type *disp_mode_list, + uint32 num_og_cea_blocks) +{ + uint8 len, offset, present_multi_3d, hdmi_vic_len, hdmi_3d_len; + uint16 structure_all, structure_mask; + const uint8 *vsd = num_og_cea_blocks ? + hdmi_edid_find_block(data_buf+0x80, DBC_START_OFFSET, + 3, &len) : NULL; + int i; + + offset = HDMI_VSDB_3D_DATA_OFFSET(vsd); + present_multi_3d = (vsd[offset] & 0x60) >> 5; + + offset += 1; + hdmi_vic_len = (vsd[offset] >> 5) & 0x7; + hdmi_3d_len = vsd[offset] & 0x1F; + DEV_DBG("EDID[3D]: HDMI_VIC_LEN = %d, HDMI_3D_LEN = %d\n", + hdmi_vic_len, hdmi_3d_len); + + offset += (hdmi_vic_len + 1); + if (present_multi_3d == 1 || present_multi_3d == 2) { + DEV_DBG("EDID[3D]: multi 3D present (%d)\n", present_multi_3d); + /* 3d_structure_all */ + structure_all = (vsd[offset] << 8) | vsd[offset + 1]; + offset += 2; + hdmi_3d_len -= 2; + if (present_multi_3d == 2) { + /* 3d_structure_mask */ + structure_mask = (vsd[offset] << 8) | vsd[offset + 1]; + offset += 2; + hdmi_3d_len -= 2; + } else + structure_mask = 0xffff; + + i = 0; + while (i < 16) { + if (i >= disp_mode_list->disp_multi_3d_mode_list_cnt) + break; + + if (!(structure_mask & BIT(i))) { + ++i; + continue; + } + + /* BIT0: FRAME PACKING */ + if (structure_all & BIT(0)) + add_supported_3d_format(disp_mode_list, + disp_mode_list-> + disp_multi_3d_mode_list[i], + FRAME_PACKING); + + /* BIT6: TOP AND BOTTOM */ + if (structure_all & BIT(6)) + add_supported_3d_format(disp_mode_list, + disp_mode_list-> + disp_multi_3d_mode_list[i], + TOP_AND_BOTTOM); + + /* BIT8: SIDE BY SIDE HALF */ + if (structure_all & BIT(8)) + add_supported_3d_format(disp_mode_list, + disp_mode_list-> + disp_multi_3d_mode_list[i], + SIDE_BY_SIDE_HALF); + + ++i; + } + } + + i = 0; + while (hdmi_3d_len > 0) { + DEV_DBG("EDID[3D]: 3D_Structure_%d @ %d: %02x\n", + i + 1, offset, vsd[offset]); + + if ((vsd[offset] >> 4) >= + disp_mode_list->disp_multi_3d_mode_list_cnt) { + if ((vsd[offset] & 0x0F) >= 8) { + offset += 1; + hdmi_3d_len -= 1; + DEV_DBG("EDID[3D]: 3D_Detail_%d @ %d: %02x\n", + i + 1, offset, vsd[offset]); + } + i += 1; + offset += 1; + hdmi_3d_len -= 1; + continue; + } + + switch (vsd[offset] & 0x0F) { + case 0: + /* 0000b: FRAME PACKING */ + add_supported_3d_format(disp_mode_list, + disp_mode_list->disp_multi_3d_mode_list + [vsd[offset] >> 4], + FRAME_PACKING); + break; + case 6: + /* 0110b: TOP AND BOTTOM */ + add_supported_3d_format(disp_mode_list, + disp_mode_list->disp_multi_3d_mode_list + [vsd[offset] >> 4], + TOP_AND_BOTTOM); + break; + case 8: + /* 1000b: SIDE BY SIDE HALF */ + add_supported_3d_format(disp_mode_list, + disp_mode_list->disp_multi_3d_mode_list + [vsd[offset] >> 4], + SIDE_BY_SIDE_HALF); + break; + } + if ((vsd[offset] & 0x0F) >= 8) { + offset += 1; + hdmi_3d_len -= 1; + DEV_DBG("EDID[3D]: 3D_Detail_%d @ %d: %02x\n", + i + 1, offset, vsd[offset]); + } + i += 1; + offset += 1; + hdmi_3d_len -= 1; + } +} + static void hdmi_edid_get_display_mode(const uint8 *data_buf, struct hdmi_disp_mode_list_type *disp_mode_list, uint32 num_og_cea_blocks) @@ -1237,9 +1645,14 @@ static void hdmi_edid_get_display_mode(c const uint8 *edid_blk0 = &data_buf[0x0]; const uint8 *edid_blk1 = &data_buf[0x80]; const uint8 *svd = num_og_cea_blocks ? - hdmi_edid_find_block(data_buf+0x80, 2, &len) : NULL; + hdmi_edid_find_block(data_buf+0x80, DBC_START_OFFSET, + 2, &len) : NULL; + boolean has60hz_mode = FALSE; + boolean has50hz_mode = FALSE; + disp_mode_list->num_of_elements = 0; + disp_mode_list->disp_multi_3d_mode_list_cnt = 0; if (svd != NULL) { ++svd; for (i = 0; i < len; ++i, ++svd) { @@ -1249,6 +1662,28 @@ static void hdmi_edid_get_display_mode(c video_format = (*svd & 0x7F) - 1; add_supported_video_format(disp_mode_list, video_format); + /* Make a note of the preferred video format */ + if (i == 0) { + external_common_state->preferred_video_format = + video_format; + } + if (i < 16) { + disp_mode_list->disp_multi_3d_mode_list[i] + = video_format; + disp_mode_list->disp_multi_3d_mode_list_cnt++; + } + + if (video_format <= HDMI_VFRMT_1920x1080p60_16_9 || + video_format == HDMI_VFRMT_2880x480p60_4_3 || + video_format == HDMI_VFRMT_2880x480p60_16_9) + has60hz_mode = TRUE; + + if ((video_format >= HDMI_VFRMT_720x576p50_4_3 && + video_format <= HDMI_VFRMT_1920x1080p50_16_9) || + video_format == HDMI_VFRMT_2880x576p50_4_3 || + video_format == HDMI_VFRMT_2880x576p50_16_9 || + video_format == HDMI_VFRMT_1920x1250i50_16_9) + has50hz_mode = TRUE; if (video_format == HDMI_VFRMT_640x480p60_4_3) has480p = TRUE; } @@ -1271,6 +1706,11 @@ static void hdmi_edid_get_display_mode(c video_format); if (video_format == HDMI_VFRMT_640x480p60_4_3) has480p = TRUE; + /* Make a note of the preferred video format */ + if (i == 0) { + external_common_state->preferred_video_format = + video_format; + } desc_offset += 0x12; ++i; } @@ -1291,6 +1731,11 @@ static void hdmi_edid_get_display_mode(c video_format); if (video_format == HDMI_VFRMT_640x480p60_4_3) has480p = TRUE; + /* Make a note of the preferred video format */ + if (i == 0) { + external_common_state->preferred_video_format = + video_format; + } desc_offset += 0x12; ++i; } @@ -1314,11 +1759,46 @@ static void hdmi_edid_get_display_mode(c video_format); if (video_format == HDMI_VFRMT_640x480p60_4_3) has480p = TRUE; + /* Make a note of the preferred video format */ + if (i == 0) { + external_common_state->preferred_video_format = + video_format; + } desc_offset += 0x12; ++i; } } + /* mandaroty 3d format */ + if (external_common_state->present_3d) { + if (has60hz_mode) { + add_supported_3d_format(disp_mode_list, + HDMI_VFRMT_1920x1080p24_16_9, + FRAME_PACKING | TOP_AND_BOTTOM); + add_supported_3d_format(disp_mode_list, + HDMI_VFRMT_1280x720p60_16_9, + FRAME_PACKING | TOP_AND_BOTTOM); + add_supported_3d_format(disp_mode_list, + HDMI_VFRMT_1920x1080i60_16_9, + SIDE_BY_SIDE_HALF); + } + if (has50hz_mode) { + add_supported_3d_format(disp_mode_list, + HDMI_VFRMT_1920x1080p24_16_9, + FRAME_PACKING | TOP_AND_BOTTOM); + add_supported_3d_format(disp_mode_list, + HDMI_VFRMT_1280x720p50_16_9, + FRAME_PACKING | TOP_AND_BOTTOM); + add_supported_3d_format(disp_mode_list, + HDMI_VFRMT_1920x1080i50_16_9, + SIDE_BY_SIDE_HALF); + } + + /* 3d format described in Vendor Specific Data */ + hdmi_edid_get_display_vsd_3d_mode(data_buf, disp_mode_list, + num_og_cea_blocks); + } + if (!has480p) /* Need to add default 640 by 480 timings, in case not described * in the EDID structure. @@ -1392,6 +1872,10 @@ int hdmi_common_read_edid(void) /* EDID_BLOCK_SIZE[0x80] Each page size in the EDID ROM */ uint8 edid_buf[0x80 * 4]; + external_common_state->pt_scan_info = 0; + external_common_state->it_scan_info = 0; + external_common_state->ce_scan_info = 0; + external_common_state->preferred_video_format = 0; /* Default 2ch-audio */ external_common_state->audio_speaker_data = 2; external_common_state->present_3d = 0; @@ -1445,6 +1929,7 @@ int hdmi_common_read_edid(void) edid_buf+0x80); hdmi_edid_extract_audio_data_blocks(edid_buf+0x80); hdmi_edid_extract_3d_present(edid_buf+0x80); + hdmi_edid_extract_extended_data_blocks(edid_buf+0x80); } break; case 2: --- a/drivers/video/msm/external_common.h +++ b/drivers/video/msm/external_common.h @@ -194,6 +194,12 @@ extern struct hdmi_disp_mode_timing_type * device */ struct hdmi_disp_mode_list_type { uint32 disp_mode_list[HDMI_VFRMT_MAX]; +#define TOP_AND_BOTTOM 0x10 +#define FRAME_PACKING 0x20 +#define SIDE_BY_SIDE_HALF 0x40 + uint32 disp_3d_mode_list[HDMI_VFRMT_MAX]; + uint32 disp_multi_3d_mode_list[16]; + uint32 disp_multi_3d_mode_list_cnt; uint32 num_of_elements; }; #endif @@ -216,6 +222,13 @@ struct external_common_state_type { uint8 speaker_allocation_block; uint16 video_latency, audio_latency; uint8 audio_data_block_cnt; + uint16 physical_address; + uint32 preferred_video_format; + uint8 pt_scan_info; + uint8 it_scan_info; + uint8 ce_scan_info; + uint8 spd_vendor_name[8]; + uint8 spd_product_description[16]; boolean present_3d; boolean present_hdcp; uint32 audio_data_blocks[16]; @@ -250,6 +263,8 @@ const struct hdmi_disp_mode_timing_type const struct hdmi_disp_mode_timing_type *hdmi_mhl_get_supported_mode( uint32 mode); void hdmi_common_init_panel_info(struct msm_panel_info *pinfo); + +ssize_t video_3d_format_2string(uint32 format, char *buf); #endif int external_common_state_create(struct platform_device *pdev); --- a/drivers/video/msm/hdmi_msm.c +++ b/drivers/video/msm/hdmi_msm.c @@ -66,6 +66,7 @@ static DEFINE_MUTEX(hdcp_auth_state_mute static void hdmi_msm_dump_regs(const char *prefix); #ifdef CONFIG_FB_MSM_HDMI_MSM_PANEL_HDCP_SUPPORT +static void hdcp_deauthenticate(void); static void hdmi_msm_hdcp_enable(void); #else static inline void hdmi_msm_hdcp_enable(void) {} @@ -807,6 +808,9 @@ static void hdmi_msm_send_event(boolean if (on) { /* Build EDID table */ + cancel_work_sync(&hdmi_msm_state->hdcp_reauth_work); + if (hdmi_msm_state->full_auth_done) + hdcp_deauthenticate(); hdmi_msm_read_edid(); hdmi_msm_set_mode(FALSE); @@ -924,7 +928,6 @@ static void hdmi_msm_cec_latch_work(stru #endif #ifdef CONFIG_FB_MSM_HDMI_MSM_PANEL_HDCP_SUPPORT -static void hdcp_deauthenticate(void); static void hdmi_msm_hdcp_reauth_work(struct work_struct *work) { @@ -3991,6 +3994,7 @@ static void hdmi_msm_avi_info_frame(void uint32 regVal; int i; int mode = 0; + boolean use_ce_scan_info = TRUE; switch (external_common_state->video_resolution) { case HDMI_VFRMT_720x480p60_4_3: @@ -4056,6 +4060,48 @@ static void hdmi_msm_avi_info_frame(void /* Data Byte 01: 0 Y1 Y0 A0 B1 B0 S1 S0 */ aviInfoFrame[3] = hdmi_msm_avi_iframe_lut[0][mode]; + + /* + * If the sink specified support for both underscan/overscan + * then, by default, set the underscan bit. + * Only checking underscan support for preferred format and cea formats + */ + if ((external_common_state->video_resolution == + external_common_state->preferred_video_format)) { + use_ce_scan_info = FALSE; + switch (external_common_state->pt_scan_info) { + case 0: + /* + * Need to use the info specified for the corresponding + * IT or CE format + */ + DEV_DBG("%s: No underscan information specified for the" + " preferred video format\n", __func__); + use_ce_scan_info = TRUE; + break; + case 3: + DEV_DBG("%s: Setting underscan bit for the preferred" + " video format\n", __func__); + aviInfoFrame[3] |= 0x02; + break; + default: + DEV_DBG("%s: Underscan information not set for the" + " preferred video format\n", __func__); + break; + } + } + + if (use_ce_scan_info) { + if (3 == external_common_state->ce_scan_info) { + DEV_DBG("%s: Setting underscan bit for the CE video" + " format\n", __func__); + aviInfoFrame[3] |= 0x02; + } else { + DEV_DBG("%s: Not setting underscan bit for the CE video" + " format\n", __func__); + } + } + /* Data Byte 02: C1 C0 M1 M0 R3 R2 R1 R0 */ aviInfoFrame[4] = hdmi_msm_avi_iframe_lut[1][mode]; /* Data Byte 03: ITC EC2 EC1 EC0 Q1 Q0 SC1 SC0 */ @@ -4211,6 +4257,137 @@ static void hdmi_msm_switch_3d(boolean o } #endif +#define IFRAME_CHECKSUM_32(d) \ + ((d & 0xff) + ((d >> 8) & 0xff) + \ + ((d >> 16) & 0xff) + ((d >> 24) & 0xff)) + +static void hdmi_msm_spd_infoframe_packetsetup(void) +{ + uint32 packet_header = 0; + uint32 check_sum = 0; + uint32 packet_payload = 0; + uint32 packet_control = 0; + + uint8 *vendor_name = external_common_state->spd_vendor_name; + uint8 *product_description = + external_common_state->spd_product_description; + + /* 0x00A4 GENERIC1_HDR + * HB0 7:0 NUM + * HB1 15:8 NUM + * HB2 23:16 NUM */ + /* Setup Packet header and payload */ + /* 0x83 InfoFrame Type Code + 0x01 InfoFrame Version Number + 0x19 Length of Source Product Description InfoFrame + */ + packet_header = 0x83 | (0x01 << 8) | (0x19 << 16); + HDMI_OUTP(0x00A4, packet_header); + check_sum += IFRAME_CHECKSUM_32(packet_header); + + /* 0x00AC GENERIC1_1 + * BYTE4 7:0 VENDOR_NAME[3] + * BYTE5 15:8 VENDOR_NAME[4] + * BYTE6 23:16 VENDOR_NAME[5] + * BYTE7 31:24 VENDOR_NAME[6] */ + packet_payload = (vendor_name[3] & 0x7f) + | ((vendor_name[4] & 0x7f) << 8) + | ((vendor_name[5] & 0x7f) << 16) + | ((vendor_name[6] & 0x7f) << 24); + HDMI_OUTP(0x00AC, packet_payload); + check_sum += IFRAME_CHECKSUM_32(packet_payload); + + /* Product Description (7-bit ASCII code) */ + /* 0x00B0 GENERIC1_2 + * BYTE8 7:0 VENDOR_NAME[7] + * BYTE9 15:8 PRODUCT_NAME[ 0] + * BYTE10 23:16 PRODUCT_NAME[ 1] + * BYTE11 31:24 PRODUCT_NAME[ 2] */ + packet_payload = (vendor_name[7] & 0x7f) + | ((product_description[0] & 0x7f) << 8) + | ((product_description[1] & 0x7f) << 16) + | ((product_description[2] & 0x7f) << 24); + HDMI_OUTP(0x00B0, packet_payload); + check_sum += IFRAME_CHECKSUM_32(packet_payload); + + /* 0x00B4 GENERIC1_3 + * BYTE12 7:0 PRODUCT_NAME[ 3] + * BYTE13 15:8 PRODUCT_NAME[ 4] + * BYTE14 23:16 PRODUCT_NAME[ 5] + * BYTE15 31:24 PRODUCT_NAME[ 6] */ + packet_payload = (product_description[3] & 0x7f) + | ((product_description[4] & 0x7f) << 8) + | ((product_description[5] & 0x7f) << 16) + | ((product_description[6] & 0x7f) << 24); + HDMI_OUTP(0x00B4, packet_payload); + check_sum += IFRAME_CHECKSUM_32(packet_payload); + + /* 0x00B8 GENERIC1_4 + * BYTE16 7:0 PRODUCT_NAME[ 7] + * BYTE17 15:8 PRODUCT_NAME[ 8] + * BYTE18 23:16 PRODUCT_NAME[ 9] + * BYTE19 31:24 PRODUCT_NAME[10] */ + packet_payload = (product_description[7] & 0x7f) + | ((product_description[8] & 0x7f) << 8) + | ((product_description[9] & 0x7f) << 16) + | ((product_description[10] & 0x7f) << 24); + HDMI_OUTP(0x00B8, packet_payload); + check_sum += IFRAME_CHECKSUM_32(packet_payload); + + /* 0x00BC GENERIC1_5 + * BYTE20 7:0 PRODUCT_NAME[11] + * BYTE21 15:8 PRODUCT_NAME[12] + * BYTE22 23:16 PRODUCT_NAME[13] + * BYTE23 31:24 PRODUCT_NAME[14] */ + packet_payload = (product_description[11] & 0x7f) + | ((product_description[12] & 0x7f) << 8) + | ((product_description[13] & 0x7f) << 16) + | ((product_description[14] & 0x7f) << 24); + HDMI_OUTP(0x00BC, packet_payload); + check_sum += IFRAME_CHECKSUM_32(packet_payload); + + /* 0x00C0 GENERIC1_6 + * BYTE24 7:0 PRODUCT_NAME[15] + * BYTE25 15:8 Source Device Information + * BYTE26 23:16 NUM + * BYTE27 31:24 NUM */ + /* Source Device Information + * 00h unknown + * 01h Digital STB + * 02h DVD + * 03h D-VHS + * 04h HDD Video + * 05h DVC + * 06h DSC + * 07h Video CD + * 08h Game + * 09h PC general */ + packet_payload = (product_description[15] & 0x7f) | 0x00 << 8; + HDMI_OUTP(0x00C0, packet_payload); + check_sum += IFRAME_CHECKSUM_32(packet_payload); + + /* Vendor Name (7bit ASCII code) */ + /* 0x00A8 GENERIC1_0 + * BYTE0 7:0 CheckSum + * BYTE1 15:8 VENDOR_NAME[0] + * BYTE2 23:16 VENDOR_NAME[1] + * BYTE3 31:24 VENDOR_NAME[2] */ + packet_payload = ((vendor_name[0] & 0x7f) << 8) + | ((vendor_name[1] & 0x7f) << 16) + | ((vendor_name[2] & 0x7f) << 24); + check_sum += IFRAME_CHECKSUM_32(packet_payload); + packet_payload |= ((0x100 - (0xff & check_sum)) & 0xff); + HDMI_OUTP(0x00A8, packet_payload); + + /* GENERIC1_LINE | GENERIC1_CONT | GENERIC1_SEND + * Setup HDMI TX generic packet control + * Enable this packet to transmit every frame + * Enable HDMI TX engine to transmit Generic packet 1 */ + packet_control = HDMI_INP_ND(0x0034); + packet_control |= ((0x1 << 24) | (1 << 5) | (1 << 4)); + HDMI_OUTP(0x0034, packet_control); +} + int hdmi_msm_clk(int on) { int rc; @@ -4288,6 +4465,7 @@ static void hdmi_msm_turn_on(void) #ifdef CONFIG_FB_MSM_HDMI_3D hdmi_msm_vendor_infoframe_packetsetup(); #endif + hdmi_msm_spd_infoframe_packetsetup(); #ifdef CONFIG_FB_MSM_HDMI_MSM_PANEL_HDCP_SUPPORT if (hdmi_msm_state->reauth) { @@ -4424,7 +4602,6 @@ static int hdmi_msm_hpd_on(void) /* Set up HPD state variables */ mutex_lock(&external_common_state_hpd_mutex); - external_common_state->hpd_state = 0; hdmi_msm_state->hpd_state_in_isr = 0; mutex_unlock(&external_common_state_hpd_mutex); mutex_lock(&hdmi_msm_state_mutex); @@ -4899,6 +5076,10 @@ static int __init hdmi_msm_init(void) #ifdef CONFIG_FB_MSM_HDMI_3D external_common_state->switch_3d = hdmi_msm_switch_3d; #endif + memset(external_common_state->spd_vendor_name, 0, + sizeof(external_common_state->spd_vendor_name)); + memset(external_common_state->spd_product_description, 0, + sizeof(external_common_state->spd_product_description)); /* * Create your work queue --- a/drivers/video/msm/mddi_quickvx.c +++ b/drivers/video/msm/mddi_quickvx.c @@ -263,22 +263,10 @@ int ql_mddi_write(uint32 address, uint32 value) { - uint32 regval = 0; int ret = 0; ret = mddi_queue_register_write(address, value, TRUE, 0); - if (!ret) { - ret = mddi_queue_register_read(address, ®val, TRUE, 0); - if (regval != value) { - MDDI_MSG_DEBUG("\nMismatch: ql_mddi_write[0x%x]->0x%x " - "r0x%x\n", address, value, regval); - } else { - MDDI_MSG_DEBUG("\nMatch: ql_mddi_write[0x%x]->0x%x " - "r0x%x\n", address, value, regval); - } - } - return ret; } @@ -294,8 +282,6 @@ int ql_mddi_read(uint32 address, uint32 int ql_send_spi_cmd_to_lcd(uint32 index, uint32 cmd) { - int retry, ret; - uint32 readval; MDDI_MSG_DEBUG("\n %s(): index 0x%x, cmd 0x%x", __func__, index, cmd); /* do the index phase */ @@ -308,18 +294,6 @@ int ql_send_spi_cmd_to_lcd(uint32 index, /* set start */ ql_mddi_write(QUICKVX_SPI_CTRL_REG, QL_SPI_CTRL_LCD_START); - retry = 0; - - do { - ret = ql_mddi_read(QUICKVX_SPI_CTRL_REG, &readval); - - if (ret || ++retry > 5) { - MDDI_MSG_DEBUG("\n ql_send_spi_cmd_to_lcd: retry " - "timeout at index phase, ret = %d", ret); - return -EIO; - } - mddi_wait(1); - } while ((readval & QL_SPI_CTRL_MASK_rTxDone) == 0); /* do the command phase */ /* send 24 bits in the cmd phase */ @@ -331,18 +305,6 @@ int ql_send_spi_cmd_to_lcd(uint32 index, /* set start */ ql_mddi_write(QUICKVX_SPI_CTRL_REG, QL_SPI_CTRL_LCD_START); - retry = 0; - - do { - ret = ql_mddi_read(QUICKVX_SPI_CTRL_REG, &readval); - - if (ret || ++retry > 5) { - MDDI_MSG_DEBUG("\n ql_send_spi_cmd_to_lcd: retry " - "timeout at cmd phase, ret = %d", ret); - return -EIO; - } - mddi_wait(1); - } while ((readval & QL_SPI_CTRL_MASK_rTxDone) == 0); return 0; } @@ -350,8 +312,6 @@ int ql_send_spi_cmd_to_lcd(uint32 index, int ql_send_spi_data_from_lcd(uint32 index, uint32 *value) { - int retry, ret; - uint32 readval; MDDI_MSG_DEBUG("\n %s(): index 0x%x", __func__, index); /* do the index phase */ @@ -364,19 +324,6 @@ int ql_send_spi_data_from_lcd(uint32 ind /* set start */ ql_mddi_write(QUICKVX_SPI_CTRL_REG, QL_SPI_CTRL_LCD_START); - retry = 0; - - do { - ret = ql_mddi_read(QUICKVX_SPI_CTRL_REG, &readval); - - if (ret || ++retry > 5) { - MDDI_MSG_DEBUG("\n ql_send_spi_cmd_to_lcd: retry " - "timeout at index phase, ret = %d", ret); - return -EIO; - } - mddi_wait(1); - } while ((readval & QL_SPI_CTRL_MASK_rTxDone) == 0); - /* do the command phase */ /* send 8 bits and read 24 bits in the cmd phase, so total 32 bits */ ql_mddi_write(QUICKVX_SPI_TLEN_REG, 31); @@ -387,29 +334,9 @@ int ql_send_spi_data_from_lcd(uint32 ind /* set start */ ql_mddi_write(QUICKVX_SPI_CTRL_REG, QL_SPI_CTRL_LCD_START); - retry = 0; - - do { - ret = ql_mddi_read(QUICKVX_SPI_CTRL_REG, &readval); - if (ret || ++retry > 5) { - MDDI_MSG_DEBUG("\n ql_send_spi_cmd_to_lcd: retry " - "timeout at cmd phase, ret = %d", ret); - return -EIO; - } - mddi_wait(1); - } while ((readval & QL_SPI_CTRL_MASK_rTxDone) == 0); - - /* value will appear at lower 16 bits */ - ret = ql_mddi_read(QUICKVX_SPI_RX0_REG, value); - - if (!ret) { - *value = *value & 0xffff; - MDDI_MSG_DEBUG("\n QUICKVX_SPI_RX0_REG value = 0x%x", *value); - } else - MDDI_MSG_DEBUG("\n Read QUICKVX_SPI_RX0_REG Failed"); + return 0; - return ret; } /* Global Variables */ --- a/drivers/video/msm/mdp.c +++ b/drivers/video/msm/mdp.c @@ -94,6 +94,7 @@ struct workqueue_struct *mdp_dma_wq; /*m struct workqueue_struct *mdp_vsync_wq; /*mdp vsync wq */ struct workqueue_struct *mdp_hist_wq; /*mdp histogram wq */ +bool mdp_pp_initialized = FALSE; static struct workqueue_struct *mdp_pipe_ctrl_wq; /* mdp mdp pipe ctrl wq */ static struct delayed_work mdp_pipe_ctrl_worker; @@ -225,10 +226,28 @@ static void mdp_hist_lut_init_mgmt(struc mutex_unlock(&mdp_hist_lut_list_mutex); } -static int mdp_hist_lut_init(void) +static int mdp_hist_lut_destroy(void) { struct mdp_hist_lut_mgmt *temp; struct list_head *pos, *q; + + mutex_lock(&mdp_hist_lut_list_mutex); + list_for_each_safe(pos, q, &mdp_hist_lut_list) { + temp = list_entry(pos, struct mdp_hist_lut_mgmt, list); + list_del(pos); + kfree(temp); + } + mutex_unlock(&mdp_hist_lut_list_mutex); + return 0; +} + +static int mdp_hist_lut_init(void) +{ + struct mdp_hist_lut_mgmt *temp; + + if (mdp_pp_initialized) + return -EEXIST; + INIT_LIST_HEAD(&mdp_hist_lut_list); if (mdp_rev >= MDP_REV_30) { @@ -259,13 +278,7 @@ static int mdp_hist_lut_init(void) return 0; exit_list: - mutex_lock(&mdp_hist_lut_list_mutex); - list_for_each_safe(pos, q, &mdp_hist_lut_list) { - temp = list_entry(pos, struct mdp_hist_lut_mgmt, list); - list_del(pos); - kfree(temp); - } - mutex_unlock(&mdp_hist_lut_list_mutex); + mdp_hist_lut_destroy(); exit: pr_err("Failed initializing histogram LUT memory\n"); return -ENOMEM; @@ -666,6 +679,7 @@ static int mdp_hist_init_mgmt(struct mdp goto error_extra; INIT_WORK(&mgmt->mdp_histogram_worker, mdp_hist_read_work); + mgmt->hist = NULL; mdp_hist_mgmt_array[index] = mgmt; return 0; @@ -688,11 +702,32 @@ static void mdp_hist_del_mgmt(struct mdp kfree(mgmt->c0); } +static int mdp_histogram_destroy(void) +{ + struct mdp_hist_mgmt *temp; + int i; + + for (i = 0; i < MDP_HIST_MGMT_MAX; i++) { + temp = mdp_hist_mgmt_array[i]; + if (!temp) + continue; + mdp_hist_del_mgmt(temp); + kfree(temp); + mdp_hist_mgmt_array[i] = NULL; + } + return 0; +} + static int mdp_histogram_init(void) { struct mdp_hist_mgmt *temp; int i, ret; - mdp_hist_wq = alloc_workqueue("mdp_hist_wq", WQ_UNBOUND, 0); + + if (mdp_pp_initialized) + return -EEXIST; + + mdp_hist_wq = alloc_workqueue("mdp_hist_wq", + WQ_NON_REENTRANT | WQ_UNBOUND, 0); for (i = 0; i < MDP_HIST_MGMT_MAX; i++) mdp_hist_mgmt_array[i] = NULL; @@ -736,14 +771,7 @@ static int mdp_histogram_init(void) return 0; exit_list: - for (i = 0; i < MDP_HIST_MGMT_MAX; i++) { - temp = mdp_hist_mgmt_array[i]; - if (!temp) - continue; - mdp_hist_del_mgmt(temp); - kfree(temp); - mdp_hist_mgmt_array[i] = NULL; - } + mdp_histogram_destroy(); exit: return -ENOMEM; } @@ -826,7 +854,11 @@ static int mdp_histogram_disable(struct MDP_OUTP(base + 0x0018, INTR_HIST_DONE | INTR_HIST_RESET_SEQ_DONE); mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE); - complete(&mgmt->mdp_hist_comp); + if (mgmt->hist != NULL) { + mgmt->hist = NULL; + complete(&mgmt->mdp_hist_comp); + } + mdp_disable_irq(mgmt->irq_term); return 0; } @@ -893,6 +925,7 @@ int mdp_histogram_start(struct mdp_histo goto error; } + mutex_lock(&mgmt->mdp_do_hist_mutex); mutex_lock(&mgmt->mdp_hist_mutex); if (mgmt->mdp_is_hist_start == TRUE) { pr_err("%s histogram already started\n", __func__); @@ -911,6 +944,7 @@ int mdp_histogram_start(struct mdp_histo error_lock: mutex_unlock(&mgmt->mdp_hist_mutex); + mutex_unlock(&mgmt->mdp_do_hist_mutex); error: return ret; } @@ -927,6 +961,7 @@ int mdp_histogram_stop(struct fb_info *i goto error; } + mutex_lock(&mgmt->mdp_do_hist_mutex); mutex_lock(&mgmt->mdp_hist_mutex); if (mgmt->mdp_is_hist_start == FALSE) { pr_err("%s histogram already stopped\n", __func__); @@ -938,7 +973,10 @@ int mdp_histogram_stop(struct fb_info *i if (!mfd->panel_power_on) { mgmt->mdp_is_hist_data = FALSE; - complete(&mgmt->mdp_hist_comp); + if (mgmt->hist != NULL) { + mgmt->hist = NULL; + complete(&mgmt->mdp_hist_comp); + } ret = -EINVAL; goto error_lock; } @@ -947,10 +985,12 @@ int mdp_histogram_stop(struct fb_info *i mutex_unlock(&mgmt->mdp_hist_mutex); cancel_work_sync(&mgmt->mdp_histogram_worker); + mutex_unlock(&mgmt->mdp_do_hist_mutex); return ret; error_lock: mutex_unlock(&mgmt->mdp_hist_mutex); + mutex_unlock(&mgmt->mdp_do_hist_mutex); error: return ret; } @@ -1072,25 +1112,39 @@ static void mdp_hist_read_work(struct wo goto error; } - switch (mgmt->block) { - case MDP_BLOCK_DMA_P: - case MDP_BLOCK_DMA_S: - ret = _mdp_histogram_read_dma_data(mgmt); - break; - case MDP_BLOCK_VG_1: - case MDP_BLOCK_VG_2: - ret = _mdp_histogram_read_vg_data(mgmt); - break; - default: - pr_err("%s, invalid MDP block = %d\n", __func__, mgmt->block); + if (mgmt->hist == NULL) { + if ((mgmt->mdp_is_hist_init == TRUE) && + ((!completion_done(&mgmt->mdp_hist_comp)) && + waitqueue_active(&mgmt->mdp_hist_comp.wait))) + pr_err("mgmt->hist invalid NULL\n"); ret = -EINVAL; - goto error; } - /* if read was triggered by an underrun, don't wake up readers*/ - if (mgmt->mdp_is_hist_valid && mgmt->mdp_is_hist_init) { + if (!ret) { + switch (mgmt->block) { + case MDP_BLOCK_DMA_P: + case MDP_BLOCK_DMA_S: + ret = _mdp_histogram_read_dma_data(mgmt); + break; + case MDP_BLOCK_VG_1: + case MDP_BLOCK_VG_2: + ret = _mdp_histogram_read_vg_data(mgmt); + break; + default: + pr_err("%s, invalid MDP block = %d\n", __func__, + mgmt->block); + ret = -EINVAL; + goto error; + } + } + /* + * if read was triggered by an underrun or failed copying, + * don't wake up readers + */ + if (!ret && mgmt->mdp_is_hist_valid && mgmt->mdp_is_hist_init) { mgmt->hist = NULL; - complete(&mgmt->mdp_hist_comp); + if (waitqueue_active(&mgmt->mdp_hist_comp.wait)) + complete(&mgmt->mdp_hist_comp); } if (mgmt->mdp_is_hist_valid == FALSE) @@ -1143,11 +1197,13 @@ err: return ret; } +#define MDP_HISTOGRAM_TIMEOUT_MS 84 /*5 Frames*/ static int mdp_do_histogram(struct fb_info *info, struct mdp_histogram_data *hist) { struct mdp_hist_mgmt *mgmt = NULL; int ret = 0; + unsigned long timeout = (MDP_HISTOGRAM_TIMEOUT_MS * HZ) / 1000; ret = mdp_histogram_block2mgmt(hist->block, &mgmt); if (ret) { @@ -1184,12 +1240,26 @@ static int mdp_do_histogram(struct fb_in goto error_lock; } + if (mgmt->hist != NULL) { + pr_err("%s; histogram attempted to be read twice\n", __func__); + ret = -EPERM; + goto error_lock; + } + INIT_COMPLETION(mgmt->mdp_hist_comp); mgmt->hist = hist; mutex_unlock(&mgmt->mdp_hist_mutex); - if (wait_for_completion_killable(&mgmt->mdp_hist_comp)) { - pr_err("%s(): histogram bin collection killed", __func__); - ret = -EINVAL; + ret = wait_for_completion_killable_timeout(&mgmt->mdp_hist_comp, + timeout); + if (ret <= 0) { + if (!ret) { + mgmt->hist = NULL; + ret = -ETIMEDOUT; + pr_debug("%s: bin collection timedout", __func__); + } else { + mgmt->hist = NULL; + pr_debug("%s: bin collection interrupted", __func__); + } goto error; } @@ -1686,15 +1756,7 @@ void mdp_histogram_handle_isr(struct mdp __mdp_histogram_kickoff(mgmt); if (isr & INTR_HIST_DONE) { - if (waitqueue_active(&mgmt->mdp_hist_comp.wait)) { - if (!queue_work(mdp_hist_wq, - &mgmt->mdp_histogram_worker)) { - pr_err("%s %d- can't queue hist_read\n", - __func__, mgmt->block); - } - } else { - __mdp_histogram_reset(mgmt); - } + queue_work(mdp_hist_wq, &mgmt->mdp_histogram_worker); } } @@ -1868,7 +1930,6 @@ static void mdp_drv_init(void) #endif mdp_dma_wq = create_singlethread_workqueue("mdp_dma_wq"); mdp_vsync_wq = create_singlethread_workqueue("mdp_vsync_wq"); - mdp_hist_wq = create_singlethread_workqueue("mdp_hist_wq"); mdp_pipe_ctrl_wq = create_singlethread_workqueue("mdp_pipe_ctrl_wq"); INIT_DELAYED_WORK(&mdp_pipe_ctrl_worker, mdp_pipe_ctrl_workqueue_handler); @@ -2008,6 +2069,8 @@ static int mdp_off(struct platform_devic mfd->panel.type == LCDC_PANEL || mfd->panel.type == LVDS_PANEL) mdp4_lcdc_off(pdev); + else if (mfd->panel.type == MDDI_PANEL) + mdp4_mddi_off(pdev); mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE); ret = panel_next_off(pdev); @@ -2020,6 +2083,18 @@ static int mdp_off(struct platform_devic return ret; } +#ifdef CONFIG_FB_MSM_MDP303 +unsigned is_mdp4_hw_reset(void) +{ + return 0; +} +void mdp4_hw_init(void) +{ + /* empty */ +} + +#endif + static int mdp_on(struct platform_device *pdev) { int ret = 0; @@ -2028,24 +2103,29 @@ static int mdp_on(struct platform_device pr_debug("%s:+\n", __func__); -#ifdef CONFIG_FB_MSM_MDP40 - mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE); - mdp_clk_ctrl(1); - mdp4_hw_init(); - outpdw(MDP_BASE + 0x0038, mdp4_display_intf); - if (mfd->panel.type == MIPI_CMD_PANEL) { - mdp_vsync_cfg_regs(mfd, FALSE); - mdp4_dsi_cmd_on(pdev); - } else if (mfd->panel.type == MIPI_VIDEO_PANEL) - mdp4_dsi_video_on(pdev); - else if (mfd->panel.type == HDMI_PANEL || - mfd->panel.type == LCDC_PANEL || - mfd->panel.type == LVDS_PANEL) - mdp4_lcdc_on(pdev); + if (mdp_rev >= MDP_REV_40) { + mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE); + mdp_clk_ctrl(1); + mdp4_hw_init(); + outpdw(MDP_BASE + 0x0038, mdp4_display_intf); + if (mfd->panel.type == MIPI_CMD_PANEL) { + mdp_vsync_cfg_regs(mfd, FALSE); + mdp4_dsi_cmd_on(pdev); + } else if (mfd->panel.type == MIPI_VIDEO_PANEL) { + mdp4_dsi_video_on(pdev); + } else if (mfd->panel.type == HDMI_PANEL || + mfd->panel.type == LCDC_PANEL || + mfd->panel.type == LVDS_PANEL) { + mdp4_lcdc_on(pdev); + } else if (mfd->panel.type == MDDI_PANEL) { + mdp_vsync_cfg_regs(mfd, FALSE); + mdp4_mddi_on(pdev); + } + + mdp_clk_ctrl(0); + mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE); + } - mdp_clk_ctrl(0); - mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE); -#endif if ((mdp_rev == MDP_REV_303) && (mfd->panel.type == MIPI_CMD_PANEL)) @@ -2353,6 +2433,7 @@ static int mdp_probe(struct platform_dev /* initialize Post Processing data*/ mdp_hist_lut_init(); mdp_histogram_init(); + mdp_pp_initialized = TRUE; /* add panel data */ if (platform_device_add_data @@ -2388,6 +2469,9 @@ static int mdp_probe(struct platform_dev mdp_vsync_resync_workqueue_handler); mfd->hw_refresh = FALSE; + if(mfd->panel.type == MDDI_PANEL) + mdp4_mddi_rdptr_init(0); + if (mfd->panel.type == EXT_MDDI_PANEL) { /* 15 fps -> 66 msec */ mfd->refresh_timer_duration = (66 * HZ / 1000); @@ -2476,6 +2560,7 @@ static int mdp_probe(struct platform_dev else { printk(KERN_ERR "Invalid Selection of destination panel\n"); rc = -ENODEV; + mdp_clk_ctrl(0); goto mdp_probe_err; } @@ -2518,6 +2603,7 @@ static int mdp_probe(struct platform_dev else { printk(KERN_ERR "Invalid Selection of destination panel\n"); rc = -ENODEV; + mdp_clk_ctrl(0); goto mdp_probe_err; } INIT_WORK(&mfd->dma_update_worker, @@ -2610,6 +2696,7 @@ static int mdp_probe(struct platform_dev pr_err("%s: writeback panel not supprted\n", __func__); platform_device_put(msm_fb_dev); + mdp_clk_ctrl(0); return -ENODEV; } pdata->on = mdp4_overlay_writeback_on; @@ -2777,6 +2864,12 @@ static int mdp_remove(struct platform_de { if (footswitch != NULL) regulator_put(footswitch); + + /*free post processing memory*/ + mdp_histogram_destroy(); + mdp_hist_lut_destroy(); + mdp_pp_initialized = FALSE; + iounmap(msm_mdp_base); pm_runtime_disable(&pdev->dev); #ifdef CONFIG_MSM_BUS_SCALING --- a/drivers/video/msm/mdp.h +++ b/drivers/video/msm/mdp.h @@ -792,6 +792,10 @@ static inline int mdp4_lcdc_off(struct p { return 0; } +static inline int mdp4_mddi_off(struct platform_device *pdev) +{ + return 0; +} static inline int mdp4_dsi_cmd_on(struct platform_device *pdev) { return 0; @@ -804,6 +808,19 @@ static inline int mdp4_lcdc_on(struct pl { return 0; } +static inline int mdp4_mddi_on(struct platform_device *pdev) +{ + return 0; +} +#endif + + +#ifndef CONFIG_FB_MSM_MDDI +static inline void mdp4_mddi_rdptr_init(int cndx) +{ + /* empty */ +} + #endif void set_cont_splashScreen_status(int); --- a/drivers/video/msm/mdp4.h +++ b/drivers/video/msm/mdp4.h @@ -638,9 +638,10 @@ void mdp4_overlay_dmae_xy(struct mdp4_ov int mdp4_overlay_pipe_staged(int mixer); void mdp4_lcdc_primary_vsyn(void); void mdp4_overlay0_done_lcdc(int cndx); -void mdp4_overlay0_done_mddi(struct mdp_dma_data *dma); +void mdp4_overlay0_done_mddi(int cndx); void mdp4_dma_p_done_mddi(struct mdp_dma_data *dma); void mdp4_dmap_done_dsi_cmd(int cndx); +void mdp4_dmap_done_mddi(int cndx); void mdp4_dmap_done_dsi_video(int cndx); void mdp4_dmap_done_lcdc(int cndx); void mdp4_overlay1_done_dtv(void); @@ -726,6 +727,12 @@ void mdp4_dsi_cmd_overlay_blt(struct msm void mdp4_dsi_video_overlay_blt(struct msm_fb_data_type *mfd, struct msmfb_overlay_blt *req); void mdp4_dsi_video_base_swap(int cndx, struct mdp4_overlay_pipe *pipe); +static inline void mdp4_mddi_blt_start(struct msm_fb_data_type *mfd) +{ +} +static inline void mdp4_mddi_blt_stop(struct msm_fb_data_type *mfd) +{ +} #ifdef CONFIG_FB_MSM_MDP40 static inline void mdp3_dsi_cmd_dma_busy_wait(struct msm_fb_data_type *mfd) @@ -734,6 +741,8 @@ static inline void mdp3_dsi_cmd_dma_busy } #endif #else /* CONFIG_FB_MSM_MIPI_DSI */ +void mdp4_mddi_blt_start(struct msm_fb_data_type *mfd); +void mdp4_mddi_blt_stop(struct msm_fb_data_type *mfd); int mdp4_mddi_overlay_blt_offset(struct msm_fb_data_type *mfd, struct msmfb_overlay_blt *req); void mdp4_mddi_overlay_blt(struct msm_fb_data_type *mfd, @@ -741,6 +750,7 @@ void mdp4_mddi_overlay_blt(struct msm_fb int mdp4_mddi_overlay_blt_start(struct msm_fb_data_type *mfd); int mdp4_mddi_overlay_blt_stop(struct msm_fb_data_type *mfd); void mdp4_mddi_blt_dmap_busy_wait(struct msm_fb_data_type *mfd); +void mdp4_mddi_rdptr_init(int cndx); static inline int mdp4_dsi_overlay_blt_start(struct msm_fb_data_type *mfd) { return -ENODEV; @@ -777,6 +787,14 @@ static inline void mdp4_dsi_video_base_s { /* empty */ } +static inline void mdp4_dsi_cmd_blt_start(struct msm_fb_data_type *mfd) +{ + /* empty */ +} +static inline void mdp4_dsi_cmd_blt_stop(struct msm_fb_data_type *mfd) +{ + /* empty */ +} #endif /* CONFIG_FB_MSM_MIPI_DSI */ void mdp4_lcdc_overlay_blt(struct msm_fb_data_type *mfd, @@ -823,11 +841,35 @@ static inline void mdp4_dsi_cmd_del_time { /* empty */ } -#else /* CONFIG_FB_MSM_MIPI_DSI */ +#else /* CONFIG_FB_MSM_MDP303 */ void mdp4_dsi_cmd_del_timer(void); +static inline int mdp4_mddi_on(struct platform_device *pdev) +{ + return 0; +} +static inline int mdp4_mddi_off(struct platform_device *pdev) +{ + return 0; +} +static inline void mdp4_mddi_wait4vsync(int cndx, long long *vtime) +{ +} +static inline void mdp4_mddi_vsync_ctrl(struct fb_info *info, int enable) +{ +} +static inline void mdp4_mddi_pipe_queue(int cndx, + struct mdp4_overlay_pipe *pipe) +{ +} #endif #else /* CONFIG_FB_MSM_MIPI_DSI */ +int mdp4_mddi_off(struct platform_device *pdev); +int mdp4_mddi_on(struct platform_device *pdev); +void mdp4_mddi_wait4vsync(int cndx, long long *vtime); +void mdp4_mddi_vsync_ctrl(struct fb_info *info, int enable); +void mdp4_mddi_pipe_queue(int cndx, struct mdp4_overlay_pipe *pipe); + static inline int mdp4_dsi_cmd_on(struct platform_device *pdev) { return 0; @@ -866,7 +908,7 @@ static inline void mdp4_dsi_video_pipe_q { } static inline void mdp4_dsi_cmd_vsync_ctrl(struct fb_info *info, - int enable) + int enable) { } static inline void mdp4_dsi_video_vsync_ctrl(struct fb_info *info, @@ -952,7 +994,7 @@ void mdp4_csc_write(struct mdp_csc_cfg * int mdp4_csc_enable(struct mdp_csc_cfg_data *config); int mdp4_pcc_cfg(struct mdp_pcc_cfg_data *cfg_ptr); int mdp4_argc_cfg(struct mdp_pgc_lut_data *pgc_ptr); - +int mdp4_qseed_cfg(struct mdp_qseed_cfg_data *cfg); u32 mdp4_allocate_writeback_buf(struct msm_fb_data_type *mfd, u32 mix_num); void mdp4_init_writeback_buf(struct msm_fb_data_type *mfd, u32 mix_num); void mdp4_free_writeback_buf(struct msm_fb_data_type *mfd, u32 mix_num); --- a/drivers/video/msm/mdp4_overlay.c +++ b/drivers/video/msm/mdp4_overlay.c @@ -2063,12 +2063,11 @@ void mdp4_mixer_blend_setup(int mixer) } /* alpha channel is lost on VG pipe when using QSEED or M/N */ if (s_pipe->pipe_type == OVERLAY_TYPE_VIDEO && - ((s_pipe->op_mode & MDP4_OP_SCALEY_EN) || - (s_pipe->op_mode & MDP4_OP_SCALEX_EN)) && - !(s_pipe->op_mode & (MDP4_OP_SCALEX_PIXEL_RPT | MDP4_OP_SCALEY_PIXEL_RPT))) + s_pipe->alpha_enable && + (s_pipe->op_mode & (MDP4_OP_SCALEY_EN | MDP4_OP_SCALEX_EN)) && + !(s_pipe->op_mode & (MDP4_OP_SCALEY_PIXEL_RPT | MDP4_OP_SCALEX_PIXEL_RPT))) alpha_drop = 1; - d_pipe = mdp4_background_layer(mixer, s_pipe); d_alpha = d_pipe->alpha_enable; s_alpha = s_pipe->alpha_enable; @@ -2092,25 +2091,28 @@ void mdp4_mixer_blend_setup(int mixer) } else if (s_alpha) { if (!alpha_drop) { blend->op = MDP4_BLEND_BG_ALPHA_FG_PIXEL; - if ((!(s_pipe->flags & MDP_BLEND_FG_PREMULT)) && - ((i != MDP4_MIXER_STAGE0) || (!base_premulti))) - blend->op |= MDP4_BLEND_FG_ALPHA_FG_PIXEL; - else - blend->fg_alpha = 0xff; + if (!(s_pipe->flags & MDP_BLEND_FG_PREMULT)) + blend->op |= + MDP4_BLEND_FG_ALPHA_FG_PIXEL; } else blend->op = MDP4_BLEND_BG_ALPHA_FG_CONST; + blend->op |= MDP4_BLEND_BG_INV_ALPHA; } else if (d_alpha) { ptype = mdp4_overlay_format2type(s_pipe->src_format); if (ptype == OVERLAY_TYPE_VIDEO) { blend->op = (MDP4_BLEND_FG_ALPHA_BG_PIXEL | - MDP4_BLEND_FG_INV_ALPHA); - if ((!(s_pipe->flags & MDP_BLEND_FG_PREMULT)) && - ((i != MDP4_MIXER_STAGE0) || (!base_premulti))) - blend->op |= MDP4_BLEND_BG_ALPHA_BG_PIXEL; - else - blend->fg_alpha = 0xff; + MDP4_BLEND_FG_INV_ALPHA); + if (!(s_pipe->flags & MDP_BLEND_FG_PREMULT)) + blend->op |= + MDP4_BLEND_BG_ALPHA_BG_PIXEL; blend->co3_sel = 0; /* use bg alpha */ + if(mixer == MDP4_MIXER2 && (s_pipe->flags & MDP_WFD_NO_VIDEO_ON_EXTERNAL)) { + blend->op = (MDP4_BLEND_FG_ALPHA_FG_CONST | + MDP4_BLEND_BG_ALPHA_BG_CONST); + blend->bg_alpha = 0xff; + blend->fg_alpha = 0x00; + } } else { /* s_pipe is rgb without alpha */ blend->op = (MDP4_BLEND_FG_ALPHA_FG_CONST | @@ -2915,6 +2917,11 @@ void mdp4_overlay_mdp_perf_upd(struct ms if (!mdp4_extn_disp) perf_cur->use_ov1_blt = 0; +#if defined(CONFIG_FB_MSM_MIPI_NOVATEK_BOE_CMD_WVGA_PT) \ + || defined(CONFIG_FB_MSM_MIPI_NOVATEK_CMD_WVGA_PT_PANE) + /* don't use blt mode in CMD panel */ + perf_req->use_ov0_blt = 0; +#endif if (flag) { if (perf_req->mdp_clk_rate > perf_cur->mdp_clk_rate) { mdp_set_core_clk(perf_req->mdp_clk_rate); @@ -2949,6 +2956,8 @@ void mdp4_overlay_mdp_perf_upd(struct ms mdp4_dsi_video_blt_start(mfd); else if (ctrl->panel_mode & MDP4_PANEL_DSI_CMD) mdp4_dsi_cmd_blt_start(mfd); + else if (ctrl->panel_mode & MDP4_PANEL_MDDI) + mdp4_mddi_blt_start(mfd); pr_info("%s mixer0 start blt [%d] from %d to %d.\n", __func__, flag, @@ -2997,6 +3006,8 @@ void mdp4_overlay_mdp_perf_upd(struct ms mdp4_dsi_video_blt_stop(mfd); else if (ctrl->panel_mode & MDP4_PANEL_DSI_CMD) mdp4_dsi_cmd_blt_stop(mfd); + else if (ctrl->panel_mode & MDP4_PANEL_MDDI) + mdp4_mddi_blt_stop(mfd); pr_info("%s mixer0 stop blt [%d] from %d to %d.\n", __func__, flag, @@ -3285,19 +3296,12 @@ int mdp4_overlay_unset(struct fb_info *i else { /* mixer 0 */ ctrl->mixer0_played = 0; - if (ctrl->panel_mode & MDP4_PANEL_MDDI) { - if (mfd->panel_power_on) - mdp4_mddi_blt_dmap_busy_wait(mfd); - } + } mdp4_overlay_reg_flush(pipe, 1); mdp4_mixer_stage_down(pipe, 0); if (pipe->mixer_num == MDP4_MIXER0) { - if (ctrl->panel_mode & MDP4_PANEL_MDDI) { - if (mfd->panel_power_on) - mdp4_mddi_overlay_restore(); - } } else { /* mixer1, DTV, ATV */ if (ctrl->panel_mode & MDP4_PANEL_DTV) mdp4_overlay_dtv_unset(mfd, pipe); @@ -3329,6 +3333,8 @@ int mdp4_overlay_wait4vsync(struct fb_in mdp4_dsi_cmd_wait4vsync(0, vtime); else if (ctrl->panel_mode & MDP4_PANEL_LCDC) mdp4_lcdc_wait4vsync(0, vtime); + else if (ctrl->panel_mode & MDP4_PANEL_MDDI) + mdp4_mddi_wait4vsync(0, vtime); } else if (hdmi_prim_display || info->node == 1) { mdp4_dtv_wait4vsync(0, vtime); } @@ -3352,6 +3358,8 @@ int mdp4_overlay_vsync_ctrl(struct fb_in mdp4_dsi_cmd_vsync_ctrl(info, cmd); else if (ctrl->panel_mode & MDP4_PANEL_LCDC) mdp4_lcdc_vsync_ctrl(info, cmd); + else if (ctrl->panel_mode & MDP4_PANEL_MDDI) + mdp4_mddi_vsync_ctrl(info, cmd); } else if (hdmi_prim_display || info->node == 1) { mdp4_dtv_vsync_ctrl(info, cmd); } @@ -3427,7 +3435,7 @@ void mdp4_overlay_vsync_commit(struct md pr_debug("%s: pipe=%x ndx=%d num=%d used=%d\n", __func__, (int) pipe, pipe->pipe_ndx, pipe->pipe_num, pipe->pipe_used); mdp4_overlay_reg_flush(pipe, 1); - mdp4_mixer_stage_up(pipe, 1); + mdp4_mixer_stage_up(pipe, 0); } int mdp4_overlay_play(struct fb_info *info, struct msmfb_overlay_data *req) @@ -3572,8 +3580,8 @@ int mdp4_overlay_play(struct fb_info *in mdp4_overlay_mdp_perf_req(mfd, ctrl->plist); - if (pipe->mixer_num == MDP4_MIXER2 || ctrl->panel_mode & MDP4_PANEL_MDDI) - goto mddi; + if (pipe->mixer_num == MDP4_MIXER2) + goto mixer2_cfg; if (pipe->mixer_num == MDP4_MIXER0) { if (ctrl->panel_mode & MDP4_PANEL_DSI_CMD) { @@ -3586,6 +3594,10 @@ int mdp4_overlay_play(struct fb_info *in /* cndx = 0 */ mdp4_lcdc_pipe_queue(0, pipe); } + if (ctrl->panel_mode & MDP4_PANEL_MDDI) { + /* cndx = 0 */ + mdp4_mddi_pipe_queue(0, pipe); + } } else if (pipe->mixer_num == MDP4_MIXER1) { #ifdef CONFIG_FB_MSM_DTV if (ctrl->panel_mode & MDP4_PANEL_DTV) @@ -3596,7 +3608,7 @@ int mdp4_overlay_play(struct fb_info *in mutex_unlock(&mfd->dma->ov_mutex); return ret; -mddi: +mixer2_cfg: if (pipe->pipe_type == OVERLAY_TYPE_VIDEO) { mdp4_overlay_vg_setup(pipe); /* video/graphic pipe */ } else { @@ -3612,17 +3624,7 @@ mddi: mdp4_writeback_kickoff_video(mfd, pipe); } #endif - } else if (ctrl->panel_mode & MDP4_PANEL_MDDI) { - if (pipe->flags & MDP_OV_PLAY_NOWAIT) { - mdp4_stat.overlay_play[pipe->mixer_num]++; - mutex_unlock(&mfd->dma->ov_mutex); - goto end; - } - mdp4_mixer_stage_commit(pipe->mixer_num); - mdp4_mddi_dma_busy_wait(mfd); - mdp4_mddi_kickoff_video(mfd, pipe); } - if (!(pipe->flags & MDP_OV_PLAY_NOWAIT)) mdp4_iommu_unmap(pipe); mdp4_stat.overlay_play[pipe->mixer_num]++; @@ -3868,6 +3870,7 @@ int mdp4_v4l2_overlay_play(struct fb_inf mdp4_mixer_stage_up(pipe, 0); /* mixer stage commit commits this */ mdp4_mixer_stage_commit(pipe->mixer_num); + #ifdef V4L2_VSYNC /* * TODO: incorporate v4l2 into vsycn driven mechanism --- a/drivers/video/msm/mdp4_overlay_atv.c +++ b/drivers/video/msm/mdp4_overlay_atv.c @@ -187,6 +187,7 @@ void mdp4_atv_overlay(struct msm_fb_data mdp4_overlay_mdp_perf_req(pipe, mfd); mdp4_overlay_mdp_perf_upd(mfd, 1); mdp4_overlay_rgb_setup(pipe); + mdp4_overlay_reg_flush(pipe, 0); mdp4_mixer_stage_up(pipe, 0); mdp4_mixer_stage_commit(pipe->mixer_num); --- a/drivers/video/msm/mdp4_overlay_dtv.c +++ b/drivers/video/msm/mdp4_overlay_dtv.c @@ -797,6 +797,7 @@ static void mdp4_overlay_dtv_alloc_pipe( mdp4_overlay_reg_flush(pipe, 1); mdp4_mixer_stage_up(pipe, 0); mdp4_mixer_stage_commit(pipe->mixer_num); + vctrl->base_pipe = pipe; /* keep it */ } @@ -909,6 +910,7 @@ void mdp4_dmae_done_dtv(void) complete_all(&vctrl->dmae_comp); mdp4_overlay_dma_commit(MDP4_MIXER1); + vsync_irq_disable(INTR_DMA_E_DONE, MDP_DMA_E_TERM); spin_unlock(&vctrl->spin_lock); } @@ -964,6 +966,7 @@ void mdp4_dtv_set_black_screen(void) temp_src_format = inpdw(rgb_base + 0x0050); MDP_OUTP(rgb_base + 0x0050, temp_src_format | BIT(22)); mdp4_overlay_reg_flush(vctrl->base_pipe, 1); + mdp4_mixer_stage_up(vctrl->base_pipe, 0); mdp4_mixer_stage_commit(vctrl->base_pipe->mixer_num); mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE); --- a/drivers/video/msm/mdp4_overlay_lcdc.c +++ b/drivers/video/msm/mdp4_overlay_lcdc.c @@ -665,6 +665,8 @@ int mdp4_lcdc_off(struct platform_device struct msm_fb_data_type *mfd; struct vsycn_ctrl *vctrl; struct mdp4_overlay_pipe *pipe; + unsigned long flags; + int need_wait = 0; mfd = (struct msm_fb_data_type *)platform_get_drvdata(pdev); vctrl = &vsync_ctrl_db[cndx]; @@ -675,7 +677,14 @@ int mdp4_lcdc_off(struct platform_device msleep(20); /* >= 17 ms */ - complete_all(&vctrl->vsync_comp); + if (pipe->ov_blt_addr) { + spin_lock_irqsave(&vctrl->spin_lock, flags); + if (vctrl->ov_koff != vctrl->ov_done) + need_wait = 1; + spin_unlock_irqrestore(&vctrl->spin_lock, flags); + if (need_wait) + mdp4_lcdc_wait4ov(0); + } MDP_OUTP(MDP_BASE + LCDC_BASE, 0); @@ -938,7 +947,6 @@ void mdp4_lcdc_overlay(struct msm_fb_dat mdp4_overlay_mdp_perf_upd(mfd, 1); - mutex_lock(&mfd->dma->ov_mutex); mdp4_lcdc_pipe_commit(0, 0); mutex_unlock(&mfd->dma->ov_mutex); --- a/drivers/video/msm/mdp4_overlay_mddi.c +++ b/drivers/video/msm/mdp4_overlay_mddi.c @@ -17,721 +17,1055 @@ #include #include #include -#include #include -#include #include - -#include -#include #include #include - #include +#include +#include +#include #include "mdp.h" #include "msm_fb.h" #include "mdp4.h" -static struct mdp4_overlay_pipe *mddi_pipe; -static struct msm_fb_data_type *mddi_mfd; -static int busy_wait_cnt; +static int mddi_state; + +#define TOUT_PERIOD HZ /* 1 second */ +#define MS_100 (HZ/10) /* 100 ms */ static int vsync_start_y_adjust = 4; -static int dmap_vsync_enable; +#define MAX_CONTROLLER 1 +#define VSYNC_EXPIRE_TICK 8 + +static struct vsycn_ctrl { + struct device *dev; + int inited; + int update_ndx; + int expire_tick; + int blt_wait; + u32 ov_koff; + u32 ov_done; + u32 dmap_koff; + u32 dmap_done; + uint32 rdptr_intr_tot; + uint32 rdptr_sirq_tot; + atomic_t suspend; + int wait_vsync_cnt; + int blt_change; + int blt_free; + int blt_end; + int uevent; + struct mutex update_lock; + struct completion ov_comp; + struct completion dmap_comp; + struct completion vsync_comp; + spinlock_t spin_lock; + struct msm_fb_data_type *mfd; + struct mdp4_overlay_pipe *base_pipe; + struct vsync_update vlist[2]; + int vsync_enabled; + int clk_enabled; + int clk_control; + int new_update; + ktime_t vsync_time; + struct work_struct vsync_work; + struct work_struct clk_work; +} vsync_ctrl_db[MAX_CONTROLLER]; -void mdp_dmap_vsync_set(int enable) +static void vsync_irq_enable(int intr, int term) { - dmap_vsync_enable = enable; + unsigned long flag; + + spin_lock_irqsave(&mdp_spin_lock, flag); + /* no need to clear other interrupts for comamnd mode */ + mdp_intr_mask |= intr; + outp32(MDP_INTR_ENABLE, mdp_intr_mask); + mdp_enable_irq(term); + spin_unlock_irqrestore(&mdp_spin_lock, flag); } -int mdp_dmap_vsync_get(void) +static void vsync_irq_disable(int intr, int term) { - return dmap_vsync_enable; + unsigned long flag; + + spin_lock_irqsave(&mdp_spin_lock, flag); + /* no need to clrear other interrupts for comamnd mode */ + mdp_intr_mask &= ~intr; + outp32(MDP_INTR_ENABLE, mdp_intr_mask); + mdp_disable_irq_nosync(term); + spin_unlock_irqrestore(&mdp_spin_lock, flag); } -void mdp4_mddi_vsync_enable(struct msm_fb_data_type *mfd, - struct mdp4_overlay_pipe *pipe, int which) +static void mdp4_mddi_blt_ov_update(struct mdp4_overlay_pipe *pipe) { - uint32 start_y, data, tear_en; + uint32 off, addr; + int bpp; + char *overlay_base; - tear_en = (1 << which); + if (pipe->ov_blt_addr == 0) + return; - if ((mfd->use_mdp_vsync) && (mfd->ibuf.vsync_enable) && - (mfd->panel_info.lcd.vsync_enable)) { +#ifdef BLT_RGB565 + bpp = 2; /* overlay ouput is RGB565 */ +#else + bpp = 3; /* overlay ouput is RGB888 */ +#endif + off = 0; + if (pipe->ov_cnt & 0x01) + off = pipe->src_height * pipe->src_width * bpp; + addr = pipe->ov_blt_addr + off; + /* overlay 0 */ + overlay_base = MDP_BASE + MDP4_OVERLAYPROC0_BASE;/* 0x10000 */ + outpdw(overlay_base + 0x000c, addr); + outpdw(overlay_base + 0x001c, addr); +} - if (mdp_hw_revision < MDP4_REVISION_V2_1) { - /* need dmas dmap switch */ - if (which == 0 && dmap_vsync_enable == 0 && - mfd->panel_info.lcd.rev < 2) /* dma_p */ - return; - } +static void mdp4_mddi_blt_dmap_update(struct mdp4_overlay_pipe *pipe) +{ + uint32 off, addr; + int bpp; - if (vsync_start_y_adjust <= pipe->dst_y) - start_y = pipe->dst_y - vsync_start_y_adjust; - else - start_y = (mfd->total_lcd_lines - 1) - - (vsync_start_y_adjust - pipe->dst_y); - if (which == 0) - MDP_OUTP(MDP_BASE + 0x210, start_y); /* primary */ - else - MDP_OUTP(MDP_BASE + 0x214, start_y); /* secondary */ + if (pipe->ov_blt_addr == 0) + return; - data = inpdw(MDP_BASE + 0x20c); - data |= tear_en; - MDP_OUTP(MDP_BASE + 0x20c, data); - } else { - data = inpdw(MDP_BASE + 0x20c); - data &= ~tear_en; - MDP_OUTP(MDP_BASE + 0x20c, data); - } +#ifdef BLT_RGB565 + bpp = 2; /* overlay ouput is RGB565 */ +#else + bpp = 3; /* overlay ouput is RGB888 */ +#endif + off = 0; + if (pipe->dmap_cnt & 0x01) + off = pipe->src_height * pipe->src_width * bpp; + addr = pipe->dma_blt_addr + off; + + /* dmap */ + MDP_OUTP(MDP_BASE + 0x90008, addr); } -#define WHOLESCREEN +static void mdp4_mddi_wait4dmap(int cndx); +static void mdp4_mddi_wait4ov(int cndx); -void mdp4_overlay_update_lcd(struct msm_fb_data_type *mfd) +static void mdp4_mddi_do_blt(struct msm_fb_data_type *mfd, int enable) { - MDPIBUF *iBuf = &mfd->ibuf; - uint8 *src; - int ptype; - uint32 mddi_ld_param; - uint16 mddi_vdo_packet_reg; + unsigned long flags; + int cndx = 0; + struct vsycn_ctrl *vctrl; struct mdp4_overlay_pipe *pipe; - int ret; + int need_wait; - if (mfd->key != MFD_KEY) - return; + vctrl = &vsync_ctrl_db[cndx]; + pipe = vctrl->base_pipe; - mddi_mfd = mfd; /* keep it */ + mdp4_allocate_writeback_buf(mfd, MDP4_MIXER0); - /* MDP cmd block enable */ - mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE); + if (mfd->ov0_wb_buf->write_addr == 0) { + pr_err("%s: no blt_base assigned\n", __func__); + return; + } - if (mddi_pipe == NULL) { - ptype = mdp4_overlay_format2type(mfd->fb_imgType); - if (ptype < 0) - printk(KERN_INFO "%s: format2type failed\n", __func__); - pipe = mdp4_overlay_pipe_alloc(ptype, MDP4_MIXER0); - if (pipe == NULL) - printk(KERN_INFO "%s: pipe_alloc failed\n", __func__); - pipe->pipe_used++; - pipe->mixer_num = MDP4_MIXER0; - pipe->src_format = mfd->fb_imgType; - mdp4_overlay_panel_mode(pipe->mixer_num, MDP4_PANEL_MDDI); - ret = mdp4_overlay_format2pipe(pipe); - if (ret < 0) - printk(KERN_INFO "%s: format2type failed\n", __func__); + spin_lock_irqsave(&vctrl->spin_lock, flags); + if (enable && pipe->ov_blt_addr == 0) { + vctrl->blt_change++; + if (vctrl->dmap_koff != vctrl->dmap_done) { + INIT_COMPLETION(vctrl->dmap_comp); + need_wait = 1; + } + } else if (enable == 0 && pipe->ov_blt_addr) { + vctrl->blt_change++; + if (vctrl->ov_koff != vctrl->dmap_done) { + INIT_COMPLETION(vctrl->dmap_comp); + need_wait = 1; + } + } + spin_unlock_irqrestore(&vctrl->spin_lock, flags); - mddi_pipe = pipe; /* keep it */ - mddi_ld_param = 0; - mddi_vdo_packet_reg = mfd->panel_info.mddi.vdopkt; - - if (mdp_hw_revision == MDP4_REVISION_V2_1) { - uint32 data; - - data = inpdw(MDP_BASE + 0x0028); - data &= ~0x0300; /* bit 8, 9, MASTER4 */ - if (mfd->fbi->var.xres == 540) /* qHD, 540x960 */ - data |= 0x0200; - else - data |= 0x0100; + if (need_wait) + mdp4_mddi_wait4dmap(0); - MDP_OUTP(MDP_BASE + 0x00028, data); - } + spin_lock_irqsave(&vctrl->spin_lock, flags); + if (enable && pipe->ov_blt_addr == 0) { + pipe->ov_blt_addr = mfd->ov0_wb_buf->write_addr; + pipe->dma_blt_addr = mfd->ov0_wb_buf->read_addr; + pipe->ov_cnt = 0; + pipe->dmap_cnt = 0; + vctrl->ov_koff = vctrl->dmap_koff; + vctrl->ov_done = vctrl->dmap_done; + vctrl->blt_free = 0; + vctrl->blt_wait = 0; + vctrl->blt_end = 0; + mdp4_stat.blt_mddi++; + } else if (enable == 0 && pipe->ov_blt_addr) { + pipe->ov_blt_addr = 0; + pipe->dma_blt_addr = 0; + vctrl->blt_end = 1; + vctrl->blt_free = 4; /* 4 commits to free wb buf */ + } - if (mfd->panel_info.type == MDDI_PANEL) { - if (mfd->panel_info.pdest == DISPLAY_1) - mddi_ld_param = 0; - else - mddi_ld_param = 1; - } else { - mddi_ld_param = 2; - } + pr_debug("%s: changed=%d enable=%d ov_blt_addr=%x\n", __func__, + vctrl->blt_change, enable, (int)pipe->ov_blt_addr); - MDP_OUTP(MDP_BASE + 0x00090, mddi_ld_param); + spin_unlock_irqrestore(&vctrl->spin_lock, flags); +} - if (mfd->panel_info.bpp == 24) - MDP_OUTP(MDP_BASE + 0x00094, - (MDDI_VDO_PACKET_DESC_24 << 16) | mddi_vdo_packet_reg); - else if (mfd->panel_info.bpp == 16) - MDP_OUTP(MDP_BASE + 0x00094, - (MDDI_VDO_PACKET_DESC_16 << 16) | mddi_vdo_packet_reg); - else - MDP_OUTP(MDP_BASE + 0x00094, - (MDDI_VDO_PACKET_DESC << 16) | mddi_vdo_packet_reg); +/* + * mdp4_mddi_do_update: + * called from thread context + */ +void mdp4_mddi_pipe_queue(int cndx, struct mdp4_overlay_pipe *pipe) +{ + struct vsycn_ctrl *vctrl; + struct vsync_update *vp; + struct mdp4_overlay_pipe *pp; + int undx; - MDP_OUTP(MDP_BASE + 0x00098, 0x01); - mdp4_init_writeback_buf(mfd, MDP4_MIXER0); - pipe->blt_addr = 0; - } else { - pipe = mddi_pipe; + if (cndx >= MAX_CONTROLLER) { + pr_err("%s: out or range: cndx=%d\n", __func__, cndx); + return; } - /* 0 for dma_p, client_id = 0 */ - MDP_OUTP(MDP_BASE + 0x00090, 0); + vctrl = &vsync_ctrl_db[cndx]; + if (atomic_read(&vctrl->suspend) > 0) + return; - src = (uint8 *) iBuf->buf; + mutex_lock(&vctrl->update_lock); + undx = vctrl->update_ndx; + vp = &vctrl->vlist[undx]; -#ifdef WHOLESCREEN + pp = &vp->plist[pipe->pipe_ndx - 1]; /* ndx start form 1 */ - { - struct fb_info *fbi; + pr_debug("%s: vndx=%d pipe_ndx=%d expire=%x pid=%d\n", __func__, + undx, pipe->pipe_ndx, vctrl->expire_tick, current->pid); - fbi = mfd->fbi; - pipe->src_height = fbi->var.yres; - pipe->src_width = fbi->var.xres; - pipe->src_h = fbi->var.yres; - pipe->src_w = fbi->var.xres; - pipe->src_y = 0; - pipe->src_x = 0; - pipe->dst_h = fbi->var.yres; - pipe->dst_w = fbi->var.xres; - pipe->dst_y = 0; - pipe->dst_x = 0; - pipe->srcp0_addr = (uint32)src; - pipe->srcp0_ystride = fbi->fix.line_length; - } + *pp = *pipe; /* clone it */ + vp->update_cnt++; -#else - if (mdp4_overlay_active(MDP4_MIXER0)) { - struct fb_info *fbi; + mutex_unlock(&vctrl->update_lock); + mdp4_stat.overlay_play[pipe->mixer_num]++; +} - fbi = mfd->fbi; - pipe->src_height = fbi->var.yres; - pipe->src_width = fbi->var.xres; - pipe->src_h = fbi->var.yres; - pipe->src_w = fbi->var.xres; - pipe->src_y = 0; - pipe->src_x = 0; - pipe->dst_h = fbi->var.yres; - pipe->dst_w = fbi->var.xres; - pipe->dst_y = 0; - pipe->dst_x = 0; - pipe->srcp0_addr = (uint32) src; - pipe->srcp0_ystride = fbi->fix.line_length; +static void mdp4_mddi_blt_ov_update(struct mdp4_overlay_pipe *pipe); + +int mdp4_mddi_pipe_commit(void) +{ + int i, undx; + int mixer = 0; + struct vsycn_ctrl *vctrl; + struct vsync_update *vp; + struct mdp4_overlay_pipe *pipe; + struct mdp4_overlay_pipe *real_pipe; + unsigned long flags; + int need_dmap_wait = 0; + int need_ov_wait = 0; + int cnt = 0; + + vctrl = &vsync_ctrl_db[0]; + + mutex_lock(&vctrl->update_lock); + undx = vctrl->update_ndx; + vp = &vctrl->vlist[undx]; + pipe = vctrl->base_pipe; + mixer = pipe->mixer_num; + + if (vp->update_cnt == 0) { + mutex_unlock(&vctrl->update_lock); + return cnt; + } + + vctrl->update_ndx++; + vctrl->update_ndx &= 0x01; + vp->update_cnt = 0; /* reset */ + if (vctrl->blt_free) { + vctrl->blt_free--; + if (vctrl->blt_free == 0) + mdp4_free_writeback_buf(vctrl->mfd, mixer); + } + mutex_unlock(&vctrl->update_lock); + + /* free previous committed iommu back to pool */ + mdp4_overlay_iommu_unmap_freelist(mixer); + + spin_lock_irqsave(&vctrl->spin_lock, flags); + if (pipe->ov_blt_addr) { + /* Blt */ + if (vctrl->blt_wait) + need_dmap_wait = 1; + else if (vctrl->ov_koff != vctrl->ov_done) { + INIT_COMPLETION(vctrl->ov_comp); + need_ov_wait = 1; + } } else { - /* starting input address */ - src += (iBuf->dma_x + iBuf->dma_y * iBuf->ibuf_width) - * iBuf->bpp; - - pipe->src_height = iBuf->dma_h; - pipe->src_width = iBuf->dma_w; - pipe->src_h = iBuf->dma_h; - pipe->src_w = iBuf->dma_w; - pipe->src_y = 0; - pipe->src_x = 0; - pipe->dst_h = iBuf->dma_h; - pipe->dst_w = iBuf->dma_w; - pipe->dst_y = iBuf->dma_y; - pipe->dst_x = iBuf->dma_x; - pipe->srcp0_addr = (uint32) src; - pipe->srcp0_ystride = iBuf->ibuf_width * iBuf->bpp; + /* direct out */ + if (vctrl->dmap_koff != vctrl->dmap_done) { + INIT_COMPLETION(vctrl->dmap_comp); + pr_debug("%s: wait, ok=%d od=%d dk=%d dd=%d cpu=%d\n", + __func__, vctrl->ov_koff, vctrl->ov_done, + vctrl->dmap_koff, vctrl->dmap_done, smp_processor_id()); + need_dmap_wait = 1; + } } -#endif + spin_unlock_irqrestore(&vctrl->spin_lock, flags); - pipe->mixer_stage = MDP4_MIXER_STAGE_BASE; + if (need_dmap_wait) { + pr_debug("%s: wait4dmap\n", __func__); + mdp4_mddi_wait4dmap(0); + } - mdp4_overlay_rgb_setup(pipe); + if (need_ov_wait) { + pr_debug("%s: wait4ov\n", __func__); + mdp4_mddi_wait4ov(0); + } - mdp4_mixer_stage_up(pipe, 1); + if (pipe->ov_blt_addr) { + if (vctrl->blt_end) { + vctrl->blt_end = 0; + pipe->ov_blt_addr = 0; + pipe->dma_blt_addr = 0; + } + } - mdp4_overlayproc_cfg(pipe); + if (vctrl->blt_change) { + mdp4_overlayproc_cfg(pipe); + mdp4_overlay_dmap_xy(pipe); + vctrl->blt_change = 0; + } + + pipe = vp->plist; + for (i = 0; i < OVERLAY_PIPE_MAX; i++, pipe++) { + if (pipe->pipe_used) { + cnt++; + real_pipe = mdp4_overlay_ndx2pipe(pipe->pipe_ndx); + if (real_pipe && real_pipe->pipe_used) { + /* pipe not unset */ + mdp4_overlay_vsync_commit(pipe); + } + /* free previous iommu to freelist + * which will be freed at next + * pipe_commit + */ + mdp4_overlay_iommu_pipe_free(pipe->pipe_ndx, 0); + pipe->pipe_used = 0; /* clear */ + } + } - mdp4_overlay_dmap_xy(pipe); + mdp4_mixer_stage_commit(mixer); - mdp4_overlay_dmap_cfg(mfd, 0); - mdp4_mixer_stage_commit(pipe->mixer_num); - mdp4_mddi_vsync_enable(mfd, pipe, 0); + pipe = vctrl->base_pipe; + spin_lock_irqsave(&vctrl->spin_lock, flags); + if (pipe->ov_blt_addr) { + mdp4_mddi_blt_ov_update(pipe); + pipe->ov_cnt++; + vctrl->ov_koff++; + vsync_irq_enable(INTR_OVERLAY0_DONE, MDP_OVERLAY0_TERM); + } else { + vsync_irq_enable(INTR_DMA_P_DONE, MDP_DMAP_TERM); + vctrl->dmap_koff++; + } + pr_debug("%s: kickoff\n", __func__); + /* kickoff overlay engine */ + mdp4_stat.kickoff_ov0++; + outpdw(MDP_BASE + 0x0004, 0); + mb(); /* make sure kickoff executed */ + spin_unlock_irqrestore(&vctrl->spin_lock, flags); + + mdp4_stat.overlay_commit[pipe->mixer_num]++; - /* MDP cmd block disable */ - mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE); + return cnt; } -int mdp4_mddi_overlay_blt_start(struct msm_fb_data_type *mfd) +static void mdp4_overlay_update_mddi(struct msm_fb_data_type *mfd); + +void mdp4_mddi_vsync_ctrl(struct fb_info *info, int enable) { - unsigned long flag; + struct msm_fb_data_type *mfd = (struct msm_fb_data_type *)info->par; + struct vsycn_ctrl *vctrl; + unsigned long flags; + int clk_set_on = 0; + int cndx = 0; - pr_debug("%s: blt_end=%d blt_addr=%x pid=%d\n", - __func__, mddi_pipe->blt_end, (int)mddi_pipe->blt_addr, current->pid); + vctrl = &vsync_ctrl_db[cndx]; - mdp4_allocate_writeback_buf(mfd, MDP4_MIXER0); + pr_debug("%s: clk_enabled=%d vsycn_enabeld=%d req=%d\n", __func__, + vctrl->clk_enabled, vctrl->vsync_enabled, enable); - if (mfd->ov0_wb_buf->phys_addr == 0) { - pr_info("%s: no blt_base assigned\n", __func__); - return -EBUSY; + mutex_lock(&vctrl->update_lock); + + if (vctrl->vsync_enabled == enable) { + mutex_unlock(&vctrl->update_lock); + return; } - if (mddi_pipe->blt_addr == 0) { - mdp4_mddi_dma_busy_wait(mfd); - spin_lock_irqsave(&mdp_spin_lock, flag); - mddi_pipe->blt_end = 0; - mddi_pipe->blt_cnt = 0; - mddi_pipe->ov_cnt = 0; - mddi_pipe->dmap_cnt = 0; - mddi_pipe->blt_addr = mfd->ov0_wb_buf->phys_addr; - mdp4_stat.blt_mddi++; - spin_unlock_irqrestore(&mdp_spin_lock, flag); - return 0; -} + vctrl->vsync_enabled = enable; + + if (enable) { + if (vctrl->clk_enabled == 0) { + pr_debug("%s: SET_CLK_ON\n", __func__); + mdp_clk_ctrl(1); + vctrl->clk_enabled = 1; + clk_set_on = 1; + } + spin_lock_irqsave(&vctrl->spin_lock, flags); + vctrl->clk_control = 0; + vctrl->expire_tick = 0; + vctrl->uevent = 1; + vctrl->new_update = 1; + if (clk_set_on) { + vsync_irq_enable(INTR_PRIMARY_RDPTR, + MDP_PRIM_RDPTR_TERM); + } + spin_unlock_irqrestore(&vctrl->spin_lock, flags); - return -EBUSY; + mdp4_overlay_update_mddi(mfd); + } else { + spin_lock_irqsave(&vctrl->spin_lock, flags); + vctrl->clk_control = 1; + vctrl->uevent = 0; + if (vctrl->clk_enabled) + vctrl->expire_tick = VSYNC_EXPIRE_TICK; + spin_unlock_irqrestore(&vctrl->spin_lock, flags); + } + mutex_unlock(&vctrl->update_lock); } -int mdp4_mddi_overlay_blt_stop(struct msm_fb_data_type *mfd) +void mdp4_mddi_wait4vsync(int cndx, long long *vtime) { - unsigned long flag; + struct vsycn_ctrl *vctrl; + struct mdp4_overlay_pipe *pipe; + unsigned long flags; + + if (cndx >= MAX_CONTROLLER) { + pr_err("%s: out or range: cndx=%d\n", __func__, cndx); + return; + } - pr_debug("%s: blt_end=%d blt_addr=%x\n", - __func__, mddi_pipe->blt_end, (int)mddi_pipe->blt_addr); + vctrl = &vsync_ctrl_db[cndx]; + pipe = vctrl->base_pipe; - if ((mddi_pipe->blt_end == 0) && mddi_pipe->blt_addr) { - spin_lock_irqsave(&mdp_spin_lock, flag); - mddi_pipe->blt_end = 1; /* mark as end */ - spin_unlock_irqrestore(&mdp_spin_lock, flag); - return 0; + if (atomic_read(&vctrl->suspend) > 0) { + *vtime = -1; + return; } - return -EBUSY; -} + spin_lock_irqsave(&vctrl->spin_lock, flags); + if (vctrl->wait_vsync_cnt == 0) + INIT_COMPLETION(vctrl->vsync_comp); + vctrl->wait_vsync_cnt++; + spin_unlock_irqrestore(&vctrl->spin_lock, flags); -int mdp4_mddi_overlay_blt_offset(struct msm_fb_data_type *mfd, - struct msmfb_overlay_blt *req) -{ - req->offset = 0; - req->width = mddi_pipe->src_width; - req->height = mddi_pipe->src_height; - req->bpp = mddi_pipe->bpp; + wait_for_completion(&vctrl->vsync_comp); + mdp4_stat.wait4vsync0++; - return sizeof(*req); + *vtime = ktime_to_ns(vctrl->vsync_time); } -void mdp4_mddi_overlay_blt(struct msm_fb_data_type *mfd, - struct msmfb_overlay_blt *req) +static void mdp4_mddi_wait4dmap(int cndx) { - if (req->enable) - mdp4_mddi_overlay_blt_start(mfd); - else if (req->enable == 0) - mdp4_mddi_overlay_blt_stop(mfd); + struct vsycn_ctrl *vctrl; -} + if (cndx >= MAX_CONTROLLER) { + pr_err("%s: out or range: cndx=%d\n", __func__, cndx); + return; + } -void mdp4_blt_xy_update(struct mdp4_overlay_pipe *pipe) -{ - uint32 off, addr, addr2; - int bpp; - char *overlay_base; + vctrl = &vsync_ctrl_db[cndx]; - if (pipe->blt_addr == 0) + if (atomic_read(&vctrl->suspend) > 0) return; + wait_for_completion(&vctrl->dmap_comp); +} -#ifdef BLT_RGB565 - bpp = 2; /* overlay ouput is RGB565 */ -#else - bpp = 3; /* overlay ouput is RGB888 */ -#endif - off = 0; - if (pipe->dmap_cnt & 0x01) - off = pipe->src_height * pipe->src_width * bpp; +static void mdp4_mddi_wait4ov(int cndx) +{ + struct vsycn_ctrl *vctrl; - addr = pipe->blt_addr + off; + if (cndx >= MAX_CONTROLLER) { + pr_err("%s: out or range: cndx=%d\n", __func__, cndx); + return; + } - /* dmap */ - MDP_OUTP(MDP_BASE + 0x90008, addr); + vctrl = &vsync_ctrl_db[cndx]; - off = 0; - if (pipe->ov_cnt & 0x01) - off = pipe->src_height * pipe->src_width * bpp; - addr2 = pipe->blt_addr + off; - /* overlay 0 */ - overlay_base = MDP_BASE + MDP4_OVERLAYPROC0_BASE;/* 0x10000 */ - outpdw(overlay_base + 0x000c, addr2); - outpdw(overlay_base + 0x001c, addr2); -} + if (atomic_read(&vctrl->suspend) > 0) + return; -void mdp4_primary_rdptr(void) -{ + wait_for_completion(&vctrl->ov_comp); } /* - * mdp4_dmap_done_mddi: called from isr + * primary_rdptr_isr: + * called from interrupt context */ -void mdp4_dma_p_done_mddi(struct mdp_dma_data *dma) +static void primary_rdptr_isr(int cndx) { - int diff; + struct vsycn_ctrl *vctrl; - mddi_pipe->dmap_cnt++; - diff = mddi_pipe->ov_cnt - mddi_pipe->dmap_cnt; - pr_debug("%s: ov_cnt=%d dmap_cnt=%d\n", - __func__, mddi_pipe->ov_cnt, mddi_pipe->dmap_cnt); + vctrl = &vsync_ctrl_db[cndx]; + pr_debug("%s: ISR, cpu=%d\n", __func__, smp_processor_id()); + vctrl->rdptr_intr_tot++; + vctrl->vsync_time = ktime_get(); - if (diff <= 0) { - spin_lock(&mdp_spin_lock); - dma->dmap_busy = FALSE; - complete(&dma->dmap_comp); - spin_unlock(&mdp_spin_lock); + spin_lock(&vctrl->spin_lock); + if (vctrl->uevent) + schedule_work(&vctrl->vsync_work); - if (mddi_pipe->blt_end) { - mddi_pipe->blt_end = 0; - mddi_pipe->blt_addr = 0; - pr_debug("%s: END, ov_cnt=%d dmap_cnt=%d\n", __func__, - mddi_pipe->ov_cnt, mddi_pipe->dmap_cnt); - mdp_intr_mask &= ~INTR_DMA_P_DONE; - outp32(MDP_INTR_ENABLE, mdp_intr_mask); - } + if (vctrl->wait_vsync_cnt) { + complete(&vctrl->vsync_comp); + vctrl->wait_vsync_cnt = 0; + } - mdp_pipe_ctrl(MDP_OVERLAY0_BLOCK, MDP_BLOCK_POWER_OFF, TRUE); - mdp_disable_irq_nosync(MDP_DMA2_TERM); /* disable intr */ - return; + if (vctrl->expire_tick) { + vctrl->expire_tick--; + if (vctrl->expire_tick == 0) + schedule_work(&vctrl->clk_work); } + spin_unlock(&vctrl->spin_lock); +} - spin_lock(&mdp_spin_lock); - dma->busy = FALSE; - spin_unlock(&mdp_spin_lock); - complete(&dma->comp); - if (busy_wait_cnt) - busy_wait_cnt--; +void mdp4_dmap_done_mddi(int cndx) +{ + struct vsycn_ctrl *vctrl; + struct mdp4_overlay_pipe *pipe; + int diff; - pr_debug("%s: kickoff dmap\n", __func__); + vctrl = &vsync_ctrl_db[cndx]; + pipe = vctrl->base_pipe; - mdp4_blt_xy_update(mddi_pipe); - /* kick off dmap */ - outpdw(MDP_BASE + 0x000c, 0x0); + /* blt enabled */ + spin_lock(&vctrl->spin_lock); + vsync_irq_disable(INTR_DMA_P_DONE, MDP_DMAP_TERM); + vctrl->dmap_done++; + diff = vctrl->ov_done - vctrl->dmap_done; + pr_debug("%s: ov_koff=%d ov_done=%d dmap_koff=%d dmap_done=%d cpu=%d\n", + __func__, vctrl->ov_koff, vctrl->ov_done, vctrl->dmap_koff, + vctrl->dmap_done, smp_processor_id()); + complete_all(&vctrl->dmap_comp); + + if (mdp_rev <= MDP_REV_41) + mdp4_mixer_blend_cfg(MDP4_MIXER0); + + if (diff <= 0) { + if (vctrl->blt_wait) + vctrl->blt_wait = 0; + spin_unlock(&vctrl->spin_lock); + return; + } + + /* kick dmap */ + mdp4_mddi_blt_dmap_update(pipe); + pipe->dmap_cnt++; mdp4_stat.kickoff_dmap++; - mdp_pipe_ctrl(MDP_OVERLAY0_BLOCK, MDP_BLOCK_POWER_OFF, TRUE); + vctrl->dmap_koff++; + vsync_irq_enable(INTR_DMA_P_DONE, MDP_DMAP_TERM); + outpdw(MDP_BASE + 0x000c, 0); /* kickoff dmap engine */ + mb(); /* make sure kickoff executed */ + spin_unlock(&vctrl->spin_lock); } /* * mdp4_overlay0_done_mddi: called from isr */ -void mdp4_overlay0_done_mddi(struct mdp_dma_data *dma) +void mdp4_overlay0_done_mddi(int cndx) { + struct vsycn_ctrl *vctrl; + struct mdp4_overlay_pipe *pipe; int diff; - if (mddi_pipe->blt_addr == 0) { - mdp_pipe_ctrl(MDP_OVERLAY0_BLOCK, MDP_BLOCK_POWER_OFF, TRUE); - spin_lock(&mdp_spin_lock); - dma->busy = FALSE; - spin_unlock(&mdp_spin_lock); - complete(&dma->comp); + vctrl = &vsync_ctrl_db[cndx]; + pipe = vctrl->base_pipe; - if (busy_wait_cnt) - busy_wait_cnt--; - mdp_disable_irq_nosync(MDP_OVERLAY0_TERM); + spin_lock(&vctrl->spin_lock); + vsync_irq_disable(INTR_OVERLAY0_DONE, MDP_OVERLAY0_TERM); + vctrl->ov_done++; + complete_all(&vctrl->ov_comp); + diff = vctrl->ov_done - vctrl->dmap_done; + + pr_debug("%s: ov_koff=%d ov_done=%d dmap_koff=%d dmap_done=%d cpu=%d\n", + __func__, vctrl->ov_koff, vctrl->ov_done, vctrl->dmap_koff, + vctrl->dmap_done, smp_processor_id()); + + if (pipe->ov_blt_addr == 0) { + /* blt disabled */ + spin_unlock(&vctrl->spin_lock); + return; + } + if (diff > 1) { + /* + * two overlay_done and none dmap_done yet + * let dmap_done kickoff dmap + * and put pipe_commit to wait + */ + vctrl->blt_wait = 1; + pr_debug("%s: blt_wait set\n", __func__); + spin_unlock(&vctrl->spin_lock); return; } + mdp4_mddi_blt_dmap_update(pipe); + pipe->dmap_cnt++; + mdp4_stat.kickoff_dmap++; + vctrl->dmap_koff++; + vsync_irq_enable(INTR_DMA_P_DONE, MDP_DMAP_TERM); + outpdw(MDP_BASE + 0x000c, 0); /* kickoff dmap engine */ + mb(); /* make sure kickoff executed */ + spin_unlock(&vctrl->spin_lock); +} + +static void clk_ctrl_work(struct work_struct *work) +{ + struct vsycn_ctrl *vctrl = + container_of(work, typeof(*vctrl), clk_work); + unsigned long flags; + + mutex_lock(&vctrl->update_lock); + if (vctrl->clk_control && vctrl->clk_enabled) { + pr_debug("%s: SET_CLK_OFF\n", __func__); + mdp_clk_ctrl(0); + spin_lock_irqsave(&vctrl->spin_lock, flags); + vsync_irq_disable(INTR_PRIMARY_RDPTR, MDP_PRIM_RDPTR_TERM); + vctrl->clk_enabled = 0; + vctrl->clk_control = 0; + spin_unlock_irqrestore(&vctrl->spin_lock, flags); + } + mutex_unlock(&vctrl->update_lock); +} - /* blt enabled */ - if (mddi_pipe->blt_end == 0) - mddi_pipe->ov_cnt++; +static void send_vsync_work(struct work_struct *work) +{ + struct vsycn_ctrl *vctrl = + container_of(work, typeof(*vctrl), vsync_work); + char buf[64]; + char *envp[2]; - pr_debug("%s: ov_cnt=%d dmap_cnt=%d\n", - __func__, mddi_pipe->ov_cnt, mddi_pipe->dmap_cnt); + snprintf(buf, sizeof(buf), "VSYNC=%llu", + ktime_to_ns(vctrl->vsync_time)); + envp[0] = buf; + envp[1] = NULL; + kobject_uevent_env(&vctrl->dev->kobj, KOBJ_CHANGE, envp); +} - if (mddi_pipe->blt_cnt == 0) { - /* first kickoff since blt enabled */ - mdp_intr_mask |= INTR_DMA_P_DONE; - outp32(MDP_INTR_ENABLE, mdp_intr_mask); - } - mddi_pipe->blt_cnt++; +void mdp4_mddi_rdptr_init(int cndx) +{ + struct vsycn_ctrl *vctrl; - diff = mddi_pipe->ov_cnt - mddi_pipe->dmap_cnt; - if (diff >= 2) { - mdp_disable_irq_nosync(MDP_OVERLAY0_TERM); + if (cndx >= MAX_CONTROLLER) { + pr_err("%s: out or range: cndx=%d\n", __func__, cndx); return; } - spin_lock(&mdp_spin_lock); - dma->busy = FALSE; - dma->dmap_busy = TRUE; - spin_unlock(&mdp_spin_lock); - complete(&dma->comp); - - if (busy_wait_cnt) - busy_wait_cnt--; - - pr_debug("%s: kickoff dmap\n", __func__); + vctrl = &vsync_ctrl_db[cndx]; + if (vctrl->inited) + return; - mdp4_blt_xy_update(mddi_pipe); - mdp_enable_irq(MDP_DMA2_TERM); /* enable intr */ - /* kick off dmap */ - outpdw(MDP_BASE + 0x000c, 0x0); - mdp4_stat.kickoff_dmap++; - mdp_disable_irq_nosync(MDP_OVERLAY0_TERM); + vctrl->inited = 1; + vctrl->update_ndx = 0; + mutex_init(&vctrl->update_lock); + init_completion(&vctrl->ov_comp); + init_completion(&vctrl->dmap_comp); + init_completion(&vctrl->vsync_comp); + spin_lock_init(&vctrl->spin_lock); + INIT_WORK(&vctrl->vsync_work, send_vsync_work); + INIT_WORK(&vctrl->clk_work, clk_ctrl_work); } -void mdp4_mddi_overlay_restore(void) +void mdp4_primary_rdptr(void) { - if (mddi_mfd == NULL) - return; - - pr_debug("%s: resotre, pid=%d\n", __func__, current->pid); - - if (mddi_mfd->panel_power_on == 0) - return; - if (mddi_mfd && mddi_pipe) { - mdp4_mddi_dma_busy_wait(mddi_mfd); - mdp4_overlay_update_lcd(mddi_mfd); - - if (mddi_pipe->blt_addr) - mdp4_mddi_blt_dmap_busy_wait(mddi_mfd); - mdp4_mddi_overlay_kickoff(mddi_mfd, mddi_pipe); - mddi_mfd->dma_update_flag = 1; - } - if (mdp_hw_revision < MDP4_REVISION_V2_1) /* need dmas dmap switch */ - mdp4_mddi_overlay_dmas_restore(); + primary_rdptr_isr(0); } -void mdp4_mddi_blt_dmap_busy_wait(struct msm_fb_data_type *mfd) +void mdp4_overlay_mddi_state_set(int state) { unsigned long flag; - int need_wait = 0; spin_lock_irqsave(&mdp_spin_lock, flag); - if (mfd->dma->dmap_busy == TRUE) { - INIT_COMPLETION(mfd->dma->dmap_comp); - need_wait++; - } + mddi_state = state; spin_unlock_irqrestore(&mdp_spin_lock, flag); +} - if (need_wait) { - /* wait until DMA finishes the current job */ - wait_for_completion(&mfd->dma->dmap_comp); - } +int mdp4_overlay_mddi_state_get(void) +{ + return mddi_state; } -/* - * mdp4_mddi_cmd_dma_busy_wait: check mddi link activity - * mddi link is a shared resource and it can only be used - * while it is in idle state. - * ov_mutex need to be acquired before call this function. - */ -void mdp4_mddi_dma_busy_wait(struct msm_fb_data_type *mfd) +static __u32 msm_fb_line_length(__u32 fb_index, __u32 xres, int bpp) { - unsigned long flag; - int need_wait = 0; + /* + * The adreno GPU hardware requires that the pitch be aligned to + * 32 pixels for color buffers, so for the cases where the GPU + * is writing directly to fb0, the framebuffer pitch + * also needs to be 32 pixel aligned + */ - pr_debug("%s: START, pid=%d\n", __func__, current->pid); - spin_lock_irqsave(&mdp_spin_lock, flag); - if (mfd->dma->busy == TRUE) { - if (busy_wait_cnt == 0) - INIT_COMPLETION(mfd->dma->comp); - busy_wait_cnt++; - need_wait++; - } - spin_unlock_irqrestore(&mdp_spin_lock, flag); + if (fb_index == 0) + return ALIGN(xres, 32) * bpp; + else + return xres * bpp; +} + +void mdp4_mddi_vsync_enable(struct msm_fb_data_type *mfd, + struct mdp4_overlay_pipe *pipe, int which) +{ + uint32 start_y, data, tear_en; + + tear_en = (1 << which); + + if ((mfd->use_mdp_vsync) && (mfd->ibuf.vsync_enable) && + (mfd->panel_info.lcd.vsync_enable)) { + if (vsync_start_y_adjust <= pipe->dst_y) + start_y = pipe->dst_y - vsync_start_y_adjust; + else + start_y = (mfd->total_lcd_lines - 1) - + (vsync_start_y_adjust - pipe->dst_y); + if (which == 0) + MDP_OUTP(MDP_BASE + 0x210, start_y); /* primary */ + else + MDP_OUTP(MDP_BASE + 0x214, start_y); /* secondary */ - if (need_wait) { - /* wait until DMA finishes the current job */ - pr_debug("%s: PENDING, pid=%d\n", __func__, current->pid); - wait_for_completion(&mfd->dma->comp); + data = inpdw(MDP_BASE + 0x20c); + data |= tear_en; + MDP_OUTP(MDP_BASE + 0x20c, data); + } else { + data = inpdw(MDP_BASE + 0x20c); + data &= ~tear_en; + MDP_OUTP(MDP_BASE + 0x20c, data); } - pr_debug("%s: DONE, pid=%d\n", __func__, current->pid); } -void mdp4_mddi_kickoff_video(struct msm_fb_data_type *mfd, - struct mdp4_overlay_pipe *pipe) +void mdp4_mddi_base_swap(int cndx, struct mdp4_overlay_pipe *pipe) { - /* - * a video kickoff may happen before UI kickoff after - * blt enabled. mdp4_overlay_update_lcd() need - * to be called before kickoff. - * vice versa for blt disabled. - */ - if (mddi_pipe->blt_addr && mddi_pipe->blt_cnt == 0) - mdp4_overlay_update_lcd(mfd); /* first time */ - else if (mddi_pipe->blt_addr == 0 && mddi_pipe->blt_cnt) { - mdp4_overlay_update_lcd(mfd); /* last time */ - mddi_pipe->blt_cnt = 0; - } + struct vsycn_ctrl *vctrl; - pr_debug("%s: blt_addr=%d blt_cnt=%d\n", - __func__, (int)mddi_pipe->blt_addr, mddi_pipe->blt_cnt); + if (cndx >= MAX_CONTROLLER) { + pr_err("%s: out or range: cndx=%d\n", __func__, cndx); + return; + } - if (mddi_pipe->blt_addr) - mdp4_mddi_blt_dmap_busy_wait(mddi_mfd); - mdp4_mddi_overlay_kickoff(mfd, pipe); + vctrl = &vsync_ctrl_db[cndx]; + vctrl->base_pipe = pipe; } -void mdp4_mddi_kickoff_ui(struct msm_fb_data_type *mfd, - struct mdp4_overlay_pipe *pipe) +static void mdp4_overlay_setup_pipe_addr(struct msm_fb_data_type *mfd, + struct mdp4_overlay_pipe *pipe) { - pr_debug("%s: pid=%d\n", __func__, current->pid); - mdp4_mddi_overlay_kickoff(mfd, pipe); -} - + MDPIBUF *iBuf = &mfd->ibuf; + struct fb_info *fbi; + int bpp; + uint8 *src; -void mdp4_mddi_overlay_kickoff(struct msm_fb_data_type *mfd, - struct mdp4_overlay_pipe *pipe) -{ - unsigned long flag; + /* whole screen for base layer */ + src = (uint8 *) iBuf->buf; + fbi = mfd->fbi; - if (mdp_hw_revision == MDP4_REVISION_V2_1) { - if (mdp4_overlay_status_read(MDP4_OVERLAY_TYPE_UNSET)) { - uint32 data; - data = inpdw(MDP_BASE + 0x0028); - data &= ~0x0300; /* bit 8, 9, MASTER4 */ - if (mfd->fbi->var.xres == 540) /* qHD, 540x960 */ - data |= 0x0200; - else - data |= 0x0100; - MDP_OUTP(MDP_BASE + 0x00028, data); - mdp4_overlay_status_write(MDP4_OVERLAY_TYPE_UNSET, - false); - } - if (mdp4_overlay_status_read(MDP4_OVERLAY_TYPE_SET)) { - uint32 data; - data = inpdw(MDP_BASE + 0x0028); - data &= ~0x0300; /* bit 8, 9, MASTER4 */ - MDP_OUTP(MDP_BASE + 0x00028, data); - mdp4_overlay_status_write(MDP4_OVERLAY_TYPE_SET, false); - } + if (pipe->is_3d) { + bpp = fbi->var.bits_per_pixel / 8; + pipe->src_height = pipe->src_height_3d; + pipe->src_width = pipe->src_width_3d; + pipe->src_h = pipe->src_height_3d; + pipe->src_w = pipe->src_width_3d; + pipe->dst_h = pipe->src_height_3d; + pipe->dst_w = pipe->src_width_3d; + pipe->srcp0_ystride = msm_fb_line_length(0, + pipe->src_width, bpp); + } else { + /* 2D */ + pipe->src_height = fbi->var.yres; + pipe->src_width = fbi->var.xres; + pipe->src_h = fbi->var.yres; + pipe->src_w = fbi->var.xres; + pipe->dst_h = fbi->var.yres; + pipe->dst_w = fbi->var.xres; + pipe->srcp0_ystride = fbi->fix.line_length; } - mdp_enable_irq(MDP_OVERLAY0_TERM); - spin_lock_irqsave(&mdp_spin_lock, flag); - mfd->dma->busy = TRUE; - if (mddi_pipe->blt_addr) - mfd->dma->dmap_busy = TRUE; - spin_unlock_irqrestore(&mdp_spin_lock, flag); - /* start OVERLAY pipe */ - mdp_pipe_kickoff(MDP_OVERLAY0_TERM, mfd); - mdp4_stat.kickoff_ov0++; + pipe->src_y = 0; + pipe->src_x = 0; + pipe->dst_y = 0; + pipe->dst_x = 0; + pipe->srcp0_addr = (uint32)src; } -void mdp4_dma_s_update_lcd(struct msm_fb_data_type *mfd, - struct mdp4_overlay_pipe *pipe) +static void mdp4_overlay_update_mddi(struct msm_fb_data_type *mfd) { - MDPIBUF *iBuf = &mfd->ibuf; - uint32 outBpp = iBuf->bpp; + int ptype; + uint32 mddi_ld_param; uint16 mddi_vdo_packet_reg; - uint32 dma_s_cfg_reg; + struct mdp4_overlay_pipe *pipe; + uint32 data; + int ret; + int cndx = 0; + struct vsycn_ctrl *vctrl; - dma_s_cfg_reg = 0; + if (mfd->key != MFD_KEY) + return; - if (mfd->fb_imgType == MDP_RGBA_8888) - dma_s_cfg_reg |= DMA_PACK_PATTERN_BGR; /* on purpose */ - else if (mfd->fb_imgType == MDP_BGR_565) - dma_s_cfg_reg |= DMA_PACK_PATTERN_BGR; - else - dma_s_cfg_reg |= DMA_PACK_PATTERN_RGB; + vctrl = &vsync_ctrl_db[cndx]; + + if (vctrl->base_pipe == NULL) { + ptype = mdp4_overlay_format2type(mfd->fb_imgType); + if (ptype < 0) + pr_info("%s: format2type failed\n", __func__); + + pipe = mdp4_overlay_pipe_alloc(ptype, MDP4_MIXER0); + if (pipe == NULL) { + pr_info("%s: pipe_alloc failed\n", __func__); + return; + } + pipe->pipe_used++; + pipe->mixer_stage = MDP4_MIXER_STAGE_BASE; + pipe->mixer_num = MDP4_MIXER0; + pipe->src_format = mfd->fb_imgType; + mdp4_overlay_panel_mode(pipe->mixer_num, MDP4_PANEL_MDDI); + ret = mdp4_overlay_format2pipe(pipe); + if (ret < 0) + pr_info("%s: format2type failed\n", __func__); - if (outBpp == 4) - dma_s_cfg_reg |= (1 << 26); /* xRGB8888 */ - else if (outBpp == 2) - dma_s_cfg_reg |= DMA_IBUF_FORMAT_RGB565; - - dma_s_cfg_reg |= DMA_DITHER_EN; - - /* MDP cmd block enable */ - mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE); - /* PIXELSIZE */ - MDP_OUTP(MDP_BASE + 0xa0004, (pipe->dst_h << 16 | pipe->dst_w)); - MDP_OUTP(MDP_BASE + 0xa0008, pipe->srcp0_addr); /* ibuf address */ - MDP_OUTP(MDP_BASE + 0xa000c, pipe->srcp0_ystride);/* ystride */ - - if (mfd->panel_info.bpp == 24) { - dma_s_cfg_reg |= DMA_DSTC0G_8BITS | /* 666 18BPP */ - DMA_DSTC1B_8BITS | DMA_DSTC2R_8BITS; - } else if (mfd->panel_info.bpp == 18) { - dma_s_cfg_reg |= DMA_DSTC0G_6BITS | /* 666 18BPP */ - DMA_DSTC1B_6BITS | DMA_DSTC2R_6BITS; + vctrl->base_pipe = pipe; /* keep it */ + mdp4_init_writeback_buf(mfd, MDP4_MIXER0); + pipe->ov_blt_addr = 0; + pipe->dma_blt_addr = 0; } else { - dma_s_cfg_reg |= DMA_DSTC0G_6BITS | /* 565 16BPP */ - DMA_DSTC1B_5BITS | DMA_DSTC2R_5BITS; + pipe = vctrl->base_pipe; } - MDP_OUTP(MDP_BASE + 0xa0010, (pipe->dst_y << 16) | pipe->dst_x); - - /* 1 for dma_s, client_id = 0 */ - MDP_OUTP(MDP_BASE + 0x00090, 1); + MDP_OUTP(MDP_BASE + 0x021c, 10); /* read pointer */ + mddi_ld_param = 0; mddi_vdo_packet_reg = mfd->panel_info.mddi.vdopkt; + if (mdp_hw_revision == MDP4_REVISION_V2_1) { + data = inpdw(MDP_BASE + 0x0028); + data &= ~0x0300; /* bit 8, 9, MASTER4 */ + if (mfd->fbi->var.xres == 540) /* qHD, 540x960 */ + data |= 0x0200; + else + data |= 0x0100; + + MDP_OUTP(MDP_BASE + 0x00028, data); + } + + if (mfd->panel_info.type == MDDI_PANEL) { + if (mfd->panel_info.pdest == DISPLAY_1) + mddi_ld_param = 0; + else + mddi_ld_param = 1; + } else { + mddi_ld_param = 2; + } + + MDP_OUTP(MDP_BASE + 0x00090, mddi_ld_param); + if (mfd->panel_info.bpp == 24) MDP_OUTP(MDP_BASE + 0x00094, - (MDDI_VDO_PACKET_DESC_24 << 16) | mddi_vdo_packet_reg); + (MDDI_VDO_PACKET_DESC_24 << 16) | mddi_vdo_packet_reg); else if (mfd->panel_info.bpp == 16) MDP_OUTP(MDP_BASE + 0x00094, - (MDDI_VDO_PACKET_DESC_16 << 16) | mddi_vdo_packet_reg); + (MDDI_VDO_PACKET_DESC_16 << 16) | mddi_vdo_packet_reg); else MDP_OUTP(MDP_BASE + 0x00094, - (MDDI_VDO_PACKET_DESC << 16) | mddi_vdo_packet_reg); + (MDDI_VDO_PACKET_DESC << 16) | mddi_vdo_packet_reg); - MDP_OUTP(MDP_BASE + 0x00098, 0x01); + MDP_OUTP(MDP_BASE + 0x00098, 0x01); - MDP_OUTP(MDP_BASE + 0xa0000, dma_s_cfg_reg); - mdp4_mddi_vsync_enable(mfd, pipe, 1); + mdp4_overlay_setup_pipe_addr(mfd, pipe); - /* MDP cmd block disable */ - mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE); + mdp4_overlay_rgb_setup(pipe); + + mdp4_overlay_reg_flush(pipe, 1); + + mdp4_mixer_stage_up(pipe, 0); + + mdp4_overlayproc_cfg(pipe); + + mdp4_overlay_dmap_xy(pipe); + + mdp4_overlay_dmap_cfg(mfd, 0); + + wmb(); +} + +void mdp4_mddi_blt_start(struct msm_fb_data_type *mfd) +{ + mdp4_mddi_do_blt(mfd, 1); } -void mdp4_mddi_dma_s_kickoff(struct msm_fb_data_type *mfd, - struct mdp4_overlay_pipe *pipe) +void mdp4_mddi_blt_stop(struct msm_fb_data_type *mfd) { - mdp_enable_irq(MDP_DMA_S_TERM); + mdp4_mddi_do_blt(mfd, 0); +} - if (mddi_pipe->blt_addr == 0) - mfd->dma->busy = TRUE; +void mdp4_mddi_overlay_blt(struct msm_fb_data_type *mfd, + struct msmfb_overlay_blt *req) +{ + mdp4_mddi_do_blt(mfd, req->enable); +} - mfd->ibuf_flushed = TRUE; - /* start dma_s pipe */ - mdp_pipe_kickoff(MDP_DMA_S_TERM, mfd); - mdp4_stat.kickoff_dmas++; +int mdp4_mddi_on(struct platform_device *pdev) +{ + int ret = 0; + int cndx = 0; + struct msm_fb_data_type *mfd; + struct vsycn_ctrl *vctrl; - /* wait until DMA finishes the current job */ - wait_for_completion(&mfd->dma->comp); - mdp_disable_irq(MDP_DMA_S_TERM); + pr_debug("%s+:\n", __func__); + + mfd = (struct msm_fb_data_type *)platform_get_drvdata(pdev); + + vctrl = &vsync_ctrl_db[cndx]; + vctrl->mfd = mfd; + vctrl->dev = mfd->fbi->dev; + + mdp_clk_ctrl(1); + mdp4_overlay_update_mddi(mfd); + mdp_clk_ctrl(0); + + mdp4_iommu_attach(); + + atomic_set(&vctrl->suspend, 0); + pr_debug("%s-:\n", __func__); + + return ret; +} + +int mdp4_mddi_off(struct platform_device *pdev) +{ + int ret = 0; + int cndx = 0; + struct msm_fb_data_type *mfd; + struct vsycn_ctrl *vctrl; + struct mdp4_overlay_pipe *pipe; + + pr_debug("%s+:\n", __func__); + + mfd = (struct msm_fb_data_type *)platform_get_drvdata(pdev); + + vctrl = &vsync_ctrl_db[cndx]; + pipe = vctrl->base_pipe; + if (pipe == NULL) { + pr_err("%s: NO base pipe\n", __func__); + return ret; + } + + atomic_set(&vctrl->suspend, 1); + + /* sanity check, free pipes besides base layer */ + mdp4_overlay_unset_mixer(pipe->mixer_num); + mdp4_mixer_stage_down(pipe, 1); + mdp4_overlay_pipe_free(pipe); + vctrl->base_pipe = NULL; + + if (vctrl->clk_enabled) { + /* + * in case of suspend, vsycn_ctrl off is not + * received from frame work which left clock on + * then, clock need to be turned off here + */ + mdp_clk_ctrl(0); + } + + vctrl->clk_enabled = 0; + vctrl->vsync_enabled = 0; + vctrl->clk_control = 0; + vctrl->expire_tick = 0; + vctrl->uevent = 0; + + vsync_irq_disable(INTR_PRIMARY_RDPTR, MDP_PRIM_RDPTR_TERM); + + pr_debug("%s-:\n", __func__); + + /* + * footswitch off + * this will casue all mdp register + * to be reset to default + * after footswitch on later + */ + + return ret; } -void mdp4_mddi_overlay_dmas_restore(void) +void mdp_mddi_overlay_suspend(struct msm_fb_data_type *mfd) { - /* mutex held by caller */ - if (mddi_mfd && mddi_pipe) { - mdp4_mddi_dma_busy_wait(mddi_mfd); - mdp4_dma_s_update_lcd(mddi_mfd, mddi_pipe); - mdp4_mddi_dma_s_kickoff(mddi_mfd, mddi_pipe); - mddi_mfd->dma_update_flag = 1; + int cndx = 0; + struct vsycn_ctrl *vctrl; + struct mdp4_overlay_pipe *pipe; + + vctrl = &vsync_ctrl_db[cndx]; + pipe = vctrl->base_pipe; + /* dis-engage rgb0 from mixer0 */ + if (pipe) { + if (mfd->ref_cnt == 0) { + /* adb stop */ + if (pipe->pipe_type == OVERLAY_TYPE_BF) + mdp4_overlay_borderfill_stage_down(pipe); + + /* pipe == rgb1 */ + mdp4_overlay_unset_mixer(pipe->mixer_num); + vctrl->base_pipe = NULL; + } else { + mdp4_mixer_stage_down(pipe, 1); + mdp4_overlay_iommu_pipe_free(pipe->pipe_ndx, 1); + } } } void mdp4_mddi_overlay(struct msm_fb_data_type *mfd) { - mutex_lock(&mfd->dma->ov_mutex); + int cndx = 0; + struct vsycn_ctrl *vctrl; + struct mdp4_overlay_pipe *pipe; + unsigned long flags; + long long xx; - if (mfd && mfd->panel_power_on) { - mdp4_mddi_dma_busy_wait(mfd); + vctrl = &vsync_ctrl_db[cndx]; - if (mddi_pipe && mddi_pipe->blt_addr) - mdp4_mddi_blt_dmap_busy_wait(mfd); - mdp4_overlay_mdp_perf_upd(mfd, 0); - mdp4_overlay_update_lcd(mfd); - - mdp4_overlay_mdp_perf_upd(mfd, 1); - if (mdp_hw_revision < MDP4_REVISION_V2_1) { - /* dmas dmap switch */ - if (mdp4_overlay_mixer_play(mddi_pipe->mixer_num) - == 0) { - mdp4_dma_s_update_lcd(mfd, mddi_pipe); - mdp4_mddi_dma_s_kickoff(mfd, mddi_pipe); - } else - mdp4_mddi_kickoff_ui(mfd, mddi_pipe); - } else /* no dams dmap switch */ - mdp4_mddi_kickoff_ui(mfd, mddi_pipe); - - /* signal if pan function is waiting for the update completion */ - if (mfd->pan_waiting) { - mfd->pan_waiting = FALSE; - complete(&mfd->pan_comp); - } + if (!mfd->panel_power_on) + return; + + pipe = vctrl->base_pipe; + if (pipe == NULL) { + pr_err("%s: NO base pipe\n", __func__); + return; } + + mutex_lock(&vctrl->update_lock); + if (!vctrl->clk_enabled) { + pr_err("%s: mdp clocks disabled\n", __func__); + mutex_unlock(&vctrl->update_lock); + return; + + } + mutex_unlock(&vctrl->update_lock); + + spin_lock_irqsave(&vctrl->spin_lock, flags); + if (vctrl->expire_tick) { + /* + * in the middle of shutting clocks down + * delay to allow pan display to go through + */ + vctrl->expire_tick = VSYNC_EXPIRE_TICK; + } + spin_unlock_irqrestore(&vctrl->spin_lock, flags); + + if (pipe->mixer_stage == MDP4_MIXER_STAGE_BASE) { + mdp4_mddi_vsync_enable(mfd, pipe, 0); + mdp4_overlay_setup_pipe_addr(mfd, pipe); + mdp4_mddi_pipe_queue(0, pipe); + } + + mdp4_overlay_mdp_perf_upd(mfd, 1); + + mutex_lock(&mfd->dma->ov_mutex); + mdp4_mddi_pipe_commit(); mutex_unlock(&mfd->dma->ov_mutex); + + mdp4_mddi_wait4vsync(0, &xx); + + + mdp4_overlay_mdp_perf_upd(mfd, 0); } int mdp4_mddi_overlay_cursor(struct fb_info *info, struct fb_cursor *cursor) @@ -739,7 +1073,6 @@ int mdp4_mddi_overlay_cursor(struct fb_i struct msm_fb_data_type *mfd = info->par; mutex_lock(&mfd->dma->ov_mutex); if (mfd && mfd->panel_power_on) { - mdp4_mddi_dma_busy_wait(mfd); mdp_hw_cursor_update(info, cursor); } mutex_unlock(&mfd->dma->ov_mutex); --- a/drivers/video/msm/mdp4_util.c +++ b/drivers/video/msm/mdp4_util.c @@ -35,6 +35,9 @@ struct mdp4_statistic mdp4_stat; +#define MDP4_SW_RESET; + + unsigned is_mdp4_hw_reset(void) { unsigned hw_reset = 0; @@ -265,7 +268,7 @@ void mdp4_hw_init(void) mdp_bus_scale_update_request(5); -#ifdef MDP4_ERROR +#ifdef MDP4_SW_RESET /* * Issue software reset on DMA_P will casue DMA_P dma engine stall * on LCDC mode. However DMA_P does not stall at MDDI mode. @@ -441,7 +444,7 @@ irqreturn_t mdp4_isr(int irq, void *ptr) mdp4_dmap_done_dsi_cmd(0); #else else { /* MDDI */ - mdp4_dma_p_done_mddi(dma); + mdp4_dmap_done_mddi(0); mdp_pipe_ctrl(MDP_DMA2_BLOCK, MDP_BLOCK_POWER_OFF, TRUE); complete(&dma->comp); @@ -492,7 +495,7 @@ irqreturn_t mdp4_isr(int irq, void *ptr) mdp4_overlay0_done_dsi_cmd(0); #else if (panel & MDP4_PANEL_MDDI) - mdp4_overlay0_done_mddi(dma); + mdp4_overlay0_done_mddi(0); #endif } mdp_hw_cursor_done(); @@ -3878,6 +3881,107 @@ error: return ret; } +#define QSEED_TABLE_1_COUNT 2 +#define QSEED_TABLE_2_COUNT 1024 + +static uint32_t mdp4_pp_block2qseed(uint32_t block) +{ + uint32_t valid = 0; + switch (block) { + case MDP_BLOCK_VG_1: + case MDP_BLOCK_VG_2: + valid = 0x1; + break; + default: + break; + } + return valid; +} + +static int mdp4_qseed_access_cfg(struct mdp_qseed_cfg_data *cfg) +{ + int i, ret = 0; + uint32_t base = (uint32_t) (MDP_BASE + mdp_block2base(cfg->block)); + uint32_t *values; + + if ((cfg->table_num != 1) && (cfg->table_num != 2)) { + ret = -ENOTTY; + goto error; + } + + if (((cfg->table_num == 1) && (cfg->len != QSEED_TABLE_1_COUNT)) || + ((cfg->table_num == 2) && (cfg->len != QSEED_TABLE_2_COUNT))) { + ret = -EINVAL; + goto error; + } + + values = kmalloc(cfg->len * sizeof(uint32_t), GFP_KERNEL); + if (!values) { + ret = -ENOMEM; + goto error; + } + + base += (cfg->table_num == 1) ? MDP4_QSEED_TABLE1_OFF : + MDP4_QSEED_TABLE2_OFF; + + if (cfg->ops & MDP_PP_OPS_WRITE) { + ret = copy_from_user(values, cfg->data, + sizeof(uint32_t) * cfg->len); + if (ret) { + pr_warn("%s: Error copying from user, %d", __func__, + ret); + ret = -EINVAL; + goto err_mem; + } + for (i = 0; i < cfg->len; i++) { + if (!(base & 0x3FF)) + wmb(); + MDP_OUTP(base , values[i]); + base += sizeof(uint32_t); + } + } else if (cfg->ops & MDP_PP_OPS_READ) { + for (i = 0; i < cfg->len; i++) { + values[i] = inpdw(base); + if (!(base & 0x3FF)) + rmb(); + base += sizeof(uint32_t); + } + ret = copy_to_user(cfg->data, values, + sizeof(uint32_t) * cfg->len); + if (ret) { + pr_warn("%s: Error copying to user, %d", __func__, ret); + ret = -EINVAL; + goto err_mem; + } + } + +err_mem: + kfree(values); +error: + return ret; +} + +int mdp4_qseed_cfg(struct mdp_qseed_cfg_data *cfg) +{ + int ret = 0; + + if (!mdp4_pp_block2qseed(cfg->block)) { + ret = -ENOTTY; + goto error; + } + + if ((cfg->ops & MDP_PP_OPS_READ) && (cfg->ops & MDP_PP_OPS_WRITE)) { + ret = -EPERM; + pr_warn("%s: Cannot read and write on the same request\n", + __func__); + goto error; + } + + ret = mdp4_qseed_access_cfg(cfg); + +error: + return ret; +} u32 mdp4_get_mixer_num(u32 panel_type) { u32 mixer_num; --- a/drivers/video/msm/mdp4_video_enhance.c +++ b/drivers/video/msm/mdp4_video_enhance.c @@ -696,9 +696,8 @@ static ssize_t mdnieset_init_file_cmd_sh struct device_attribute *attr, char *buf) { - char temp[15]; + char temp[]="mdnieset_init_file_cmd_show\n\0"; DPRINT("called %s\n", __func__); - sprintf(temp, "mdnieset_init_file_cmd_show\n"); strcat(buf, temp); return strlen(buf); } --- a/drivers/video/msm/mdp_debugfs.c +++ b/drivers/video/msm/mdp_debugfs.c @@ -722,84 +722,6 @@ static const struct file_operations pmdh .write = pmdh_reg_write, }; - - -#if defined(CONFIG_FB_MSM_OVERLAY) && defined(CONFIG_FB_MSM_MDDI) -static int vsync_reg_open(struct inode *inode, struct file *file) -{ - /* non-seekable */ - file->f_mode &= ~(FMODE_LSEEK | FMODE_PREAD | FMODE_PWRITE); - return 0; -} - -static int vsync_reg_release(struct inode *inode, struct file *file) -{ - return 0; -} - -static ssize_t vsync_reg_write( - struct file *file, - const char __user *buff, - size_t count, - loff_t *ppos) -{ - uint32 enable; - int cnt; - - if (count >= sizeof(debug_buf)) - return -EFAULT; - - if (copy_from_user(debug_buf, buff, count)) - return -EFAULT; - - debug_buf[count] = 0; /* end of string */ - - cnt = sscanf(debug_buf, "%x", &enable); - - mdp_dmap_vsync_set(enable); - - return count; -} - -static ssize_t vsync_reg_read( - struct file *file, - char __user *buff, - size_t count, - loff_t *ppos) -{ - char *bp; - int len = 0; - int tot = 0; - int dlen; - - if (*ppos) - return 0; /* the end */ - - bp = debug_buf; - dlen = sizeof(debug_buf); - len = snprintf(bp, dlen, "%x\n", mdp_dmap_vsync_get()); - tot += len; - bp += len; - *bp = 0; - tot++; - - if (copy_to_user(buff, debug_buf, tot)) - return -EFAULT; - - *ppos += tot; /* increase offset */ - - return tot; -} - - -static const struct file_operations vsync_fops = { - .open = vsync_reg_open, - .release = vsync_reg_release, - .read = vsync_reg_read, - .write = vsync_reg_write, -}; -#endif - static ssize_t emdh_reg_write( struct file *file, const char __user *buff, @@ -1345,15 +1267,6 @@ int mdp_debugfs_init(void) return -1; } -#if defined(CONFIG_FB_MSM_OVERLAY) && defined(CONFIG_FB_MSM_MDDI) - if (debugfs_create_file("vsync", 0644, dent, 0, &vsync_fops) - == NULL) { - printk(KERN_ERR "%s(%d): debugfs_create_file: debug fail\n", - __FILE__, __LINE__); - return -1; - } -#endif - dent = debugfs_create_dir("emdh", NULL); if (IS_ERR(dent)) { --- a/drivers/video/msm/msm_dss_io_8960.c +++ b/drivers/video/msm/msm_dss_io_8960.c @@ -11,6 +11,7 @@ * */ #include +#include #include "msm_fb.h" #include "mdp.h" #include "mdp4.h" @@ -758,6 +759,9 @@ void hdmi_msm_reset_core(void) hdmi_msm_clk(0); udelay(5); hdmi_msm_clk(1); + clk_reset(hdmi_msm_state->hdmi_app_clk, CLK_RESET_ASSERT); + udelay(20); + clk_reset(hdmi_msm_state->hdmi_app_clk, CLK_RESET_DEASSERT); } void hdmi_msm_init_phy(int video_format) --- a/drivers/video/msm/msm_fb.c +++ b/drivers/video/msm/msm_fb.c @@ -64,6 +64,11 @@ static unsigned char *fbram; static unsigned char *fbram_phys; static int fbram_size; static boolean bf_supported; +/* Set backlight on resume after 50 ms after first + * pan display on the panel. This is to avoid panel specific + * transients during resume. + */ +unsigned long backlight_duration = (HZ/20); static struct platform_device *pdev_list[MSM_FB_MAX_DEV_LIST]; static int pdev_list_cnt; @@ -331,6 +336,8 @@ static void msm_fb_remove_sysfs(struct p sysfs_remove_group(&mfd->fbi->dev->kobj, &msm_fb_attr_group); } +static void bl_workqueue_handler(struct work_struct *work); + static int msm_fb_probe(struct platform_device *pdev) { struct msm_fb_data_type *mfd; @@ -369,6 +376,8 @@ static int msm_fb_probe(struct platform_ mfd = (struct msm_fb_data_type *)platform_get_drvdata(pdev); + INIT_DELAYED_WORK(&mfd->backlight_worker, bl_workqueue_handler); + if (!mfd) return -ENODEV; @@ -866,6 +875,7 @@ static int msm_fb_blank_sub(int blank_mo mfd->op_enable = FALSE; curr_pwr_state = mfd->panel_power_on; mfd->panel_power_on = FALSE; + cancel_delayed_work_sync(&mfd->backlight_worker); bl_updated = 0; #if defined(CONFIG_MACH_ESPRESSO_VZW) || defined(CONFIG_MACH_ESPRESSO10_ATT) \ || defined(CONFIG_MACH_ESPRESSO10_SPR) || defined(CONFIG_MACH_ESPRESSO10_VZW) \ @@ -1783,13 +1793,28 @@ static int msm_fb_release(struct fb_info DEFINE_SEMAPHORE(msm_fb_pan_sem); +static void bl_workqueue_handler(struct work_struct *work) +{ + struct msm_fb_data_type *mfd = container_of(to_delayed_work(work), + struct msm_fb_data_type, backlight_worker); + struct msm_fb_panel_data *pdata = mfd->pdev->dev.platform_data; + + if ((pdata) && (pdata->set_backlight) && (!bl_updated)) { + down(&mfd->sem); + mfd->bl_level = unset_bl_level; + pdata->set_backlight(mfd); + bl_level_old = unset_bl_level; + bl_updated = 1; + up(&mfd->sem); + } +} + static int msm_fb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info) { struct mdp_dirty_region dirty; struct mdp_dirty_region *dirtyPtr = NULL; struct msm_fb_data_type *mfd = (struct msm_fb_data_type *)info->par; - struct msm_fb_panel_data *pdata; /* * If framebuffer is 2, io pen display is not allowed. @@ -1856,8 +1881,7 @@ static int msm_fb_pan_display(struct fb_ if (mfd->msmfb_no_update_notify_timer.function) del_timer(&mfd->msmfb_no_update_notify_timer); - mfd->msmfb_no_update_notify_timer.expires = - jiffies + ((1000 * HZ) / 1000); + mfd->msmfb_no_update_notify_timer.expires = jiffies + (2 * HZ); add_timer(&mfd->msmfb_no_update_notify_timer); mutex_unlock(&msm_fb_notify_update_sem); @@ -1876,18 +1900,9 @@ static int msm_fb_pan_display(struct fb_ mdp_dma_pan_update(info); up(&msm_fb_pan_sem); - if (unset_bl_level && !bl_updated) { - pdata = (struct msm_fb_panel_data *)mfd->pdev-> - dev.platform_data; - if ((pdata) && (pdata->set_backlight)) { - bl_updated = 1; - down(&mfd->sem); - mfd->bl_level = unset_bl_level; - pdata->set_backlight(mfd); - bl_level_old = unset_bl_level; - up(&mfd->sem); - } - } + if (unset_bl_level && !bl_updated) + schedule_delayed_work(&mfd->backlight_worker, + backlight_duration); ++mfd->panel_info.frame_count; return 0; @@ -3038,7 +3053,6 @@ static int msmfb_overlay_play(struct fb_ int ret; struct msmfb_overlay_data req; struct msm_fb_data_type *mfd = (struct msm_fb_data_type *)info->par; - struct msm_fb_panel_data *pdata; if (mfd->overlay_play_enable == 0) /* nothing to do */ return 0; @@ -3055,8 +3069,7 @@ static int msmfb_overlay_play(struct fb_ if (mfd->msmfb_no_update_notify_timer.function) del_timer(&mfd->msmfb_no_update_notify_timer); - mfd->msmfb_no_update_notify_timer.expires = - jiffies + ((1000 * HZ) / 1000); + mfd->msmfb_no_update_notify_timer.expires = jiffies + (2 * HZ); add_timer(&mfd->msmfb_no_update_notify_timer); mutex_unlock(&msm_fb_notify_update_sem); @@ -3070,21 +3083,9 @@ static int msmfb_overlay_play(struct fb_ ret = mdp4_overlay_play(info, &req); - if (unset_bl_level && !bl_updated) { - pdata = (struct msm_fb_panel_data *)mfd->pdev-> - dev.platform_data; - if ((pdata) && (pdata->set_backlight)) { - down(&mfd->sem); - mfd->bl_level = unset_bl_level; -#if !defined(CONFIG_MACH_GOGH) && !defined(CONFIG_MACH_INFINITE) - /*Backlight is set in mipi_novatek_disp_on*/ - pdata->set_backlight(mfd); -#endif - bl_level_old = unset_bl_level; - up(&mfd->sem); - bl_updated = 1; - } - } + if (unset_bl_level && !bl_updated) + schedule_delayed_work(&mfd->backlight_worker, + backlight_duration); return ret; } @@ -3391,6 +3392,10 @@ static int msmfb_handle_pp_ioctl(struct break; } break; + case mdp_op_qseed_cfg: + ret = mdp4_qseed_cfg((struct mdp_qseed_cfg_data *) + &pp_ptr->data.qseed_cfg_data); + break; #endif case mdp_bl_scale_cfg: ret = mdp_bl_scale_config(mfd, (struct mdp_bl_scale_data *) --- a/drivers/video/msm/msm_fb.h +++ b/drivers/video/msm/msm_fb.h @@ -81,7 +81,7 @@ struct msm_fb_data_type { DISP_TARGET dest; struct fb_info *fbi; - struct device *dev; + struct delayed_work backlight_worker; boolean op_enable; uint32 fb_imgType; boolean sw_currently_refreshing; --- a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_errors.c +++ b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_errors.c @@ -766,6 +766,6 @@ void print_core_recoverable_errors(u32 e break; } if (string) - DDL_MSG_ERROR("Recoverable Error code = 0x%x : %s", + DDL_MSG_LOW("Recoverable Error code = 0x%x : %s", error_code, string); } --- a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_helper.c +++ b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_helper.c @@ -448,7 +448,7 @@ struct ddl_client_context *ddl_get_curre ddl = ddl_context->current_ddl[1]; else { DDL_MSG_LOW("STATE-CRITICAL-FRMRUN"); - DDL_MSG_ERROR("Unexpected channel ID = %d", channel_id); + DDL_MSG_LOW("Unexpected channel ID = %d", channel_id); ddl = NULL; } return ddl; --- a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_interrupt_handler.c +++ b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_interrupt_handler.c @@ -351,16 +351,12 @@ static u32 ddl_decoder_seq_done_callback ddl->command_channel); } else { u32 seq_hdr_only_frame = false; - u32 need_reconfig = false; + u32 need_reconfig = false, eos_present = 0; struct vcd_frame_data *input_vcd_frm = &ddl->input_frame.vcd_frm; need_reconfig = ddl_check_reconfig(ddl); DDL_MSG_HIGH("%s : need_reconfig = %u\n", __func__, need_reconfig); - if (input_vcd_frm->flags & - VCD_FRAME_FLAG_EOS) { - need_reconfig = false; - } if (((input_vcd_frm->flags & VCD_FRAME_FLAG_CODECCONFIG) && (!(input_vcd_frm->flags & @@ -371,15 +367,25 @@ static u32 ddl_decoder_seq_done_callback input_vcd_frm->offset += seq_hdr_info.dec_frm_size; input_vcd_frm->data_len = 0; - input_vcd_frm->flags |= - VCD_FRAME_FLAG_CODECCONFIG; - ddl->input_frame.frm_trans_end = - !need_reconfig; - ddl_context->ddl_callback( + eos_present = + input_vcd_frm->flags & VCD_FRAME_FLAG_EOS; + if (!eos_present) { + input_vcd_frm->flags |= + VCD_FRAME_FLAG_CODECCONFIG; + ddl->input_frame.frm_trans_end = + !need_reconfig; + ddl_context->ddl_callback( VCD_EVT_RESP_INPUT_DONE, VCD_S_SUCCESS, &ddl->input_frame, sizeof(struct ddl_frame_data_tag), (u32 *) ddl, ddl->client_data); + } else { + input_vcd_frm->flags &= + ~(VCD_FRAME_FLAG_CODECCONFIG); + seq_hdr_only_frame = false; + pr_err("%s() Codec config buffer with eos\n", + __func__); + } } else { if (decoder->codec.codec == VCD_CODEC_VC1_RCV) { @@ -1163,20 +1169,28 @@ static u32 ddl_decoder_output_done_callb &(decoder->dec_disp_info); struct ddl_frame_data_tag *output_frame = &(ddl->output_frame); struct vcd_frame_data *output_vcd_frm = &(output_frame->vcd_frm); + enum vidc_1080p_decode_frame frame_type = 0; u32 vcd_status, free_luma_dpb = 0, disp_pict = 0, is_interlaced; + u32 idr_frame = 0, coded_frame = 0; get_dec_op_done_data(dec_disp_info, decoder->output_order, &output_vcd_frm->physical, &is_interlaced); decoder->progressive_only = !(is_interlaced); output_vcd_frm->frame = VCD_FRAME_YUV; + vidc_sm_get_displayed_picture_frame(&ddl->shared_mem + [ddl->command_channel], &disp_pict); + coded_frame = (disp_pict & 0x03); + idr_frame = (disp_pict & 0x20) >> 5; + if (idr_frame) + frame_type = VIDC_1080P_DECODE_FRAMETYPE_IDR; + else + frame_type = (disp_pict & 0x1c) >> 2; if (decoder->codec.codec == VCD_CODEC_MPEG4 || decoder->codec.codec == VCD_CODEC_VC1 || decoder->codec.codec == VCD_CODEC_VC1_RCV || (decoder->codec.codec >= VCD_CODEC_DIVX_3 && decoder->codec.codec <= VCD_CODEC_XVID)) { - vidc_sm_get_displayed_picture_frame(&ddl->shared_mem - [ddl->command_channel], &disp_pict); if (decoder->output_order == VCD_DEC_ORDER_DISPLAY) { - if (!disp_pict) { + if (!coded_frame) { output_vcd_frm->frame = VCD_FRAME_NOTCODED; vidc_sm_get_available_luma_dpb_address( &ddl->shared_mem[ddl->command_channel], @@ -1201,6 +1215,7 @@ static u32 ddl_decoder_output_done_callb DDL_MSG_ERROR("CORRUPTED_OUTPUT_BUFFER_ADDRESS"); ddl_hw_fatal_cb(ddl); } else { + ddl_get_decoded_frame(output_vcd_frm, frame_type); vidc_sm_get_metadata_status(&ddl->shared_mem [ddl->command_channel], &decoder->meta_data_exists); @@ -1223,6 +1238,8 @@ static u32 ddl_decoder_output_done_callb output_vcd_frm->flags |= VCD_FRAME_FLAG_DATACORRUPT; } + if (decoder->codec.codec != VCD_CODEC_H264) + output_vcd_frm->flags &= ~VCD_FRAME_FLAG_DATACORRUPT; output_vcd_frm->ip_frm_tag = dec_disp_info->tag_top; vidc_sm_get_picture_times(&ddl->shared_mem [ddl->command_channel], @@ -1328,6 +1345,10 @@ static u32 ddl_get_decoded_frame(struct case VIDC_1080P_DECODE_FRAMETYPE_OTHERS: frame->frame = VCD_FRAME_YUV; break; + case VIDC_1080P_DECODE_FRAMETYPE_IDR: + frame->flags |= VCD_FRAME_FLAG_SYNCFRAME; + frame->frame = VCD_FRAME_IDR; + break; case VIDC_1080P_DECODE_FRAMETYPE_32BIT: default: DDL_MSG_ERROR("UNKNOWN-FRAMETYPE"); --- a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_metadata.c +++ b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_metadata.c @@ -217,6 +217,7 @@ void ddl_set_default_decoder_metadata_bu DDL_METADATA_ALIGNSIZE(suffix); decoder->suffix = suffix; output_buf_req->sz += suffix; + decoder->meta_data_offset = 0; DDL_MSG_LOW("metadata output buf size : %d", suffix); } --- a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_properties.c +++ b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_properties.c @@ -201,6 +201,7 @@ static u32 ddl_set_dec_property(struct d decoder->dynamic_prop_change |= DDL_DEC_REQ_OUTPUT_FLUSH; decoder->dpb_mask.client_mask = 0; + decoder->field_needed_for_prev_ip = 0; vcd_status = VCD_S_SUCCESS; } break; --- a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_shared_mem.c +++ b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_shared_mem.c @@ -45,7 +45,7 @@ #define VIDC_SM_DISP_PIC_PROFILE_DISP_PIC_PROFILE_SHFT 0 #define VIDC_SM_DISP_PIC_FRAME_TYPE_ADDR 0x00c0 -#define VIDC_SM_DISP_PIC_FRAME_TYPE_BMSK 0x00000003 +#define VIDC_SM_DISP_PIC_FRAME_TYPE_BMSK 0x0000003f #define VIDC_SM_DISP_PIC_FRAME_TYPE_SHFT 0 #define VIDC_SM_FREE_LUMA_DPB_ADDR 0x00c4 --- a/drivers/video/msm/vidc/1080p/ddl/vidc.c +++ b/drivers/video/msm/vidc/1080p/ddl/vidc.c @@ -520,8 +520,12 @@ void vidc_1080p_get_decode_frame( u32 frame = 0; VIDC_HWIO_IN(REG_760102, &frame); - *pe_frame = (enum vidc_1080p_decode_frame) - (frame & VIDC_1080P_SI_RG8_DECODE_FRAMETYPE_MASK); + if (frame & 0x10) + *pe_frame = (enum vidc_1080p_decode_frame) + VIDC_1080P_DECODE_FRAMETYPE_IDR; + else + *pe_frame = (enum vidc_1080p_decode_frame) + (frame & VIDC_1080P_SI_RG8_DECODE_FRAMETYPE_MASK); } void vidc_1080p_get_decode_frame_result( --- a/drivers/video/msm/vidc/1080p/ddl/vidc.h +++ b/drivers/video/msm/vidc/1080p/ddl/vidc.h @@ -277,6 +277,7 @@ enum vidc_1080p_decode_frame{ VIDC_1080P_DECODE_FRAMETYPE_P = 2, VIDC_1080P_DECODE_FRAMETYPE_B = 3, VIDC_1080P_DECODE_FRAMETYPE_OTHERS = 4, + VIDC_1080P_DECODE_FRAMETYPE_IDR = 5, VIDC_1080P_DECODE_FRAMETYPE_32BIT = 0x7FFFFFFF }; enum vidc_1080P_decode_frame_correct_type { --- a/drivers/video/msm/vidc/1080p/resource_tracker/vcd_res_tracker.c +++ b/drivers/video/msm/vidc/1080p/resource_tracker/vcd_res_tracker.c @@ -520,6 +520,9 @@ int res_trk_update_bus_perf_level(struct u32 enc_perf_level = 0, dec_perf_level = 0; u32 bus_clk_index, client_type = 0; int rc = 0; + bool turbo_enabled = false; + bool turbo_supported = + !resource_context.vidc_platform_data->disable_turbo; cctxt_itr = dev_ctxt->cctxt_list_head; while (cctxt_itr) { @@ -527,6 +530,9 @@ int res_trk_update_bus_perf_level(struct dec_perf_level += cctxt_itr->reqd_perf_lvl; else enc_perf_level += cctxt_itr->reqd_perf_lvl; + + if (cctxt_itr->is_turbo_enabled) + turbo_enabled = true; cctxt_itr = cctxt_itr->next; } @@ -543,13 +549,18 @@ int res_trk_update_bus_perf_level(struct if (dev_ctxt->reqd_perf_lvl + dev_ctxt->curr_perf_lvl == 0) bus_clk_index = 2; - else if (resource_context.vidc_platform_data->disable_turbo - && bus_clk_index == 3) { - VCDRES_MSG_ERROR("Warning: Turbo mode not supported " - " falling back to 1080p bus\n"); + else if ((!turbo_supported || !turbo_enabled) && bus_clk_index == 3) { + if (!turbo_supported) + VCDRES_MSG_MED("Warning: Turbo mode not supported "\ + " falling back to 1080p bus\n"); bus_clk_index = 2; } + if (bus_clk_index == 3) + dev_ctxt->turbo_mode_set = true; + else + dev_ctxt->turbo_mode_set = false; + bus_clk_index = (bus_clk_index << 1) + (client_type + 1); VCDRES_MSG_LOW("%s(), bus_clk_index = %d", __func__, bus_clk_index); VCDRES_MSG_LOW("%s(),context.pcl = %x", __func__, resource_context.pcl); @@ -564,6 +575,9 @@ u32 res_trk_set_perf_level(u32 req_perf_ struct vcd_dev_ctxt *dev_ctxt) { u32 vidc_freq = 0; + bool turbo_supported = + !resource_context.vidc_platform_data->disable_turbo; + if (!pn_set_perf_lvl || !dev_ctxt) { VCDRES_MSG_ERROR("%s(): NULL pointer! dev_ctxt(%p)\n", __func__, dev_ctxt); @@ -571,8 +585,7 @@ u32 res_trk_set_perf_level(u32 req_perf_ } VCDRES_MSG_LOW("%s(), req_perf_lvl = %d", __func__, req_perf_lvl); - if (resource_context.vidc_platform_data->disable_turbo - && req_perf_lvl > RESTRK_1080P_MAX_PERF_LEVEL) { + if (!turbo_supported && req_perf_lvl > RESTRK_1080P_MAX_PERF_LEVEL) { VCDRES_MSG_ERROR("%s(): Turbo not supported! dev_ctxt(%p)\n", __func__, dev_ctxt); } @@ -602,10 +615,11 @@ u32 res_trk_set_perf_level(u32 req_perf_ *pn_set_perf_lvl = RESTRK_1080P_TURBO_PERF_LEVEL; } - if (resource_context.vidc_platform_data->disable_turbo && - *pn_set_perf_lvl == RESTRK_1080P_TURBO_PERF_LEVEL) { - VCDRES_MSG_ERROR("Warning: Turbo mode not supported " - " falling back to 1080p clocks\n"); + if ((!turbo_supported || !dev_ctxt->turbo_mode_set) && + *pn_set_perf_lvl == RESTRK_1080P_TURBO_PERF_LEVEL) { + if (!turbo_supported) + VCDRES_MSG_ERROR("Warning: Turbo mode not supported "\ + " falling back to 1080p clocks\n"); vidc_freq = vidc_clk_table[2]; *pn_set_perf_lvl = RESTRK_1080P_MAX_PERF_LEVEL; } @@ -924,23 +938,44 @@ void res_trk_secure_set(void) int res_trk_open_secure_session() { - int rc; - - if (res_trk_check_for_sec_session() == 1) { - mutex_lock(&resource_context.secure_lock); + int rc, memtype; + if (!res_trk_check_for_sec_session()) { + pr_err("Secure sessions are not active\n"); + return -EINVAL; + } + mutex_lock(&resource_context.secure_lock); + if (!resource_context.sec_clk_heap) { pr_err("Securing...\n"); rc = res_trk_enable_iommu_clocks(); if (rc) { pr_err("IOMMU clock enabled failed while open"); goto error_open; } - msm_ion_secure_heap(ION_HEAP(resource_context.memtype)); - msm_ion_secure_heap(ION_HEAP(resource_context.cmd_mem_type)); + memtype = ION_HEAP(resource_context.memtype); + rc = msm_ion_secure_heap(memtype); + if (rc) { + pr_err("ION heap secure failed heap id %d rc %d\n", + resource_context.memtype, rc); + goto disable_iommu_clks; + } + memtype = ION_HEAP(resource_context.cmd_mem_type); + rc = msm_ion_secure_heap(memtype); + if (rc) { + pr_err("ION heap secure failed heap id %d rc %d\n", + resource_context.cmd_mem_type, rc); + goto unsecure_memtype_heap; + } + resource_context.sec_clk_heap = 1; res_trk_disable_iommu_clocks(); - mutex_unlock(&resource_context.secure_lock); } + mutex_unlock(&resource_context.secure_lock); return 0; +unsecure_memtype_heap: + msm_ion_unsecure_heap(ION_HEAP(resource_context.cmd_mem_type)); +disable_iommu_clks: + res_trk_disable_iommu_clocks(); error_open: + resource_context.sec_clk_heap = 0; mutex_unlock(&resource_context.secure_lock); return rc; } @@ -948,17 +983,19 @@ error_open: int res_trk_close_secure_session() { int rc; - if (res_trk_check_for_sec_session() == 1) { + if (res_trk_check_for_sec_session() == 1 && + resource_context.sec_clk_heap) { pr_err("Unsecuring....\n"); mutex_lock(&resource_context.secure_lock); rc = res_trk_enable_iommu_clocks(); if (rc) { - pr_err("IOMMU clock enabled failed while close"); + pr_err("IOMMU clock enabled failed while close\n"); goto error_close; } msm_ion_unsecure_heap(ION_HEAP(resource_context.cmd_mem_type)); msm_ion_unsecure_heap(ION_HEAP(resource_context.memtype)); res_trk_disable_iommu_clocks(); + resource_context.sec_clk_heap = 0; mutex_unlock(&resource_context.secure_lock); } return 0; --- a/drivers/video/msm/vidc/1080p/resource_tracker/vcd_res_tracker.h +++ b/drivers/video/msm/vidc/1080p/resource_tracker/vcd_res_tracker.h @@ -57,6 +57,7 @@ struct res_trk_context { u32 mmu_clks_on; u32 secure_session; struct mutex secure_lock; + u32 sec_clk_heap; }; #if DEBUG --- a/drivers/video/msm/vidc/common/vcd/vcd_client_sm.c +++ b/drivers/video/msm/vidc/common/vcd/vcd_client_sm.c @@ -213,11 +213,11 @@ static u32 vcd_decode_frame_cmn return vcd_handle_input_frame(cctxt, input_frame); } -static u32 vcd_pause_in_run(struct vcd_clnt_ctxt *cctxt) +static u32 vcd_pause_cmn(struct vcd_clnt_ctxt *cctxt) { u32 rc = VCD_S_SUCCESS; - VCD_MSG_LOW("vcd_pause_in_run:"); + VCD_MSG_LOW("vcd_pause_cmn:"); if (cctxt->sched_clnt_hdl) { rc = vcd_sched_suspend_resume_clnt(cctxt, false); @@ -1703,7 +1703,7 @@ static const struct vcd_clnt_state_table vcd_encode_frame_cmn, vcd_decode_start_in_run, vcd_decode_frame_cmn, - vcd_pause_in_run, + vcd_pause_cmn, NULL, vcd_flush_cmn, vcd_stop_in_run, @@ -1778,7 +1778,7 @@ static const struct vcd_clnt_state_table vcd_encode_frame_cmn, NULL, vcd_decode_frame_cmn, - NULL, + vcd_pause_cmn, NULL, vcd_flush_in_eos, vcd_stop_in_eos, --- a/drivers/video/msm/vidc/common/vcd/vcd_core.h +++ b/drivers/video/msm/vidc/common/vcd/vcd_core.h @@ -146,7 +146,7 @@ struct vcd_dev_ctxt { u32 reqd_perf_lvl; u32 curr_perf_lvl; u32 set_perf_lvl_pending; - + bool turbo_mode_set; }; struct vcd_clnt_status { @@ -213,6 +213,7 @@ struct vcd_clnt_ctxt { u32 meta_mode; int secure; int perf_set_by_client; + bool is_turbo_enabled; }; #define VCD_BUFFERPOOL_INUSE_DECREMENT(val) \ --- a/drivers/video/msm/vidc/common/vcd/vcd_sub.c +++ b/drivers/video/msm/vidc/common/vcd/vcd_sub.c @@ -782,7 +782,11 @@ u32 vcd_free_one_buffer_internal( buf_pool->allocated--; } - memset(buf_entry, 0, sizeof(struct vcd_buffer_entry)); + buf_entry->valid = buf_entry->allocated = buf_entry->in_use = 0; + buf_entry->alloc = buf_entry->virtual = buf_entry->physical = NULL; + buf_entry->sz = 0; + memset(&buf_entry->frame, 0, sizeof(struct vcd_frame_data)); + buf_pool->validated--; if (buf_pool->validated == 0) vcd_free_buffer_pool_entries(buf_pool); @@ -3034,6 +3038,7 @@ u32 vcd_req_perf_level( { u32 rc; u32 res_trk_perf_level; + u32 turbo_perf_level; if (!perf_level) { VCD_MSG_ERROR("Invalid parameters\n"); return -EINVAL; @@ -3043,10 +3048,13 @@ u32 vcd_req_perf_level( rc = -ENOTSUPP; goto perf_level_not_supp; } + turbo_perf_level = get_res_trk_perf_level(VCD_PERF_LEVEL_TURBO); rc = vcd_set_perf_level(cctxt->dev_ctxt, res_trk_perf_level); if (!rc) { cctxt->reqd_perf_lvl = res_trk_perf_level; cctxt->perf_set_by_client = 1; + if (res_trk_perf_level == turbo_perf_level) + cctxt->is_turbo_enabled = true; } perf_level_not_supp: return rc; --- a/firmware/tsp_melfas/PRIV.fw.ihex +++ b/firmware/tsp_melfas/PRIV.fw.ihex @@ -1,401 +1,618 @@ :100000003B4D454C4641532062696E6172792066D2 + :10001000696C650A5B47656E6572616C20496E6646 + :100020006F726D6174696F6E5D0A43484950203D7F + :10003000204D4D53313030410A0A5B53656374697A + :100040006F6E20496E666F726D6174696F6E5D0AC6 + :1000500053454354494F4E5F4E414D45203D20503E + :100060005249560A53454354494F4E5F56455253E1 -:10007000494F4E203D2032300A53544152545F5074 + +:10007000494F4E203D2032320A53544152545F5072 :100080004147455F41444452203D2032330A454EAA + :10009000445F504147455F41444452203D2032383F + :1000A0000A434F4D50415449424C455F53454354D8 + :1000B000494F4E5F4E414D45203D20434F52450A2A + :1000C000434F4D50415449424C455F564552534968 + :1000D0004F4E203D2034350A0A5B42696E617279C9 + :1000E0005D0AAEF1173048314D353452502800B515 + :1000F000082801D002E007D1244A134B124B1360A9 + :100100001A60986058E01B60D8681B4B11D1152B02 + :10011000104B114A104A11601A601A4B114B124AC7 + :10012000114A12601A601A4B124B134A124A13609A + :100130001A601A4B134B144A13E001601AF8C8F7FF + :10014000FE46C0BD08200001F8000068C12000087C + :10015000F82000115000005CA92000006800006831 + :10016000812000006C0000662D200002000000715C -:100170004920000018000062052000001C000061FA + +:100170009D20000018000062052000001C000061A6 :10018000E92000002000005CAB2000002423A047F1 + :1001900070220105DB4909721A721A2210700A22B4 + :1001A000004B07721A68192280430A0052681A60CD + :1001B0001A05DB2380609A689946C04770200000CA + :1001C0000C20000014285AB5004B05D007DD01288B + :1001D000591A1022B45A1800404802E00046C0BD27 -:1001E00000000072900000FFFF2800B50028B4D086 + +:1001E00000000072E40000FFFF2800B50028B4D032 :1001F0000E4B08D00EDC04285A1A10225A5A180046 + :1002000040385AE0075A180040E0024240E00048F7 -:1002100002BD004802000072900000FFFFFFFF00D7 + +:1002100002BD004802000072E40000FFFFFFFF0083 :1002200001B09BB5F09011930E7808910B90034BA1 + :10023000C91C1678499112B2495E1A200A921325F8 + :10024000001C2C4AC55E11202891141C2F911568A2 + :1002500059680949C22108910D681B5E58212690F2 + :100260001793195E509504901895059506950A9573 + :1002700009E095950898149A0343509915FCFAF7EC + :10028000FFB2009B13683318181AC3990B930C988C + :100290000B9A03788078C99002B249320191160115 + :1002A000939310920F9A02E0753202991049AC189C + :1002B000882B0E5C432304D92748AA4694B2DB3B23 + :1002C00001990356C249A8188A56C8320101929969 + :1002D0000230021808181049A23A015C0A2A0DB22D + :1002E000D248A2D80E5682990ED109428A46629B04 + :1002F00010489F189A5A1300521A5B990DE01293F6 + :1003000007D1DA2B002B00E0414A98D03F18D3994F + :100310000E781B3B01428BB25B4A95D1375A830062 + :10032000401A1B980D99079307D02E290098189A08 + :100330000243509919FC9EF7FF9B179A07B2009948 + :100340000818181889910868731AC0990C434B1C37 + :1003500013280043422900DC0B18FFDD041A9B9B85 + :100360000AE012930A1AE4980990091A80990CE09D + :100370000DDC0629009906980518891AC091069087 + :10038000059804E00318C018AD9B029004B2DB335B + :10039000019902930242919A16AB0FDD859303787F + :1003A0001B99129803DC0042889A05E764469498EA + :1003B000041B3A466397021A19D40242D1910721CD + :1003C000009A06E00D1C15950699099A049B0A935C + :1003D000041C2792059C0222019309910A9B059215 + :1003E0000718F8990418401900F7FF99089002FCC3 + :1003F00043D06428009B069A0A18D099091940181E + :1004000040F7FF99089003FC37205A9A03D0562AE8 + :1004100000202D9B02D052429ADA24429301981C6C + :1004200011FC28F7FF98051C051B3F99041A781842 + :100430003F17DB43C399084018FC1CF7FF01809964 + :1004400003FC18F7FF1C1A4B4BDD00283F5C1B20F8 + :100450003FDD002D3F5D51253F1A41202D435818A7 + :10046000C9FC08F7FF9A03E02B01909902FC02F700 + :10047000FFDD00283F4B3F203F5C1C99099A069BFB + :100480000A18801A5843C31B40990817DBF7FF402E + :10049000189902FBF1F7FF0180283FFBED203FDDBB + :1004A00000225A4B34202D5C1B1B001AD143481BE1 + :1004B000122387435A18801B1CF7FF1A619B07FB06 + :1004C000DBD0002B00991142401A24245A1C2070C2 + :1004D00008FE8AF7FF1C209009FE74F7FF900A9A25 -:1004E0000B56D323015E17AEF118930F78174A1BF2 + +:1004E0000B56D323012533AEF118930F78174A1B0F :1004F0004B1A5E58210A901024005E502128901259 + :10050000491868586809901391075E1920089115D9 + :10051000681B5E1120269116931794049405E0A899 + :10052000940299139812F7FF43789910FBA7683348 + :10053000B2001AC318089A0B93032303990356D3E6 + :10054000980A9A097895434A43481C7B931401986A + :100550009018930C9219E087900D20000924200038 + :1005600009AE20000D3840002000000059F80000BE -:1005700059F4200002EC40004000000072501CAA18 + +:1005700059F4200002EC40004000000072A41CAAC4 :10058000990D494E18882B0E5C432304D925484CFD + :100590004694B2DB3B0156C2494B18BA56C81828DC + :1005A000320130020192181049453A015C0A2A0DC5 + :1005B000B2D24845D80E5682990ED109428A466277 + :1005C0009B0D4842189A5A1300521A5B9907E01281 + :1005D0009306D1DC2B002B00E0464A3BD04418D3D5 + :1005E000990E781B3B01428BB25B4A38D13C5A834F + :1005F00000401A1B980799069306D03329009917D3 + :100600009816F7FF43689A15FB396873B2001A1BF6 + :100610001810980193019A069B03435A99099B0667 + :1006200043419818434329001A099905DD041889A4 + :1006300018E4E00391051AE4980590051A80980AD9 + :10064000990199194348280018409802DD0618803E + :100650009904900218C9E0059104990498021AC9F6 + :100660001A8091049002B2ED350142959A14AB0CB8 + :10067000DD86980F781FDC0042879908E752F7FF64 + :1006800098029908FAFB98041C07FAF6F7FF1C0574 + :100690009908F7FF98059908FAF11C201C06FAEC56 + :1006A000F7FF4376437F4340436D197D991111ADA8 + :1006B0001830B01B11806088604D46C0BDF040000E + :1006C0002000000059F8000059F4200002EC40001E + :1006D00040004B05B508B2DB881BD0012B10D101BF + :1006E0002BAFF98AF7FD46C0BD08200000284AC19B + :1006F000B538B21B8813D1002BAEDC3BE159D100D9 + :100700002B0CDC1BE0D2D1002B05DC08E0A6D100CD + :100710002B03DD00E08F2B02E096E1A5D0002B0932 + :10072000E07CE0A4D1002B06DC03E19DD0002B0A85 + :10073000E099E0ACD100D0002B0BE0ADE196D10008 + :100740002B31DC08E095D05A2B10D1002B302B0F29 + :10075000E09AE189D0002B62E048E181D1002B6171 + :10076000DC03E181D0002B64E177E16FD100D000A0 + :100770002BA8E15BE17AD1002BF4DC19E0BCD100BD + :100780002BEFDC09E12ED1002BBF2BEEE150E12352 + :10079000D100D0002BAFE111E168D1002BF1DA00DC + :1007A000E0912BF2E08CE094D100D0002BF3E099A3 + :1007B000E15CD1002BF9DC0BE0CDD1002BF6DA00A7 + :1007C000E0AD2BF7E0A1E0AFD100D0002BF8E0B70F + :1007D000E14CD1002BFBDA00E0CF2BFCE0C4E0D3EE + :1007E000D100D0002BFDE0D8E14068234C83D1013B + :1007F0002B00F902F7FD4B816822701A00D2498064 + :10080000E13423004A804D7D78085C1418C0330120 + :1008100019582B087004E127D1F6230F4A7B5E118B + :1008200020265F522528121211094013439918CB34 + :100830004A734B7070132303881A1A9AB2128D19D7 + :100840004B7254D14B6E881A4B6BB21223044B6E11 + :100850001A9A4B6A8CD9E10754D18CDA4B6C701A16 + :100860004B674B6AE102781A3334701A4B644B6859 + :10087000E0FC4B62781AD0022A00701A2202220190 + :10088000E0F4E0F1701A781A4B62701A4B5C4B611D + :10089000E0EC4B5A781AE0E7701A4B5F881278192F + :1008A000B2121A9A230B54D14B55881A4B52B212DA + :1008B0004B5A230C78594B511A9AE0D554D1224205 + :1008C0004B4F4B4C701A881A2101B21223F14B4B3B + :1008D0001A9A4B4854D14B4C881A7859B2121A9A2A -:1008E00023F254D14B4621BB4B43006FAEF1192389 + +:1008E00023F254D14B4621BD4B432C27AEF11923A3 :1008F000F3881A1A9AB21254D14B42881A4B3FB25B + :10090000124B4823F478194B3E1A9A4B3B54D14B67 + :1009100045881A7819B2121A9A23F554D14B394BDB + :1009200039E0A6781B4A3A78DA18D3701A4B354961 + :10093000374B324B34881A781BB212791918CB1AFC + :100940009A23F754D14B2F881A4B2CB2124B3023D9 + :10095000F879594B2B1A9A4B2854D14B2C881A7979 + :1009600099B2121A9A23F954D14B26881A4B23B202 + :10097000124B2723FA79D94B221A9A4B1F54D14B89 + :1009800023881A7A19B2121A9A23FB54D14B1D8864 + :100990001A4B1AB2124B1E23FC7A594B191A9A4B56 + :1009A0001654D14B1A881A7A99B2121A9A23FD5406 + :1009B000D14B144B1DE05C4B12781AF7FD701AE016 + :1009C00055F81F4A10491A680C23004D0D78105C29 + :1009D000C41820330119582B087004E047D1F57E64 + :1009E0001A4B0B701A4B07881A4B04B2124B082390 + :1009F000EF7DD94B031A9AE03954D120000028200A + :100A0000000D985000000C2000002A200011EC205E + :100A10000009AE20000D48200001DD200001DF208C + :100A200000030A000073FF00007BFF200003F62094 + :100A3000000D344A10490F680C23004D0F78105CEC + :100A4000C41820330119582B087004F7FCD1F5E0C5 + :100A50000DFFD7781A4B0A701A4B084B09E0084B68 + :100A600006789AE003701A78DA4B06701A4B034640 + :100A7000C0BD3820000D342000002A5000000C00BA + :100A8000005BFF200000351C03B50828061E50F748 + :100A9000FFD8350A04F8932A151B2A4A18002A7031 + :100AA00013230170134A174A16E0291859019B4B6A + :100AB0001520020049701018C94A14E01E6011FF89 + :100AC0009EF7FC22004B0EE018701A015B4A0D20C5 + :100AD00001185970104B0E4B0E565ADC002A00803C + :100AE0001A220060134A094A06E009015B20021835 + :100AF000C9701000494A084A041889BD08601120CD + :100B00000001E5200003F64000408420000D342061 + :100B1000000E6420000308200003F84C87B5F05C49 + :100B2000E323232B00B08D3B01D0124D84B2DBE0D8 + :100B3000004984009A1C13005218D2263C188A1EC1 + :100B40005A5F9041B01E46B2D254E8D1F12B00FF5B + :100B500082F7FCD1FB28005CE423232C009407E0FF + :100B6000A3D10022604B784B787819781B01094398 + :100B70000A425221204C76430B011B5C61213491C7 + :100B80000948744F742100496E9108B2DBB2D293C8 + :100B90000B920A230019C4910122019901E03E4FF2 + :100BA0006F4D6E468C18C94F6E5D79466718FD977C + :100BB0000488BF970688AF8C3F46678B2F46BC29B9 + :100BC0000097034661D122466FB209370C91055E4A + :100BD0007921001A799F0519C917CF9F094079DA41 + :100BE0006542B94669271091035E79311846695FFD + :100BF000CF27001BCF9903187F17F99909404FDDC4 + :100C00005542B95FED272CDD572D001C559E07304E + :100C10000133024296340C1C2ADD45009E9D0119C9 + :100C2000AE18F65FF5273CDCB82D0018F54E4D5F89 + :100C3000EE272CDDE92E002E0078062105D0E68B6C + :100C40002E56699908468C00C988AD9103B2374683 + :100C5000619504400D250F210F113F9903438F46E5 + :100C60008C432F9D08493E990B448C431135014616 + :100C7000659505706F70292710466D21005D7F70A6 + :100C8000EE4665712970AF71A97169261471E95D2D + :100C900075466D95089E071C557001300133024260 + :100CA00096340C9F08DCB9D1422F00BDF0B00D196D + :100CB000D74F2D783F3F01D0A32F002710466999C9 + :100CC000085E7D9503122D9D0500C99903910225AB + :100CD0000F112F3640400D7836950343AF250F9600 + :100CE0000697054E1E9F0219F599059E039F0A8ED1 + :100CF00018AEF11A430E4317706E702F466E271010 + :100D000046695DBE261870AE46675C71712970EF4A + :100D1000716E78262EFF686626FFDD0068A671AE2C + :100D2000DD002EFF9F0826FF370171EE2501B2FF7F + :100D3000700597084B0EE76CF7FC601FE7B7FE39AC + :100D4000200009AE200001EC20000D9C200000F5E1 + :100D5000200000F420000D48200016F4FFFFFC38AE + :100D600000000504200011EC200001202000016497 + :100D700020000D981C04B510FE70F7FCD1FB280074 + :100D80002C014B0A2C02D002E002D105701A220F6E + :100D9000220EE0012200701A709A70DA4B04705A29 + :100DA000601A2201FE04F7FC46C0BD10200011ECC1 -:100DB00020000D98B08BB5F0D9002814F7FEE3A3FE -:100DC0000015FF09004303A2005903A2006403A217 -:100DD00003A2008803A200FB014803A2015403A25E -:100DE00002B7033003A203A2039D038C781B4BC000 -:100DF000D0002B004CBFE38720F2230170E0722368 -:100E0000FDD8F7FE70204BBC2BAA781BE37AD000EC -:100E10004BBB4ABA4ABB78117812781B429118C969 -:100E2000E370D00078E04AB8781232401841B259E5 -:100E300029FF188943D2DD0370E2B2D278E2E3637E -:100E4000B2DB18D3E35E70E323004AB021A0701335 -:100E500000C94AAF49AF5453545320A100C049AE12 -:100E6000210A5453390118121888B2C92900700395 -:100E7000E348D1F9230049A9429A680A684BDD0288 -:100E80000FDB18D370134AA64BA6E33D699B49A01C -:100E90002B004AA05C8BD10D2B0120194BA2D01145 -:100EA0002B01781B4BA1D102E00A7E987E984BA0C3 -:100EB0005C8AE0072A0120082019D103D0002B0307 -:100EC0004B9C200868190180FEDCF7FE76984B8E5B -:100ED0004B94E319601A220078114A9329004A962C -:100EE0002102D003270870112101E0084A8B7011FC -:100EF000210827062A225E522703DC00691C695D4F -:100F00002600681B9404950596029303E047251A72 -:100F1000230E20003B011CAE1C5AB2DB4987019214 -:100F2000005219921C0C5A521880B212D1F22B00A6 -:100F3000F7FE211C0FFAFEA7230E90063B01920735 -:100F40001C58B2DB1992018200529000B2905AA252 -:100F50009A02B211DA03428A9102B2C19304950552 -:100F60001A809A069001B2802204466898005E8238 -:100F7000198901812A0000499100DD0D5A614668F6 -:100F8000980088819807522142BA17D19A034141AB -:100F9000920318522000E00252605A62D1CE2B0018 -:100FA000B2ED3D01D1B32DFF9C044B5E9E039D0528 -:100FB000615D611CE2A6601E48624B61601C2400FA -:100FC00068C36882DA00429A250CE29D42950FD6EA -:100FD00019924166684117DE68001AF61B9B0FF6EE -:100FE0000FC627184166428717CE19800FF61A766A -:100FF0001A411B89428D0FC8B2E44144D1082C002C -:101000000FD91AD3429A220BB2E4414CD1002C00E2 -:101010004B4DE279230E781AD1132A001C5FE2733C -:1010200001BF221AB2D23A0118791C912D005D0D30 -:101030002501D002E002550D5A0E00492A00520D3A -:10104000E001D1F0483D4C41B2DB3B01D1E62BFF42 -:101050004B3FE259781A3334D0002A002201E25380 -:101060002002701AFE86F7FF4B2EE24D69994A2B3B -:10107000D07329017804482C2C0120FF2010D000C7 -:101080001C258914B2AD3D0BD9002D09270CE08237 -:101090002A055FD2E07DDD00B2244A2E781232406C -:1010A000DA7742A268124A2CDA734282D10329000D -:1010B00022034B1CE06F619AD16D29034B144A1532 -:1010C00022A05C99290100D25C99D1035499310185 -:1010D0005C99E002549931022A015C9A4A11D95C68 -:1010E00061912101210022A0549900D246C0E05410 -:1010F000200001E5BE7AAEF11B20000AAA00007CA8 -:101100002800007C2900007C2A00007C2B20000D98 -:101110004820000054200011EC0000050C000005E0 -:1011200004200001702000113D200008F82000017B -:10113000DD0000749A0000744A2000097820000045 -:10114000404000400020000D38200010E420000046 -:10115000F540002000200009AE20000D9C20001169 -:101160004C49C789103C0A1C042C0AB2A4240CD890 -:101170000B2A055F121C0ADC07781232404282B249 -:10118000002200DA0168DA60DADC052A59290068F1 -:10119000093201D104E00160DA619A2200781A4B29 -:1011A000B92A004BB96999D108D105290125084907 -:1011B000B729215F49619ADD004BB56999D10629AC -:1011C0000185DA223C84DA220F851A220A202DE0DA -:1011D0000A212885D8D0022A00851984D82223E044 -:1011E00002851A84D978194BA7D1682900681B4B4E -:1011F000A4DD642B004BA44AA67D187F129202B294 -:10120000523802691A24023A02B2D2B2C01C0F420A -:101210006490041C0B1C1EE02142822219B2F6418C -:101220005ED00F2E002E0046669A03D00C19961C35 -:101230008600764A989A025AB6DB03429631011923 -:10124000F7B2C9B2BF350130012D03B2C09A05D142 -:10125000E3320134012C03B2D2250DD00D42951C8E -:10126000181C5641582502B2C0468401B698044263 -:101270006D920596034B85E7CF4B83891E2C006941 -:101280009C01F5D11DB22D197D1C283101FCFCF704 -:10129000FEB2804B8142831C27B2FB4167D00E2BEC -:1012A000000FEA4B7E415442AB2C00B2E44B74D0A9 -:1012B000073340B23642B3781BF7FBDD014B78FBB6 -:1012C00029781A240A42534D6E4B71415A33320029 -:1012D000521C27701AB2E43C0143611C39203C18AF -:1012E0006B2B005E1B0063D015220418EB200C5EF4 -:1012F0009B1C239308436033105F5B005B930930B2 -:101300004130FF4B6818C01869AA083141F7FE1C2C -:10131000231C3BFF914E5A436318F64A5B7A3336DF -:10132000384358681068194B60FCAEF7FE2C007209 -:1013300030E0EAD1D0781B4B53D0002B004B54E067 -:10134000E5333249584B507818699B4C5893021E2C -:101350004746BC5D0B3A01220A210CB2D24C5143E4 -:101360005118614D4731051C0C6C4E31FF43512122 -:101370000A186934FC253C6CA731385F4CD0222C0C -:101380000017E51BBC406C1964B2E44D4945655635 -:10139000AD2C11D10F9C02D816D0142C00DC112FCB -:1013A00028DC0F2E285F4C250634027A09DA0A421F -:1013B0008C4285E0082B00DB072314D105419B42BA -:1013C000A3E000425B2A0023014C2DD1C539012145 -:1013D0000A2B00B2C9250AD00D1965434D5FEE27CF -:1013E0003E9602200025149F0242BD0FF642754131 -:1013F00046250A402B1965434D5E2D203CD0012D1A -:1014000000B2D23201D1E229004C2849262A0055E7 -:101410000B4827D17B3B01230A54C2B2DBD1FA2B04 -:1014200000554B4D224B18E0712A00699A4A21D091 -:10143000102A0068124A12DD0C2A0168124A1ED1D5 -:10144000082A0078124A1DD0042A006812619AD135 -:10145000002A00699A21A0D10400C9481260DA5418 -:10146000422A01689A2200D151685B609AD12B2BE5 -:101470000170134A0432344A124A127013E0447065 -:101480001320000D9C200001DD200008F820000141 -:101490007020000D48400040000000018F0000094E -:1014A0005F200000F5200011EC2000114C00000529 -:1014B000042000113E2000012020001148200011CE -:1014C000BC200009AE200001B3D11E2B0070134ACE -:1014D0001032344A104B107013701A22024B0FE076 -:1014E00015709A2204005222872240809A220671A7 -:1014F0009A220171DA2203721AD823AEF11C22005B -:10150000725AE004701A49074806F7FE2250B00BE1 -:10151000FC2146C0BDF0200001DD200009AE200006 -:1015200001B320000D480000744A2850B5384B3BE9 -:10153000D10560182001FDE6F7FE4B39E06FD101BF -:101540002840701C24012B00781B3841D067D864D8 -:10155000280EFB3AF7FE2D08120863634708636301 -:101560006363005E636322014B2F4B2F701A4A2F77 -:10157000801AF7FC6013E050FA214B2C482AD10B5B -:101580002AFF01C94A2B005278127002B2D2188980 -:101590004A29F7FC6019E040FA11188A01890052C3 -:1015A000492518522402601A7004FA06F7FC4C1DF3 -:1015B000E03548214B1ED10A2AFF01894A1D1840F7 -:1015C0007812B2D2005260187022F9F6F7FC014985 -:1015D000E025005218521880250260187025F9EC99 -:1015E000F7FC4C10E01B48154B11D1082AFF0149AC -:1015F0004A101840789260187022F9DEF7FC014911 -:10160000E00D2501185270251880F7FC6018E004E1 -:10161000F9D523004A0B4A027013BD38701320001D -:101620001150200001E5200003F6200003082000EF -:101630000D342000030A40004084200003F82000FD -:101640000AB32000031D4B35B5082B33881BD80681 -:10165000D029D02F2B0AD0112B30D15D2B012BA0FC -:10166000E0062BB0D0322B5FD04CE03FD156781142 -:101670004A2C4211220E4A2BD150E04D70134A2AB7 -:101680004B287812781BD1052B01D1452A006053D5 -:101690004A27E0416093D13F2A0121004B24609A00 -:1016A00060594B1FE03A78194A2229014B22210048 -:1016B000D000E03154D1781A4B20D1022A00701AA0 -:1016C00022012200E02AE027701A4A1C4B154B1C0D -:1016D0007818D106281A4B1B7819781A7810F9DA7D -:1016E000F7FF7811E01AF7FF781AE015FF1F781B53 -:1016F0004B0CD0112B0022084B14F7FA601AE00BA8 -:10170000FBD7781B4B07D1072B1A78184B0C78198D -:101710004B0C781A4B0CF9BEF7FF46C0BD082000F1 -:1017200000285000000C200001E8200001DD20000E -:1017300008F8200011EC0000050C200001DF50002B -:10174000000E5000000D5000001020001150030248 -:101750000100060504040A0908070D0C0B0B111003 -:101760000F0E14131211171615151A1918181D1C1F -:101770001B1B1F1F1E1D222121202424232327265B -:101780002525292828272B2A2A292D2C2C2B04789B -:1017900000000D6608EF165011DB1F331AC2280C2B -:1017A00023A130D92C743996353942423DEE4AD9BD -:1017B000469053584F1B5BBE578E64075FE66C30F4 -:1017C000681F743870397C1C782F83D97FFF8B6D2C -:1017D00087A892D58F279A109679A11B9D9BA7F376 -:1017E000A48DAE97AB4BB504B1D4BB39B826C13488 -:1017F000BE3EC6F2C41BCC73C9BAD1B3CF1BD6B29E -:10180000D43BDB6ED919DFE6DDB3E418E208E80368 -:10181000E616EBA5E9DDEEFEED5BF20DF08FF4CF01 -:10182000F377F746F614F96FF864FB4BFA67FCD8C8 -:10183000FC1BFE17FD81FF06FE98FFA5FF5FFFF56D -:10184000FFD7FFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 -:10185000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 -:10186000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 -:10187000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 -:10188000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 -:10189000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 + +:100DB00020000D98B08BB5F0D9002814F7FEE3C2DF +:100DC0000015FF09004503C1007B03C1008603C174 +:100DD00003C100AA03C1011D016A03C1017603C159 +:100DE00002DF037303C103C103BC03AB4CCB4BCA8B +:100DF0002B00781B2301D127722320F2F7FE70E02D +:100E00004BC7FDD9781B7020D0002BAA4AC5E39AA6 +:100E100078114BC5781B4AC518C97812D000429189 +:100E20004AC3E390324078E0B259781218891841E9 +:100E3000DD0329FFB2D243D2E38370E218D378E214 +:100E400070E3B2DB78E3E37EE37B70A349B923E090 +:100E5000220001DB1812CB01D1FB428B2300681961 +:100E6000D003428A22FF4BB42301709A48B322F088 +:100E7000210001D21909CA10D1FB428242916812A5 +:100E80004BADD00370DA22FF2B00E001E7FED0006B +:100E900021A04AAB4AAB7013545300C920A149AA00 +:100EA00049AA5453545300C01812210AB2C9390137 +:100EB00029005453E345D1FA230049A5429A680A10 +:100EC000684BDD020FDB18D370134AA24BA2E33A42 +:100ED000699B499C2B004A9C5C8BD10D2B012019EE +:100EE0004B9ED0112B01781B4B9DD102E00A7E98BE +:100EF0007E984B9C5C8AE0072A0120082019D103C8 +:100F0000D0002B034B98200868190180FEBAF7FE29 +:100F100076984B874B90E316601A220078114A8F1F +:100F200029004A922102D003270870112101E0080C +:100F30004A877011210827062A225E522703DC0007 +:100F4000691C695D2600681B94049505960293034D +:100F5000E047251A230E20003B011CAE1C5AB2DBD1 +:100F600049830192005219921C0C5A521880B212F5 +:100F7000D1F22B00F7FE211C0FFAFE85230E9006FE +:100F80003B0192071C58B2DB19920182005290007B +:100F9000B2905AA29A02B211DA03428A9102B2C105 +:100FA000930495051A809A069001B280220446683F +:100FB00098005E82198901812A0000499100DD0DA7 +:100FC0005A614668980088819807522142BA17D121 +:100FD0009A034141920318522000E00252605A6283 +:100FE000D1CE2B00B2ED3D01D1B32DFF9C044B5A65 +:100FF0009E039D05615D611CE2A3601E485E4B5D22 +:10100000601C240068C36882DA00429A250CE29AC8 +:1010100042950FD619924166684117DE68001AF6AC +:101020001B9B0FF60FC627184166428717CE198003 +:101030000FF61A761A411B89428D0FC8B2E441445B +:10104000D1082C000FD91AD3429A220BB2E4414C9A +:10105000D1002C004B49E276230E781AD1132A00D6 +:101060001C5FE27001BF221AB2D23A0118791C91BA +:101070002D005D0D2501D002E002550D5A0E0049EC +:101080002A00520DE001D1F048394C3DB2DB3B0162 +:10109000D1E62BFF4B3BE256781A3334D0002A00BE +:1010A0002201E2502002701AFE64F7FF4B2AE24A46 +:1010B00069994A27D0792901780448282C0120FF12 +:1010C0002010D0001C258914B2AD3D0BD9002D098C +:1010D000270CE0882A055FD2E083DD00B2244A2A8B +:1010E00078123240DB0042A24A28E07C4282681239 +:1010F0002900DA78D43EAEF11B4B18D103619A2255 +:10110000032903E0744A11D1725C994B0F00D2227B +:10111000A0D13F290131015C99E03E5499200001A2 +:10112000E520000AAA00007C2800007C2900007C41 +:101130002A00007C2B20000D48000073F8200000DE +:101140002D00007BF820000054200011EC00000569 +:101150000C00000504200001702000113D20000853 +:10116000F8200001DD0000749A0000744A20000994 +:1011700078200000404000400020000D3820001082 +:10118000E4200000F540002000200009AE20000D02 +:101190009C2000114C31025C995C9A5499D9252A03 +:1011A0000121014AB522A0619100D22100E01D5425 +:1011B0009949B289103C0A1C042C0AB2A4240CD808 +:1011C0000B2A055F121C0ADC07781232404282B2F9 +:1011D000002200DA0168DA60DADC052A59290068A1 +:1011E000093201D104E00160DA619A2200781A4BD9 +:1011F000A42A004BA16999D108D1052901250849E4 +:10120000A129215F49619ADD004B9F6999D1062987 +:101210000185DA223C84DA220F851A220A202DE089 +:101220000A212885D8D0022A00851984D82223E0F3 +:1012300002851A84D978194B92D1682900681B4B12 +:101240008FDD642B004B8C4A907D187F129202B286 +:10125000523802691A24023A02B2D2B2C01C0F42BA +:101260006490041C0B1C1EE02142822219B2F6413C +:101270005ED00F2E002E0046669A03D00C19961CE5 +:101280008600764A829A025AB6DB034296310119E9 +:10129000F7B2C9B2BF350130012D03B2C09A05D1F2 +:1012A000E3320134012C03B2D2250DD00D42951C3E +:1012B000181C5641582502B2C0468401B698044213 +:1012C0006D920596034B6FE7CF4B6B891E2C00691F +:1012D0009C01F5D11DB22D197D1C283101FCD4F7DC +:1012E000FEB2804B6B42831C27B2FB4167D00E2BB2 +:1012F000000FEA4B68415442AB2C00B2E44B5FD084 +:10130000073340B23642B3781BF7FBDD014B62FB7B +:1013100001781A240A42534D594B5B415A3332002B +:10132000521C27701AB2E43C0143611C39203C185E +:101330006B2B005E1B0063D015220418EB200C5EA3 +:101340009B1C239308436033105F5B005B93093061 +:101350004130FF4B5218C01869AA083141F7FE1CF2 +:10136000231C3BFF694E45436318F64A437A3336E4 +:10137000384358681068194B4AFC86F7FE2C0072F7 +:1013800030E0E1D1D0781B4B3ED0002B004B3EE04B +:10139000DC333249424B387818699B4C4293021E29 +:1013A0004746BC5D0B3A01220A210CB2D24C3B43AA +:1013B0005118614D3231051C0C6C4E31FF435121E7 +:1013C0000A186934FC253C6CA731385F4CD0222CBC +:1013D0000017E51BBC406C1964B2E44D33456556FB +:1013E000AD2C11D10F9C02D816D0142C00DC112F7B +:1013F00028DC0F2E285F4C250634027A09DA0A42CF +:101400008C4285E0082B00DB072314D105419B4269 +:10141000A3E000425B2A0023014C18D1C539012109 +:101420000A2B00B2C9250AD00D1965434D5FEE277E +:101430003E9602200025149F0242BD0FF6427541E0 +:1014400046250A402B1965434D5E2D203CD0012DC9 +:1014500000B2D23201D1E229004C1249102A0055C3 +:101460000B4811D1723B01230A54C2B2DBD1FA2BD3 +:1014700000554B4D0C46C0E068200008F820000DD8 +:101480009C200001DD2000017020000D484000403C +:10149000000000018F0000095F200000F52000110E +:1014A000EC2000114C000005042000113E699A4B0D +:1014B00027D0102A0068124A26DD0C2A0068124A3A +:1014C00025D1082A0178124A24D0042A0068124A39 +:1014D00023D1002A00699A619AD1042A0048202168 +:1014E000A0544200C9689A60DAD12D2A01609A227C +:1014F000002B01685B4A1BD107BBF3AEF11C4A1BF2 +:1015000070137013323470134A1A2B00E0204A16FD +:10151000D11E4A1670137013323422024B15E01597 +:10152000701A22044B1422DC709A809A0052719A2D +:10153000224071DA2206721A2201725A2203701AAC +:101540002200480CE0042250490CFC02F7FEBDF0DA +:10155000B00B200008F82000012020000D9C200086 +:101560001148200011BC200011EC200001DD2000FA +:1015700009AE200001B320000D480000744A285035 +:10158000B5384B3BD10560182001FDBCF7FE4B3947 +:10159000E06FD1012840701C24012B00781B3841DA +:1015A000D067D864280EFB10F7FE2D08120863637D +:1015B000470863636363005E636322014B2F4B2F15 +:1015C000701A4A2F801AF7FC6013E050F9F74B2C81 +:1015D000482AD10B2AFF01C94A2B00527812700207 +:1015E000B2D218894A29F7FC6019E040F9E7188A55 +:1015F00001890052492518522402601A7004F9DC4E +:10160000F7FC4C1DE03548214B1ED10A2AFF018909 +:101610004A1D18407812B2D2005260187022F9CCDC +:10162000F7FC0149E0250052185218802502601885 +:101630007025F9C2F7FC4C10E01B48154B11D1087E +:101640002AFF01494A101840789260187022F9B4B4 +:10165000F7FC0149E00D2501185270251880F7FCB0 +:101660006018E004F9AB23004A0B4A027013BD383E +:10167000701320001150200001E5200003F6200027 +:10168000030820000D342000030A4000408420009D +:1016900003F820000AB32000031D4B35B5082B3397 +:1016A000881BD806D029D02F2B0AD0112B30D15D22 +:1016B0002B012BA0E0062BB0D0322B5FD04CE03FAB +:1016C000D15678114A2C4211220E4A2BD150E04DAE +:1016D00070134A2A4B287812781BD1052B01D1456B +:1016E0002A0060534A27E0416093D13F2A0121003C +:1016F0004B24609A60594B1FE03A78194A2229011D +:101700004B222100D000E03154D1781A4B20D10275 +:101710002A00701A22012200E02AE027701A4A1CCF +:101720004B154B1C7818D106281A4B1B7819781AC0 +:101730007810F9B0F7FF7811E01AF7FF781AE01582 +:10174000FF1F781B4B0CD0112B0022084B14F7FA0B +:10175000601AE00BFBAD781B4B07D1072B1A7818EA +:101760004B0C78194B0C781A4B0CF994F7FF46C0C8 +:10177000BD08200000285000000C200001E82000D7 +:1017800001DD200008F8200011EC0000050C20000D +:1017900001DF5000000E5000000D5000001020002E +:1017A000115003020100060504040A0908070D0C84 +:1017B0000B0B11100F0E14131211171615151A1901 +:1017C00018181D1C1B1B1F1F1E1D22212120242435 +:1017D000232327262525292828272B2A2A292D2C8B +:1017E0002C2B047800000D6608EF165011DB1F3318 +:1017F0001AC2280C23A130D92C74399635394242AB +:101800003DEE4AD9469053584F1B5BBE578E640736 +:101810005FE66C30681F743870397C1C782F83D970 +:101820007FFF8B6D87A892D58F279A109679A11B81 +:101830009D9BA7F3A48DAE97AB4BB504B1D4BB3938 +:10184000B826C134BE3EC6F2C41BCC73C9BAD1B3EC +:10185000CF1BD6B2D43BDB6ED919DFE6DDB3E4187B +:10186000E208E803E616EBA5E9DDEEFEED5BF20D1E +:10187000F08FF4CFF377F746F614F96FF864FB4B6B +:10188000FA67FCD8FC1BFE17FD81FF06FE98FFA53A +:10189000FF5FFFF5FFD7FFFFFFFFFFFFFFFFFFFF2A :1018A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 + :1018B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 + :1018C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 + :1018D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 + :1018E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 -:1018F000FFFFFFFFFFFFFFFFFFFF2045FFFF8931D5 + +:1018F000FFFFFFFFFFFF6863D28722450000930BC5 :00000001FF --- a/firmware/tsp_melfas/PUBL.fw.ihex +++ b/firmware/tsp_melfas/PUBL.fw.ihex @@ -1,144 +1,285 @@ :100000003B4D454C4641532062696E6172792066D2 + :10001000696C650A5B47656E6572616C20496E6646 + :100020006F726D6174696F6E5D0A43484950203D7F + :10003000204D4D53313030410A0A5B53656374697A + :100040006F6E20496E666F726D6174696F6E5D0AC6 + :1000500053454354494F4E5F4E414D45203D20503E + :1000600055424C0A53454354494F4E5F56455253EF -:10007000494F4E203D2032300A53544152545F5074 + +:10007000494F4E203D2032320A53544152545F5072 :100080004147455F41444452203D2032390A454EA4 + :10009000445F504147455F41444452203D20333046 + :1000A0000A434F4D50415449424C455F53454354D8 + :1000B000494F4E5F4E414D45203D20434F52450A2A + :1000C000434F4D50415449424C455F564552534968 + :1000D0004F4E203D2034350A0A5B42696E617279C9 + :1000E0005D0AAEF11D3048314D3534425034014483 + :1000F0002559473038000031305A10480001011EA0 + :10010000281A0000001A00000E0000000E0A00016C + :100110000105000000000002D05001010001015063 + :1001200050006200000023004B3232030401010042 + :100130001002080004030303180400000007000F66 + :1001400005F9C00005F60A1E141405000F29A200C7 + :100150001E000001DE00230028013C0A0F00000001 + :100160002D140101020032003201007FFF000B0755 + :1001700001050A003200B303D080007FFF010100B7 + :100180000102080004030304300400000008000F0B + :1001900005F9C00006F60A1E142308001929A2005A + :1001A0001E000001DE0028002D013C0A0F001E0089 + :1001B0002D140101020032009601017FFF000A07A1 + :1001C00001050A003200B303D080007FFF1E1F002C + :1001D000191A1B1C1D131415190F1011120B0C0DDD + :1001E0000E0405060A0001020300000000000000E2 + :1001F00000000000000E0F1011080B0C0D04050686 + :1002000007000002030000000000000000000000E2 + :1002100000000000000000000000000000000000DE + :1002200000000000000000000001000000010101CA + :1002300001020202020000000000000000000000B5 + :1002400000000000000000000000000000000000AE + :10025000000101010102020201000003020000008E + :10026000000000000000000000000000010000008D + :100270000000000000010000000201010103020271 + :10028000020000000000000000000000000000016B + :10029000000000000000000000010000000101015A + :1002A0000002020201000003030000000000000041 + :1002B000000101000000000001000000000000003B + :1002C0000001010101020201010303030200000019 + :1002D000000000000000000000000101010000001B + :1002E00001010000000101010002020101020202FD + :1002F00002000003030000000000000000010100F4 + :1003000000010101010000000101000100010101E3 + :1003100001020202010303030300000000000000C9 + :1003200000000000000101010101000100010001C5 + :1003300001010101010202020103030202000004A3 + :1003400003000000000000000001010000010101A5 + :10035000010001010101010101020101010202028A + :10036000020403030300000000000000000000007E + :10037000000101010101010101010101010201016D + :10038000010202020204030303000004040000004F + :100390000000000000010100000101010101010154 + :1003A000010101010102020201030302020404032C + :1003B0000300000000000000000000000001010236 + :1003C0000101010101010101010202020103020216 + :1003D0000204030303000005040000000000000005 + :1003E00000020100000101010202010101020102FB + :1003F00001020202020303030205040404000000D8 + :1004000000000000000000000002010202010101E2 + :1004100001010101010202020103020202040403BC + :1004200003000005040000000000000000000000C0 + :1004300000000000000000000000000000000000BC + :1004400000000000000000000000000000000000AC + :10045000000000000000000000000000000000009C + :10046000000000000000000000000000000000008C + :10047000000000000000000000000000000000007C + :10048000000000000000000000000000000000006C + :10049000000000000000000000000000000000005C + :1004A000000000000000000000000000000000004C + :1004B000000000000000000000000000000000003C + :1004C000000000000000000000000000000000002C + :1004D000000000000000000000000000000000001C + :1004E000000000000085ADAEF11E0000000000001D + :1004F00000000000000000000000000000000000FC + :1005000000000000000000000000000000000000EB + :1005100000000000000000000000000000000000DB + :1005200000000000000000000000000000000000CB + :1005300000000000000000000000000000000000BB + :1005400000000000000000000000000000000000AB + :10055000000000000000000000000000000000009B + :10056000000000000000000000000000000000008B + :10057000000000000000000000000000000000007B + :10058000000000000000000000000000000000006B + :10059000000000000000000000000000000000005B + :1005A000000000000000000000000000000000004B + :1005B000000000000000000000000000000000003B + :1005C000000000000000000000000000000000002B + :1005D000000000000000000000000000000000001B + :1005E000000000000000000000000000000000000B + :1005F000000000000000000000004E5900004D4DBA + :100600004E4E4B4B4B4B4B4B4A4B484A474A474746 + :1006100047474B484545000000004750000045470C + :10062000454845454545464543434241434641418A + :1006300041424842403E0000000048520000474806 + :10064000484746474846434545484142434242435E + :10065000454247414342000000004A5000004747DE + :10066000484A484848474345484842424343434232 + :1006700042424A414543000000004D5300004A4BAE + :100680004A4B484847484A484746464542474345FB + :1006900046424B464545000000004E5500004A4B7F + :1006A0004B4B47474A4846484848434645434342E0 + :1006B00046454E464645000000004E5200004A485E + :1006C0004B4D4A484A4A454A4A4A464645464643A9 + :1006D00046454D4646450000000050520000484740 + :1006E0004D4D484847474648484845464645434596 + :1006F00045434B464646000000004D5200004A4824 + :100700004A4A484846474545474845464546454381 + :1007100043414B474641000000004D52000048470E + :100720004A4B464646464545454642424646414274 + :1007300042424B454543000000004B5000004648F4 + :10074000484A47464545424345464041414242406A + :10075000414148434241000000004B5000004747E0 + :100760004848454346453F4143454040413F423F5D + :10077000424047424042000000004B4E00004545C9 + :10078000474A45454643414242454141423E403E3B + :10079000404143404041000000004B4300004A4BB1 + :1007A0004D4D4A4A4A4A4748484A454645454643C8 + :1007B00046454A4646460000000000000000000092 + :1007C0000000000000000000000000000000000029 + :1007D0000000000000000000000000000000000019 + :1007E0000000000000000000000000000000000009 + :1007F00000000000000000000000000000000000F9 + :1008000000000000000000000000000000000000E8 + :1008100000000000000000000000000000000000D8 + :1008200000000000000000000000000000000000C8 + :1008300000000000000000000000000000000000B8 + :1008400000000000000000000000000000000000A8 + :100850000000000000000000000000000000000098 + :100860000000000000000000000000000000000088 + :100870000000000000000000000000000000000078 + :100880000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF76 + :10089000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 + :1008A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 + :1008B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 + :1008C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 + :1008D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 -:0C08E000FFFFFFFFFFFF2045FFFF3F5917 + +:0C08E000FFFF434301D0224500003C38DC :00000001FF --- a/fs/ecryptfs/ecryptfs_kernel.h +++ b/fs/ecryptfs/ecryptfs_kernel.h @@ -279,6 +279,10 @@ struct ecryptfs_crypt_stat { #define ECRYPTFS_ENCFN_USE_FEK 0x00001000 #define ECRYPTFS_UNLINK_SIGS 0x00002000 #define ECRYPTFS_I_SIZE_INITIALIZED 0x00004000 +#ifdef CONFIG_WTL_ENCRYPTION_FILTER +#define ECRYPTFS_ENCRYPTED_OTHER_DEVICE 0x00008000 +#endif + u32 flags; unsigned int file_version; size_t iv_bytes; --- a/fs/ecryptfs/file.c +++ b/fs/ecryptfs/file.c @@ -36,7 +36,8 @@ #ifdef CONFIG_WTL_ENCRYPTION_FILTER #include #define ECRYPTFS_IOCTL_GET_ATTRIBUTES _IOR('l', 0x10, __u32) -#define ECRYPTFS_WAS_ENCRYPTED 128 +#define ECRYPTFS_WAS_ENCRYPTED 0x0080 +#define ECRYPTFS_WAS_ENCRYPTED_OTHER_DEVICE 0x0100 #endif @@ -245,6 +246,14 @@ static int ecryptfs_open(struct inode *i goto out; } #ifdef CONFIG_WTL_ENCRYPTION_FILTER + if (crypt_stat->flags & ECRYPTFS_STRUCT_INITIALIZED + && crypt_stat->flags & ECRYPTFS_POLICY_APPLIED + && crypt_stat->flags & ECRYPTFS_ENCRYPTED + && !(crypt_stat->flags & ECRYPTFS_KEY_VALID) + && !(crypt_stat->flags & ECRYPTFS_KEY_SET) + && crypt_stat->flags & ECRYPTFS_I_SIZE_INITIALIZED) { + crypt_stat->flags |= ECRYPTFS_ENCRYPTED_OTHER_DEVICE; + } mutex_lock(&crypt_stat->cs_mutex); if ((mount_crypt_stat->flags & ECRYPTFS_ENABLE_NEW_PASSTHROUGH) && (crypt_stat->flags & ECRYPTFS_ENCRYPTED)) { @@ -377,11 +386,19 @@ ecryptfs_unlocked_ioctl(struct file *fil fp_dentry->d_name.len + 1); mutex_lock(&crypt_stat->cs_mutex); - if ((crypt_stat->flags & ECRYPTFS_ENCRYPTED) || - ((mount_crypt_stat->flags & ECRYPTFS_ENABLE_FILTERING) - && (is_file_name_match(mount_crypt_stat, fp_dentry) - || is_file_ext_match(mount_crypt_stat, filename)))) - attr = ECRYPTFS_WAS_ENCRYPTED; + if ((crypt_stat->flags & ECRYPTFS_ENCRYPTED + || crypt_stat->flags & ECRYPTFS_ENCRYPTED_OTHER_DEVICE) + || ((mount_crypt_stat->flags + & ECRYPTFS_ENABLE_FILTERING) + && (is_file_name_match + (mount_crypt_stat, fp_dentry) + || is_file_ext_match + (mount_crypt_stat, filename)))) { + if (crypt_stat->flags & ECRYPTFS_KEY_VALID) + attr = ECRYPTFS_WAS_ENCRYPTED; + else + attr = ECRYPTFS_WAS_ENCRYPTED_OTHER_DEVICE; + } mutex_unlock(&crypt_stat->cs_mutex); put_user(attr, user_attr); return 0; --- a/include/linux/msm_mdp.h +++ b/include/linux/msm_mdp.h @@ -156,6 +156,7 @@ enum { #define MDP_BACKEND_COMPOSITION 0x00040000 #define MDP_BORDERFILL_SUPPORTED 0x00010000 #define MDP_SECURE_OVERLAY_SESSION 0x00008000 +#define MDP_WFD_NO_VIDEO_ON_EXTERNAL 0x00004000 #define MDP_WFD_NO_VIDEO_ON_PRIMARY 0x00002000 #define MDP_MEMORY_ID_TYPE_FB 0x00001000 @@ -402,6 +403,9 @@ struct mdp_csc_cfg_data { struct mdp_csc_cfg csc_data; }; +#define MDP_PP_OPS_READ 0x2 +#define MDP_PP_OPS_WRITE 0x4 + enum { mdp_lut_igc, mdp_lut_pgc, @@ -409,7 +413,6 @@ enum { mdp_lut_max, }; - struct mdp_igc_lut_data { uint32_t block; uint32_t len, ops; @@ -456,11 +459,21 @@ struct mdp_bl_scale_data { uint32_t scale; }; +struct mdp_qseed_cfg_data { + uint32_t block; + uint32_t table_num; + uint32_t ops; + uint32_t len; + uint32_t *data; +}; + + enum { mdp_op_pcc_cfg, mdp_op_csc_cfg, mdp_op_lut_cfg, mdp_bl_scale_cfg, + mdp_op_qseed_cfg, mdp_op_max, }; @@ -471,6 +484,7 @@ struct msmfb_mdp_pp { struct mdp_csc_cfg_data csc_cfg_data; struct mdp_lut_cfg_data lut_cfg_data; struct mdp_bl_scale_data bl_scale_data; + struct mdp_qseed_cfg_data qseed_cfg_data; } data; }; --- a/include/linux/power_supply.h +++ b/include/linux/power_supply.h @@ -44,6 +44,7 @@ enum { POWER_SUPPLY_CHARGE_TYPE_NONE, POWER_SUPPLY_CHARGE_TYPE_TRICKLE, POWER_SUPPLY_CHARGE_TYPE_FAST, + POWER_SUPPLY_CHARGE_TYPE_SLOW, }; enum { @@ -138,7 +139,8 @@ enum power_supply_property { }; enum power_supply_type { - POWER_SUPPLY_TYPE_BATTERY = 0, + POWER_SUPPLY_TYPE_UNKNOWN = 0, + POWER_SUPPLY_TYPE_BATTERY, POWER_SUPPLY_TYPE_UPS, POWER_SUPPLY_TYPE_MAINS, POWER_SUPPLY_TYPE_USB, /* Standard Downstream Port */ @@ -147,14 +149,49 @@ enum power_supply_type { POWER_SUPPLY_TYPE_USB_ACA, /* Accessory Charger Adapters */ POWER_SUPPLY_TYPE_MISC, POWER_SUPPLY_TYPE_CARDOCK, - POWER_SUPPLY_TYPE_UARTOFF, #ifdef CONFIG_WIRELESS_CHARGING POWER_SUPPLY_TYPE_WPC, /* Wireless Charging should be 10 */ #else POWER_SUPPLY_TYPE_DUMMY, /* # 10 is assigned for wireless */ #endif POWER_SUPPLY_TYPE_OTG, + POWER_SUPPLY_TYPE_UARTOFF, +}; + +/* + * EXTENDED_ONLINE_TYPE + * - support various charger cable type + * - set type from each accessory driver(muic, host, mhl, etc,,,) + * + * - type format + * | 31-24: RSVD | 23-16: MAIN TYPE | 15-8: SUB TYPE | 7-0: POWER TYPE | + */ +#define ONLINE_TYPE_RSVD_SHIFT 24 +#define ONLINE_TYPE_RSVD_MASK (0xF << ONLINE_TYPE_RSVD_SHIFT) +#define ONLINE_TYPE_MAIN_SHIFT 16 +#define ONLINE_TYPE_MAIN_MASK (0xF << ONLINE_TYPE_MAIN_SHIFT) +#define ONLINE_TYPE_SUB_SHIFT 8 +#define ONLINE_TYPE_SUB_MASK (0xF << ONLINE_TYPE_SUB_SHIFT) +#define ONLINE_TYPE_PWR_SHIFT 0 +#define ONLINE_TYPE_PWR_MASK (0xF << ONLINE_TYPE_PWR_SHIFT) + +enum online_sub_type { + ONLINE_SUB_TYPE_UNKNOWN = 0, + ONLINE_SUB_TYPE_MHL, + ONLINE_SUB_TYPE_AUDIO, + ONLINE_SUB_TYPE_DESK, + ONLINE_SUB_TYPE_SMART_NOTG, + ONLINE_SUB_TYPE_SMART_OTG, + ONLINE_SUB_TYPE_KBD, +}; + +enum online_power_type { + ONLINE_POWER_TYPE_UNKNOWN = 0, + ONLINE_POWER_TYPE_BATTERY, + ONLINE_POWER_TYPE_TA, + ONLINE_POWER_TYPE_USB, }; +/* EXTENDED_ONLINE_TYPE */ union power_supply_propval { int intval; --- a/include/linux/wcnss_wlan.h +++ b/include/linux/wcnss_wlan.h @@ -43,6 +43,17 @@ int wcnss_wlan_power(struct device *dev, int req_riva_power_on_lock(char *driver_name); int free_riva_power_on_lock(char *driver_name); unsigned int wcnss_get_serial_number(void); +void *wcnss_prealloc_get(unsigned int size); +int wcnss_prealloc_put(void *ptr); + +void wcnss_flush_delayed_boot_votes(void); +void wcnss_allow_suspend(void); +void wcnss_prevent_suspend(void); +void wcnss_flush_delayed_boot_votes(void); +void *wcnss_prealloc_get(unsigned int size); +int wcnss_prealloc_put(void *ptr); +void wcnss_reset_intr(void); + #define wcnss_wlan_get_drvdata(dev) dev_get_drvdata(dev) #define wcnss_wlan_set_drvdata(dev, data) dev_set_drvdata((dev), (data)) --- a/include/media/msm_camera.h +++ b/include/media/msm_camera.h @@ -28,6 +28,30 @@ #ifdef __KERNEL__ #include #endif + +#define VFE_FRAME_NUM_MAX 0x00FFFFFF +#define ZERO_OUT_FRAME 0xFF000000 +#define CLEAR_FOCUS_BIT 0x7FFFFFFF +#define get_focus_bit(x) ({ \ + (x & 0x80000000) >> 31; \ +}) +#define get_frame_num(x) ({ \ + x & VFE_FRAME_NUM_MAX; \ +}) +#define get_focus_in_position(x) ({ \ + (x & 00000001) << 31; \ +}) +#define increment_frame_num(x) ({ \ + uint32_t num = get_frame_num(x); \ + num = num + 1; \ + (x & ZERO_OUT_FRAME) | num; \ +}) +#define decrement_frame_num(x) ({ \ + uint32_t num = get_frame_num(x); \ + num = num - 1; \ + (x & ZERO_OUT_FRAME) | num; \ +}) + #define MSM_CAM_IOCTL_MAGIC 'm' #define MSM_CAM_IOCTL_GET_SENSOR_INFO \ @@ -203,6 +227,9 @@ struct ioctl_native_cmd { #define MSM_CAM_IOCTL_V4L2_EVT_NATIVE_FRONT_CMD \ _IOWR(MSM_CAM_IOCTL_MAGIC, 55, struct ioctl_native_cmd *) +#define MCTL_CAM_IOCTL_SET_FOCUS \ + _IOW(MSM_CAM_IOCTL_MAGIC, 56, uint32_t) + struct msm_mctl_pp_cmd { int32_t id; uint16_t length; @@ -839,7 +866,8 @@ struct msm_snapshot_pp_status { #define CAMERA_EFFECT_POINT_COLOR_2 16 #define CAMERA_EFFECT_POINT_COLOR_3 17 #define CAMERA_EFFECT_POINT_COLOR_4 18 -#define CAMERA_EFFECT_MAX 19 +#define CAMERA_EFFECT_CARTOONIZE 19 +#define CAMERA_EFFECT_MAX 20 #define CAMERA_WHITE_BALANCE_AUTO 1 #define CAMERA_WHITE_BALANCE_INCANDESCENT 3 --- a/include/media/radio-iris.h +++ b/include/media/radio-iris.h @@ -509,6 +509,7 @@ enum radio_state_t { FM_RECV, FM_TRANS, FM_RESET, + FM_CALIB }; enum v4l2_cid_private_iris_t { --- a/include/media/tavarua.h +++ b/include/media/tavarua.h @@ -476,7 +476,8 @@ enum tavarua_evt_t { TAVARUA_EVT_NEW_SRCH_LIST, TAVARUA_EVT_NEW_AF_LIST, TAVARUA_EVT_TXRDSDAT, - TAVARUA_EVT_TXRDSDONE + TAVARUA_EVT_TXRDSDONE, + TAVARUA_EVT_RADIO_DISABLED }; enum tavarua_region_t { --- a/mm/madvise.c +++ b/mm/madvise.c @@ -13,6 +13,7 @@ #include #include #include +#include /* * Any behaviour which results in changes to the vma->vm_flags needs to @@ -197,30 +198,38 @@ static long madvise_remove(struct vm_are struct address_space *mapping; loff_t offset, endoff; int error; + struct file *f; *prev = NULL; /* tell sys_madvise we drop mmap_sem */ if (vma->vm_flags & (VM_LOCKED|VM_NONLINEAR|VM_HUGETLB)) return -EINVAL; - if (!vma->vm_file || !vma->vm_file->f_mapping - || !vma->vm_file->f_mapping->host) { + f = vma->vm_file; + + if (!f || !f->f_mapping || !f->f_mapping->host) return -EINVAL; - } if ((vma->vm_flags & (VM_SHARED|VM_WRITE)) != (VM_SHARED|VM_WRITE)) return -EACCES; - mapping = vma->vm_file->f_mapping; + mapping = f->f_mapping; offset = (loff_t)(start - vma->vm_start) + ((loff_t)vma->vm_pgoff << PAGE_SHIFT); endoff = (loff_t)(end - vma->vm_start - 1) + ((loff_t)vma->vm_pgoff << PAGE_SHIFT); - /* vmtruncate_range needs to take i_mutex and i_alloc_sem */ + /* + * vmtruncate_range may need to take i_mutex. We need to + * explicitly grab a reference because the vma (and hence the + * vma's reference to the file) can go away as soon as we drop + * mmap_sem. + */ + get_file(f); up_read(¤t->mm->mmap_sem); error = vmtruncate_range(mapping->host, offset, endoff); + fput(f); down_read(¤t->mm->mmap_sem); return error; } --- a/mm/slub.c +++ b/mm/slub.c @@ -31,6 +31,10 @@ #include +#ifdef CONFIG_SEC_DEBUG_DOUBLE_FREE +#include +#endif + /* * Lock order: * 1. slab_lock(page) @@ -3003,6 +3007,11 @@ void kfree(const void *x) { struct page *page; void *object = (void *)x; + #ifdef CONFIG_SEC_DEBUG_DOUBLE_FREE + object = x = kfree_hook(x, __builtin_return_address(0)); + if (!x) + return; + #endif trace_kfree(_RET_IP_, x); --- a/net/bluetooth_mgmt/sco.c +++ b/net/bluetooth_mgmt/sco.c @@ -100,8 +100,11 @@ static struct sco_conn *sco_conn_add(str struct hci_dev *hdev = hcon->hdev; struct sco_conn *conn = hcon->sco_data; - if (conn || status) + if (conn || status) { + if (conn && (!conn->hcon)) + conn->hcon = hcon; return conn; + } conn = kzalloc(sizeof(struct sco_conn), GFP_ATOMIC); if (!conn) --- a/sound/soc/codecs/wcd9310.c +++ b/sound/soc/codecs/wcd9310.c @@ -3210,8 +3210,8 @@ static int tabla_codec_enable_clock_bloc tabla_codec_enable_config_mode(codec, 0); } } - - snd_soc_update_bits(codec, TABLA_A_CLK_BUFF_EN1, 0x01, 0x01); + /* Modifed 0x1 => 0x5, because ss don't use MBHC, so for using bangap mode */ + snd_soc_update_bits(codec, TABLA_A_CLK_BUFF_EN1, 0x05, 0x05); snd_soc_update_bits(codec, TABLA_A_CLK_BUFF_EN2, 0x02, 0x00); /* on MCLK */ snd_soc_update_bits(codec, TABLA_A_CLK_BUFF_EN2, 0x04, 0x04);