Samsung VZW MB1 update master

file:adf2bcfafe47518c290e1399f343f7ee9098268d -> file:e04f536ec1d44f6980d909ec045dd7e8235d3334
--- 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
file:187dc133a7a6a477acc703f49df5e8aeff4c1ccb -> file:21b5af41fd260714d54b765ebd25417daa3d861d
--- 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
file:4af8638cb7b074b2cd1bc4e0349f209d80f3608a -> file:c4386c287a1e3d1e617e391000e98caec4415629
--- 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
file:a3dca0f8aa1d9227761b3b9b2ac239e334100cea -> file:0edecc4776b82bb0a64b7ad0c164b32891e0ab00
--- 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
file:8b83c9063c26e29675742ad62bee3b48daab442e -> file:dedaa5e1f449b6337a8a0417db06b5070cc6b62c
--- 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"
file:d9c9c5124e0d02850710b62bbd02190d0033937c -> file:6579d931c0b946085cfe370e5ac1010c99ad41c6
--- 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"
file:d1e73dc4483488f8d3f47bb3a96d752bcd68f6cf -> file:9803ef9dd2155496e34b23d2079f40be18cb3806
--- 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"
file:e0f0694aa266bf7f94addafa57e38191b78f96b5 -> file:be5b20f2e081066bff6cc3edb5518d3f99912b2a
--- 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"
file:b21247ca785853ea2a439f01e884e674fc0d06aa -> file:ab67eca4bb67e5ba0ac8e39da50efc8992eadf8a
--- 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
file:540ed2a1e88a2972935ea60b464ae846bcb81721 -> file:efd575027d011c18ffe84022560aeebe55f020ea
--- 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
file:b4a564d07710d719cca040e4aa3883b6c2eae088 -> file:847a20b4f1250771769bd9f5e78a5f7d8bc7b9da
--- 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
file:4e5e3f2bd075d9d03291b403aaa9ee56d167d0dc -> file:a09223a1ce76c9bbe062062acaf847b17e163fbe
--- 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
file:97911da2bd39758e0e1ffae332a0b06d34b63d77 -> file:d981c1b95a415581455ed5e194f94d7a1ebe2be4
--- 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" \
file:d8b1aa02c3a0281985b0b159221227bf0379cbae -> file:dfe0834bcd6c380803016cafc773a9cd8a844487
--- 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:
file:d5f102d5a9048287a0023a57426e797bc8bf5239 -> file:c6028eee6c205b70c7e604e037c1fe755b8b33aa
--- 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;
file:099cc34e110d200b340441a8732ec25ddc33a638 -> file:b032aebd817c702f195ac462c4201ce7ea310e78
--- 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
file:fa358640e32eca14f7d038b85d4f37604661766c -> file:4a713350577776626bbb66490338ab9d317265bb
--- 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};
file:e4634e2fdc21f76c0cddb2ebdb330760a1dfb6b1 -> file:83af29cbe33d9e9542e3d172d71f6ff78c0b37b5
--- 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};
file:a242462ef4d38e647c2d2f41f38af144425f5c7b -> file:1af205b5ca2d3d79ade5c58b3d675720bf9c806b
--- 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 = {
file:785ab1f673e04c52a5e5fd928030a9a13f0cb9c1 -> file:943ac613294927241bf1d28d0f0a3f5ac99eea25
--- a/arch/arm/mach-msm/board-m2_dcm.c
+++ b/arch/arm/mach-msm/board-m2_dcm.c
@@ -137,6 +137,7 @@
#include <mach/msm_rtb.h>
#include <mach/msm_cache_dump.h>
#include <mach/scm.h>
+#include <mach/iommu_domains.h>
#include <linux/fmem.h>
@@ -161,6 +162,10 @@
#ifdef CONFIG_SENSORS_CM36651
#include <linux/i2c/cm36651.h>
#endif
+#ifdef CONFIG_REGULATOR_MAX8952
+#include <linux/regulator/max8952.h>
+#include <linux/regulator/machine.h>
+#endif
#ifdef CONFIG_VIBETONZ
#include <linux/vibrator.h>
#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;
file:bf3b011649630ff8a57fe6ed96800a1c9585fda8 -> file:083e69d4afcd7fa580e11cba23fe1600df4165d6
--- 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,
};
file:356ab38e2d8f5c9c209c21feac1166f94b719eaa -> file:551d8f8e0d419dccf301090c70c0f796e9d47236
--- 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,
};
file:14090b3741c5ad41c350b283c9326a042076c871 -> file:1f848af863a5c7da90e60636787c8858aea62ccf
--- 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,
file:cc4f47bcda450c3dd7b1c8f9b169f05fb76bcbcd -> file:74f21872d491368578d34e8d7a299e14d0b7b0a5
--- 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)
file:f67a5cb00df3f75a7e1627050fedd45b18927fde -> file:c3dd119d898cbafb3a834d69a482435bbf4dbf32
--- 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,
},
{
file:1c75cf7368ec88d7b9089edb3637d9407d6a91ec -> file:05e547eaa1b1443a6bc558248df9925f7392cd4d
--- 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)
file:4f73ea1bb4a7fdb259dd8f44574331f1e77684ee -> file:53a4cebe2c63e904fcd28c8fddb4b69efaf60422
--- 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"
file:68a3c44222bed45fa52d68e4e53b5cc26ab90df4 -> file:b15ba224357307f752e18cd056e9d34d45221ed6
--- 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;
file:2355717888c3c97870b1e112cd1261e749c1730d -> file:9611dd43ae737f91ffa6d62739dc636d4f5097ed
--- 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 */
file:31a83f8d319a203994c765af394414cdfbbca49b -> file:aaaa40597fd14e0d027c391eba14d4734068d788
--- 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;
file:3498af6056a2a07d8ff7088b7d5b2e997fd7eeeb -> file:9b3edc97cc0e0afe4e28d008bd55fc2865b30ec9
--- 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;
file:60b5c200c27c8e8ef41cc6aee42f04cae6b02c65 -> file:bf51f8184d8b7c815b2d82c8bfb76900a88101da
--- 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 <linux/dma-mapping.h>
#include <linux/msm_audio.h>
#include <linux/msm_audio_sbc.h>
-#include <linux/android_pmem.h>
+#include <linux/ion.h>
#include <linux/memory_alloc.h>
#include <mach/iommu.h>
@@ -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);
file:bdb5bb1e8abbba65b12a441cea2cdc9d1d780c87 -> file:156fbe5ca410a17b1cd3305a808d18e3d51191f7
--- 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 <linux/wait.h>
#include <linux/dma-mapping.h>
#include <linux/msm_audio_amrnb.h>
-#include <linux/android_pmem.h>
+#include <linux/ion.h>
#include <linux/memory_alloc.h>
#include <mach/iommu.h>
@@ -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;
}
file:50621c994a905ded26624a1bf43c4f3af39bfd55 -> file:6e45bda98945269943baecc214963b406b40a80e
--- 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 <linux/wait.h>
#include <linux/dma-mapping.h>
#include <linux/msm_audio_qcp.h>
-#include <linux/android_pmem.h>
+#include <linux/ion.h>
#include <linux/memory_alloc.h>
#include <mach/msm_adsp.h>
@@ -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;
}
file:c38fefc2287bd5a7b61199bed25850ba7fe0fc84 -> file:bff7c330352797477888bd6da8e5535c2cf8777e
--- 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 <linux/delay.h>
#include <linux/earlysuspend.h>
#include <linux/list.h>
-#include <linux/android_pmem.h>
+#include <linux/ion.h>
#include <asm/atomic.h>
#include <asm/ioctls.h>
#include <mach/msm_adsp.h>
@@ -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(&region->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(&region->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(&region->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, &region);
+ ret = audlpa_ion_lookup_vaddr(audio, addr, len, &region);
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(&region->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);
file:dc41bf41de41d3d166f891f0e978f4e2a3e3dc1c -> file:06d84cedf9fe9bba2d3a9ef2d68518e93ce8d0e1
--- 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);
file:9a9318564f73da7514311f992e6a699bc929722a -> file:9d523ec7b55130f9d638bbe639cc34d58c953bb4
--- 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 <mach/qdsp5v2/audpp.h>
#include <mach/qdsp5v2/audio_dev_ctl.h>
#include <mach/msm_memtypes.h>
-
+#include <linux/ion.h>
#include <mach/htc_pwrsink.h>
#include <mach/debug_mm.h>
@@ -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);
file:a5a9bd27e6cde7270b74dfc42f449cb07397cba2 -> file:662f350a035ecf54618e9a91c94dd45bf19f4bc1
--- 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 <linux/wait.h>
#include <linux/dma-mapping.h>
#include <linux/msm_audio.h>
-#include <linux/android_pmem.h>
+#include <linux/ion.h>
#include <linux/memory_alloc.h>
#include <mach/msm_memtypes.h>
@@ -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);
file:d34499dff6a6a12ae9269f60d0ea0a9691eeb705 -> file:6eac8cf2bc01a9397abde83e624c807ad0315526
--- 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 <linux/wait.h>
#include <linux/dma-mapping.h>
#include <linux/msm_audio_qcp.h>
-#include <linux/android_pmem.h>
+#include <linux/ion.h>
#include <linux/memory_alloc.h>
#include <mach/msm_adsp.h>
@@ -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;
}
file:464f66e93e91da822f190d36a6e4e8baae3d86c5 -> file:81a45ab85373f9092353dca3708e983e830bb762
--- a/arch/arm/mach-msm/qdsp5v2/audio_wma.c
+++ b/arch/arm/mach-msm/qdsp5v2/audio_wma.c
@@ -35,12 +35,11 @@
#include <linux/delay.h>
#include <linux/list.h>
#include <linux/earlysuspend.h>
-#include <linux/android_pmem.h>
#include <linux/slab.h>
#include <linux/msm_audio.h>
#include <linux/msm_audio_wma.h>
#include <linux/memory_alloc.h>
-#include <mach/qdsp5v2/audio_dev_ctl.h>
+#include <linux/ion.h>
#include <mach/msm_adsp.h>
#include <mach/iommu.h>
@@ -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;
file:a697fa79247b3d22562c950a171b3ffc7befa5ea -> file:119938c05cbd76a38bd9311c9c1e22145ab6102b
--- 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);
file:b05c7f56185be35c95daea3b16e271fac5f2ecfb -> file:dde7461d485e7e3ddde3e5f4a5f4ac8549ed311f
--- 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) {
file:17fd5d9593077d9cb67de90240270ff061740f18 -> file:fd07eb5072bd9808d1a7a7389c8a1a42596d7a6e
--- a/arch/arm/mach-msm/sec_debug.c
+++ b/arch/arm/mach-msm/sec_debug.c
@@ -46,6 +46,9 @@
#include <linux/fcntl.h>
#include <linux/fs.h>
#endif
+#ifdef CONFIG_SEC_DEBUG_DOUBLE_FREE
+#include <linux/circ_buf.h>
+#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");
}
file:b2a8f9c3d1a9ba24b10a67f3e539117febf7f029 -> file:3d9a1552cef60321f5349438067149979e055b6e
--- 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);
}
file:a31afb89cb952c21c2090319556d36a48269130b -> file:960df7b39c29ac4494c9e87d50a7566a9e29091b
--- 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 <mach/msm8960-gpio.h>
+#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)
file:5ef7ba6b6a76a3251956329ffd9ebcfe85ce66b9 -> file:d0583a4489e60ee59a6cc0950d7342594a4d5780
--- 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);
file:5cf85028561aeb9511721e6d6d768a0e2986dc48 -> file:f38da0361d88e126b3e205034f48d3b23c9d15cd
--- 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
file:2b762a4e9e0e861c50a00bb24fe76c7d82c26a8b -> file:7efee0e77a5c0cb21397f1624a968b8fc2fb1b15
--- 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" */
file:5f577750d47f0be62c5154905541a22d7d0ef207 -> file:56dc1753fb0ff413554ca0647ebd095e6e4d7f7f
--- 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)) {
file:a6cad181945b3309ada4ab44fce5aaff26994c8a -> file:95fdbe48b1c12faa5fb143c2d9b5c49ca82cbd9a
--- a/drivers/felica/felica.c
+++ b/drivers/felica/felica.c
@@ -20,6 +20,11 @@
#include <linux/termios.h>
#include <linux/serial_core.h>
#include <linux/uaccess.h>
+#define F_WAKE_LOCK
+#ifdef F_WAKE_LOCK
+#include <linux/wakelock.h>
+#endif
+#include <linux/types.h>
#include <mach/scm.h>
/******************************************************************************
* 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();
file:63a8c57e44c11c9edc5ec5198c9cd9e0a223c3bb -> file:1dd44ac80ae926fe55a5ba4641139de5b5539b99
--- 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);
file:fe05c24365f5371b9caf114579657fae390e0746 -> file:7ded615890c8d94a06ac4b30f0b772c9eacb2c19
--- 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);
file:57c0693c65ea83ab5d8642f08ee7be5d2f36e78e -> file:164f9d9fb2ced1fa8987173e60831ec727408f44
--- 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;
file:7d2a1f52b3a6234e6670bf4362a8925c6f6866b6 -> file:75db2f5cda0afe003ce6d9221cf9ac04970fb7e3
--- 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 {
file:870f77180013c04b777fa84c9e1e50053ec70c4b -> file:c215bdc28563364cb19e6ec9467343c4f3e57afe
--- 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 */
file:99533f75c154f240f173a43185bb906ffc3362b8 -> file:585ec23a8417913187c9f2e056a76f28e4fe5e04
--- 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
};
-
file:0650103bcec2b7a43e4bd5345542f835962d59e1 -> file:65eabe013b662e0172f456d330abd07b0187b61b
--- 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
file:122b45d9ab6d4b50da9ffc73b6e7154c9464d330 -> file:35ee3eaaac398c0c4aa04cbfefa223a98bfb51d0
--- 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);
file:793f06399baab61880074474d67513ceab5bd5fc -> file:48279ee620b85fc3adfa0642af68f78871e64040
--- 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;
file:a6dac7aad99c744ec61da492a44501cfcbf083c7 -> file:4800f665b5627952709c40c85aea1fe2b3594eaf
--- 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 */
file:fe7c99f05b8d29814e9979f853949d42391a1f99 -> file:f72ac94a5ed898da7c697eee45d59cd268db6fbd
--- 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;
file:42c6ed30b76253914cf1fa96c4909ae1d8b93178 -> file:c374c72a07715fcdb5a48d80c3301b6f0f932d30
--- 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;
file:7306b68a21fc13049a6b5c90173b2e5f9b461a4e -> file:05b9b0f5c319c19e3d39c2c58118c873cfa6800d
--- 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;
file:62c363978949157c7c8a3ec078d57541e888f013 -> file:e188c048b16a82fd8666430b7ea3b0ad29475133
--- 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;
file:b8e05684afde152b528df7fe1ec3476524bc160f -> file:010c3494ed70fd43a64ad0a0ecf338f11dd07b68
--- 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);
file:bf7713427883e048061ff140246c92243519d894 -> file:d2b0a9f98c89c35b09709438e5f7e500b04748a9
--- 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;
file:309bdbd22931f4f95bcb6077ddb3f562019504ab -> file:28b279c63ad71e21fc1581b787af46f7e8ed9724
--- 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;
}
file:29b722c52d9c583428a6044492615b1c5d6d6b46 -> file:08d3c54aea863d31fee36c8865eb8a3ab115e2a3
--- 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);
file:6d2140973d6d275c7db224f175c3864af3529e2e -> file:0a2f328bd82fffc026b349ee3ab2f1a9cac1347f
--- 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,
file:a0b21fa1e124050aa5f82b98455906d98f34370a -> file:a18a3f35411ab22dafaf7b3c2676aa143ef4d34c
--- 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
file:3607d9e3acb7ed5a8d87915d4d1758e9920762b7 -> file:ca18256c943f501d4776880d4f0509d5e1ed228c
--- 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"
file:d23ca038dcdc236fa1886dc339d97ae84be46962 -> file:7f488fa3f8a647ee399d1d46116ae76b529aac3c
--- 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);
file:ebb4afe6c70242ce2bd48ef6db101df5dd284d40 -> file:c0e37be7bfec08202b7051c797970af596ee3b42
--- 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
file:fa7053f6649f75223d3f018e4fadd222862653cb -> file:fad6e00c3cacb41f68303f8b8359e96759f1d496
--- 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
file:f7d3a37e5a5e63bbfad184e024adb1802b811c79 -> file:d5c1dda2f7881aee729da4f32677dcbdc4102625
--- 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 <linux/ioctl.h>
#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);
file:746c5db7cbba6c5c9d5315eefd6f6f5fd56df2cb -> file:4f94eefea9989fb18ffeb16a9768d78f5fde5b15
--- 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;
}
file:0086fb9393826452c8c4339fc0f1bbb14cba086e -> file:234c6936b42efb3ff73ed891961bf736e27709bc
--- 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 */
file:628895f14ec174bf096677464df65ea328bb056b -> file:db217b7965caf4b38fa8cd28fbf443dd3846f20e
--- 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;
file:62c7cbf3bb3f1e71307d3bc6d51303783f0485c9 -> file:19f57ec5b08c010c378cc0fc94f5988e54460012
--- 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"
##############################################################
#########
file:e41c7387a8a53f31ffb540e2401ca620fa923630 -> file:2d8ab03faad14716e33d70d44e6e25772433d15c
--- 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 <typedefs.h>
@@ -29,7 +29,7 @@
#include <proto/bcmeth.h>
#include <proto/bcmevent.h>
-#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
file:2f7c451c47b0ca62b80f429f7f7bd0dbf51987ef -> file:92279ae46aa229c5013e9b4d906c51a6c6f60281
--- 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.h> /* SDIO Device and Protocol Specs */
-#include <dhd_sec_feature.h>
-
#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);
}
file:cd62e4b69eeebcfdd5d13cdeb1df60cef6324e0a -> file:3ea4f753e43e82f192580235a68674489b2501ee
--- 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);
file:c743d096d2c89bd2a9ca3c3d5f94ae14f343a043 -> file:69809aa85aa1a2e1c8132eaa8b92597ec3978915
--- 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 <typedefs.h>
@@ -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__));
file:36f2a6c7bc9b3cfa8cc3b2bea38ff50c140b7670 -> file:93eda2d812e1bdbe94ea8d1ba2a49d61abcab703
--- 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 <typedefs.h>
@@ -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)
file:2dbb1684b46c163bf9a52b2cdef48c67b84f6bd1 -> file:3b3df2ff6daa534d1cf1427c2bcdee8d454aa6ff
--- 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 <typedefs.h>
@@ -30,26 +30,36 @@
#include <bcmsdbus.h> /* bcmsdh to/from specific controller APIs */
#include <sdiovar.h> /* to get msglevel bit values */
-#ifndef BCMSPI_ANDROID
+#ifdef BCMSPI_ANDROID
+#include <bcmsdh.h>
+#include <bcmspibrcm.h>
+#include <linux/spi/spi.h>
+#else
#include <pcicfg.h>
#include <sdio.h> /* SDIO Device and Protocol Specs */
#include <linux/sched.h> /* request_irq(), free_irq() */
#include <bcmsdspi.h>
#include <bcmspi.h>
+#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 <bcmspibrcm.h>
-#include <linux/spi/spi.h>
+#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
file:d5f5754af4946d01f410b9af78165bc66399a2f0 -> file:d124131886fdfc9ef2482a08e8f1f70c67f48362
--- 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;
}
file:74229bbe4299b1d6889a2bec74309f863e0f5c3d -> file:e01f3ad6671c32901dad7ed8a9bede22599375c0
--- 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 <wlioctl.h>
#include <wlfc_proto.h>
-#include <dhd_sec_feature.h>
#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)
file:4f4894618ab678cd96f403066457afc31f25a820 -> file:b22940af61c09916e7ccd8535606705307c5e324
--- 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;
file:cc494653585bb0d98c4b499fac485f1bc1267a4c -> file:2dfd23c4f956cc954a07cbb1634cfb099ff2f16f
--- 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);
}
file:b985a7c46f868ea1a7df3def6b968869bc5c70aa -> file:a7e6f549f3bf206ef5a1461775394f9472909ecb
--- 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 <typedefs.h>
#include <osl.h>
@@ -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__));
file:1683501ee7fbd08f17603fda6b2cd4b7ba92d3e9 -> file:010cfc61b3a99ceb63689b09ec8f57ac6bf0bf87
--- 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,
file:654fb3e40631a1cfe96893477a8f2460ecf58368 -> file:0cb2c4906c9763ea0de70af40d7a521dabd219fb
--- 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 <typedefs.h>
@@ -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 <wl_android.h>
#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);
file:9f68309d50d6c180490b169d781d980c06007a00 -> file:cffe31252975263af9bc7d72eeebdb6f3b788a89
--- 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 <typedefs.h>
@@ -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;
file:147751642f2ceb9d03a5e1136c076133a9e3744a -> file:54487e8d15fdbbdfe901668c8b2d4666cc983974
--- 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_ */
file:4087351477167cf6a26875348f82b2313881a11c -> file:5a64e6fd2bd274fb0bcc9dcadbc12e2a6f3735ee
--- 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) - \
file:ad9a9ca464501a63434811dd02049b14b3a6ef8d -> file:58e28bbbb9c72d427f1db42922f758b7506a0e5c
--- 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 <bcm_cfg.h>
-#include <typedefs.h>
-#include <bcmdefs.h>
-#include <osl.h>
-#include <bcmutils.h>
-#include <siutils.h>
-#include <bcmdevs.h>
-#include <hndsoc.h>
-#include <sbchipc.h>
-#include <hndpmu.h>
-
-#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 <bcm_cfg.h>
+#include <typedefs.h>
+#include <bcmdefs.h>
+#include <osl.h>
+#include <bcmutils.h>
+#include <siutils.h>
+#include <bcmdevs.h>
+#include <hndsoc.h>
+#include <sbchipc.h>
+#include <hndpmu.h>
+
+#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);
+}
file:99b412a57af6cf88cf9e8430e5cf3913ed494a4d -> file:b249148d591b618dda2736e30343e684e4a3f73d
--- 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)
file:80c0a3d13eea5b0d979c9d7b95e098a50d884efb -> file:fb2ec3af60f1b2305c25420147a16364368e5257
--- 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))
file:d94e9e4292061e532adf74b3a0ea2863da30141f -> file:6452be4910b958e6a5a24277509ac8b3ee0cd31e
--- 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 */
file:95b0cd081fc868c934099f9e91eea8d7a4e7e642 -> file:ad81bbb776fc09021b591d45b9381ba6b6b890b4
--- 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
file:b36fa0c0b327edc60d38e502b245301e8b2e7f1b -> file:11fff555a8fc2251abf0951149b5f8bd9fd3365c
--- 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_
file:e58420edec996b1c390525b1fa8b86653600ae94 -> file:6ccb9c1155d5eab757dc8f29259ed8c57b540a81
--- 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 */
file:5fd1dbd31b4192680c19aeec420c3994378d29a5 -> file:d9edaa3804ac915f77082db76ec12a26e76c7b6f
--- 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 <linuxver.h>
#include <linux/kernel.h>
#include <linux/string.h>
-
+#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 <linux/kernel.h>
#include <linux/string.h>
file:3c2a168313261a948f64a553e2ca28bcb8f00fe3 -> file:494c95ff5f97f3e44135ad70bb1dfd760dafcd90
--- 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_
file:312074dc4bf9f610c0efdfd1af419b510da1f624 -> file:2e56e2bf3dd0a793bfec5ace5dd70b48d02bf5d5
--- 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
file:80601f7828d8be18781d3350c784f7a1475fdc2e -> file:7a094aac70383cc58becfda97a8b542422d7397f
--- 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_
file:47bc354c0ba6f4d8069dd9820d1458919b316bee -> file:ba63e022134a87f896129462eb4848062494ce12
--- a/drivers/net/wireless/bcmdhd/include/proto/wpa.h
+++ b/drivers/net/wireless/bcmdhd/include/proto/wpa.h
@@ -34,7 +34,7 @@
#include <packed_section_start.h>
-#include <dhd_sec_feature.h>
+
#define DOT11_RC_INVALID_WPA_IE 13
file:00e44d258337cb5fbcc2d5b56835bbf935bb8dc1 -> file:dacca08e91840f389b2040fefce99f111ed572f6
--- 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 */
file:6d2d40319e2e6c1d5c02f9fc32bfe607024f7ede -> file:f1ecc2293aa6c09c0901f19b918577044c0fe0d6
--- 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
file:1c8cc018dda1d70cc6b3c8104b0c93424e2db65d -> file:6b421b5df653dc18d5465b80053f993083d789d8
--- 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
file:5205c0756a16c7d43524118144cf4da5948b7a2a -> file:5d387630e6f87fd4ebaf490aca72375e52a18537
--- 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 <bcmcdc.h>
#endif /* LINUX_POSTMOGRIFY_REMOVAL */
-#include <dhd_sec_feature.h>
-
/* 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 */
file:ddb8372941aeadb62a7c618c1e2e2def3445c0e6 -> file:5f0d5f1eeb90c1f20df58464e3e0f75874124bf5
--- 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 <linux/delay.h>
#include <pcicfg.h>
-#ifdef BCMASSERT_LOG
-#include <bcm_assert_log.h>
-#endif
-
#include <linux/fs.h>
@@ -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
file:bb402b2ac1962ae4a41b730e13af558fab54ba80 -> file:1161b7d58e546a80600b0229124e371d3007617b
--- 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 <linux/module.h>
@@ -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;
file:583a16735ecd1c1bbcd8791f767c15478fcd0e5d -> file:d7fa5d23ab083d6aae5cd333ee46914b3cdd0979
--- 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 <linux/module.h>
#include <linux/netdevice.h>
#include <wldev_common.h>
+/* If any feature uses the Generic Netlink Interface, put it here to enable WL_GENL
+ * automatically
+ */
+
+
+#ifdef WL_GENL
+#include <net/genetlink.h>
+#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 */
file:015b411d0cea946887974e7a6d48e980940f7b6b -> file:cb6da84506ec81d19c2e86f7decd3f8dfb8cf54c
--- 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 <typedefs.h>
@@ -58,6 +58,11 @@
#include <wldev_common.h>
#include <wl_cfg80211.h>
#include <wl_cfgp2p.h>
+#include <wl_android.h>
+
+#ifdef PROP_TXSTATUS
+#include <dhd_wlfc.h>
+#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, &params_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 */
file:a712617e1c92116098bf296b484c35b8c42ad713 -> file:9b79376e1f2e428e61908b2b7c5acd4d0ce0da37
--- 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_ */
file:969da37ae209d51b78e1f388d0fd966ab1bb4cae -> file:64eb5f024ecd2b28cdc0d456e542037ca223bc6c
--- 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 <typedefs.h>
@@ -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);
+}
file:d8074cefa444c0d37e202bf28e9786cd76201527 -> file:e62acd091d962b120c28eb0e5a6cefe104423b09
--- 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-"
file:708fb3bb09cc6f364535264f4b6a6d2ba9dd13db -> file:8d9c4c8e1a131f807823c0f4eae3cfc1af10e9b0
--- 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++) {
file:ef514807968f4164caf6a3e68307962e91a6ebcd -> file:8e0ed4dcf60755ba454924e6baa4b036b112ebe8
--- 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));
file:099e83fa89bd831d52a8f1969d220d2839cfd69a -> file:f9bf42584eaf23abf0b27b5f3a832c0e9846d811
--- 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);
file:c077848dda2728cfd301101dba3ab1be954b4dda -> file:8d50d19017b76dafc7713e341e0d4186805372ca
--- 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
file:10dde40d778d9e595ca63306b8b03d0461c700b9 -> file:f3fcb316f91cafaa75dc8c4112a6a32c9e13d37a
--- 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,
file:605514afc29f20029032ef2ab94cc1b006e8ffa3 -> file:9e9d8d9e9e574789657d07bae82f0521b2053eb7
--- 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",
file:663c5a6de2f7229e7414f4ca9395023f6cce5c2e -> file:8db61d972ae4ca6415b4c7b39515d71e73c8d684
--- 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);
file:9dfcb44a23853a80fb86b24aa6711459c8a56da4 -> file:c1784aadfba798227052e297e3e98b2f20a12580
--- 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,
file:88b2b86642b642f0bff9cff27f46dbbb9e33d0f8 -> file:87194d76595511e03b43c70c0990d857cb4dad48
--- 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;
file:d3754f1ae5689562595135cea24e50eec2ade71d -> file:8ffe991f41213413c4fe9a4ed28374551460a2e4
--- 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);
file:35b0712bd48359e7ef07c03f3224895e7a39373c -> file:6cc7ac740027d624b5dc3f239633c44794ddb834
--- 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 */
file:23a75117124f1b2cd9c503a0951eda0d35b1746c -> file:9b9931fffcc8560744248bbe7b65ead0b8e34a05
--- a/drivers/usb/gadget/f_audio_source.c
+++ b/drivers/usb/gadget/f_audio_source.c
@@ -22,11 +22,9 @@
#include <sound/pcm.h>
#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;
}
file:2d8059e98655e0c7935830d63fc50fd1b775136d -> file:37c2e0daedc5ce03e25d7bfb5aa2aa8771fd8713
--- 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:
file:6a4993144d2d03fe04da5616f0e99b0d761173f1 -> file:44a0addf61ec92655a8051c38ccf1a7b3069f3aa
--- 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);
file:3348aab5d3b65ab67a3c18458408429bdb3cb2a6 -> file:d0b814ecd74d29da5486156dd31b26ab8d7af117
--- 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
file:95e7d41d1217df33044821e0db0cac695c94219c -> file:37c147de007484b0d1a8beca7c3a10dd4bea05c9
--- 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, &regval, 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 */
file:37ab015374dfb4c2f2c3c195359ec86dada8c00e -> file:a1b608c72fd4eaad5be9e9b3f8d3b0cb5cbf036d
--- 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
file:c835ff15d34232a06827edf177f44a3d1c14eddb -> file:9cc0d8f071ba01bf2d2450c8dd7cde73d99b85c7
--- 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);
file:39807a981930c7c4b50657d9ce65e0ad298b221b -> file:405230f5543f37f26184ee62729decd7457b705b
--- 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);
file:c554e0fe82c2be0ec1bd85e55e065cad37cdf167 -> file:3dddff7b06e4b70c78184bf284bf931811227c58
--- 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
file:b8ac683cc24643c5ac71bb18571fbba8db8c4dbc -> file:e67b244e99354abdf50b767a81d6f93d8d967631
--- 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);
file:5d3c4287a4a1b750e3fe940ee640f01b1d50538f -> file:f9fe454b3bfbbdf142b0d5fdfdb47b05decd1b39
--- 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);
file:9d273dd5734bcd6f39b7a571c1c480251d12655a -> file:d129d73eae79da93f59b9ddc65e81899d3cf866a
--- 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);
file:a1b0fe9cf9ca6a56a02caa350643eaf8d0f3dadf -> file:373747b0d42b902b9f21d3d064d06c7b2b156aba
--- a/drivers/video/msm/mdp4_overlay_mddi.c
+++ b/drivers/video/msm/mdp4_overlay_mddi.c
@@ -17,721 +17,1055 @@
#include <linux/time.h>
#include <linux/init.h>
#include <linux/interrupt.h>
-#include <linux/hrtimer.h>
#include <linux/delay.h>
-#include <mach/hardware.h>
#include <linux/io.h>
-
-#include <asm/system.h>
-#include <asm/mach-types.h>
#include <linux/semaphore.h>
#include <linux/spinlock.h>
-
#include <linux/fb.h>
+#include <asm/system.h>
+#include <asm/mach-types.h>
+#include <mach/hardware.h>
#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);
file:6b386a68ccb1f60ed66a58bdcf07f0102d18ccf9 -> file:8caef01026d58bd22f43ebf3a8f6a1c4977b58f7
--- 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;
file:fea021df2a6e34a63f346664cfa8955d9a12104a -> file:a6f704d32ad4865cf8567600dc7455b29d712ca1
--- 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);
}
file:967844fd05ef6143d149de70b8a6825ca0bfaf6e -> file:63db213483c7bedba188cd84aa355a8b7105515a
--- 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)) {
file:c9a77200caa367ad22bb810a49f172cc2bc3ec87 -> file:5967c2e33782ecda9b9eccb1816062be8ace8856
--- a/drivers/video/msm/msm_dss_io_8960.c
+++ b/drivers/video/msm/msm_dss_io_8960.c
@@ -11,6 +11,7 @@
*
*/
#include <linux/clk.h>
+#include <mach/clk.h>
#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)
file:e15262bf7409e3b637831f7267ef01e878ab5c97 -> file:7e9e21db3c26e4d5f209507d097c85f81db31ffb
--- 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 *)
file:57ae090bb1489ec4a43b2105b2e1fc63afa30801 -> file:716c51eac51bdc8e02a5819205273bd357d77c24
--- 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;
file:a2327d537a5977289def75af13cb7d27f99909ba -> file:3620f1a8f1f20aaa0a1934ddd3b9fdfd80fce5d5
--- 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);
}
file:0acc2f6dd67d812a22445ce6d307a7eb1804f8d5 -> file:37f5db89dc325ed5f6ca379ea768df0e7110fb71
--- 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;
file:f9c728a1304cdd037a021304bafd453ede387b44 -> file:44a48c3e922bd0ce53acba08d99a56d80c81c369
--- 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");
file:267e924ab92032ee7b81202aebd6da3fe5202dd5 -> file:fade8214f322113cd16989f23f78a6f908a535d9
--- 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);
}
file:db3624af9585899135170ac6b09764c403bd5b7f -> file:d20c1596eb713c0ec2afcd6a5bdd2075f8398455
--- 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;
file:7437f9411b5f629d016e44d0bb9a6d232bb45629 -> file:157f045ffc2dee5aff3a888055341cfb7c123349
--- 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
file:d39984749e1abab41c855e3918907589688eb668 -> file:3c445bcae0af418e67afe680cbea3a2ed52e9019
--- 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(
file:7460ef31e91818fc0a8db50658d1c39cea7995a4 -> file:7fc1aaa1513e1be3f37b90c161fdd914ec1a3a5f
--- 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 {
file:7af0de3b918bb5c4e9593c26fd99d068bab1635a -> file:0285e21241df44cf7eb6b705fcede4d882988f70
--- 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;
file:d5e656b384ba31ed0c60c255b744af345166cc8b -> file:e2cf9f22f45d6a32aa7a06bb21a0bfc16c2cb934
--- 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
file:07c73472365d6ad86ce5a5c23a769c8a0f4ebb17 -> file:b53defac057d0ea382eca3bdb997c50451cc59fd
--- 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,
file:90149213a85d4f4f35264f7781559dd0e97ec7ef -> file:f81dc953f518fff2681478a7c5082452b28344bf
--- 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) \
file:759989d305577b554cc865da7134246c0e3cf048 -> file:54735b35849463f9b43e257054805cf622b47b04
--- 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;
file:92a68a082355df8ad29c7de47e6ce0d73436f342 -> file:bbd11391e86eea537ba1ff87210b35c629538a89
--- 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
file:48fadb1c026479a080cac0df3707a90121ffbf9c -> file:5333d109924e262ac31870941b2d4a8d26ca7657
--- 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
file:855aa72a882a2e378c48efd6326d3f5705124477 -> file:72429e421d9d9e4f3b02b2e38a7ee6438e17cfb8
--- 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;
file:c6aa0fc0a4db048c5c7ee609aafc9dac14ac54c8 -> file:0a43e7efe177681c8d42233b37ee64743ad2ac6a
--- a/fs/ecryptfs/file.c
+++ b/fs/ecryptfs/file.c
@@ -36,7 +36,8 @@
#ifdef CONFIG_WTL_ENCRYPTION_FILTER
#include <linux/ctype.h>
#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;
file:1cfae34fe4b122918bf3f61001229e172c3234ba -> file:aa08048e0ebf802a0fc41c54b5265bb1fe299423
--- 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;
};
file:066ad7af52174dd0c13b7bc68790f0242bb81cee -> file:867e90d122f197b28bc945dbf0c469a2011f5f1b
--- 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;
file:9759b32a0cf2400e2cb21b337ee47f53b3e2c91a -> file:818cb512d1f17226772d29af7837a252cd9ac0d9
--- 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))
file:97ddc7f97c1dd30c9fe0f457fbc2137c7c1be939 -> file:3f89067932484cb3a55813e5ff4af445a3725ef1
--- a/include/media/msm_camera.h
+++ b/include/media/msm_camera.h
@@ -28,6 +28,30 @@
#ifdef __KERNEL__
#include <linux/ion.h>
#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
file:de2b3564fd4df819ba776a2aa9081e5a628373b1 -> file:c00e985485e2d2f8b96e6c51f21a94c84f4880df
--- 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 {
file:4a8713d4b20b4571cab6383496a47e149bb7c740 -> file:3f0d3d49c8fbb82a979c201dcdb77d0f6b064964
--- 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 {
file:2221491ed5038dcdcbe3c19bc65172eeb4380a75 -> file:e867b5d63406bccfef1dc22dd987131d1514cf39
--- a/mm/madvise.c
+++ b/mm/madvise.c
@@ -13,6 +13,7 @@
#include <linux/hugetlb.h>
#include <linux/sched.h>
#include <linux/ksm.h>
+#include <linux/file.h>
/*
* 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(&current->mm->mmap_sem);
error = vmtruncate_range(mapping->host, offset, endoff);
+ fput(f);
down_read(&current->mm->mmap_sem);
return error;
}
file:6c934d8aab6d1ef20ab72dba886bbbe39add9fbb -> file:bc610c62d5bebe085c61cc5dfa2e45761747a588
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -31,6 +31,10 @@
#include <trace/events/kmem.h>
+#ifdef CONFIG_SEC_DEBUG_DOUBLE_FREE
+#include <mach/sec_debug.h>
+#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);
file:20d7cb756c4cfd542a9101c656dac1a8983b9d5e -> file:27581df77cd0aee7434a48ce3eb6f75f71654c0e
--- 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)
file:c774babc47da3bf87ce080428f0a0af61f72baf1 -> file:d2c802469b6383f64a92c8b41950fe8fd14af8e9
--- 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);